1*91f16700Schasinglulu# 2*91f16700Schasinglulu# Copyright (c) 2022, MediaTek Inc. All rights reserved. 3*91f16700Schasinglulu# 4*91f16700Schasinglulu# SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu# 6*91f16700Schasinglulu 7*91f16700Schasinglulu# Get local directory path 8*91f16700Schasingluludefine GET_LOCAL_DIR 9*91f16700Schasinglulu$(patsubst %/,%,$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))) 10*91f16700Schasingluluendef 11*91f16700Schasinglulu 12*91f16700Schasinglulu# Clear module source variable 13*91f16700Schasingluludefine CLEAR_LOCAL_SRCS 14*91f16700Schasinglulu$(eval $(1) :=) 15*91f16700Schasingluluendef 16*91f16700Schasinglulu 17*91f16700Schasingluludefine EXPAND_SUB_MAKEFILE 18*91f16700Schasingluluinclude $(S) 19*91f16700Schasingluluendef 20*91f16700Schasinglulu 21*91f16700Schasinglulu# Expand sub rules.mk 22*91f16700Schasingluludefine INCLUDE_MAKEFILE 23*91f16700Schasinglulu$(eval MODULES_SUB_MAKEFILE := $(patsubst %,%/rules.mk,$(1))) 24*91f16700Schasinglulu$(foreach S,$(MODULES_SUB_MAKEFILE),$(eval $(EXPAND_SUB_MAKEFILE))) 25*91f16700Schasingluluendef 26*91f16700Schasinglulu 27*91f16700Schasinglulu# Determine option variable is defined or not then define it 28*91f16700Schasingluludefine add_defined_option 29*91f16700Schasingluluifdef $(1) 30*91f16700Schasingluluifeq ($(findstring $(value $(1)), $(uppercase_table)),) 31*91f16700SchasingluluDEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),) 32*91f16700Schasingluluelse 33*91f16700Schasingluluifeq ($(strip $(value $(1))),y) 34*91f16700SchasingluluDEFINES += -D$(1)$(if $(value $(1)),=1,) 35*91f16700Schasingluluendif 36*91f16700Schasingluluendif 37*91f16700Schasingluluendif 38*91f16700Schasingluluendef 39*91f16700Schasinglulu 40*91f16700Schasingluludefine EXPAND_RULES_MAKEFILE 41*91f16700SchasingluluLOCAL_SRCS-y := 42*91f16700SchasingluluMODULE := 43*91f16700SchasingluluSUB_RULES-y := 44*91f16700Schasingluluinclude $(S) 45*91f16700Schasingluluendef 46*91f16700Schasinglulu 47*91f16700Schasinglulu# INCLUDE_MODULES macro expand included modules rules.mk 48*91f16700Schasinglulu# Arguments: 49*91f16700Schasinglulu# $(1) = MODULES variables 50*91f16700Schasingluludefine INCLUDE_MODULES 51*91f16700Schasinglulu$(eval MODULES_TEMP := $(1)) 52*91f16700Schasinglulu$(eval MODULES_MAKEFILE := $(patsubst %,%/rules.mk,$(MODULES_TEMP))) 53*91f16700Schasinglulu$(foreach S,$(MODULES_MAKEFILE),$(eval $(EXPAND_RULES_MAKEFILE))) 54*91f16700Schasingluluendef 55*91f16700Schasinglulu 56*91f16700Schasinglulu# MAKE_LOCALS expand module source file variable to BL${BL}_SOURCES 57*91f16700Schasinglulu# Arguments: 58*91f16700Schasinglulu# $(1) = source file 59*91f16700Schasinglulu# $(2) = BL stage (1, 2, 2u, 31, 32) 60*91f16700Schasingluludefine MAKE_LOCALS 61*91f16700Schasinglulu$(eval $(call uppercase,$(2))_SOURCES += $(1)) 62*91f16700Schasingluluendef 63*91f16700Schasinglulu 64*91f16700Schasinglulu# MAKE_MODULE reference MAKE_OBJS. 65*91f16700Schasinglulu# Create module folder under out/bl$(BL)/$(module) 66*91f16700Schasinglulu# Arguments: 67*91f16700Schasinglulu# $(1) = module name 68*91f16700Schasinglulu# $(2) = source file 69*91f16700Schasinglulu# $(3) = BL stage 70*91f16700Schasingluludefine MAKE_MODULE 71*91f16700Schasinglulu $(eval MODULE := $(strip $(1))) 72*91f16700Schasinglulu $(eval BUILD_DIR := ${BUILD_PLAT}/${3}) 73*91f16700Schasinglulu $(eval SOURCES := $(2)) 74*91f16700Schasinglulu $(eval OBJS_TEMP := $(addprefix $(BUILD_DIR)/$(MODULE)/,$(call SOURCES_TO_OBJS,$(SOURCES)))) 75*91f16700Schasinglulu $(eval MODULE_OBJS += $(OBJS_TEMP)) 76*91f16700Schasinglulu # We use sort only to get a list of unique object directory names. 77*91f16700Schasinglulu # ordering is not relevant but sort removes duplicates. 78*91f16700Schasinglulu $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS_TEMP} ${LINKERFILE}))) 79*91f16700Schasinglulu # The $(dir ) function leaves a trailing / on the directory names 80*91f16700Schasinglulu # Rip off the / to match directory names with make rule targets. 81*91f16700Schasinglulu $(eval OBJ_DIRS := $(patsubst %/,%,$(TEMP_OBJ_DIRS))) 82*91f16700Schasinglulu 83*91f16700Schasinglulu$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR}))) 84*91f16700Schasinglulu${3}_dirs: | ${OBJ_DIRS} 85*91f16700Schasinglulu 86*91f16700Schasinglulu$(eval $(call MAKE_OBJS,$(BUILD_DIR)/$(MODULE),$(SOURCES),${3})) 87*91f16700Schasinglulu 88*91f16700Schasinglululibraries: $(OBJS_TEMP) 89*91f16700Schasingluluendef 90*91f16700Schasinglulu 91*91f16700Schasinglulu# Include MTK configuration files 92*91f16700Schasinglulu 93*91f16700Schasinglulu# MTK makefile variables 94*91f16700Schasingluluifeq (${COREBOOT},1) 95*91f16700SchasingluluMTK_COMMON_CFG := $(MTK_PLAT)/common/coreboot_config.mk 96*91f16700Schasingluluelse 97*91f16700SchasingluluMTK_COMMON_CFG := $(MTK_PLAT)/common/common_config.mk 98*91f16700Schasingluluendif 99*91f16700SchasingluluMTK_PLAT := plat/mediatek 100*91f16700SchasingluluMTK_PLAT_SOC := ${MTK_PLAT}/${MTK_SOC} 101*91f16700SchasingluluMTK_PLAT_CFG := $(MTK_PLAT_SOC)/plat_config.mk 102*91f16700SchasingluluMTK_PROJECT_CFG := $(MTK_PLAT)/project/$(PLAT)/project_config.mk 103*91f16700SchasingluluMTK_OPTIONS := $(MTK_PLAT)/build_helpers/options.mk 104*91f16700SchasingluluMTK_COND_EVAL := $(MTK_PLAT)/build_helpers/conditional_eval_options.mk 105*91f16700Schasinglulu 106*91f16700Schasinglulu# Indicate which BL should be built in command line 107*91f16700Schasingluluifeq (${NEED_BL32},yes) 108*91f16700SchasingluluMTK_BL := bl32 109*91f16700Schasingluluelse 110*91f16700SchasingluluMTK_BL := bl31 111*91f16700Schasingluluendif 112*91f16700Schasinglulu# Include common, platform, board level config 113*91f16700Schasingluluinclude $(MTK_COMMON_CFG) 114*91f16700Schasingluluinclude $(MTK_PLAT_CFG) 115*91f16700Schasinglulu-include $(MTK_PROJECT_CFG) 116*91f16700Schasingluluinclude $(MTK_COND_EVAL) 117*91f16700Schasingluluinclude $(MTK_OPTIONS) 118