xref: /rk3399_ARM-atf/plat/mediatek/build_helpers/mtk_build_helpers.mk (revision 500d40d877617653d347fb6308144973d4297ab9)
1*500d40d8SLeon Chen#
2*500d40d8SLeon Chen# Copyright (c) 2022, MediaTek Inc. All rights reserved.
3*500d40d8SLeon Chen#
4*500d40d8SLeon Chen# SPDX-License-Identifier: BSD-3-Clause
5*500d40d8SLeon Chen#
6*500d40d8SLeon Chen
7*500d40d8SLeon Chen# Get local directory path
8*500d40d8SLeon Chendefine GET_LOCAL_DIR
9*500d40d8SLeon Chen$(patsubst %/,%,$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))))
10*500d40d8SLeon Chenendef
11*500d40d8SLeon Chen
12*500d40d8SLeon Chen# Clear module source variable
13*500d40d8SLeon Chendefine CLEAR_LOCAL_SRCS
14*500d40d8SLeon Chen$(eval $(1) :=)
15*500d40d8SLeon Chenendef
16*500d40d8SLeon Chen
17*500d40d8SLeon Chendefine EXPAND_SUB_MAKEFILE
18*500d40d8SLeon Cheninclude $(S)
19*500d40d8SLeon Chenendef
20*500d40d8SLeon Chen
21*500d40d8SLeon Chen# Expand sub rules.mk
22*500d40d8SLeon Chendefine INCLUDE_MAKEFILE
23*500d40d8SLeon Chen$(eval MODULES_SUB_MAKEFILE := $(patsubst %,%/rules.mk,$(1)))
24*500d40d8SLeon Chen$(foreach S,$(MODULES_SUB_MAKEFILE),$(eval $(EXPAND_SUB_MAKEFILE)))
25*500d40d8SLeon Chenendef
26*500d40d8SLeon Chen
27*500d40d8SLeon Chen# Determine option variable is defined or not then define it
28*500d40d8SLeon Chendefine add_defined_option
29*500d40d8SLeon Chenifdef $(1)
30*500d40d8SLeon Chenifeq ($(findstring $(value $(1)), $(uppercase_table)),)
31*500d40d8SLeon ChenDEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),)
32*500d40d8SLeon Chenelse
33*500d40d8SLeon Chenifeq ($(strip $(value $(1))),y)
34*500d40d8SLeon ChenDEFINES += -D$(1)$(if $(value $(1)),=1,)
35*500d40d8SLeon Chenendif
36*500d40d8SLeon Chenendif
37*500d40d8SLeon Chenendif
38*500d40d8SLeon Chenendef
39*500d40d8SLeon Chen
40*500d40d8SLeon Chendefine EXPAND_RULES_MAKEFILE
41*500d40d8SLeon ChenLOCAL_SRCS-y :=
42*500d40d8SLeon ChenMODULE :=
43*500d40d8SLeon ChenSUB_RULES-y :=
44*500d40d8SLeon Cheninclude $(S)
45*500d40d8SLeon Chenendef
46*500d40d8SLeon Chen
47*500d40d8SLeon Chen# INCLUDE_MODULES macro expand included modules rules.mk
48*500d40d8SLeon Chen# Arguments:
49*500d40d8SLeon Chen#   $(1) = MODULES variables
50*500d40d8SLeon Chendefine INCLUDE_MODULES
51*500d40d8SLeon Chen$(eval MODULES_TEMP := $(1))
52*500d40d8SLeon Chen$(eval MODULES_MAKEFILE := $(patsubst %,%/rules.mk,$(MODULES_TEMP)))
53*500d40d8SLeon Chen$(foreach S,$(MODULES_MAKEFILE),$(eval $(EXPAND_RULES_MAKEFILE)))
54*500d40d8SLeon Chenendef
55*500d40d8SLeon Chen
56*500d40d8SLeon Chen# MAKE_LOCALS expand module source file variable to BL${BL}_SOURCES
57*500d40d8SLeon Chen# Arguments:
58*500d40d8SLeon Chen#   $(1) = source file
59*500d40d8SLeon Chen#   $(2) = BL stage (1, 2, 2u, 31, 32)
60*500d40d8SLeon Chendefine MAKE_LOCALS
61*500d40d8SLeon Chen$(eval $(call uppercase,$(2))_SOURCES += $(1))
62*500d40d8SLeon Chenendef
63*500d40d8SLeon Chen
64*500d40d8SLeon Chen# MAKE_LINKERFILE change linker script source file name to
65*500d40d8SLeon Chen# target linker script
66*500d40d8SLeon Chen#   $(1) = linker script source file
67*500d40d8SLeon Chen#   $(2) = BL stage
68*500d40d8SLeon Chendefine MAKE_LINKERFILE
69*500d40d8SLeon Chen$(eval EXTRA_GENERATED_LINKER_SCRIPT += $(BUILD_PLAT)/$(2)/$(patsubst %.ld.S,%.ld,$(notdir $(1))))
70*500d40d8SLeon Chenendef
71*500d40d8SLeon Chen
72*500d40d8SLeon Chen# MAKE_LINKERFILE_ITER call MAKE_LINKERFILE iteratively
73*500d40d8SLeon Chen#   $(1) = linker script source file
74*500d40d8SLeon Chen#   $(2) = BL stage
75*500d40d8SLeon Chendefine MAKE_LINKERFILE_ITER
76*500d40d8SLeon Chen$(eval $(foreach link_src,$(1),$(call MAKE_LINKERFILE,$(link_src),$(2))))
77*500d40d8SLeon Chenendef
78*500d40d8SLeon Chen
79*500d40d8SLeon Chen# MAKE_LD_ITER generate the linker scripts using the C preprocessor iteratively
80*500d40d8SLeon Chen#   $(1) = output linker script
81*500d40d8SLeon Chen#   $(2) = input template
82*500d40d8SLeon Chen#   $(3) = BL stage (1, 2, 2u, 31, 32)
83*500d40d8SLeon Chendefine MAKE_LD_ITER
84*500d40d8SLeon Chen$(eval index_list=$(shell seq $(words $(1))))
85*500d40d8SLeon Chen$(eval $(foreach i, $(index_list), \
86*500d40d8SLeon Chen$(call MAKE_LD,$(word $(i), $(1)), $(word $(i), $(2)),$(3))))
87*500d40d8SLeon Chenendef
88*500d40d8SLeon Chen
89*500d40d8SLeon Chen# MAKE_MODULE reference MAKE_OBJS.
90*500d40d8SLeon Chen# Create module folder under out/bl$(BL)/$(module)
91*500d40d8SLeon Chen# Arguments:
92*500d40d8SLeon Chen#   $(1) = module name
93*500d40d8SLeon Chen#   $(2) = source file
94*500d40d8SLeon Chen#   $(3) = BL stage
95*500d40d8SLeon Chendefine MAKE_MODULE
96*500d40d8SLeon Chen        $(eval MODULE := $(strip $(1)))
97*500d40d8SLeon Chen        $(eval BUILD_DIR  := ${BUILD_PLAT}/${3})
98*500d40d8SLeon Chen        $(eval SOURCES    := $(2))
99*500d40d8SLeon Chen        $(eval OBJS_TEMP  := $(addprefix $(BUILD_DIR)/$(MODULE)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
100*500d40d8SLeon Chen        $(eval MODULE_OBJS += $(OBJS_TEMP))
101*500d40d8SLeon Chen        # We use sort only to get a list of unique object directory names.
102*500d40d8SLeon Chen        # ordering is not relevant but sort removes duplicates.
103*500d40d8SLeon Chen        $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS_TEMP} ${LINKERFILE})))
104*500d40d8SLeon Chen        # The $(dir ) function leaves a trailing / on the directory names
105*500d40d8SLeon Chen        # Rip off the / to match directory names with make rule targets.
106*500d40d8SLeon Chen        $(eval OBJ_DIRS := $(patsubst %/,%,$(TEMP_OBJ_DIRS)))
107*500d40d8SLeon Chen
108*500d40d8SLeon Chen$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
109*500d40d8SLeon Chen${3}_dirs: | ${OBJ_DIRS}
110*500d40d8SLeon Chen
111*500d40d8SLeon Chen$(eval $(call MAKE_OBJS,$(BUILD_DIR)/$(MODULE),$(SOURCES),${3}))
112*500d40d8SLeon Chen
113*500d40d8SLeon Chenlibraries: $(OBJS_TEMP)
114*500d40d8SLeon Chenendef
115*500d40d8SLeon Chen
116*500d40d8SLeon Chen# Include MTK configuration files
117*500d40d8SLeon Chen
118*500d40d8SLeon Chen# MTK makefile variables
119*500d40d8SLeon ChenMTK_PLAT      := plat/mediatek
120*500d40d8SLeon ChenMTK_PLAT_SOC  := ${MTK_PLAT}/${MTK_SOC}
121*500d40d8SLeon ChenMTK_COMMON_CFG := $(MTK_PLAT)/common/common_config.mk
122*500d40d8SLeon ChenMTK_PLAT_CFG := $(MTK_PLAT_SOC)/plat_config.mk
123*500d40d8SLeon ChenMTK_PROJECT_CFG := $(MTK_PLAT)/project/$(PLAT)/project_config.mk
124*500d40d8SLeon ChenMTK_OPTIONS := $(MTK_PLAT)/build_helpers/options.mk
125*500d40d8SLeon ChenMTK_COND_EVAL := $(MTK_PLAT)/build_helpers/conditional_eval_options.mk
126*500d40d8SLeon Chen
127*500d40d8SLeon Chen# Indicate which BL should be built in command line
128*500d40d8SLeon Chenifeq (${NEED_BL31},yes)
129*500d40d8SLeon ChenMTK_BL := bl31
130*500d40d8SLeon Chenendif
131*500d40d8SLeon Chenifeq (${NEED_BL32},yes)
132*500d40d8SLeon ChenMTK_BL := bl32
133*500d40d8SLeon Chenendif
134*500d40d8SLeon Chen# Include common, platform, board level config
135*500d40d8SLeon Cheninclude $(MTK_COMMON_CFG)
136*500d40d8SLeon Cheninclude $(MTK_PLAT_CFG)
137*500d40d8SLeon Chen-include $(MTK_PROJECT_CFG)
138*500d40d8SLeon Cheninclude $(MTK_COND_EVAL)
139*500d40d8SLeon Cheninclude $(MTK_OPTIONS)
140