如何管理没有后缀的make目标?

时间:2011-08-09 16:23:08

标签: makefile gnu-make

我有一个生成多个目标的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,我很满意使用它的强大扩展。

2 个答案:

答案 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的高级语法将会起作用。