例如:
build: ...
do some building
clean:
do some cleaning
build_and_clean: build clean
在build_and_clean
中,如何确保clean
在build
之后运行?除了作为依赖项之外,还有其他方法可以调用clean
吗?我希望避免对make
进行递归调用,也希望避免重复clean
规则中的代码。
有多种方法可以做到这一点。您可以使用双冒号规则:
build: ...
do some building
clean:
do some cleaning
build_and_clean:: build
build_and_clean:: clean
文件说明
目标的双冒号规则按照它们在生成文件中出现的顺序执行。然而,双冒号规则真正有意义的情况是那些执行配方的顺序无关紧要的情况。
总的来说,我同意他们的说法,因为在复杂的构建中,单个目标的双冒号规则通常是从各种来源组装而成的,而这些来源的解析顺序可能无法保证。然而,就目前的情况而言,我们知道所有规则的来源。make无权重新订购。
这也将在不必大量重复代码的情况下完成。我已经使用echo
命令来模拟构建命令的执行:
define CLEAN
echo clean
endef
build:
echo build
clean:
$(call CLEAN)
build_and_clean: build
$(call CLEAN)
我更喜欢您自己想要避免的解决方案之一,但作为替代方案有一种相当吃力的东西:
.PHONY: any build clean build_and_clean
any:
@if [ ! -z "$(dobuild)" ];
then
echo "doing some building";
fi
@if [ ! -z "$(doclean)" ];
then
echo "doing some cleaning";
fi
build: dobuild = 1
build: any
clean: doclean = 1
clean: any
build_and_clean: dobuild = 1
build_and_clean: doclean = 1
build_and_clean: any