1

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

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。但是为什么在这两种情况下都表现不同呢?

当我“调试” source-from-object 函数时:

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

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

4

1 回答 1

1

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

你将不得不使用类似的东西:

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

得到你想要的我相信。

或者,您可能会遍历您的目标文件并静态地为它们提供正确的先决条件,并让静态模式规则提供主体。

于 2013-11-01T17:55:51.333 回答