第一版通用的项目Makeifle设计详解

本文详细介绍了如何设计一个通用的项目Makefile,旨在简化配置、减少Makefile数量并保持灵活性。重点讲解了文件体系,包括顶层Makefile、inc_path_gen.sh、inc_path.mk、SubMakefile、rules.mk和config.mk的用途和工作流程。通过自动化配置头文件路径、自动生成子目录Makefile,实现了编译过程的高效管理。此外,提供了Makefile命令行操作指南及示例工程代码链接。
摘要由CSDN通过智能技术生成

序言

    前面讲的u-boot的Makefile详解,其实是为自身设计一个通用的项目Makefile设计做铺垫。在做设计通用Makefile的主要有以下几个目标:

  1. 简化配置 – 提取必要的配置项,不需要硬件配置功能
  2. 文件简化 – 所有的子目录Makefile 直接链接顶层SubMakefile文件,极大的减少Makefile的数量与维护
  3. 通用性与灵活性的平衡 – 在编译过程中,自动生成并链接子目录的Makefile,且默认所有在目录下的.c和.S都参与编译。并支持支持自定义的子目录Makefile。(在编译过程中,若检测出已存在Makefile则不生成默认Makefile)
  4. 依赖关系生成 – 必须的

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  = startup/startup.a
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)
# $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
# 生成可执行文件$(OBJ_NAME).elf,并输出$(OBJ_NAME).map文件
${LD} $(LIBS_PATH) $(LDFLAGS) -T$(OBJ_NAME).lds $(START_OBJ) --start-group $(LIBS) --end-group -o $(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值