하단 makefile을 실행하면 오류가 발생합니다.
make: *** No rule to make target 'xhtml/%.html', needed by 'manifold/01_doehmer_syntax_pre.zip'. Stop.
target에 규칙이 있기 때문에 이 오류를 이해할 수 없습니다 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
단일 파일에 대한 레시피를 생성하는 것이 아닙니다.이 패턴과 일치하는 모든 파일, 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
recipe 에 도달 하면 manifold/${MANUSCRIPTNAME}.zip: xhtml/%.html
정적 파일 이름이기 때문에 대상에서 어떤 부분도 찾을 수 없습니다. 그래서 대체할 만한 것이 없고 %
그냥 버그라고 생각합니다.
무엇을 바꾸고 싶은지 모르겠지만 %
(그러니 하지 마세요) 다음과 같이 코드를 개선할 수 있다고 생각합니다.
manifold/$(MANUSCRIPTNAME).zip: manifold/%.zip: xhtml/%.html
:
이제 이 행에는 두 개가 있습니다. 새로운 중간 구성 요소는 파일 이름에서 합리적인 값을 읽는 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
추신: 역참조되는 것 같다는 것이 이상하다고 생각합니다 ${}
. 일반적으로 나는 $()
-constructs를 사용하고 싶습니다.