あなたのMakefileは、makeの理念に沿ったものではありません。 makeは別のスクリプト言語としてmakeを使用していますが、makeはこれ以上です。ターゲットと前提条件の日付を比較し、これに基づいてビルドまたは再構築が必要なものを決定し、レシピをシェルに渡します。その名前が言うように、文字列を代入し、patsubst
:変数の定義は合理的に簡単である
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]
:だから、あなたの特定の問題のために、あなたはかなりのようなものを試してみてください。 target: pattern: prerequisites
はstatic pattern ruleです。 |
の後の前提条件はorder-only prerequisitesです。このメイクファイルが言う
は、基本的には、$(out)/notebook.pdf
は$(build)/notebook/
でPDFファイルのセットに依存し、これらのPDFファイルは$(data)/folder1/
と$(data)/folder2/
で同じベース名とソースのPDFファイルに依存していることということです。また、ディレクトリを作成する前に作成する必要があります。このすべてのおかげで、実行する必要があるものだけが実行されます。それはmakeの哲学に沿ったものです。
あなたは多くのソースフォルダを持っており、コピールールを複製したくない場合は、あなたのような、より高度な機能を使用することができます。
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を使用していますが)一部はコピーされたばかりです。 –