实际上你是对的:它运行另一个 make 实例。
一个可能的解决方案是:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
通过调用make fresh,您首先会获得clean 目标,然后是运行clear 的clearscreen,最后是完成这项工作的all。
8 月 4 日编辑
在使用 make 的 -j 选项进行并行构建的情况下会发生什么?
有一种固定顺序的方法。来自制作手册,第 4.2 节:
但是,有时您会遇到这样的情况,即您希望对要调用的规则施加特定的顺序,而不是在执行这些规则之一时强制更新目标。在这种情况下,您想要定义仅订单的先决条件。可以通过在先决条件列表中放置管道符号 (|) 来指定仅订单先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件都是仅订购的:目标:正常先决条件|仅订购的先决条件
正常的先决条件部分当然可能是空的。此外,您仍然可以为同一目标声明多行先决条件:它们被适当地附加。请注意,如果您将同一个文件声明为普通先决条件和仅订单先决条件,则普通先决条件优先(因为它们是纯订单先决条件行为的严格超集)。
因此makefile变成了
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
12 月 5 日编辑
运行多个 makefile 实例并不是什么大不了的事,因为任务中的每个命令无论如何都是sub-shell。但是您可以使用call function 来拥有可重用的方法。
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")