Make:recursive make ignores -s

时间:2016-05-28 18:22:26

标签: makefile gnu-make

观察make noisynoisy: @make foo silent: @make -s foo foo: @make -s bar bar: @echo bar 之间的区别。我要求make对条形规则保持沉默,但它也只是在foo规则上保持沉默。

我错过了什么?

$ make silent
bar

$ make noisy
make[1]: Entering directory `/tmp/s'
make[2]: Entering directory `/tmp/s'
bar
make[2]: Leaving directory `/tmp/s'
make[1]: Leaving directory `/tmp/s'

运行它:

noisy

我期待var a = 12; function run() { var a = 34; alert(window.a); /*accesses the global window object to which any variable in the global scope gets binded*/ } run(); foo - > bar call to not print"输入目录"

2 个答案:

答案 0 :(得分:1)

如果您展示了所看到的输出并准确解释了您认为哪些方面是错误的,那将会很有帮助。你的陈述也只是对foo规则保持沉默,也难以理解/理解。所以,我真的不知道你试图解决的问题是什么。

但是,我会说-s仅对没有@前缀的配方行产生影响。如果配方行以@为前缀,则无论您是否指定-s,都不会打印。由于您的所有食谱行都以@作为前缀,因此使用-s或不会使用{<1}}。

也许这会帮助你理解你所看到的。

另外,仅供参考,在递归调用make时,不应使用文字make。请始终使用$(MAKE)变量。

答案 1 :(得分:0)

使用MAKEFLAGS环境变量将选项从父make传递给sub-make,sub-make添加了它收到的命令行标志。如果子品牌未收到-s--silent),-w--print-directory)或--no-print-directory,则automatically-w添加到自己的MAKEFLAGS中。启用和禁用目录打印的优先顺序似乎是(从最弱到最强)-s-w--no-print-directory

因此,当您运行make silent时,第一个递归调用将-s添加到MAKEFLAGS,第二个调用知道不触摸标志。但是,当您运行make noisy时,第一次递归调用会向MAKEFLAGS添加-w,因为您没有告诉它不要保持沉默,从那时起,-s赢了&#39 ; t具有你正在寻找的效果。您可以改为使用--no-print-directory,因为它会覆盖-w