Makefile列出了依赖项

时间:2015-01-03 04:30:46

标签: makefile

在下面的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 $ ^

1 个答案:

答案 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: ...,那将是一个不同的故事。)因此这两个规则并没有真正相互作用,而且作者的意图也不清楚。