Wie vermitteln ich an make
, dass ein Skript eine Datei bedingt ändern kann, so dass make
wartet auf stat
alle Dateien, bis dieses Skript ausgeführt wird?Makefile mit bedingt generierten Datei
Betrachten Sie das folgende Beispiel Spielzeug Reihe von Dateien:
// version
2
// foo.h - note the space between the 1 and the semicolon
static constexpr int VERSION = 1 ;
//update.py
import sys
with open(sys.argv[1]) as f:
cur = int(f.readlines()[0].split()[5])
with open('version') as f:
exp = int(f.readlines()[0].strip())
if cur < exp:
with open(sys.argv[1], 'w') as f:
print >> f, 'static constexpr int VERSION = {} ;'.format(exp)
// main.cxx
#include "foo.h"
#include <iostream>
int main() {
std::cout << VERSION << std::endl;
}
// makefile
all : a.out updater
a.out : main.o
g++ -o a.out main.o
main.o : main.cxx
g++ -std=c++11 -o main.o -c main.cxx -MP -MMD -MF main.d
.PHONY : updater
updater :
python update.py foo.h
-include main.d
Die hier Absicht ist, dass ich eine Datei haben, foo.h
, die bedingt ist durch ein Skript aktualisiert, update.py
(wenn Sie die Nummer in version
erhöhen, wird foo.h
aktualisiert werden - sonst wird nichts passieren). Ich möchte diesen Begriff zu make
irgendwie vermitteln - dass es nicht zu stat
foo.h
ist, um zu bestimmen, ob es main.o
bis update.py
Fertigstellen neu zu beenden braucht. Wie stelle ich die Bestellung sicher?
Hinweis: version
Hier ist einfach ein Platzhalter für eine komplexe Reihe von Voraussetzungen, die nicht einfach zu äußern sind. Einfach hinzufügen foo.h : version
ist keine Lösung.
'foo.h: Updater' vielleicht? Oder mach einfach das Rezept für "Updater" das Rezept für "foo.h". – user657267
@ user657267 Das funktioniert nicht. – Barry
Leider habe ich mich geirrt, das Rezept in 'foo.h' zu verschieben, aber' foo.h' sollte das Ziel von 'main.o' und' updater' das Ziel von 'foo.h' sein. – user657267