makefile执行另一个目标

时间:2010-07-16 16:48:52

标签: makefile

我的makefile结构如下:

all : 
    compile executable

clean :
    rm -f *.o $(EXEC)

我意识到在运行“make all”之前,我一直在我的终端中运行“make clean”然后“clear”。在尝试筛选令人讨厌的C ++编译错误之前,我喜欢有一个干净的终端。所以我尝试添加第三个目标:

fresh :
    rm -f *.o $(EXEC)
    clear
    make all

这是有效的,但是这会运行第二个make实例(我相信)。有没有正确的方法来获得相同的功能而不运行第二个make实例?

3 个答案:

答案 0 :(得分:133)

实际上你是对的:它运行另一个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节:

  

但是,有时您可能希望对要调用的规则强制执行特定排序,而不强制在执行其中一个规则时更新目标。在这种情况下,您希望定义仅订单的先决条件。可以通过在先决条件列表中放置管道符号(|)来指定仅订单的先决条件:管道符号左侧的任何先决条件都是正常的;右边的任何先决条件都是仅限订单:目标:正常先决条件|为了仅-先决条件

     

正常的先决条件部分当然可能是空的。此外,您仍可以为同一目标声明多行先决条件:它们会相应地附加。请注意,如果您将同一文件声明为普通文件和仅限订单的先决条件,则正常的先决条件优先(因为它们是仅订购先决条件行为的严格超集)。

因此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!")

答案 1 :(得分:5)

如果您从"新鲜"中删除了make all行目标:

fresh :
    rm -f *.o $(EXEC)
    clear

您只需运行make fresh all命令,该命令将以make fresh; make all执行。

有些人可能会认为这是make的第二个实例,但它肯定不是make的子实例(make中的make),这是你的尝试似乎导致的。

答案 2 :(得分:-17)

在linux命令提示符下: 清除&使