Make: только построить что-то, если исходная контрольная сумма md5 была изменена - PullRequest
15 голосов
/ 11 января 2012

Можно ли сказать make, что нужно создать цель, только если ее источники изменили контрольную сумму md5 (вместо времени редактирования)?

Я использую make для компиляции .texфайлы, и мне нужно, чтобы он не создавал все дважды.

Я пытался использовать Scons, но я чувствую, что это не адаптируется к другим моим потребностям.

Ответы [ 3 ]

5 голосов
/ 05 сентября 2012

Я нашел 3 способа: от

(от неоднородного, но простого в очистке, но сложного для реализации)

5 голосов
/ 11 января 2012

Нет, это не поддерживается Make - как вы узнали, поддержка этой функции является одной из причин, по которой существуют такие инструменты, как Scons .

Я нашел руководство рецепт для GNU make. Может быть, вы можете использовать это как обходной путь.

1 голос
/ 05 сентября 2012

Может быть, мой рецепт scons из латекса и орг-режима поможет вам:

## I need a couple of special builders for my projects
# the $SOURCE replacement only uses the first source file. $SOURCES gives all.
# specifying all source files makes it possible to rerun the build if a single source file changed.
orgexportpdf = 'emacs --batch --visit "$SOURCE" --funcall org-export-as-pdf'
pyxplot = 'pyxplot $SOURCE'
# pdflatex is quite dirty. I directly clean up after it with rm.
pdflatex = 'pdflatex $SOURCE -o $TARGET; rm -f  *_flymake* flymake* *.log *.out *.toc *.aux *.snm *.nav *.vrb'

# build the PhD thesis from emacs org-mode.
Command("doktorarbeit.pdf", "doktorarbeit.org",
        orgexportpdf)

# create plots
Command(["images/comp-t3-s07-tem-boas.png", 
         "images/comp-t3-s07-tem-bona.png"], 
        ["nee-comp.pyx", 
         "nee-comp.txt"],
        pyxplot)

# build my sink.pdf
Command("sink.pdf", 
        ["sink.tex", 
         "images/comp-t3-s07-tem-boas.png", 
         "images/comp-t3-s07-tem-bona.png", 
         "images/bona-marble.png", 
         "images/boas-marble.png"],
        pdflatex)

# My editors leave tempfiles around. I want them gone after a build clean. This is not yet supported!
tempfiles = Glob('*~') + Glob('#*#') + Glob('*.bak')
# using this here would run the cleaning on every run.
#Command("clean", [], Delete(tempfiles))

Это аналог моего Makefile:

all: doktorarbeit.pdf sink.pdf

sink.pdf : sink.tex images/comp-t3-s07-tem-boas.png images/comp-t3-s07-tem-bona.png images/bona-marble.png images/boas-marble.png
    pdflatex sink.tex
    rm -f  *_flymake* flymake* *.log *.out *.toc *.aux *.snm *.nav *.vrb # kill litter

comp-t3-s07-tem-boas.png comp-t3-s07-tem-bona.png : nee-comp.pyx nee-comp.txt
    pyxplot nee-comp.pyx

# http://www.reddit.com/r/emacs/comments/dy9yt/anyone_know_of_a_script_that_i_can_feed_an/
# http://blog.nguyenvq.com/2010/10/30/bash-batch-script-to-convert-org-mode-file-to-html/comment-page-1/#comment-27013
doktorarbeit.pdf : doktorarbeit.org
    emacs --batch --visit "doktorarbeit.org" --funcall org-export-as-pdf

# this is not what clean is intended to do, but I do it anyway.
clean : 
    rm -f \#* *~ *.bak # kill editor backups

# alternatively run scons. Should I switch to SCons, just put this in all :)
sconsrun : scons
    python scons/bootstrap.py -Q

scons : 
    hg clone https://bitbucket.org/ArneBab/scons
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...