强制Makefile中依赖项的顺序

时间:2014-07-02 10:39:37

标签: makefile gnu-make

我有一个Makefile,我想并行使用它来编译一组独立的程序。它看起来像这样:

compileall: program1 program2 program3
    @echo "Compilation completed"

program1 program2 program3:
    @echo "Compiling $@"
    $(MAKE) -C $@

我使用gmake compileall -j3调用它,一切正常。它每天作为我们测试脚本的一部分运行。

现在,我添加了一个新目标program1a,它必须是同一个目标的一部分,不能与program1目标同时执行。如果它发生在之前或之后,而不是平行发生并不重要。

我知道我可以这样做:

compileall:
    +$(MAKE) program1 program2 program3
    +$(MAKE) program1a
    @echo "Compilation completed"

program1 program2 program3:
    @echo "Compiling $@"
    $(MAKE) -C $@

program1a:
    @echo "Compiling $@"
    $(MAKE) -C program1 A=true

有更好的方法吗?我希望不必等待program2program3完成才能开始program1a编译。

1 个答案:

答案 0 :(得分:1)

未经测试(告诉我这是否有效),但您可以这样做:

compileall: program1 program2 program3
    @echo "Compilation completed"

program1: program1a
    @echo "Compiling $@"
    $(MAKE) -C $@

program1a program2 program3:
    @echo "Compiling $@"
    $(MAKE) -C $@

这种方式program1a应该在program1之前构建,而make应该能够并行构建program2program3


编辑:有点清洁(thx @Beta):

compileall: program1 program2 program3
    @echo "Compilation completed"

program1: program1a

program1 program1a program2 program3:
    @echo "Compiling $@"
    $(MAKE) -C $@

编辑2 :我想到的避免依赖的唯一解决方案如下。

创建2个单独的makefile:

# Makefile1.mk

.NOTPARALLEL: # Force disabling of -j flag

all: program1 program1a

program1 program1a:
    @echo "Compiling $@"
    $(MAKE) -C $@
# Makefile

all: program1 program1a program2 program3

program1 program1a:
    $(MAKE) -f Makefile1.mk

program2 program3:
    @echo "Compiling $@"
    $(MAKE) -C $@