0

我正在尝试运行“问题模式”的递归调用,但在一个非常独特的场景中出现错误。

我使用的是 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

这个练习的重点是能够检查是否需要重新编译子项目,以便我可以在必要时正确构建顶级项目。否则我必须对所有内容使用时间戳。(我以前使用过时间戳,但我意识到这会给其他事情带来额外的混乱。)

这个问题有一些奇怪的解决方法。例如,如果(在 makefile 中)的配方在对 $(MAKE) 的调用上方有一个附加行,即:

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

问题消失了,并且依赖项(在我的完整测试用例中)仍然有效。也直接使用 make 似乎会改变行为(与 $(MAKE) 相反)。

任何帮助,将不胜感激。谢谢, 纳楚姆

4

1 回答 1

0

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

于 2013-03-24T11:22:07.647 回答