Make:具有依赖关系的意外行为并包含Statement

时间:2015-09-23 14:27:26

标签: include makefile dependencies gnu-make

我有以下Makefile:

a.d:
    gcc -m32 -MM -o $@ a.c
    sed 's!a.o!$@ a.o!' --in-place $@

a.o:
    gcc -c -m32 -o $@ a.c

all: a.d a.o

-include a.d

a.d的内容是:

a.d a.o: a.c a.h

我有2个问题。 1,运行“make all”后运行:

touch a.h
make a.d

我明白这一点:

gcc -m32 -MM -o a.d a.c
sed 's!a.o!a.d a.o!' --in-place a.d
make: 'a.d' is up to date.

a.d规则清楚地运行了,为什么我看到“make:'a.d'是最新的。”?

2,运行“make all”后运行:

touch a.h
make a.o

我明白这一点:

gcc -m32 -MM -o a.d a.c
sed 's!a.o!a.d a.o!' --in-place a.d
gcc -c -m32 -o a.o a.c

为什么它也运行a.d规则?它没有依赖性。

我真正不明白的是当我将“-include a.d”替换为make文件中a.d的内容时,例如:

#-include a.d
a.d a.o: a.c a.h

我没有看到任何一个问题。 include语句是否应该使包含文件直接包含在同一个make文件中?

这就是我的a.h的样子:

#define FOO 0

这是a.c:

#include <stdio.h>
#include "a.h"

void foo(void)
{
    printf("foo %d", FOO);
}

我正在使用Cygwin 64位。这是make -v的输出:

$ make -v
GNU Make 4.1
Built for x86_64-unknown-cygwin
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

1 个答案:

答案 0 :(得分:1)

你的行为都是由GNU make尝试重建包含的makefile这一事实解释的;见How Makefiles are Remade。所以,在你的第一个问题中,第一个输出来自make尝试重建a.d文件,第二个输出来自make make re-execs本身;它看到目标a.d是最新的。

在第二个问题中,它会运行a.d规则,因为a.d取决于a.h,并且由于您包含a.d,因此请尝试重建它。

对于您的上一个问题,如果您直接嵌入内容,它不会发生的原因是您没有使用include

其他有趣的内容包括:Generating Prerequisites AutomaticallyAdvanced Auto-Dependency Generation。也可以Constructed Include Files获得更多背景信息。