1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# $Source: tools/build/image.dir/ppeimage.rules.mk $
#
# IBM CONFIDENTIAL
#
# EKB Project
#
# COPYRIGHT 2016
# [+] International Business Machines Corp.
#
#
# The source code for this program is not published or otherwise
# divested of its trade secrets, irrespective of what has been
# deposited with the U.S. Copyright Office.
#
# IBM_PROLOG_END_TAG
#
# Makefile that automatically define all the recipes required to generate a
# PPE image
#
# MACROS:
# BUILD_PPEIMAGE: Macro to automatically generate all the recipes for
# building a PPE image
# ADD_PPEIMAGE_SRCDIR: Macro to add additional source directories
# ADD_PPEIMAGE_INCDIR: Macro to add additional include directories
# Special Variables:
# $(IMAGE)_PATH - alternate location to place image in
# $(IMAGE)_LINK_SCRIPT - alternate linker script to use
# $(IMAGE)_COMMONFLAGS - optional compile time flags to pass in
#
# BUILD_PPEIMAGE
# This macro will automatically generate all the recipes for building a PPE
# image. Requires that the following variables are defined:
# - IMAGE=name - name of the image to generate
# As a result, this macro will define how to build $(IMAGE).bin
BUILD_PPEIMAGE = $(eval $(call __BUILD_PPEIMAGE))
# Order of operation:
# Define default output path and linker script
# Add directory of the defining .mk file to the source path for this image
# Setup LOCALCOMMONFLAGS for this image
# Create phony target to allow "make $(IMAGE)"
# Call helper macros to generate .bin file
# Erase IMAGE and OBJS variable
define __BUILD_PPEIMAGE
$(IMAGE)_PATH ?= $(OBJPATH)/$(IMAGE)
$(IMAGE)_LINK_SCRIPT ?= $(IMAGE).cmd
ifeq "PPE" "$($(IMAGE)_TARGET)"
endif
$(call ADD_PPEIMAGE_OBJ,$(IMAGE),$(OBJS))
$(call ADD_PPEIMAGE_SRCDIR,$(IMAGE),$(dir $(lastword $(MAKEFILE_LIST))))
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCOMMONFLAGS= $(PPE_LOCALCOMMONFLAGS)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCOMMONFLAGS+= \
$($($(IMAGE)_TARGET)_CFLAGS)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCOMMONFLAGS+= -DIMAGE_NAME=$(IMAGE)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCOMMONFLAGS+= \
-DPK_TRACE_HASH_PREFIX=$($(IMAGE)_TRACE_HASH_PREFIX)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCOMMONFLAGS+=$$($(IMAGE)_COMMONFLAGS)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCFLAGS+= $$($(IMAGE)_CFLAGS)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALCXXFLAGS= $$($(IMAGE)_CXXFLAGS)
$(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin: LOCALLDFLAGS= $$($(IMAGE)_LDFLAGS)
.PHONY: $(IMAGE)
$(IMAGE) :
$(C1) mkdir -p $(IMAGEPATH)/$(IMAGE)
@$$(MAKE) $(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin
$(call GEN_PPEIMAGE_BINARY,$(IMAGE),$(IMAGEPATH)/$(IMAGE),PPE_BINUTILS)
$(call GEN_ELF_OUT,$(IMAGE),$(IMAGEPATH)/$(IMAGE),PPE_BINUTILS)
$(call PROCESS_LINK_SCRIPT,$(IMAGE),$(OBJPATH)/$(IMAGE),\
$$($(IMAGE)_LINK_SCRIPT),$$($(IMAGE)_TARGET))
IMAGE_TARGETS += $(IMAGEPATH)/$(IMAGE)/$(IMAGE).bin
IMAGE:=
OBJS:=
endef
# ADD_PPEIMAGE_SRCDIR
# This macro will add additional source paths to an executable.
# Usage:
# $(call ADD_PPEIMAGE_SRCDIR,exe,/path1 /path2)
ADD_PPEIMAGE_SRCDIR = $(eval $(call __ADD_PPEIMAGE_SRCDIR,$(1),$(2)))
__ADD_PPEIMAGE_SRCDIR = \
$(foreach path,$(2),$(call ___ADD_PPEIMAGE_SRCDIR,$(1),$(2)))
# Order of operations:
# * Add the path to the include list.
# * Generate all the possible .C->.o, .c->.o, etc. pattern recipes.
define ___ADD_PPEIMAGE_SRCDIR
$(call __ADD_PPEIMAGE_INCDIR,$(1),$(2))
$(call __GENERATE_PPE_OBJECTRULES,$(OBJPATH)/$(1),$(2),$$($(1)_TARGET))
endef
# ADD_PPEIMAGE_INCDIR
# This macro will add additional include paths to a module.
ADD_PPEIMAGE_INCDIR = $(eval $(call __ADD_PPEIMAGE_INCDIR,$(1),$(2)))
__ADD_PPEIMAGE_INCDIR = \
$(foreach path,$(2),$(call ___ADD_PPEIMAGE_INCDIR,$(1),$(path)))
# Order of operations:
# * Add path to -I COMMON flags for #include <> style include.
# * Add path to $(exe)_INCDIRS for use by other targets.
define ___ADD_PPEIMAGE_INCDIR
$(1)_COMMONFLAGS += -I$(2)
$(1)_INCDIRS += $(2)
endef
# __ADD_PPEIMAGE_OBJ
# This macro will add additional objects to a module's dependency list.
# Usage:
# $(call ADD_PPEIMAGE_OBJ,image,file1.o file2.o)
ADD_PPEIMAGE_OBJ = $(eval $(call __ADD_PPEIMAGE_OBJ,$(1),$(2)))
# Order of operations:
# * Prepend $(IMAGE)_PATH to the path for the object.
# * Add object and corresponding .dep file to the 'clean' target list.
# * Add generated .dep file for header-file dependencies to __DEP_INCLUDES.
define __ADD_PPEIMAGE_OBJ
$(1)_OBJS += $$(addprefix $$($(1)_PATH)/,$(2))
$(foreach obj,$(2),$(call CLEAN_TARGET,$$($(1)_PATH)/$(obj))
$(call CLEAN_TARGET,$$($(1)_PATH)/$(obj:.o=.dep))
$(call CLEAN_TARGET,$$($(1)_PATH)/$(obj:.o=.s))
$(call CLEAN_TARGET,$$($(1)_PATH)/$(obj:.o=.es))
$(call CLEAN_TARGET,$$($(1)_PATH)/$(obj:.o=.s.ppe.hash)))
__DEP_INCLUDES += $$(wildcard $$(addprefix $$($(1)_PATH)/,$(2:.o=.dep)))
endef
|