Makefile延迟编译问题:如何合并多目标CFLAGS后再编译?
解决Makefile多配置编译标志合并问题
问题原因
执行make debug perf时,Make会逐个处理debug和perf目标:
- 处理
debug时,给该目标上下文的CFLAGS追加-g,编译生成executable; - 处理
perf时,虽给该目标上下文的CFLAGS追加-D__PERF__,但此时executable已是最新状态,Make会跳过编译步骤。
且两个目标的CFLAGS是独立作用的,不会自动合并。
解决方案
通过Make内置变量MAKECMDGOALS获取命令行指定的所有目标,提前合并所有需要的编译标志,再执行一次编译。修改后的Makefile如下:
CFLAGS = -std=c11 -Wall -pedantic -D_GNU_SOURCE # 根据命令行传入的目标追加对应编译标志 ifneq (,$(filter debug,$(MAKECMDGOALS))) CFLAGS += -g endif ifneq (,$(filter perf,$(MAKECMDGOALS))) CFLAGS += -D__PERF__ endif # 声明伪目标,避免与同名文件冲突 .PHONY: debug perf executable # debug和perf仅作为编译触发入口 debug: executable perf: executable # 统一编译目标 executable: gcc $(CFLAGS) main.c -o exe
说明
MAKECMDGOALS存储命令行指定的所有目标,通过filter函数判断是否包含debug或perf,从而追加对应编译标志;.PHONY声明确保这些目标不会被目录下的同名文件干扰;- 无论执行
make debug、make perf还是make debug perf,都会先合并所有需要的编译标志,仅执行一次编译,不会重复编译或遗漏标志。
内容的提问来源于stack exchange,提问作者Rui Gonçalves
相关产品推荐
相关产品推荐

