[英]make does not recognize target in Makefile
我經歷了以下幾點:
$ cat Makefile
POLYSCRIPTER=${HOLDIR}/Manual/Tools/polyscripter
UMAP=${HOLDIR}/Manual/Tools/umap
all: tactics.pdf
%.tex: %.stex
${POLYSCRIPTER} ${UMAP} <%.stex >%.tex
tactics.pdf: %.tex
pdflatex tactics.tex
bibtex tactics
pdflatex tactics.tex
pdflatex tactics.tex
clean:
rm tactics.{aux,bbl,blg,log,pdf,tex,ui,uo}
$ make
make: *** No rule to make target '%.tex', needed by 'tactics.pdf'. Stop.
有一個 %.tex 目標。 我究竟做錯了什么?
這是 GNU Make 4.3。
更新:我要表達的內容:從相應的 %.stex 文件創建任何 %.tex 文件,然后從包含所有 %.tex 文件的乳膠化的tactic.tex 中生成tactic.pdf 。
UPDATE2:我編輯了一行,學習如何引用依賴和目標:
${POLYSCRIPTER} ${UMAP} <$< >$@
模式規則是告訴 make 如何構建目標的模板。 它沒有為 make 提供要構建的目標列表:它只是構建目標的秘訣。 所以這個模式規則:
%.tex: %.stex
不會告訴 make“轉到文件系統並查找與%.stex
匹配的所有文件,這些文件可以轉換為.tex
文件並執行此操作”。 它告訴 make,“嘿,如果你發現由於某種原因你想構建一個與模式%.tex
匹配的目標,那么這是你可以構建它的一種方式”。
另一方面,這:
tactics.pdf: %.tex
根本不是模式規則。 模式規則必須在目標名稱中包含%
。 這是一個簡單的顯式規則,它恰好依賴於一個名為%.tex
的文件。 Make 不知道有什么方法可以構建一個名為%.tex
的文件(因為沒有按字面意思命名為%.stex
的文件,因此您在上面定義的模式規則不適用)。
你可以這樣做:
tactics.pdf: *.tex
使用 shell 通配。 這更接近,因為它告訴要構建一組.tex
文件。 但這也行不通,因為當您第一次運行時 make 不存在.tex
文件,所以。 此表達式將不匹配任何文件,並且您將擁有一組空的先決條件。
您要做的是(1)找到您要構建的所有源文件:
STEX := $(wildcard *.stex)
然后 (2) 將其轉換為您要構建的目標集:
TEX := $(patsubst %.stex,%.tex,$(STEX))
然后 (3) 將這些目標列為 PDF 文件的先決條件:
tactics.pdf: $(TEX)
現在,make 將使用您的模式規則來確定如何構建這些.tex
文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.