下面的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