0

まず第一に、私が尋ねようとしているの私の問題であるかどうかはわかりません。おそらくそれは別のことなので、遠慮なく指摘してください。私が間違った場所は私のMakefileのターゲットだと思いますcleanが、それはまったく別のものである可能性があります。

実行後、いくつかのターゲットが実行された後make cleanmakeclean構築しないで結果のファイルが削除されます。(私の質問に加えて、GNU / Makeが行うすべてのキャッシュを完全にキャンセルする方法に興味があります。これを使用したときから、それは大きな苦痛であり、一度もプラスの結果をもたらすことはありませんでした)。

その後、再度実行makeすると、一部のターゲットが再構築されます。もう一度実行するmakeと、前のラウンドで作成されたターゲットに依存するターゲットが再作成されます。

対応するMakefileセクションは次のとおりです。

PACKAGE = i-iterate
DOCDST = ${PACKAGE}/docs
HTMLDOCDST = ${PACKAGE}/html-docs
DOCSRC = ${PACKAGE}/info
IC = makeinfo
ICO = --force
TEXI2HTML = texi2html
TEXI2HTMLO = --split section --use-nodes
HTML2WIKI = html2wiki
HTML2WIKIO = --dialect GoogleCode
TEXI = $(wildcard $(DOCSRC)/*.texi)
INFO = $(addprefix $(DOCDST)/,$(notdir $(TEXI:.texi=.info)))
WIKIDST = ../wiki
HTML = $(wildcard $(HTMLDOCDST)/*.html)
WIKI = $(addprefix $(WIKIDST)/,$(notdir $(HTML:.html=.wiki)))

$(DOCDST)/%.info: $(DOCSRC)/%.texi
    echo "info builds: $<"
    $(IC) $(ICO) -o $@ $<
    $(TEXI2HTML) $(TEXI2HTMLO) $<

$(WIKIDST)/%.wiki: $(HTMLDOCDST)/%.html
    $(HTML2WIKI) $(HTML2WIKIO) $< > $@

default: prepare $(INFO) move-html $(WIKI) rename-wiki byte-compile
    cp -r lisp info Makefile README i-pkg.el ${PACKAGE}

prepare:
    mkdir -p ${PACKAGE}
    mkdir -p ${DOCDST}
    mkdir -p ${HTMLDOCDST}

move-html:
    $(shell [[ '0' -ne `find ./ -maxdepth 1 -name "*.html" | wc -l` ]] && \
mv -f *.html ${HTMLDOCDST}/)

rename-wiki:
    $(shell cd ${WIKIDST} && rename 'i-iterate' 'Iterate' *.wiki)
    $(shell find ${WIKIDST} -name "*.wiki" -exec sed -i \
's/\[i-iterate/\[Iterate/g;s/\.html\#/\#/g;s/&lt;/\</g;s/&gt;/\>/g' \
'{}' \;)

byte-compile:
    emacs -Q -L ./lisp -batch -f batch-byte-compile ./lisp/*.el

clean:
    rm -f ./lisp/*.elc
    rm -f ./*.html
    rm -rf ${DOCDST}
    rm -rf ${HTMLDOCDST}
    rm -rf ${PACKAGE}

そして、これが出力です:

ファーストラン

$ make
mkdir -p i-iterate
mkdir -p i-iterate/docs
mkdir -p i-iterate/html-docs
emacs -Q -L ./lisp -batch -f batch-byte-compile ./lisp/*.el
Wrote /home/wvxvw/Projects/i-iterate/trunk/lisp/i-iterate.elc
cp -r lisp info Makefile README i-pkg.el i-iterate

2回目の実行

$ make
mkdir -p i-iterate
mkdir -p i-iterate/docs
mkdir -p i-iterate/html-docs
echo "info builds: i-iterate/info/i-iterate.texi"
info builds: i-iterate/info/i-iterate.texi
makeinfo --force -o i-iterate/docs/i-iterate.info i-iterate/info/i-iterate.texi
texi2html --split section --use-nodes i-iterate/info/i-iterate.texi
emacs -Q -L ./lisp -batch -f batch-byte-compile ./lisp/*.el
Wrote /home/wvxvw/Projects/i-iterate/trunk/lisp/i-iterate.elc
cp -r lisp info Makefile README i-pkg.el i-iterate

3回目の実行

$ make
mkdir -p i-iterate
mkdir -p i-iterate/docs
mkdir -p i-iterate/html-docs
echo "info builds: i-iterate/info/i-iterate.texi"
info builds: i-iterate/info/i-iterate.texi
makeinfo --force -o i-iterate/docs/i-iterate.info i-iterate/info/i-iterate.texi
texi2html --split section --use-nodes i-iterate/info/i-iterate.texi
html2wiki --dialect GoogleCode i-iterate/html-docs/i-iterate_9.html > ../wiki/i-iterate_9.wiki
# ... a bunch more of the documentation pages ...
/i-iterate_5.wiki
html2wiki --dialect GoogleCode i-iterate/html-docs/i-iterate_2.html > ../wiki/i-iterate_2.wiki
emacs -Q -L ./lisp -batch -f batch-byte-compile ./lisp/*.el
Wrote /home/wvxvw/Projects/i-iterate/trunk/lisp/i-iterate.elc
cp -r lisp info Makefile README i-pkg.el i-iterate

ご覧のとおり$(INFO)、ファイルを出力するディレクトリが削除されて新しく作成されたにもかかわらず、最初の実行では入力されていません。後で(再構築しない)再構築すると、まったく同じことが起こり$(WIKI)ます。

編集:

これがディレクトリ構造#です。記号に続くテキストはコメントです。

|- info
|  +- documentation.texi
|- lisp
|  +- source.el
|  +- binary.elc # generated during compile
|- docs # should be deleted and created during the build
|  +- documentation.info
|- html-docs # should be deleted and created during the build
|  +- documentation.html
|- i-iterate # sources are copied here for distribution
|  |- info
|  |  +- documentation.texi
|  |- lisp
|  |  +- source.el

元のMakefileを更新しましたが、問題は解決していません

TEXI = $(wildcard $(DOCSRC)/*.texi)
INFO = $(addprefix $(DOCDST)/,$(notdir $(TEXI:.texi=.info)))
WIKIDST = ../wiki

$(DOCDST)/%.info: $(DOCSRC)/%.texi
    @echo "info builds: $<"
    $(IC) $(ICO) -o $@ $<
    $(TEXI2HTML) $(TEXI2HTMLO) $<

# This rule is not applied! :(
$(WIKIDST)/%.wiki: $(HTMLDOCDST)/%.html
    @echo "Wiki: $<"
    $(HTML2WIKI) $(HTML2WIKIO) $< > $@

default: prepare $(INFO) move-html rename-wiki byte-compile
    cp -r lisp info Makefile README i-pkg.el ${PACKAGE}

prepare:
    mkdir -p ${PACKAGE}
    mkdir -p ${DOCDST}
    mkdir -p ${HTMLDOCDST}

move-html:
    $(shell [[ '0' -ne `find ./ -maxdepth 1 -name "*.html" | wc -l` ]] && \
mv -f *.html ${HTMLDOCDST}/)
    $(eval HTML := $(wildcard $(HTMLDOCDST)/*.html))
    $(eval WIKI := $(addprefix $(WIKIDST)/,$(notdir $(HTML:.html=.wiki))))
    @echo "HTML: $(HTML)"       # prints as expected
    @echo "WIKI: $(WIKI)"       # prints as expected

rename-wiki: $(WIKI)                     # this dependency never triggers
                                         # the $(WIKIDST)/%.wiki rule
    @echo "Renaming: `ls $(HTMLDOCDST)`" # the files are there
    $(shell cd ${WIKIDST} && rename 'i-iterate' 'Iterate' *.wiki)
    $(shell find ${WIKIDST} -name "*.wiki" -exec sed -i \
's/\[i-iterate/\[Iterate/g;s/\.html\#/\#/g;s/&lt;/\</g;s/&gt;/\>/g' \
'{}' \;)

この方法で実行しよう$(WIKI)としても、何らかの理由でコレスポンデントルールがトリガーされません。

そして、私がrename-wiki次のように変更した場合:

rename-wiki: ../wiki/file.wiki

「ターゲットを構築するためのルールはありません。ターゲット$(WIKIDIST)/%.wikiを構築するためのルールですが。


EDIT2:

最後に、私はそれをそのようにすることで私が望むことを達成することができました:

move-html:
    $(shell [[ '0' -ne `find ./ -maxdepth 1 -name "*.html" | wc -l` ]] && \
mv -f *.html $(HTMLDOCDST)/)
    $(foreach html, $(wildcard $(HTMLDOCDST)/*.html), \
$(HTML2WIKI) $(HTML2WIKIO) $(html) > \
$(addprefix $(WIKIDST)/, $(notdir $(html:.html=.wiki))))

言うまでもなく、私が解決策とそれを考案する言語がどれほど好きか。

4

1 に答える 1

1

ここにはいくつかの問題があります。これには数回の反復が必要な場合があります。

まず、とその中のすべてmake cleanを削除するi-iterate/と、i-iterate/info/whatever.texi. texi ファイルがないため、Make は info ファイルを作成する必要がないと判断します。$(INFO)空のリストです。

私は、いくつかの黒魔術によって、emacs コマンドがinfo/エーテルから texi ファイルでいっぱいのディレクトリを作成し、それを Make がi-iterate/(defaultルールで) コピーすることを収集します。あれは正しいですか?正しい場合は、ステップの前にこれを行う必要があります。$(INFO)ステップについても同じことが言えると思いますが、$(WIKI)先回りしないようにしましょう。

于 2012-12-15T16:35:53.243 に答える