makefile执行另一个目标
我有一个makefile结构如下所示:
all : compile executable clean : rm -f *.o $(EXEC)
我意识到,在运行“make all”之前,我一直在运行“make clean”,然后在terminal中“清除”。 在尝试筛选讨厌的C ++编译错误之前,我喜欢有一个干净的terminal。 所以我试图添加第三个目标:
fresh : rm -f *.o $(EXEC) clear make all
这工作,但是这运行的第二个实例(我相信)。 有没有一个正确的方式来获得相同的function,而无需运行第二个实例?
其实你是对的:它运行另一个实例。 一个可能的解决scheme是:
.PHONY : clearscr fresh clean all all : compile executable clean : rm -f *.o $(EXEC) fresh : clean clearscr all clearscr: clear
通过调用make fresh
你首先得到clean
目标,然后clear
all
clear
,最后完成all
的工作。
编辑
使用make的-j
选项进行并行构build时会发生什么情况? 有一个固定订单的方法。 从make手册中,第4.2节:
然而,有时候,您会遇到这样一种情况,即如果要执行其中一个规则,则不会强制更新目标,而是要对要调用的规则施加特定顺序。 在这种情况下,您需要定义仅限订单的先决条件。 可以通过在先决条件列表中放置pipe道符号(|)来指定仅限于订单的先决条件:pipe道符号左侧的任何先决条件都是正常的; 右侧的任何先决条件均为“仅限订单”:目标:普通先决条件| 订单仅-先决条件
正常的先决条件部分当然可以是空的。 此外,您仍然可以为同一个目标声明多行先决条件:它们被适当地添加。 请注意,如果您声明同一个文件既是普通文件又是仅限订单的先决条件,则普通先决条件优先(因为它们是仅限订单的先决条件的行为的严格超集)。
因此makefile变成了
.PHONY : clearscr fresh clean all all : compile executable clean : rm -f *.o $(EXEC) fresh : | clean clearscr all clearscr: clear
在linux命令提示符下:clear&make