2016-09-06 7 views
0

ich meinen Code immer starrte und sich fragen, warum meine Datei tut nichts zu berühren:Berühren Ziele tut nichts in Makefile

FILES = file1 file2 

myapp: $(FILES) docs/img/barline.svg 
    cd docs; make html 

docs/img/barline.svg: docs/notebooks/barlines.ipynb docs/data/smbinning 
    cd docs/notebooks; jupyter nbconvert --execute --output-dir html barlines.ipynb 

Wenn ich touch docs/img/barline.svg und laufen make, die jupyter Befehl ausgeführt wird nicht (wie es sein sollte, sollte es nicht?). Die SVG-Datei wird generiert, indem der Befehl jupyter ausgeführt wird. Wenn ich es lösche, funktioniert alles wie erwartet, aber Berühren scheint nichts zu tun.

+1

Wenn Sie 'docs/img/barline.svg' berühren, wird' cd docs; mache html'. Versuchen Sie, 'docs/notebooks/barlines.ipynb' zu berühren, Ihr jupyter-Befehl wird ausgegeben. –

+0

Oh Jean-François. Dies kann ein Zeichen für eine Pause vom Computer sein. Vielen Dank. Klar, so soll es sein. – Xiphias

Antwort

1

Bah, ich verbringe die ganze Zeit damit, eine andere Antwort zu schreiben und es stellt sich heraus, dass ich dein Problem falsch interpretiert habe, oops.

Sie sagen, dass Sie erwarten, dass jupyter ausgeführt wird, wenn Sie barline.svg berühren.

Verwenden Sie die Dateizeitstempel, um festzustellen, wann sie ausgeführt werden soll. Die Regel für nicht-falsche Ziele ist einfach: Wenn eine der Voraussetzungen neuer als das Ziel ist oder das Ziel nicht existiert, wird das Ziel neu erstellt. Ansonsten ist es nicht. In Ihrem Fall:

docs/img/barline.svg: docs/notebooks/barlines.ipynb docs/data/smbinning 

die svg Berühren werden die Bedingungen für diese Regel nicht einhalten, da es das Ziel ist.

Make wird nur ausgeführt, wenn barlines.ipynb oder smbinning neuer als barline.svg ist. Also Ihre Erwartungen sind aus, berühren barline.svg wird nichts tun, außer möglicherweise verursachen Ziele, die es als Voraussetzung, um selbst wieder aufgebaut werden.

Dazu müssten Sie barlines.ipynb oder smbinning berühren. Das macht sie neuer als barlines.svg und zwingt sie zum Neuaufbau. Oder du kannst einfach barlines.svg löschen, wie du herausgefunden hast.

Make erstellt keine Build-Zeitstempel an einem speziellen Ort woanders. Alle Informationen stammen aus dem Dateisystem. Wenn Sie also ein Ziel berühren, hat es nicht wirklich etwas zu sagen: "Hey, jemand hat das Ziel geändert Vielleicht sollte ich es neu aufbauen "(und aus anderen Gründen würde man dieses Verhalten sowieso nicht wollen).

+0

Ich habe Ihre ursprüngliche Antwort gelesen und war ziemlich beeindruckt davon, auch in Anbetracht der Geschwindigkeit, mit der Sie geantwortet haben. – Xiphias