make无法识别Makefile中的目标
我经历了以下几点:make无法识别Makefile中的目标,makefile,gnu-make,makefile-errors,Makefile,Gnu Make,Makefile Errors,我经历了以下几点: $ 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
$ 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.
$cat Makefile
polyscript=${HOLDIR}/Manual/Tools/polyscript
UMAP=${HOLDIR}/Manual/Tools/UMAP
全部:tractics.pdf
%.tex:%.stex
${polyScript}${UMAP}%.tex
tractics.pdf:%.tex
pdflatex.tex
bibtex战术
pdflatex.tex
pdflatex.tex
清洁:
rm战术。{aux、bbl、blg、log、pdf、tex、ui、uo}
$make
make:**没有规则使目标“%.tex”成为“tractics.pdf”所需的目标。停止
有一个%.tex目标。我做错了什么
这是GNU Make 4.3
更新:我想表达的是:从相应的%.stex文件创建任何%.tex文件,然后从latexing tractics.tex生成包含所有%.tex文件的tractics.pdf
更新2:我编辑了一行,学习如何引用依赖项和目标:
${POLYSCRIPTER} ${UMAP} <$< >$@
${polyscript}${UMAP}$@
模式规则是告诉make如何构建目标的模板。它没有为make提供一个要构建的目标列表:它只是一个构建目标的配方。所以这个模式规则:
%.tex: %.stex
不要告诉make“到文件系统中查找所有与%.stex
匹配的文件,这些文件可以转换为.tex
文件并执行此操作”。它告诉make,“嘿,如果您发现出于某种原因,您想要构建一个与模式%.tex
匹配的目标,那么这里有一种方法可以构建它”
另一方面,这:
tactics.pdf: %.tex
这根本不是一个模式规则。模式规则的目标名称中必须有%
。这是一个直接的显式规则,恰好依赖于名为“%.tex”的文件。Make不知道如何构建名为%.tex
的文件(因为没有名为字面上的%.stex
的文件,因此上面定义的模式规则不适用)
您可以这样做:
tactics.pdf: *.tex
使用shell globbing。这更接近,因为它告诉我们生成一组要构建的.tex
文件。但是这也不起作用,因为当您第一次运行make no.tex
文件时!因此,此表达式将不匹配任何文件,并且您将拥有一组空的先决条件
您需要做的是(1)找到所有要生成的源文件:
STEX := $(wildcard *.stex)
TEX := $(patsubst %.stex,%.tex,$(STEX))
然后(2)将其转换为您想要构建的目标集:
STEX := $(wildcard *.stex)
TEX := $(patsubst %.stex,%.tex,$(STEX))
然后(3)列出这些目标作为PDF文件的先决条件:
tactics.pdf: $(TEX)
现在,make将使用您的模式规则来确定如何构建这些.tex
文件