GNU Make可选依赖实现:寻求更优构建方案咨询
GNU Make 按需依赖与参数传递的优化实现方式咨询
需求描述
- 构建一系列目标文件(例如
a.out),主输入文件为同名的a.in - 若存在同名的
a.suppsrc文件,需先通过它构建出a.supplement,并将a.supplement作为a.out的依赖(按需构建),同时作为参数传入构建程序 - 构建程序无法处理不存在的文件参数,因此无对应
supplement文件时,构建命令必须省略该参数
现有实现过程
初始隐式规则
首先定义基础的构建规则:
%.out: %.in $(BUILDER) -o $@ -i $< %.supplement: %.suppsrc $(SUPPBUILD) -o $@ -i $<
这里a.out依赖a.in,a.supplement依赖a.suppsrc,但未处理两者的关联逻辑。
直接添加依赖的问题
尝试直接将%.supplement设为%.out的依赖:
%.out: %.in %.supplement $(BUILDER) -o $@ -i $< supplement=$*.supplement
问题:无论
suppsrc文件是否存在,Make都会尝试寻找或构建%.supplement,无对应文件时直接导致构建失败。
二次扩展解决依赖,但参数仍有问题
使用.SECONDEXPANSION结合wildcard检测suppsrc文件,动态添加依赖:
.SECONDEXPANSION: %.out: %.in $(patsubst %.suppsrc,%.supplement,$$(wildcard %.suppsrc)) $(BUILDER) -o $@ -i $< supplement=$*.supplement
问题:依赖逻辑正确了,但无
supplement文件时,构建命令仍会传递supplement=参数,导致构建程序报错。
最终可行方案
通过$*自动变量结合wildcard,同时处理依赖和参数的动态添加:
.SECONDEXPANSION: %.out: %.in $(patsubst %.suppsrc,%.supplement,$$(wildcard %.suppsrc)) $(BUILDER) -o $@ -i $< $(patsubst %.suppsrc,supplement:%.supplement,$(wildcard $*.suppsrc))
该方案实现了:仅当同名suppsrc文件存在时,才添加supplement依赖及对应参数;否则仅使用主输入文件构建。
问题咨询
除了上述实现方式,还有哪些更简洁、更符合GNU Make最佳实践的优化方案?
内容的提问来源于stack exchange,提问作者Keith Davies
相关产品推荐
相关产品推荐

