簡體   English   中英

make 無法識別 Makefile 中的目標

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM