下部の 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/%.html
1つのファイルのためのレシピを作成するのではなく、このパターンに一致するすべてのファイルつまり、 のようなサフィックスxhtml/
を持つ内のすべてのファイルです。.html
xhtml/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.html
xml/foobar.xml
xml/foobar.xml
は%
「任意のテキストを許可する」と解釈でき、make
この任意のテキストを今後の使用のために記憶します。したがって、 を実行するとmake xhtml/foobar.html
、は「任意のテキスト」としてmake
認識し、と記述したかのように目標をfoobar
記憶して評価します。foobar
xhtml/foobar.html: xml/foobar.xml
を依存関係として配置するとxhtml/%.html
、目標の任意の部分を参照することになります。同様に、 は、作成するルールを見つけることができないmake xhtml/hello.html
ため、失敗します。make
xml/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 だけだと思います。
make
PS:逆参照 (できる) のように見えるのは非常に奇妙だと思います${}
。通常は、 -constructs を使用すると思います$()
。