什么调用这种模式匹配规则?

时间:2013-03-08 14:43:36

标签: gcc makefile pattern-matching

我有这个Makefile似乎正在工作,但我不确定如何:

EXECUTABLE=hello
CC=gcc
OBJS = a.o

all: $(EXECUTABLE)

%.o : %.c
    $(CC) -o $@ -c $<

$(EXECUTABLE): $(OBJS)
    $(CC) -o $@ $<

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

  1. Make看到$(EXECUTABLE)标签并跳转该构建命令
  2. 它看到了$(OBJS)标签,并且由于本地目录中不存在a.o,它会跳转到模式匹配规则
  3. 查找a.c并运行规则以生成a.o
  4. 现在返回$(EXECUTABLE)命令并运行.o文件的组合以制作“hello”程序
  5. 问题:

    1. 我对这种流程的理解是否正确?
    2. 此文件中“标签”的位置是否相关?
    3. 是否有一些我遗漏的GNU文档证实了我对这是如何工作的怀疑?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

所以在我的例子中我使用它:

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

%.o : %.c
    $(warning before pattern)
    $(CC) -o $@ -c $<
    $(warning after pattern)

$(EXECUTABLE): $(warning before obj) $(OBJS)
    $(warning after obj)
    $(CC) -o $@ $<

输出结果显示了流程:

mike@mike-VirtualBox:~/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)

这是有道理的,因为空格在Makefile中很重要