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