2012-01-11 3 views
12

Czy można powiedzieć, że make buduje cel tylko wtedy, gdy zmieniła się suma kontrolna md5 źródła (zamiast czasu edycji)?Uczyń: zbuduj tylko coś, jeśli suma kontrolna md5 źródła została zmieniona

Używam make do kompilowania moich plików .tex i muszę uniemożliwić mu dwukrotne budowanie wszystkiego.

Próbowałem używać Scons, ale czuję, że nie można go dostosować do innych potrzeb, jakie mam.

+0

Byłem niedawno rozwiązać podobny problem z makefile generowane przy użyciu CMake patrz http://stackoverflow.com/questions/36600111/how-does-cmake-detect-changed-files. –

Odpowiedz

4

Nie, to nie jest obsługiwane przez Make - jak już wiesz, obsługa this feature jest jednym z powodów, dla których istnieją narzędzia takie jak Scons.

Znalazłem instrukcję recipe dla GNU make, chociaż. Może możesz użyć tego jako pracy dookoła.

+0

Problem z bułeczkami polega głównie na tym, że byłabym jedyną osobą w moim otoczeniu. Nikt, kogo znam, nie użyłoby go, czułbym się o wiele więcej dla jakiegoś makefile hackowania (używając niektórych instrukcji if?). – romeovs

+1

Poszedłbym z Scons, niezależnie od tego, to niezły system. Jeśli jest to tylko do kompilowania dokumentu LaTeX, użyłbym czegoś takiego jak [latex-mk] (http://latex-mk.sourceforge.net/). –

+0

tak, właśnie znalazłem rozwiązanie z wykorzystaniem latexmk. Dzięki za podpowiedź z bułeczkami. Nadgonię, kiedy nadejdzie właściwy czas. – romeovs

1

Może mój scons lateks i org-mode receptura pomaga:

## 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)) 

Jest to odpowiednik dla mojego 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