Makefile 列出依赖项
Makefile listing the dependencies
在下面的 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) 的执行方式和原因。非常感谢任何 body 的帮助。我需要它,因为我讲了 make 文件。
.SECONDEXPANSION:
/tmp/foo.o:
%.o: $$(addsuffix /%.c,foo bar) foo.h
@echo $^
这是一个特殊的生成文件。看来写的人对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 $^
其中的 None 与目标 /tmp/foo.o
有任何关系,因为模式规则不会匹配其中包含斜杠的目标。 (如果模式规则是/tmp/%.o: ...
,那就另当别论了。)所以这两个规则并没有真正相互作用,作者的意图也不清楚。
在下面的 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) 的执行方式和原因。非常感谢任何 body 的帮助。我需要它,因为我讲了 make 文件。
.SECONDEXPANSION:
/tmp/foo.o:
%.o: $$(addsuffix /%.c,foo bar) foo.h @echo $^
这是一个特殊的生成文件。看来写的人对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 $^
其中的 None 与目标 /tmp/foo.o
有任何关系,因为模式规则不会匹配其中包含斜杠的目标。 (如果模式规则是/tmp/%.o: ...
,那就另当别论了。)所以这两个规则并没有真正相互作用,作者的意图也不清楚。