从相同的源生成多个可执行文件

时间:2013-11-01 17:40:14

标签: makefile

要从同一个源构建多个可执行文件,我必须使用不同的编译器开关翻译每个源文件。对于每个变体,我都有一组要设置的定义。我想将生成的对象文件存储到不同的子文件夹中。我有一个变量,保留所有变体的所有目标文件。现在我有问题来定义一个适当的静态规则来从源构建目标文件:

SOURCEEXT=.c
ALL_OBJECT_FILES := abcdefg/cctalkio.o tollcoll/cctalkio.o
source-from-object = $(addsuffix $(SOURCEEXT),$(basename $(notdir $(1))))

$(ALL_OBJECT_FILES): %.o: $(call source-from-object,%.o)
    @echo $*.o

当我运行make abcdefg/cctalkio.o时,我得到:

make: *** No rule to make target 'abcdefg/cctalkio.c', needed by 'abcdefg/cctalkio.o'.  Schluss.

同样,当我简化规则时:

abcdefg/cctalkio.o: %.o: $(call source-from-object,%.o)
    @echo $*.o

但是当我将规则更改为:

abcdefg/cctalkio.o: %.o: $(call source-from-object,abcdefg/cctalkio.o)
    @echo $*.o

我将abcdefg/cctalkio.o作为输出。所以词干似乎是abcdefg/cctalkio,因此%.o应该与abcdefg/cctalkio.o相同。但为什么两种情况下的表现都不同?

当我“调试”源对象函数时:

debug:
    @echo $(call source-from-object,/abcdefg/cctalkio.o)

我得到了预期的结果cctalkio.c,所以看起来函数正在运行。

1 个答案:

答案 0 :(得分:1)

您的$(call)在先决条件中立即发生,因此您的函数实际上正在传递%。o(不是您期望的匹配结果)。

你必须使用类似的东西:

.SECONDEXPANSION:
abcdefg/cctalkio.o: %.o: $$(call source-from-object,%.o)
        ...

得到你想要的东西我相信。

或者你可以循环遍历你的目标文件并静态地给它们正确的先决条件,然后让静态模式规则为主体提供。