xref: /rk3399_ARM-atf/plat/mediatek/build_helpers/mtk_build_helpers.mk (revision 3af4eb50c0b29474eaa05d62673abc796348bd5c)
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 ($(strip $(value $(1))),y)
31500d40d8SLeon ChenDEFINES += -D$(1)$(if $(value $(1)),=1,)
32*3af4eb50SChris Kayelse
33*3af4eb50SChris KayDEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),)
34500d40d8SLeon Chenendif
35500d40d8SLeon Chenendif
36500d40d8SLeon Chenendef
37500d40d8SLeon Chen
38500d40d8SLeon Chendefine EXPAND_RULES_MAKEFILE
39500d40d8SLeon ChenLOCAL_SRCS-y :=
40500d40d8SLeon ChenMODULE :=
41500d40d8SLeon ChenSUB_RULES-y :=
42500d40d8SLeon Cheninclude $(S)
43500d40d8SLeon Chenendef
44500d40d8SLeon Chen
45500d40d8SLeon Chen# INCLUDE_MODULES macro expand included modules rules.mk
46500d40d8SLeon Chen# Arguments:
47500d40d8SLeon Chen#   $(1) = MODULES variables
48500d40d8SLeon Chendefine INCLUDE_MODULES
49500d40d8SLeon Chen$(eval MODULES_TEMP := $(1))
50500d40d8SLeon Chen$(eval MODULES_MAKEFILE := $(patsubst %,%/rules.mk,$(MODULES_TEMP)))
51500d40d8SLeon Chen$(foreach S,$(MODULES_MAKEFILE),$(eval $(EXPAND_RULES_MAKEFILE)))
52500d40d8SLeon Chenendef
53500d40d8SLeon Chen
54500d40d8SLeon Chen# MAKE_LOCALS expand module source file variable to BL${BL}_SOURCES
55500d40d8SLeon Chen# Arguments:
56500d40d8SLeon Chen#   $(1) = source file
57500d40d8SLeon Chen#   $(2) = BL stage (1, 2, 2u, 31, 32)
58500d40d8SLeon Chendefine MAKE_LOCALS
59500d40d8SLeon Chen$(eval $(call uppercase,$(2))_SOURCES += $(1))
60500d40d8SLeon Chenendef
61500d40d8SLeon Chen
62500d40d8SLeon Chen# MAKE_MODULE reference MAKE_OBJS.
63500d40d8SLeon Chen# Create module folder under out/bl$(BL)/$(module)
64500d40d8SLeon Chen# Arguments:
65500d40d8SLeon Chen#   $(1) = module name
66500d40d8SLeon Chen#   $(2) = source file
67500d40d8SLeon Chen#   $(3) = BL stage
68500d40d8SLeon Chendefine MAKE_MODULE
69500d40d8SLeon Chen        $(eval MODULE := $(strip $(1)))
70500d40d8SLeon Chen        $(eval BUILD_DIR  := ${BUILD_PLAT}/${3})
71500d40d8SLeon Chen        $(eval SOURCES    := $(2))
72500d40d8SLeon Chen        $(eval OBJS_TEMP  := $(addprefix $(BUILD_DIR)/$(MODULE)/,$(call SOURCES_TO_OBJS,$(SOURCES))))
73500d40d8SLeon Chen        $(eval MODULE_OBJS += $(OBJS_TEMP))
74500d40d8SLeon Chen        # We use sort only to get a list of unique object directory names.
75500d40d8SLeon Chen        # ordering is not relevant but sort removes duplicates.
76500d40d8SLeon Chen        $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS_TEMP} ${LINKERFILE})))
77500d40d8SLeon Chen        # The $(dir ) function leaves a trailing / on the directory names
78500d40d8SLeon Chen        # Rip off the / to match directory names with make rule targets.
79500d40d8SLeon Chen        $(eval OBJ_DIRS := $(patsubst %/,%,$(TEMP_OBJ_DIRS)))
80500d40d8SLeon Chen
81500d40d8SLeon Chen$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR})))
82500d40d8SLeon Chen${3}_dirs: | ${OBJ_DIRS}
83500d40d8SLeon Chen
84500d40d8SLeon Chen$(eval $(call MAKE_OBJS,$(BUILD_DIR)/$(MODULE),$(SOURCES),${3}))
85500d40d8SLeon Chen
86500d40d8SLeon Chenlibraries: $(OBJS_TEMP)
87500d40d8SLeon Chenendef
88500d40d8SLeon Chen
89500d40d8SLeon Chen# Include MTK configuration files
90500d40d8SLeon Chen
91500d40d8SLeon Chen# MTK makefile variables
92ef988aedSRex-BC Chenifeq (${COREBOOT},1)
93ef988aedSRex-BC ChenMTK_COMMON_CFG := $(MTK_PLAT)/common/coreboot_config.mk
94ef988aedSRex-BC Chenelse
95ef988aedSRex-BC ChenMTK_COMMON_CFG := $(MTK_PLAT)/common/common_config.mk
96ef988aedSRex-BC Chenendif
97500d40d8SLeon ChenMTK_PLAT      := plat/mediatek
98500d40d8SLeon ChenMTK_PLAT_SOC  := ${MTK_PLAT}/${MTK_SOC}
99500d40d8SLeon ChenMTK_PLAT_CFG := $(MTK_PLAT_SOC)/plat_config.mk
100500d40d8SLeon ChenMTK_PROJECT_CFG := $(MTK_PLAT)/project/$(PLAT)/project_config.mk
101500d40d8SLeon ChenMTK_OPTIONS := $(MTK_PLAT)/build_helpers/options.mk
102500d40d8SLeon ChenMTK_COND_EVAL := $(MTK_PLAT)/build_helpers/conditional_eval_options.mk
103500d40d8SLeon Chen
10452035deeSLeon ChenMTK_BL := bl31
1059c41cc18SHsin-Hsiung Wang
106500d40d8SLeon Chen# Include common, platform, board level config
107500d40d8SLeon Cheninclude $(MTK_COMMON_CFG)
108500d40d8SLeon Cheninclude $(MTK_PLAT_CFG)
109500d40d8SLeon Chen-include $(MTK_PROJECT_CFG)
110500d40d8SLeon Cheninclude $(MTK_COND_EVAL)
111500d40d8SLeon Cheninclude $(MTK_OPTIONS)
112