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*a1cc10a9SHsin-Hsiung Wangelse ifneq ($(strip $(value $(1))),n) 333af4eb50SChris 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