xref: /rk3399_ARM-atf/plat/mediatek/build_helpers/mtk_build_helpers.mk (revision ef988aed9e09a4108b87decb14dee5f2d23230a4)
1500d40d8SLeon Chen#
2500d40d8SLeon Chen# Copyright (c) 2022, MediaTek Inc. All rights reserved.
3500d40d8SLeon Chen#
4500d40d8SLeon Chen# SPDX-License-Identifier: BSD-3-Clause
5500d40d8SLeon Chen#
6500d40d8SLeon Chen
7500d40d8SLeon Chen# Get local directory path
8500d40d8SLeon Chendefine GET_LOCAL_DIR
9500d40d8SLeon Chen$(patsubst %/,%,$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))))
10500d40d8SLeon Chenendef
11500d40d8SLeon Chen
12500d40d8SLeon Chen# Clear module source variable
13500d40d8SLeon Chendefine CLEAR_LOCAL_SRCS
14500d40d8SLeon Chen$(eval $(1) :=)
15500d40d8SLeon Chenendef
16500d40d8SLeon Chen
17500d40d8SLeon Chendefine EXPAND_SUB_MAKEFILE
18500d40d8SLeon Cheninclude $(S)
19500d40d8SLeon Chenendef
20500d40d8SLeon Chen
21500d40d8SLeon Chen# Expand sub rules.mk
22500d40d8SLeon Chendefine INCLUDE_MAKEFILE
23500d40d8SLeon Chen$(eval MODULES_SUB_MAKEFILE := $(patsubst %,%/rules.mk,$(1)))
24500d40d8SLeon Chen$(foreach S,$(MODULES_SUB_MAKEFILE),$(eval $(EXPAND_SUB_MAKEFILE)))
25500d40d8SLeon Chenendef
26500d40d8SLeon Chen
27500d40d8SLeon Chen# Determine option variable is defined or not then define it
28500d40d8SLeon Chendefine add_defined_option
29500d40d8SLeon Chenifdef $(1)
30500d40d8SLeon Chenifeq ($(findstring $(value $(1)), $(uppercase_table)),)
31500d40d8SLeon ChenDEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),)
32500d40d8SLeon Chenelse
33500d40d8SLeon Chenifeq ($(strip $(value $(1))),y)
34500d40d8SLeon ChenDEFINES += -D$(1)$(if $(value $(1)),=1,)
35500d40d8SLeon Chenendif
36500d40d8SLeon Chenendif
37500d40d8SLeon Chenendif
38500d40d8SLeon Chenendef
39500d40d8SLeon Chen
40500d40d8SLeon Chendefine EXPAND_RULES_MAKEFILE
41500d40d8SLeon ChenLOCAL_SRCS-y :=
42500d40d8SLeon ChenMODULE :=
43500d40d8SLeon ChenSUB_RULES-y :=
44500d40d8SLeon Cheninclude $(S)
45500d40d8SLeon Chenendef
46500d40d8SLeon Chen
47500d40d8SLeon Chen# INCLUDE_MODULES macro expand included modules rules.mk
48500d40d8SLeon Chen# Arguments:
49500d40d8SLeon Chen#   $(1) = MODULES variables
50500d40d8SLeon Chendefine INCLUDE_MODULES
51500d40d8SLeon Chen$(eval MODULES_TEMP := $(1))
52500d40d8SLeon Chen$(eval MODULES_MAKEFILE := $(patsubst %,%/rules.mk,$(MODULES_TEMP)))
53500d40d8SLeon Chen$(foreach S,$(MODULES_MAKEFILE),$(eval $(EXPAND_RULES_MAKEFILE)))
54500d40d8SLeon Chenendef
55500d40d8SLeon Chen
56500d40d8SLeon Chen# MAKE_LOCALS expand module source file variable to BL${BL}_SOURCES
57500d40d8SLeon Chen# Arguments:
58500d40d8SLeon Chen#   $(1) = source file
59500d40d8SLeon Chen#   $(2) = BL stage (1, 2, 2u, 31, 32)
60500d40d8SLeon Chendefine MAKE_LOCALS
61500d40d8SLeon Chen$(eval $(call uppercase,$(2))_SOURCES += $(1))
62500d40d8SLeon Chenendef
63500d40d8SLeon Chen
64500d40d8SLeon Chen# MAKE_LINKERFILE change linker script source file name to
65500d40d8SLeon Chen# target linker script
66500d40d8SLeon Chen#   $(1) = linker script source file
67500d40d8SLeon Chen#   $(2) = BL stage
68500d40d8SLeon Chendefine MAKE_LINKERFILE
69500d40d8SLeon Chen$(eval EXTRA_GENERATED_LINKER_SCRIPT += $(BUILD_PLAT)/$(2)/$(patsubst %.ld.S,%.ld,$(notdir $(1))))
70500d40d8SLeon Chenendef
71500d40d8SLeon Chen
72500d40d8SLeon Chen# MAKE_LINKERFILE_ITER call MAKE_LINKERFILE iteratively
73500d40d8SLeon Chen#   $(1) = linker script source file
74500d40d8SLeon Chen#   $(2) = BL stage
75500d40d8SLeon Chendefine MAKE_LINKERFILE_ITER
76500d40d8SLeon Chen$(eval $(foreach link_src,$(1),$(call MAKE_LINKERFILE,$(link_src),$(2))))
77500d40d8SLeon Chenendef
78500d40d8SLeon Chen
79500d40d8SLeon Chen# MAKE_LD_ITER generate the linker scripts using the C preprocessor iteratively
80500d40d8SLeon Chen#   $(1) = output linker script
81500d40d8SLeon Chen#   $(2) = input template
82500d40d8SLeon Chen#   $(3) = BL stage (1, 2, 2u, 31, 32)
83500d40d8SLeon Chendefine MAKE_LD_ITER
84500d40d8SLeon Chen$(eval index_list=$(shell seq $(words $(1))))
85500d40d8SLeon Chen$(eval $(foreach i, $(index_list), \
86500d40d8SLeon Chen$(call MAKE_LD,$(word $(i), $(1)), $(word $(i), $(2)),$(3))))
87500d40d8SLeon Chenendef
88500d40d8SLeon Chen
89500d40d8SLeon Chen# MAKE_MODULE reference MAKE_OBJS.
90500d40d8SLeon Chen# Create module folder under out/bl$(BL)/$(module)
91500d40d8SLeon Chen# Arguments:
92500d40d8SLeon Chen#   $(1) = module name
93500d40d8SLeon Chen#   $(2) = source file
94500d40d8SLeon Chen#   $(3) = BL stage
95500d40d8SLeon Chendefine MAKE_MODULE
96500d40d8SLeon Chen        $(eval MODULE := $(strip $(1)))
97500d40d8SLeon Chen        $(eval BUILD_DIR  := ${BUILD_PLAT}/${3})
98500d40d8SLeon Chen        $(eval SOURCES    := $(2))
99500d40d8SLeon Chen        $(eval OBJS_TEMP  := $(addprefix $(BUILD_DIR)/$(MODULE)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
100500d40d8SLeon Chen        $(eval MODULE_OBJS += $(OBJS_TEMP))
101500d40d8SLeon Chen        # We use sort only to get a list of unique object directory names.
102500d40d8SLeon Chen        # ordering is not relevant but sort removes duplicates.
103500d40d8SLeon Chen        $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS_TEMP} ${LINKERFILE})))
104500d40d8SLeon Chen        # The $(dir ) function leaves a trailing / on the directory names
105500d40d8SLeon Chen        # Rip off the / to match directory names with make rule targets.
106500d40d8SLeon Chen        $(eval OBJ_DIRS := $(patsubst %/,%,$(TEMP_OBJ_DIRS)))
107500d40d8SLeon Chen
108500d40d8SLeon Chen$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
109500d40d8SLeon Chen${3}_dirs: | ${OBJ_DIRS}
110500d40d8SLeon Chen
111500d40d8SLeon Chen$(eval $(call MAKE_OBJS,$(BUILD_DIR)/$(MODULE),$(SOURCES),${3}))
112500d40d8SLeon Chen
113500d40d8SLeon Chenlibraries: $(OBJS_TEMP)
114500d40d8SLeon Chenendef
115500d40d8SLeon Chen
116500d40d8SLeon Chen# Include MTK configuration files
117500d40d8SLeon Chen
118500d40d8SLeon Chen# MTK makefile variables
119*ef988aedSRex-BC Chenifeq (${COREBOOT},1)
120*ef988aedSRex-BC ChenMTK_COMMON_CFG := $(MTK_PLAT)/common/coreboot_config.mk
121*ef988aedSRex-BC Chenelse
122*ef988aedSRex-BC ChenMTK_COMMON_CFG := $(MTK_PLAT)/common/common_config.mk
123*ef988aedSRex-BC Chenendif
124500d40d8SLeon ChenMTK_PLAT      := plat/mediatek
125500d40d8SLeon ChenMTK_PLAT_SOC  := ${MTK_PLAT}/${MTK_SOC}
126500d40d8SLeon ChenMTK_PLAT_CFG := $(MTK_PLAT_SOC)/plat_config.mk
127500d40d8SLeon ChenMTK_PROJECT_CFG := $(MTK_PLAT)/project/$(PLAT)/project_config.mk
128500d40d8SLeon ChenMTK_OPTIONS := $(MTK_PLAT)/build_helpers/options.mk
129500d40d8SLeon ChenMTK_COND_EVAL := $(MTK_PLAT)/build_helpers/conditional_eval_options.mk
130500d40d8SLeon Chen
131500d40d8SLeon Chen# Indicate which BL should be built in command line
132500d40d8SLeon Chenifeq (${NEED_BL32},yes)
133500d40d8SLeon ChenMTK_BL := bl32
13452035deeSLeon Chenelse
13552035deeSLeon ChenMTK_BL := bl31
136500d40d8SLeon Chenendif
137500d40d8SLeon Chen# Include common, platform, board level config
138500d40d8SLeon Cheninclude $(MTK_COMMON_CFG)
139500d40d8SLeon Cheninclude $(MTK_PLAT_CFG)
140500d40d8SLeon Chen-include $(MTK_PROJECT_CFG)
141500d40d8SLeon Cheninclude $(MTK_COND_EVAL)
142500d40d8SLeon Cheninclude $(MTK_OPTIONS)
143