根目录Makefile
初始化一些变量
TARGETS := model executiontb cpu
ROOT_DIR?=$(abspath $(CURDIR))
OUT_DIR?=$(abspath $(CURDIR))
ADDR_FILE:=$(ROOT_DIR)/build/mmu_addr.txt
make all 执行 make help
all: help
.PHONY后面跟的目标都被称为伪目标,也就是说我们 make 命令后面跟的参数如果出现在.PHONY 定义的伪目标中,那就直接在Makefile中就执行伪目标的依赖和命令。不管Makefile同级目录下是否有该伪目标同名的文件,即使有也不会产生冲突。另一个就是提高执行makefile时的效率
.PHONY: session_dump_file
session_dump_file:
ifndef SESSION_DUMP
$(error No SESSION_DUMP file provided)
endif
echo和@echo的区别
make 在执行命令之前会把要执行的命令进行输出,称之为回显
如果要执行的命令以字符 @ 开始,则不会回显,例如:
1. @echo XXX
在执行命令时,将输出
XXX
2. echo XXX
在执行命令时,将输出
echo XXX
XXX
@echo "Binarizing $(SESSION_DUMP) -> ${OUT_DIR}/src/session_dump.c"
build/bin2a.sh -l $(SESSION_DUMP) g_session_dump > ${OUT_DIR}/src/session_dump.c
.PHONY: self_check
self_check:
ifdef SELF_CHECK
@echo "SELF_CHECK enabled: Binarizing $(SELF_CHECK) -> ${OUT_DIR}/src/self_check_reference.c"
build/bin2a.sh -i $(SELF_CHECK) g_self_check_reference > ${OUT_DIR}/src/self_check_reference.c
endif
define
endef
定义一个函数
可以通过$(call xxx)来进行调用
define target_rule
$(1): session_dump_file self_check
ifeq ($(PRE_CONVERT_PTABLE), 1)
$$(MAKE) -f build/compile-$(1).mk ROOT_DIR=$(ROOT_DIR) OUT_DIR=$(OUT_DIR) ADDR_FILE=$(ADDR_FILE)
python $(ROOT_DIR)/build/mmu_restore.py -i $(SESSION_DUMP) -s $(ADDR_FILE) -b 0
/bin/rm -rf obj bin
/bin/rm $(ADDR_FILE)
/bin/mv $(SESSION_DUMP).tmp $(SESSION_DUMP)
build/bin2a.sh -l $(SESSION_DUMP) g_session_dump > ${OUT_DIR}/src/session_dump.c
endif
顶层Makefile使用make -f调用子目录中的文件(文件名可以随意,不一定用Makefile作为文件名)作为Makefile,经测试,在顶层Makefile中使用-f选项,例如make -f ./xxx/xx/build.mk 此时make命令的工作目录仍然是顶层目录,即CUDIR变量依然是./目录而不是./xxx/xx/目录
$$(MAKE) -f build/compile-$(1).mk ROOT_DIR=$(ROOT_DIR) OUT_DIR=$(OUT_DIR)
.PHONY: $(1)