在Makefile中在父目标调用的情况下退出而不抛出错误

107次阅读
没有评论

问题描述

在Makefile中遇到一个问题,他有两个目标(target):testdosomething。他希望在以下情况下实现特定的行为:
– 当执行 make test 时,无论 $(SOMETHING) 是否为空,都希望执行 echo test
– 当执行 make dosomething 时,只有当 $(SOMETHING) 不为空时才执行 echo dosomething,如果为空则不执行。

他尝试在 dosomething 目标中使用 exit 0 命令,但由于 make 忽略在子shell中执行的非负退出状态,这并不起作用。

他希望知道是否有其他方法可以在不破坏后续执行 test 目标的情况下,跳过 dosomething 目标的剩余部分。

解决方案

请注意以下操作可能存在版本差异或风险,建议在实际操作前备份。

最佳解决方案

要实现上述需求,你可以在 dosomething 目标中使用 if 语句,并通过条件判断来控制是否执行剩余的指令。以下是一个示例 Makefile 文件,展示如何在 dosomething 目标中实现所需的行为:

all: test dosomething

test:
    @echo "hello"

dosomething:
    @if [ "a" = "a" ]; then \
        echo "world"; \
        exit 0; \
    fi

在这个示例中,test 目标会始终执行 echo "hello",而 dosomething 目标会根据条件判断决定是否执行 echo "world"。请注意,在 if 语句的条件判断部分,我使用了一个恒定为真的条件 [ "a" = "a" ],你可以根据实际情况替换成适当的条件判断。

运行 make 命令会返回以下输出:

hello
world

这样,无论 $(SOMETHING) 是否为空,都会按照你的需求执行相应的指令。

替代方案

如果你仍然想在 dosomething 目标中使用 exit 0,并且希望在父目标中继续执行,可以尝试使用以下脚本示例来实现:

all: test dosomething

test:
    @echo "hello"

dosomething:
    @if [ "a" = "a" ]; then \
        echo "world"; \
        exit 0; \
    fi; exit 0

在这个示例中,无论 dosomething 目标的条件判断是否为真,都会执行 exit 0 来确保父目标继续执行。

结论

通过在 Makefile 中使用条件判断,你可以根据不同的情况来控制目标的执行流程。以上提供的解决方案可以满足你的需求,但请确保根据实际情况进行适当的调整和修改。

正文完