强制退出Makefile目标而不引发错误

Mar*_*ski 17 netbeans makefile

我使用由外部工具(Netbeans)生成的Makefile,我无法更改主目标的逻辑,但我能够在实际构建之前执行的目标中"注入"逻辑(.build-pre)在Netbeans生成的Makefile中具体说明)

我希望该目标有条件地终止make执行,但不会引发错误.如果我做

exit
Run Code Online (Sandbox Code Playgroud)

在"预"规则中,没有任何反应(我的意思是,规则终止,但继续).如果我加

exit 1
Run Code Online (Sandbox Code Playgroud)

make将终止,但它将返回错误状态.

有没有办法强制make以干净的方式退出?我搜索了make函数,但发现只有error/warn/info,但没有像exit一样.

提前致谢!

编辑:基于评论似乎不可能.可怜.

为了完整性,我想要实现的更具体的例子:

default: pre
  @echo "Doing default"

pre: 
  @echo "Doing pre"
ifeq "$(SOME_VARIABLE)" "yes"
  exit 0
fi
Run Code Online (Sandbox Code Playgroud)

使用上面的Makefile,我希望能够执行pre,并有条件地阻止'default'执行,但仍然返回0到shell.

小智 18

如果未设置变量,则可以让所有目标无效:

ifeq ($(SOME_VAR),)
$(info SOME_VAR not set!)
all:
else
all: target1 target2 targetetc
endif
Run Code Online (Sandbox Code Playgroud)

  • 有 3 个可能的函数 - `info`、`warning` 和 `error`。有关更多信息,请访问 [make 有关控制功能的文档](https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html) (2认同)

ade*_*ino 5

您所看到的情况是因为配方中的每一行都在其自己的 shell 中运行。

您可以使用.ONESHELL,以便所有命令在同一个 shell 中运行。这样,“退出”就起作用了:

.ONESHELL:

sayhi:
    @echo Hi
    exit
    @echo "I won't be printed"
Run Code Online (Sandbox Code Playgroud)

  • 您可以将其更改为“我不会被打印”而不是“再见”。我尝试了“ONESHELL”,但即使经过一番摆弄,它也不起作用。我并不是说它*不能*工作,但无论如何它并不简单 (3认同)