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