2009-09-30 10 views
7

scons verwendet MD5-Hashwerte anstelle von Dateimod-Zeiten, um festzustellen, ob eine Abhängigkeit erstellt werden muss.äquivalent von "touch" in scons?

Ich möchte, dass dies das Standardverhalten ist. Aber gibt es eine Möglichkeit, es zu zwingen, anzunehmen, dass eine bestimmte Datei veraltet ist (das Äquivalent von "Berührung"), neben der Bearbeitung der Datei, um sie anders zu machen?

edit: Use Case:

Binärdatei F wird verwendet, G eine andere Datei G mit einem Werkzeug X. Aus irgendeinem Grund-Datei zu erstellen hat sich geändert (es wurde beschädigt, oder ich bearbeitet es) oder Werkzeug X hat sich geändert, und ich möchte Datei G und alles stromabwärts davon neu erstellen.

bearbeiten: Dies ist nur für den gelegentlichen Gebrauch. Ich möchte nicht, dass das immer passiert, nur wenn ich darum bitteste bin. Auch kann ich die bestimmte Datei im Voraus nicht wissen. Aus diesem Grund möchte ich die SConscript/SConstruct-Dateien nicht modifizieren, um eine bestimmte Datei zu erstellen. Was ich möchte, ist dies an einer Eingabeaufforderung zu tun:

scons {something to specify file foobar.h} 

und das würde scons zwingen, alle Dateien je nach foobar.h zu bauen, während nur scons Eingabe des regulären Build tun würde MD5-Hashes für Abhängigkeitsprüfung . Es macht mir nichts aus, die SConscript/SConstruct-Dateien im Voraus zu bearbeiten, um dies zu ermöglichen (ich denke, dass es sich um einen benutzerdefinierten Decider handelt), wenn es eine Möglichkeit gibt, die Build-Zeiten nicht wesentlich zu erhöhen.

Antwort

4

Haben Sie sich die --interaktive Option von Scons angesehen, dort können Sie bestimmte Ziele säubern und erstellen.

man page describing this.

+0

huh, ich wusste nie über --interaktiv, das wird mir einige Zeit mit wiederholten Builds ersparen. Vielen Dank! Ich denke, ich kann es für das verwenden, was ich auch wollte. –

+0

Beachten Sie, dass Sie, wenn Sie wirklich neue Aufrufe für Kompilierungen auslösen möchten, scons '--interactive --no-cache' verwenden müssen, da der interaktive Befehl' build' nur aus dem Cache auswählt und Sie nicht den Compiler ausführt. –

1

Ich glaube nicht, dass es eine Möglichkeit gibt, dies direkt zu tun. Wenn die fragliche Quelldatei eine eindeutige Ausgabe hat, z. B. test.o, die aus test.c erstellt wurde, würde das Entfernen von test.o eine Neukompilierung der Quelldatei erzwingen.

Wenn Sie stattdessen test.h berühren möchten, das aus mehreren verschiedenen Quelldateien enthalten ist, können Sie besser Ihr gesamtes Projekt bereinigen, um sicherzustellen, dass alles neu erstellt wird.

Nachdem dies gesagt wurde, möchten Sie vielleicht über die Decider() function lesen, die Sie wählen können, wie Dateiabhängigkeiten behandelt werden. Sie können sogar eine benutzerdefinierte Entscheiderfunktion für bestimmte Dateien in Ihrem Projekt auswählen. Wenn Sie also eine globale Header-Datei haben, die Sie gerne touch erstellen und neu erstellen möchten, können Sie das tun.

Update: Um Ihre letzte Frage zu beantworten, löschen Sie einfach die Datei G. Scons wird es von F neu erstellen, indem Sie X beim nächsten Build ausführen.

0

Ich erstelle eine Dummy-Zieldatei mit einem vollen Datum bis zu der Stunde Minute und Sekunde. Dann habe ich die anderen Schritte von dieser Dummy-Zieldatei abhängig. Dies ändert den Wert von md5 jedes Mal, wenn der Erstellungsschritt erneut kompiliert wird und die nachfolgenden Schritte neu kompiliert werden. Alternativ können Sie das Dummy-Ziel entfernen, und das wird auch eine Neukompilierung kaskadieren.

Persönlich finde ich das sehr nützlich, weil ich nicht die gesamte Ausgabe von jedem einzelnen Schritt in meinem EDA-Build-Flow vorhersagen kann. Ich möchte auch nicht versuchen, die gesamte Ausgabe jedes Build-Schritts aufgrund der Wartungskosten vorherzusagen.

Ich bin sicher, dass die Decider() - Funktion, wie Greg erwähnt hat, mehr scons-like ist, aber ich persönlich habe gerne die Timestamp-Dateien.

0

In Ihrer SConstruct-Datei extrahieren Sie den Knoten, der Ihre Datei darstellt. Danach sollten Sie in der Lage sein, den Knoten zu verwenden.always_build (true) um sicherzustellen, dass es gebaut wird, denke ich, dass es seine Angehörigen zwingen wird, auch wieder aufgebaut werden.

+0

Dank, aber ich will das nicht immer tun (es eine seltene, aber dringend benötigte Aufgabe ist), und ich möchte nicht die SConstruct/SConscript Dateien ändern, ich will nur einen Weg, Durchführen einer einmaligen Neuerstellung zum Erzwingen einer bestimmten Datei oder von Dateien und deren Abhängigkeiten, die neu erstellt werden sollen. –