例如:
build: ...
do some building
clean:
do some cleaning
build_and_clean: build clean
在build_and_clean
中,如何确保clean
之后build
运行?除了作为依赖项之外,还有另一种方法可以调用clean
吗?我想避免对make
进行递归调用,我也想避免重复clean
规则中的代码。
答案 0 :(得分:1)
有多种方法可以做到这一点。您可以使用双冒号规则:
build: ...
do some building
clean:
do some cleaning
build_and_clean:: build
build_and_clean:: clean
目标的双冒号规则按它们在makefile中出现的顺序执行。但是,双冒号规则真正有意义的情况是那些执行食谱的顺序无关紧要的情况。
一般来说,我同意他们在那里所说的内容,因为在复杂的构建中经常出现这种情况,单个目标的双重冒号规则将从各种来源汇编而来,这些来源的解析顺序可能不保证。但是,在这种情况下,我们知道所有规则的来源。并且make不能自由地重新排序它们。
这也可以在不必重复代码的情况下完成。我使用echo
命令来模拟构建命令的执行:
define CLEAN
echo clean
endef
build:
echo build
clean:
$(call CLEAN)
build_and_clean: build
$(call CLEAN)
答案 1 :(得分:0)
我更喜欢你想要避免自己的解决方案之一,但作为替代方案 这是一个相当辛苦的事情:
.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