下面的Makefile必须创建(多个)输出目录,并在这些目录中生成输出,从上面目录中的输入。因此,在输入时,目录n存在,并且目录n /file.foo存在。构建必须创建目录n /out/file.bar。多作业的依赖性排序错误
这个Makefile在作为单个作业运行时工作(请注意,它会在$(shell)
中创建两个必需的源目录和文件)。推测可能是因为makedirs
是all
的第一个/最左边的先决条件。但是,它不适用于多工作制(即make -j4
/无)。
有关如何解决依赖性以确保输出目录在需要之前生成的任何想法?
编辑
我应该明确表示,我曾尝试过各种顺序,唯一的先决条件的解决方案,但我不能做到这一点,并保证目标实际上重建(顺序仅是点一般到阻止重建,不强制依赖性排序)。如果您有OO解决方案,请检查它!谢谢。
# expected output:
# made directories
# copying dir1/out/../file.foo to dir1/out/file.bar
# copying dir2/out/../file.foo to dir2/out/file.bar
# created all output files
# done
$(shell mkdir dir1 >& /dev/null; touch dir1/file.foo; \
mkdir dir2 >& /dev/null; touch dir2/file.foo)
OUTDIRS = dir1/out dir2/out
OUTPUTS = dir1/out/file.bar dir2/out/file.bar
.DEFAULT_GOAL := all
.PHONY: makedirs $(OUTDIRS)
.SUFFIXES: .foo .bar
%.bar : ../%.foo
@echo "copying $< to [email protected]"
@cp $< [email protected]
all : makedirs outputs
@echo "done"
outputs : $(OUTPUTS)
@echo "created all output files"
makedirs : $(OUTDIRS)
@mkdir -p $(OUTDIRS)
@echo "made directories"
clean :
@rm -rf dir1 dir2
谢谢,但是仅依赖订单的问题在于它不能保证目标将被重建 - 只有目录才会被创建。我在原始的Makefile中无法获得可用的OOD,但是我还没有尝试过这个简化版本 - 是否尝试过对上述文件进行特定更改? – EML
注意:由于模式规则,我无法做到这一点。如果目录尚不存在,则模式中的词干匹配失败(请参阅'..')。似乎没有任何解决方法(无论如何我都能找到)。 – EML
On注2:我不认为这会起作用,因为'$(OUTPUTS)'必须由模式规则构建,而不是新规则。我尝试了各种各样的组合,并将'makedirs'放入原始Makefile中的模式规则中,但没有一个能够工作。 – EML