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