2013-03-08 38 views
2

我有这个Makefile这似乎是工作,但我不知道如何:调用此模式匹配规则的是什么?

EXECUTABLE=hello 
CC=gcc 
OBJS = a.o 

all: $(EXECUTABLE) 

%.o : %.c 
    $(CC) -o [email protected] -c $< 

$(EXECUTABLE): $(OBJS) 
    $(CC) -o [email protected] $< 

我知道前3行是本地定义的,当我输入“make”将建立在all目标。现在,从这里我有点失落......我猜:

  1. 制作看到$(EXECUTABLE)标签和跳是构建命令
  2. 它看到$(OBJS)标签,因为a.o不存在本地目录就跳转到模式匹配规则
  3. 制作认定a.c和运行规则来产生a.o
  4. 现在做返回到$(EXECUTABLE)指挥和运行的.o文件相结合,使“你好”节目

问题:

  1. 是我认为流动的理解是否正确?
  2. 此文件中“标签”的位置是否相关?
  3. 是否有一些我错过的GNU文档证实了我对此工作原理的怀疑?

回答

1

您的流程基本正确。如果您没有在命令行上显式传递一个命令,Make会构建文件中列出的第一个目标。在大多数makefile中,人们将有all作为第一个目标,所以在你的例子中你可以输入make,它会自动构建all目标。内部做什么是构建您在Makefile中定义的依赖关系列表。 all依赖于$(EXECUTABLE)这是取决于$(OBJS)。为了满足all目标的创建,它必须从该依赖列表的底部开始,然后继续工作。制作手册其实很好,如果你想看看这里:http://www.gnu.org/software/make/manual/,尤其是你在这里的具体问题:http://www.gnu.org/software/make/manual/make.html#How-Make-Works

+0

感谢您的信息。因此,最后一个链接告诉我#3的答案(这是标签**的顺序**是重要的)是否正确? – Mike 2013-03-08 15:25:31

+0

它唯一重要的是你不打算提供一个make的目标,比如它给出的“make all”“make clean”等例子 – ThePosey 2013-03-08 15:27:51

1

我发现了一个工具来帮助至少回答我的问题的一部分,所以我会发布它以供我和其他人参考:

可以通过$(warning <some string>)调用“调试”Makefile。

所以在我的例子中,我用它作为这样的:

all: $(warning All before exe call) $(EXECUTABLE) 
    $(warning All warning after call) 

%.o : %.c 
    $(warning before pattern) 
    $(CC) -o [email protected] -c $< 
    $(warning after pattern) 

$(EXECUTABLE): $(warning before obj) $(OBJS) 
    $(warning after obj) 
    $(CC) -o [email protected] $< 

,得到了我展示的流量输出:

[email protected]:~/C$ make 
Makefile:6: All before exe call // started at all 
Makefile:14: before obj   // Jumped to EXECUTABLE label 
Makefile:10: before pattern  // Jumped to pattern matching 
Makefile:10: after pattern 
gcc -o a.o -c a.c 
Makefile:15: after obj    // back to EXECUTABLE label 
Makefile:15: after build   // back to build command 
gcc -o hello a.o 
Makefile:7: All warning after call 

利用这一点,我发现我能做到这一点:

$(EXECUTABLE): $(warning before obj) $(OBJS) 

但不是:

$(EXECUTABLE): 
    $(warning before obj) 
    $(OBJS) 

这是有道理的,因为白色空间在Makefiles中很重要

+1

$(info)是另一个很好的make函数,用于输出信息$(info $(OBJS)) – ThePosey 2013-03-08 15:29:41

+0

@ThePosey谢谢!我还没有在$ info上找到任何东西,打印通用字符串或只是字段? – Mike 2013-03-08 15:37:24

+0

请注意,在目标的先决条件列表中放置'$(warning ...)'并不符合您的期望,因为它在读取makefile时立即进行评估,而不是在考虑目标时进行评估。 – Idelic 2013-03-08 15:50:31