今天给大家介绍一个简单实用的Makefile模板,也可以当做学习Makefile核心内容的范例,里面都有详细的注释,清晰明了。
这个Makefile主要解决以下需求:
###################################################################################### # 需求: #1.编译输出的所有文件均放在一个output目录,.o文件的相对目录应与源码的位置保持一致; #2.需要生成每个.c文件的头文件依赖,当.c文件为xxxx.c时,.o文件名为xxx.o,头文件依赖文件名为.xxx.o.d ######################################################################################
废话不多说,直接上内容:
#######################################################################################################
# 需求:
#1.编译输出的所有文件均放在一个output目录,.o文件的相对目录应与源码的位置保持一致;
#2.需要生成每个.c文件的头文件依赖,当.c文件未xxxx.c时,.o文件名为xxx.o,头文件依赖文件名为.xxx.o.d
#######################################################################################################
# 定义输出目录
OUTPUT := output
OUTPUT_BIN := $(OUTPUT)/test
# 定义.c文件列表
SRC-C += ./src/main.c
SRC-C += ./src/test1/test1.c
SRC-C += ./src/test2/test2.c
SRC-C += ./src/test3/test3.c
# 求出.o文件列表
SRC-O += $(patsubst %.c, $(OUTPUT)/%.o, $(SRC-C))
# 求出.o文件的头文件依赖列表 # output/./src/test1/test1.o ==> output/./src/test1/.test1.o.d
SRC-O-DEPS += $(foreach n, $(SRC-O), $(dir $(n)).$(notdir $(n).d))
# Entry for Makefile
all: info gen_output gen_bin
@echo
@echo Generate $(OUTPUT_BIN) done !
@echo
# Show some variables
info:
@echo
@echo SRC-C=$(SRC-C)
@echo SRC-O=$(SRC-O)
@echo SRC-O-DEPS=$(SRC-O-DEPS)
@echo
# Generate output bin
gen_bin: $(SRC-O) $(SRC-O-DEPS)
touch $(OUTPUT_BIN)
# Create .o files
$(OUTPUT)/%.o:
test -d $(dir $@) || mkdir -p $(dir $@)
touch $@
# Create .o dependent files
$(OUTPUT)/.%.o.d:
touch $@
# Create output path when it's not exist !
gen_output:
test -d $(OUTPUT) || mkdir -p $(OUTPUT)
# Clean builded output files
clean:
rm -rf $(OUTPUT)
.PHONY: info gen_output clean
工程的文件目录结构如下图:
编辑
工程目录执行make即可开始编译,执行make clean即可清除编译文件。
编辑
值得注意的是,Makefile里面都是模拟生成.o .o.d .bin等文件,在实际工程运用中,需要根据自己的实际情况加以修改。
使用过程如有发现问题,可在评论席提出,期待您的宝贵建议,谢谢。
延伸阅读:
1.【Linux + Makefile】十分钟教你学会Makefile的FORCE
\2. 【Linux + Makefile】Makefile的高阶用法:解决C文件包含的头文件修改了,但C文件不重新编译的问题
全部0条评论
快来发表一下你的评论吧 !