我有以下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.
答案 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 Automatically和Advanced Auto-Dependency Generation。也可以Constructed Include Files获得更多背景信息。