Makefile 检查命令块是否成功

问题描述 投票:0回答:1

我有一个这样的目标:

.PHONY: do-symlink
do-symlink:
    ln -s $(HERE_ONE_FILE) $(THERE_ONE_DIR)/
    ln -s $(HERE_TWO_FILE) $(THERE_ONE_DIR)/

    # check if those succeed or failed. I want to make sure both have passed
    if succeeded:
        do_something
    else:
        do_something_else

我如何检查它们是否都成功了?如果是这样,请据此做一些事情?

makefile
1个回答
4
投票

首先,如果 make 配方行失败,则 make 失败并停止执行配方。因此,如果您在末尾放置一个配方行,

@echo "succeeded"
,那么只有在所有前面的行都有效的情况下才会运行。至于在失败时打印特定内容,您可以使用 bash
||

all:
   @command1 || { echo "command1 failed"; exit 1 }
   @command2 || { echo "command2 failed"; exit 1 }
   @echo "command1 and command2 passed"

注意

exit 1
在那里。通常,
false || echo "false"
的返回状态为
0
(通过),因为退出状态取自上次运行的命令 (
echo "false"
),该命令始终会成功。这将导致 make 始终继续运行下一个配方行。您可能想要这样,但是,您可以通过复合语句并在最后执行
exit 1
来保留失败。

要运行这两个命令,无论退出状态如何,然后处理退出,请在配方行前加上

-
。如果命令失败,这将导致 make 不会停止运行。但请注意,每个配方行都在其自己的 shell 中运行,因此一个配方行无法直接访问另一行的返回代码。您可以输出到文件,然后在后面的配方行中访问该文件:

 all:
     -@command1; echo $? > .commands.result
     -@command2; echo $? >> .commands.result
     @if grep -q "^00$" .commands.result; then \
            echo both commands passed; \
     else \
            echo "at least one command failed"

(或者您始终可以将所有食谱行连接到一个 bash 命令中并传递变量)。

© www.soinside.com 2019 - 2024. All rights reserved.