你的Makefile不符合化妝的理念線多對多的PDF文件。您使用make作爲另一種腳本語言,而make則不止這些。它比較目標和先決條件日期,基於此確定必須構建或重新構建哪些日期,並將配方傳遞到shell。因此,對於您的特定問題,您應該寧可嘗試類似:
PR := $(wildcard $(data)/folder1/*.pdf)
SR := $(wildcard $(data)/folder2/*.pdf)
PDFS1 := $(patsubst $(data)/folder1/%.pdf,$(build)/notebook/%.pdf,$(PR))
PDFS2 := $(patsubst $(data)/folder2/%.pdf,$(build)/notebook/%.pdf,$(SR))
PDFS := $(sort $(PDFS1) $(PDFS2))
.PHONY: notebook
notebook: $(out)/notebook.pdf
$(PDFS1): $(build)/notebook/%.pdf: $(data)/folder1/%.pdf | $(build)/notebook
cp $< [email protected]
$(PDFS2): $(build)/notebook/%.pdf: $(data)/folder2/%.pdf | $(build)/notebook
cp $< [email protected]
$(build)/notebook $(out):
mkdir -p [email protected]
$(out)/notebook.pdf: $(PDFS) | $(out)
pdfunite $(PDFS) [email protected]
的變量定義相當簡單:patsubst
,如它的名字一樣,替換字符串。 target: pattern: prerequisites
是static pattern rule。並且|
之後的先決條件是order-only prerequisites。
什麼這個Makefile說,基本上,是$(out)/notebook.pdf
依賴於一組PDF文件$(build)/notebook/
,而這些PDF文件取決於源PDF文件,在$(data)/folder1/
和$(data)/folder2/
相同基本名稱。它還說目錄必須在填充之前創建。多虧了這一切,只有需要做的事情將會完成,不多也不少。它更符合品牌的哲學。
如果你有很多的源文件夾,並且不希望複製複製的規則,你可以使用更先進的功能,如:
FOLDERS := folder1 folder2
.PHONY: notebook
notebook: $(out)/notebook.pdf
define MY_rule
$(1)_SRCS := $$(wildcard $$(data)/$(1)/*.pdf)
$(1)_DSTS := $$(patsubst $$(data)/$(1)/%.pdf,$$(build)/notebook/%.pdf,$$($(1)_SRCS))
PDFS += $$($(1)_DSTS)
$(1)_DSTS: $$(build)/notebook/%.pdf: $$(data)/$(1)/%.pdf | $$(build)/notebook
cp $$< [email protected]
endef
$(foreach f,$(FOLDERS),$(eval $(call MY_rule,$(f))))
$(build)/notebook $(out):
mkdir -p [email protected]
$(out)/notebook.pdf: $(PDFS) | $(out)
pdfunite $(PDFS) [email protected]
是構建過程中產生的這些PDF? – fukanchik
是的,其中一些是(使用pandoc),但其他人只是複製。 –