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