0

首先,我不确定我要问的是我的问题。也许是别的东西,所以,请不要犹豫,指出这一点。我认为我出错的地方是clean我的 Makefile 的目标,但它可能完全是另外一回事。

这是发生的事情:在运行之后make clean,然后是make几个目标,它们的结果文件在clean不重建期间被删除。(除了我的问题之外,我对完全取消所有缓存 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

第二轮

$ 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

第三轮

$ 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是建立目标的规则。


编辑2:

最后,我可以像这样实现我想要的:

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 回答