序言
前面讲的u-boot的Makefile详解,其实是为自身设计一个通用的项目Makefile设计做铺垫。在做设计通用Makefile的主要有以下几个目标:
- 简化配置 – 提取必要的配置项,不需要硬件配置功能
- 文件简化 – 所有的子目录Makefile 直接链接顶层SubMakefile文件,极大的减少Makefile的数量与维护
- 通用性与灵活性的平衡 – 在编译过程中,自动生成并链接子目录的Makefile,且默认所有在目录下的.c和.S都参与编译。并支持支持自定义的子目录Makefile。(在编译过程中,若检测出已存在Makefile则不生成默认Makefile)
- 依赖关系生成 – 必须的
Makefile文件体系
名 称 |
描 述 |
顶层Makefile |
从总体上控制着u-boot的编译、连接,定义总目标u-boot.bin |
顶层config.mk |
规定了编译的规则,被所有Makefile所调用 |
顶层rules.mk |
生成依赖关系,被各级子目录Makefile所调用 |
各级子目录Makefile |
决定当前目录的编译、连接 |
顶层inc_path_gen.sh |
头文件路径变量生成shell脚本 |
u-boot编译过程中生成的与编译相关的文件
名 称 |
描 述 |
inc_path.mk |
由顶层inc_path_gen.sh所生成的头文件路径变量赋值文件 |
顶层Makefile脚本
TOP_DIR = $(shell /bin/pwd)
include $(TOP_DIR)/config.mk
OBJ_NAME = bootloader
START_OBJ = startup/Start.o
LIBS = boot/boot.a
LIBS += hw/hw.a
export TOP_DIR OBJ_NAME
.PHONY : config unconfig clean distclean $(OBJ_NAME).bin mfclean $(LIBS)
ALL: $(OBJ_NAME).bin
$(OBJ_NAME).bin: $(START_OBJ) $(LIBS)
${LD} $(LIBS_PATH) $(LDFLAGS) -T$(OBJ_NAME).lds $(START_OBJ) --start-group $(LIBS) --end-group -o $(