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'.