2013-03-24 47 views
0

我想运行“问题模式”的递归调用,并在非常特殊的场景中出现错误。makefile递归-q模式错误1

我使用的是MAKE 3.81,这已经在两个完全独立的环境中测试过了。我调用“make -q”,然后makefile调用“$(MAKE)-C sub/a /”,然后makefile调用“$(MAKE)-f ../../makefile.b”

该测试用例尽可能简单。谁能告诉我,为什么我得到这个错误:

nachum:/home/nachum/makefile_bug[1497]$make -q 
make -C sub/a 
make[1]: Entering directory `/home/nachum/makefile_bug/sub/a' 
make -f ../../makefile.b 
make[1]: *** [b] Error 1 
make[1]: Leaving directory `/home/nachum/makefile_bug/sub/a' 
make: *** [a] Error 2 
nachum:/home/nachum/makefile_bug[1498]$ 

下面是生成文件:

makefile: 
a: 
     $(MAKE) -C sub/a 

sub/a/makefile: 
b: 
     $(MAKE) -f ../../makefile.b 

makefile.b: 
all: 
     echo hi 

这个练习的要点是要能够检查是否子项目需要重新编译,所以我必要时可以正确构建顶级项目。否则,我必须使用时间戳的一切。 (我以前使用过时间戳,但是我意识到这对其他事情造成了额外的困惑。)

这个问题有一些奇怪的解决方法。例如,如果一个(在生成文件)的配方具有调用$以上的额外线(MAKE),即:

makefile: 
a: 
     @echo hi 
     $(MAKE) -C sub/a 

的问题消失了,而依赖关系(在我的全测试用例)仍能正常工作。也直接使用make似乎改变了行为(而不是$(MAKE))。

任何帮助,将不胜感激。 谢谢, Nachum

回答

0

您的问题是漫游指定的-q选项。 -q将不运行命令,但如果是最新状态,则退出状态。当你使用${MAKE}make -q -C sub/a被执行。经过一些排列和组合后,我发现我们不能使用和-C选项。如果您想要使用make --quite或者您只想检查时间戳,请尝试-t(触摸但不编译)或'-n`(空运行)。

+0

听起来像一个错误? – nachum 2013-03-24 19:10:46

+0

可能有可能是原因,我们还需要探讨:) – 2013-03-25 11:08:52