我有一个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
有更好的方法吗?我希望不必等待program2
和program3
完成才能开始program1a
编译。
答案 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应该能够并行构建program2
和program3
。
编辑:有点清洁(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 $@