Answers:
其实您是对的:它运行另一个make实例。可能的解决方案是:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
通过调用make fresh
您首先获得clean
目标,然后clearscreen
运行目标,clear
最后all
完成目标。
编辑8月4日
如果使用make -j
选项进行并行构建,会发生什么情况?有固定订单的方法。在制造手册的第4.2节中:
但是,有时会遇到这样的情况,如果要执行的规则之一,则要对要调用的规则施加特定的顺序,而不必强制更新目标。在这种情况下,您要定义仅订购的先决条件。可以通过在先决条件列表中放置管道符号(|)来指定仅订购的先决条件:管道符号左侧的所有先决条件都是正常的;右侧的任何先决条件仅适用于订购:targets:normal-prerequisites | 仅订购先决条件
正常的先决条件部分当然可以为空。同样,您仍然可以为同一目标声明多行先决条件:它们会适当地附加。请注意,如果您将同一文件声明为常规和仅订购的前提条件,则以常规前提条件为准(因为它们是仅订购的前提条件的行为的严格超集)。
因此,makefile变为
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
编辑12月5日
运行多个makefile实例并没有什么大不了的,因为任务中的每个命令仍然是子shell。但是您可以使用call函数拥有可重用的方法。
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!")
t2
将取决于t0
,t1
和t3
。如果你需要这个,你应该把 t3
所要求的t2
,t1
所要求的t3
和t0
所要求的t1
。这意味着3个不同的规则。但是,您应该对此进行验证。我不确定100%。
.PHONY :
被视为始终执行的某些关键字,而非语音目标旨在作为文件。