私のメイクファイルには、別のターゲットに必要なターゲットを作成するルールがないのはなぜですか?

私のメイクファイルには、別のターゲットに必要なターゲットを作成するルールがないのはなぜですか?

下部の makefile を実行すると、次のエラーが表示されます:

make: *** No rule to make target 'xhtml/%.html', needed by 'manifold/01_doehmer_syntax_pre.zip'.  Stop.

ターゲットを含むルールがあるため、このエラーが理解できませんxhtml/%.html。なぜこのルールはカウントされないのでしょうか?

ファイルを含むフォルダー内でこれを実行します01_doehmer_aspekte.docx

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

答え1

目標を定義するときは、xhtml/%.html1つのファイルのためのレシピを作成するのではなく、このパターンに一致するすべてのファイルつまり、 のようなサフィックスxhtml/を持つ内のすべてのファイルです。.htmlxhtml/foobar.html

たとえば、次のような目標を立てるとします。

xhtml/%.html: xml/%.xml
    xsltproc magic.xsl $< > $@

xml/foobar.xml:
    echo '<?xml version="1.0"?><a><b><c some="attr">Lorep Ipsum</c><c some="other">Dorlor si amet</c></b></a></xml>' >$@

私たちは今、実行して、依存するmake xhtml/foobar.htmlものを決定し、したがって、最初に手元にあるレシピを作成するように努めます。xhtml/foobar.htmlxml/foobar.xmlxml/foobar.xml

%「任意のテキストを許可する」と解釈でき、makeこの任意のテキストを今後の使用のために記憶します。したがって、 を実行するとmake xhtml/foobar.html、は「任意のテキスト」としてmake認識し、と記述したかのように目標をfoobar記憶して評価します。foobarxhtml/foobar.html: xml/foobar.xml

を依存関係として配置するとxhtml/%.html、目標の任意の部分を参照することになります。同様に、 は、作成するルールを見つけることができないmake xhtml/hello.htmlため、失敗します。makexml/hello.xml

Makefile では、makeレシピに到達したときにmanifold/${MANUSCRIPTNAME}.zip: xhtml/%.html、静的ファイル名であるため、目標内の任意の部分を見つけることができません。その結果、 を置き換えるものがなく%、これは単にエラーと見なされると思います。

何を置き換えたいのかはわかりませんが%(したがって、作成しません)、次のようにコードを改善できると思います。

manifold/$(MANUSCRIPTNAME).zip: manifold/%.zip: xhtml/%.html

この行には現在 2 つあることに注意してください:。新しい中央のコンポーネントは、ファイル名からmake適切な値を読み取る方法を示しています。%

あるいは、次のように記述することもできます。

# as your first recipe
default: manifold/$(MANUSCRIPTNAME).zip

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

あるいは:

.DEFAULT_GOAL: manifold/$(MANUSCRIPTNAME).zip
manifold/%.zip: xhtml/%.html
    [...your recipe...]

しかし、最後は GNU Make だけだと思います。

makePS:逆参照 (できる) のように見えるのは非常に奇妙だと思います${}。通常は、 -constructs を使用すると思います$()

関連情報