【问题标题】:GNU make nested callsGNU 进行嵌套调用
【发布时间】:2019-06-06 21:18:08
【问题描述】:

我需要找到一种方法来避免并行执行子调用,并避免收到警告: make[1]:警告:submake 中强制使用 -jN:禁用作业服务器模式。

我确实有几个并行运行的 make 调用,因为主要 make 调用使用标志 -jNwith N>1 运行 我收到上面列出的警告,可以看到 Makefile 并调用导致它。 但是,我尝试使用 gnu/make 文档中提供的几个选项,但仍然无法发出警告。

a)
+make -C $FOO $@

b)
make MAKEFLAGS= -C $FOO $@

c)
make -j1 -C $FOO $@

d)
.NOTPARALLEL:bar

我需要在没有警告的情况下运行整个编译(因为它们被视为错误)。 但上述警告仍然出现。

【问题讨论】:

  • 如果你只是不从你的 Makefile 递归调用 make 怎么办?

标签: bash gnu-make


【解决方案1】:

警告来自调用的 make,因为它通过 MAKEFLAGS 获取某些与作业服务器相关的标志。

为了显示这一点,我们可以像这样简单地调用make 来重现错误消息:

make --jobserver-fds=3,4 -j1
make: warning: -jN forced in submake: disabling jobserver mode.
... other errors about those being bad file descriptors ...

make 命令行中覆盖MAKEFLAGS 并没有这样做,因为在它已经从父级收到MAKEFLAGS 之后,调用的make 正在解释它。但是我们可以通过外部工具env拦截父环境变量:

yourtarget: yourprereq
        env MAKEFLAGS= make -j1 -C $FOO $@

使用env,我们可以完全控制嵌套的make 可以看到哪些环境变量。

【讨论】:

  • 您真的需要env 还是只需要MAKEFLAGS= make -j1 -C $FOO $@
  • 我想不出这不起作用的原因。它在没有env 的情况下对我有用,因为整个事情都是作为命令传递给 shell 的。这种方式效率更高;少了一个“垫片”过程。事实上,如果我们有shell解释器,我们通常不需要env;仅当我们处理原始的exec 机制及其参数列表时。也就是说,env 允许我们插入环境覆盖,如果我们能够操作的唯一接口是将 argv 传递给不是 shell 解释器的进程。
  • 我开始用env 调查这个问题,纯粹是为了试图愚弄make 使其无法将执行的命令识别为嵌套的make。不过,这是一个红鲱鱼。
  • 感谢@Kaz 的解决方案,就像一个魅力。根本不需要环境。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多