Make不遵循依赖链

时间:2015-07-04 09:10:44

标签: makefile

我有这个Makefile:

all: src/exec

src/exec:
    make -C src/

src/exec: src/bar.o
src/bar.o: src/bar.h

src目录中这些文件:

touch src/exec src/bar.o src/bar.h

当我点击make时,我得到了:

$ make
make: Nothing to be done for 'all'.

现在,如果我对src/bar.h进行更改,我会得到相同的结果:

$ touch src/bar.h
$ make
make: Nothing to be done for 'all'.

我不明白。 Make应该遵循依赖链:

all <- src/exec <- src/bar.o <- src/bar.h 

如果src/bar.h将目标更改为正确重建?

当我使用*.dgcc -MM生成的makedepend个文件时,我注意到这些文件中的规则完全相同:

bar.o: bar.c bar.h
exec: bar.o foo.o

所以我想做的事情应该在某个时候起作用。我错了吗?

1 个答案:

答案 0 :(得分:2)

既然你明确要求解释正在发生的事情,而不是对你要解决的问题有任何帮助,我会提供前者并忽略后者。

如果您使用make -d并检查输出,您将很快看到会发生什么;这是一段摘录:

     Finished prerequisites of target file 'src/bar.o'.
     Prerequisite 'src/bar.h' is newer than target 'src/bar.o'.
    No recipe for 'src/bar.o' and no prerequisites actually changed.
    No need to remake target 'src/bar.o'.
   Finished prerequisites of target file 'src/exec'.
   Prerequisite 'src/bar.o' is older than target 'src/exec'.
  No need to remake target 'src/exec'.
 Finished prerequisites of target file 'all'.

因此,make看到bar.hbar.o更新,但没有可用于构建bar.o的配方,因此它不会对bar.o执行任何操作。因此,请注意bar.o的时间戳未发生变化,因此bar.o并不比src/exec更新,因此不会重建src/exec