.shELLFLAGS在makefile中的赋值

时间:2015-08-23 06:08:33

标签: makefile gnu-make

来自docs

  

...您可以修改.SHELLFLAGS以将-e选项添加到shell中   在命令行中的任何地方导致任何失败导致shell   失败...   
  

所以,给定一个makeile,例如:

.SHELLFLAGS = -e -c

define cmd
echo true
true
endef


all::
    $(shell $(cmd))



正在运行,我得到:

truetrue
/bin/sh: 1: truetrue: not found
makefile:10: recipe for target 'all' failed
make: *** [all] Error 127

你看到了吗(在输出的第一行)? truetrue? 它是从哪里来的?


我们将其与以下 相同的 makefile进行比较,其中-e未添加到.SHELLFLAGS

makefile,将是:

# Do you see the difference, from the previous Makefile?
# Here, the value is '-c' alone. No '-e' flag is present here!
.SHELLFLAGS = -c

define cmd
echo true
true
endef


all::
    $(shell $(cmd))



正在运行,我得到:

true true

好多了!

因此,我们在这里有2个版本的makefile,都运行相同的命令,其中第一个版本还将-e标志添加到.SHELLFLAGS

然而,结果 - 对于各自的运行 - 并不一致!我们有:

  1. 扩展为普通命令true true,类似于简单命令: true(即“忽略参数......”),因此退出状态:0。
    • 这是“简单”的运行,没有.SHELLFLAGS的变化。 (第2版)。
  2. 至于第一次运行,Make继续前进,并将命令压缩到truetrue(真的吗?),因此:一个无意义的命令和来自shell的致命错误。
  3. 总结:似乎将-e添加到.SHELLFLAGS并不像上面提到的文档那样无辜

    实际上,Make,然后(当.SHELLFLAGS被修改为包含-e)时,只有那时 - Make可以自由地对命令进行更多(意外?)修改,结果 - 例如 - 这里使用命令truetrue表示true true命令。

    真的?

    (版本 - 注释:支持.SHELLFLAGS的所有版本,即3.82及更高版本。)

1 个答案:

答案 0 :(得分:0)

我从未理解在食谱中使用$(shell ...)。可能有一两个 它有用的情况,但我经常看到它,我还没有看到它。

但是,您会注意到文档中说的值为 .SHELLFLAGS当您要使用-e标记时,-ec应为-e -c,而不是-ec。 某些版本的Bourne shell不接受命令上的多个标志 line:它们必须是一组标志。如果你使用.SHELLFLAGS那么你的例子 的工作原理。

你所看到的行为差异在于对新行的处理 食谱:在某些情况下,它们与初始TAB一起被删除,在另一些情况下 他们被转换为单一空间的情况。我不知道为什么要加一秒钟 string[] Demo; string[,] Demo; string[,,] Demo; 的选项导致了这一点,但我同意tripleee:你应该这样做 file a bug