要从同一个源构建多个可执行文件,我必须使用不同的编译器开关翻译每个源文件。对于每个变体,我都有一组要设置的定义。我想将生成的对象文件存储到不同的子文件夹中。我有一个变量,保留所有变体的所有目标文件。现在我有问题来定义一个适当的静态规则来从源构建目标文件:
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
,所以看起来函数正在运行。
答案 0 :(得分:1)
您的$(call)
在先决条件中立即发生,因此您的函数实际上正在传递%。o(不是您期望的匹配结果)。
你必须使用类似的东西:
.SECONDEXPANSION:
abcdefg/cctalkio.o: %.o: $$(call source-from-object,%.o)
...
得到你想要的东西我相信。
或者你可以循环遍历你的目标文件并静态地给它们正确的先决条件,然后让静态模式规则为主体提供。