【问题标题】:Makefile listing the dependencies列出依赖项的 Makefile
【发布时间】:2015-01-03 04:30:46
【问题描述】:

在 Makefile 的 sn-p 下面,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 file 讲座。

.SECONDEXPANSION:

/tmp/foo.o:

%.o: $$(addsuffix /%.c,foo bar) foo.h @echo $^

【问题讨论】:

    标签: makefile


    【解决方案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: ...,那就另当别论了。)所以这两个规则并没有真正交互,作者的意图也不清楚。

    【讨论】:

    • 感谢您的回复先生!!!!!!!!!!!!但我的问题是,如果一个目标有一个空列表并且没有明确的规则,那么下一行遵循模式规则,就像在这种情况下“目标 foo.o:没有依赖列表和明确的规则”,那么 make 将自动执行对于 %.o: 规则或它忽略。这是我想知道的请解释一下?
    • @Beta,至于This is a peculiar makefile.。这个 makefile 来自 make doc:gnu.org/software/make/manual/html_node/Secondary-Expansion.html,段落 Secondary Expansion of Implicit Rules
    • 是的,先生!!!!它来自制作文档,但在讲座中它是参考点。所以请解释一下上面的问题,如果一个目标没有依赖列表,也没有明确的规则和模式规则,那么 make 会自动考虑目标的模式规则,或者有一些其他的机制。
    猜你喜欢
    • 2016-09-14
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2013-04-27
    相关资源
    最近更新 更多