在下面的Makefile片段中,makefile行为的正常方式是当foo.o在此处列出依赖项时,如/tmp/foo.o:abc.o xyz.o lmn.o等,然后解析make转到规则列出了如何建立依赖关系(abc.o xyz.o lmn.o)但是这里目标/tmp/foo.o已经列出了没有依赖性,即使然后如何执行下一行或者它只是被忽略。
请尽快解释这个行(%.o:$$(addsuffix /%.c,foo bar)foo.h)的执行方式和原因。任何身体帮助都非常感谢。因为我在make文件上的演讲,我需要它。
.SECONDEXPANSION:
/tmp/foo.o:
%。o:$$(addsuffix /%.c,foo bar)foo.h @echo $ ^
答案 0 :(得分:1)
这是一个特殊的makefile。看来编写它的人并不理解Make ..
使用SECONDEXPANSION
会导致先决条件列表:
$$(addsuffix /%.c,foo bar) foo.h
要扩大两次;首先:
$(addsuffix /%.c,foo bar) foo.h
然后到此:
foo/%.c bar/%.c foo.h
SECONDEXPANSION
的使用完成任何事情。我们也可以写下这样的规则:
%.o: $(addsuffix /%.c,foo bar) foo.h
@echo $^
或者这个:
%.o: foo/%.c bar/%c foo.h
@echo $^
无论如何,这是一种模式规则。如果您尝试构建snaf.o
(并且目标snaf.o
没有明确的规则),那么Make会考虑此规则,匹配词snaf
,以便规则等效于这样:
snaf.o: foo/snaf.c bar/snaf.c foo.h
@echo $^
这些都与目标/tmp/foo.o
无关,因为模式规则与其中包含斜杠的目标不匹配。 (如果模式规则是/tmp/%.o: ...
,那将是一个不同的故事。)因此这两个规则并没有真正相互作用,而且作者的意图也不清楚。