我有一个生成多个目标的make文件。类似的东西:
target-a: target-a.src target-include.src
@$(BUILD_TOOL) -f $< -o $@
target-b: target-b.src target-include.src
@$(BUILD_TOOL) -f $< -o $@
target-c: target-c.src target-include.src
@$(BUILD_TOOL) -f $< -o $@
实际构建过程(上面缩写为$(BUILD_TOOL)
)是涉及编译器,脚本和各种诸如此类的多行事物,但足以说,构建过程作用于第一个目标依赖项($<
)并生成输出目标($@
)。
这非常笨拙。 我下面的内容是否会被视为安全替换上述方法(使用没有后缀的模式规则)?
all: target-a target-b target-c
% : %.src target-include.src
@$(BUILD_TOOL) -f $< -o $@
make工具是GNU,我很满意使用它的强大扩展。
答案 0 :(得分:3)
如果target
是文字字符串,则renierpost的解决方案非常好。如果它不是(或者即使它),这将起作用:
TARGETS := target-a target-b target-c
all: $(TARGETS)
$(TARGETS): % : %.src target-include.src
@$(BUILD_TOOL) -f $< -o $@
请注意,此规则不会构建您不想要的目标,甚至不会构建target-include
。
答案 1 :(得分:1)
这取决于你的Makefile的其余部分,但原则上这应该工作, 如果所有文件都在一个目录中。
最好在目标上使用扩展程序。
target
是一个文字字符串吗?在这种情况下,您可以更具体
(并且使用
all: target-a target-b target-c
target-% : target-%.src target-include.src
@$(BUILD_TOOL) -f $< -o $@
如果您想从文件系统上的target-a target-b target-c
文件名或类似内容中自动推导出target-*.src
的名称,那么GNU make的高级语法将会起作用。