首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在我的makefile中没有另一个目标需要的目标

为什么在我的makefile中没有另一个目标需要的目标
EN

Unix & Linux用户
提问于 2019-06-06 10:38:49
回答 1查看 2.9K关注 0票数 2

当我在底部运行makefile时,我会收到以下错误:

代码语言:javascript
复制
make: *** No rule to make target 'xhtml/%.html', needed by 'manifold/01_doehmer_syntax_pre.zip'.  Stop.

我不理解这个错误,因为目标xhtml/%.html有一个规则。为什么这条规则不算数?

我在一个包含文件01_doehmer_aspekte.docx的文件夹中运行它。

代码语言:javascript
复制
BINDIR:=~/TEIC-XSLT/bin
PROFDIR:=/mnt/c/Users/niels-oliver.walkows/OneDrive/Dokumente/Luxemburg/Melusinapress/Transformationen/xslt/TEIC/profiles
MANUSCRIPTFILE:=$(shell ls *.docx)
MANUSCRIPTNAME:=$(shell basename ${MANUSCRIPTFILE} .docx)

.PHONY : all clean

all: manifold/${MANUSCRIPTNAME}.zip

tei/%.xml: %.docx
    mkdir -p tei
    ${BINDIR}/docxtotei --profiledir=${PROFDIR} --profile=melusina $< $@

xhtml/%.html: tei/%.xml
    mkdir -p xhtml
    ${BINDIR}/teitohtml --profiledir=${PROFDIR} --profile=melusina $< $@
    cp -r tei/media xhtml/

manifold/${MANUSCRIPTNAME}.zip: xhtml/%.html
    mkdir -p manifold
    touch manifold/manifest.yml
    cp -r tei/media manifold/
    cp -r xhtml/*.html manifold/
    cd manifold && zip -r ${MANUSCRIPTNAME}.zip manifest.yml media *.html
    rm -rf manifold/media manifold/${MANUSCRIPTNAME}.html

test:
    echo "${MANUSCRIPTFILE}"
    echo "${MANUSCRIPTNAME}"

clean:
    rm -rf tei xhtml manifold
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-06-06 11:20:18

在定义目标xhtml/%.html时,您不是为单个文件创建菜谱,而是创建与此模式相匹配的<#>all文件配方,即xhtml/中所有带有.html后缀的文件,例如xhtml/foobar.html

例如,当我们提出以下目标时:

代码语言:javascript
复制
xhtml/%.html: xml/%.xml
    xsltproc magic.xsl $< > $@

xml/foobar.xml:
    echo 'Lorep IpsumDorlor si amet' >$@

我们现在可以运行make xhtml/foobar.html,并且make将确定xhtml/foobar.html依赖于xml/foobar.xml,因此将首先创建我们手头有一个菜谱的xml/foobar.xml

%可以被理解为“允许任意文本”,make会记住这个任意文本以供进一步使用。因此,当我们运行make xhtml/foobar.html时,makefoobar识别为“任意文本”,记住foobar并像编写xhtml/foobar.html: xml/foobar.xml那样对目标进行评估。

当您将xhtml/%.html作为依赖项时,您是在引用目标的任意部分。同样,make xhtml/hello.html也会失败,因为make将无法找到一条规则来创建xml/hello.xml

在Makefile中,当make到达菜谱manifold/${MANUSCRIPTNAME}.zip: xhtml/%.html时,它在目标中找不到任意部分,因为它是一个静态文件名。因此,它没有什么可以替换%,我认为这只是一个错误。

我不知道您想要什么来替换% (所以没有做),但是我认为您可以使用以下方法来改进代码:

代码语言:javascript
复制
manifold/$(MANUSCRIPTNAME).zip: manifold/%.zip: xhtml/%.html

注意,在这一行中现在有两个:。新的中间组件告诉make如何从文件名中读取%的合理值。

或者,你可以将:

代码语言:javascript
复制
# as your first recipe
default: manifold/$(MANUSCRIPTNAME).zip

# and then
manifold/%.zip: xhtml/%.html
    [...your recipe...]

甚至:

代码语言:javascript
复制
.DEFAULT_GOAL: manifold/$(MANUSCRIPTNAME).zip
manifold/%.zip: xhtml/%.html
    [...your recipe...]

但我认为最后一个是GNU制造的。

P.S.:我觉得很奇怪,make似乎(能够)取消了${}。通常,我希望我们使用$()-constructs。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/523279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档