如何编写含多目标依赖且执行相同规则的GNU Makefile?求替代方案
嘿,你已经用define函数搞定了多目标共享规则的问题,不错嘛!其实GNU Make还有几种更灵活的替代方案,我给你梳理一下:
方案1:多目标规则(最简洁的无规律配对)
如果你的目标和依赖是无规律的一对一配对,直接先单独定义每个目标的依赖,再把所有目标放在同一个规则块里共享命令就行:
# 先逐个定义目标-依赖关系 a: b c: d e: f # 给所有目标统一指定执行命令 a c e: cp $< $@
Make会自动为每个目标匹配对应的依赖,执行命令时$<会替换成当前目标的依赖,$@替换成当前目标,完全满足你的需求。
方案2:静态模式规则(适合有命名规律的场景)
如果你的目标和依赖有固定的命名模式(比如目标是a依赖a_src,c依赖c_src),静态模式规则会更高效:
# 假设目标是a、c、e,对应依赖是a_src、c_src、e_src TARGETS := a c e $(TARGETS): %: %_src cp $< $@
这种方式不用逐个写依赖,只要符合%匹配的模式,Make会自动关联目标和依赖。
方案3:foreach循环+eval(适合大量目标-依赖对)
如果你有几十上百组目标-依赖对,手动写太麻烦,可以用foreach遍历配对列表,再用eval生成规则:
# 定义所有目标-依赖对,用空格分隔每一组(格式:目标:依赖) PAIRS := a:b c:d e:f # 遍历每一组,自动生成目标-依赖规则 $(foreach pair,$(PAIRS), \ $(eval $(firstword $(subst :, ,$(pair))):$(lastword $(subst :, ,$(pair)))) \ ) # 统一指定执行命令 a c e: cp $< $@
这样新增配对时,只要在PAIRS里加一行就行,不用改其他地方,维护起来很方便。
方案4:模式规则(通用匹配场景)
如果你的目标和依赖的后缀有规律(比如目标是.txt文件,依赖是.md文件),模式规则是最通用的选择:
%.txt: %.md cp $< $@
所有.txt目标都会自动匹配对应的.md依赖,执行复制命令。
这些方法各有优劣,你可以根据自己的目标数量、命名规律来选最顺手的~
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

