Makefile 当只指定了没有(显式)先决条件的目标时,会调用哪些make隐式规则?
我在Makefile 当只指定了没有(显式)先决条件的目标时,会调用哪些make隐式规则?,makefile,Makefile,我在src目录中有源文件偶数\奇数\列表.c。这是我正在试验的makefile VPATH = src include CPPFLAGS = -I include even_odd_list: 我已经调用了make-pn来检查所有的隐式规则,但是我没有看到一个似乎适用的规则 我错过了什么?请解释make正在执行的逻辑流。make将匹配此隐式规则(通过检查make-pf/def/null找到): 这里忽略的事实是,如何使目标与隐式规则匹配。在这种情况下,没有指定先决条件,但是如果规则的先决条件
src
目录中有源文件偶数\奇数\列表.c
。这是我正在试验的makefile
VPATH = src include
CPPFLAGS = -I include
even_odd_list:
我已经调用了make-pn
来检查所有的隐式规则,但是我没有看到一个似乎适用的规则
我错过了什么?请解释make正在执行的逻辑流。make将匹配此隐式规则(通过检查
make-pf/def/null
找到):
这里忽略的事实是,如何使目标与隐式规则匹配。在这种情况下,没有指定先决条件,但是如果规则的先决条件存在或应该存在并且可以生成,make将匹配隐式规则。当匹配隐式规则的先决条件存在且未指定时,将其视为隐式先决条件 因此,要匹配的第一条规则是:
%: %.c
# commands to execute (built-in):
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
此页面有更多信息
使用make-d
将显示make正在执行的步骤。以下是此示例的相关输出:
Updating goal targets....
Considering target file `even_odd_list'.
File `even_odd_list' does not exist.
Looking for an implicit rule for `even_odd_list'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.o'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.c'.
Found prerequisite `even_odd_list.c' as VPATH `src/even_odd_list.c'
Found an implicit rule for `even_odd_list'.
Considering target file `even_odd_list.c'.
Looking for an implicit rule for `even_odd_list.c'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.y'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.l'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.w'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.w'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `even_odd_list.c,v'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `RCS/even_odd_list.c,v'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `RCS/even_odd_list.c'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `s.even_odd_list.c'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `SCCS/s.even_odd_list.c'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.y'.
Looking for a rule with intermediate file `even_odd_list.y'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `even_odd_list.y,v'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `RCS/even_odd_list.y,v'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `RCS/even_odd_list.y'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `s.even_odd_list.y'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `SCCS/s.even_odd_list.y'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.l'.
Looking for a rule with intermediate file `even_odd_list.l'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `even_odd_list.l,v'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `RCS/even_odd_list.l,v'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `RCS/even_odd_list.l'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `s.even_odd_list.l'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `SCCS/s.even_odd_list.l'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.w'.
Looking for a rule with intermediate file `even_odd_list.w'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `even_odd_list.w,v'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `RCS/even_odd_list.w,v'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `RCS/even_odd_list.w'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `s.even_odd_list.w'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `SCCS/s.even_odd_list.w'.
Trying pattern rule with stem `even_odd_list'.
Rejecting impossible implicit prerequisite `even_odd_list.w'.
No implicit rule found for `even_odd_list.c'.
Finished prerequisites of target file `even_odd_list.c'.
No need to remake target `even_odd_list.c'; using VPATH name `src/even_odd_list.c'.
Finished prerequisites of target file `even_odd_list'.
Must remake target `even_odd_list'.
cc -I include src/even_odd_list.c -o even_odd_list
Putting child 0x085fbe90 (even_odd_list) PID 24853 on the chain.
Live child 0x085fbe90 (even_odd_list) PID 24853
Reaping winning child 0x085fbe90 PID 24853
Removing child 0x085fbe90 PID 24853 from chain.
Successfully remade target file `even_odd_list'.
谢谢你的回答,但我也想知道为什么。在做了更多的挖掘和检查make-d的输出之后,我开始更多地研究隐含的先决条件;你没有问其他问题。为什么?Make选择该规则是因为(a)makefile中没有为该目标定义配方,以及(b)规则中的
%
模式匹配您要构建的目标(%
当然匹配所有内容),以及(c)该规则的先决条件%.c
(既然%
匹配奇偶列表
那么%.c
匹配奇偶列表.c
)存在。所以make使用了这个规则。我本来可以说得更好。我正在学习一本书,书中包含了源文件作为先决条件,所以我认为这是必要的,但现在看来它是多余的。源文件是一个隐含的先决条件;这很有意义。在我发布的make文件中,我想知道目标文件如何匹配wi您指定的规则。了解隐含的先决条件似乎很清楚。如果您正在编写自己的显式规则和配方,那么您必须自己提供所有先决条件,包括.c
文件。如果您使用的是隐式规则,则make将选择“最佳”隐式规则(确切的算法在GNU make手册中有描述)基于它可用的文件,或者知道如何构建。在这种情况下,它通常知道至少一个已经存在的先决条件,因为它在隐式规则中有描述。
Updating goal targets....
Considering target file `even_odd_list'.
File `even_odd_list' does not exist.
Looking for an implicit rule for `even_odd_list'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.o'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.c'.
Found prerequisite `even_odd_list.c' as VPATH `src/even_odd_list.c'
Found an implicit rule for `even_odd_list'.
Considering target file `even_odd_list.c'.
Looking for an implicit rule for `even_odd_list.c'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.y'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.l'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.w'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.w'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `even_odd_list.c,v'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `RCS/even_odd_list.c,v'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `RCS/even_odd_list.c'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `s.even_odd_list.c'.
Trying pattern rule with stem `even_odd_list.c'.
Trying implicit prerequisite `SCCS/s.even_odd_list.c'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.y'.
Looking for a rule with intermediate file `even_odd_list.y'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `even_odd_list.y,v'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `RCS/even_odd_list.y,v'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `RCS/even_odd_list.y'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `s.even_odd_list.y'.
Trying pattern rule with stem `even_odd_list.y'.
Trying implicit prerequisite `SCCS/s.even_odd_list.y'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.l'.
Looking for a rule with intermediate file `even_odd_list.l'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `even_odd_list.l,v'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `RCS/even_odd_list.l,v'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `RCS/even_odd_list.l'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `s.even_odd_list.l'.
Trying pattern rule with stem `even_odd_list.l'.
Trying implicit prerequisite `SCCS/s.even_odd_list.l'.
Trying pattern rule with stem `even_odd_list'.
Trying implicit prerequisite `even_odd_list.w'.
Looking for a rule with intermediate file `even_odd_list.w'.
Avoiding implicit rule recursion.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `even_odd_list.w,v'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `RCS/even_odd_list.w,v'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `RCS/even_odd_list.w'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `s.even_odd_list.w'.
Trying pattern rule with stem `even_odd_list.w'.
Trying implicit prerequisite `SCCS/s.even_odd_list.w'.
Trying pattern rule with stem `even_odd_list'.
Rejecting impossible implicit prerequisite `even_odd_list.w'.
No implicit rule found for `even_odd_list.c'.
Finished prerequisites of target file `even_odd_list.c'.
No need to remake target `even_odd_list.c'; using VPATH name `src/even_odd_list.c'.
Finished prerequisites of target file `even_odd_list'.
Must remake target `even_odd_list'.
cc -I include src/even_odd_list.c -o even_odd_list
Putting child 0x085fbe90 (even_odd_list) PID 24853 on the chain.
Live child 0x085fbe90 (even_odd_list) PID 24853
Reaping winning child 0x085fbe90 PID 24853
Removing child 0x085fbe90 PID 24853 from chain.
Successfully remade target file `even_odd_list'.