问题描述
在Makefile中遇到一个问题,他有两个目标(target):test
和 dosomething
。他希望在以下情况下实现特定的行为:
– 当执行 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
中使用条件判断,你可以根据不同的情况来控制目标的执行流程。以上提供的解决方案可以满足你的需求,但请确保根据实际情况进行适当的调整和修改。