makefile simple versioning

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
hellospencer
Beiträge: 10
Registriert: 20.07.2005 10:25:59

makefile simple versioning

Beitrag von hellospencer » 01.09.2005 19:37:16

Hallo,

ich möchte gerne in mein makefile ein simples versioning System einfügen: zu jedem generierten Endprodukt soll der aktuelle Zeitstempel in den Dateinamen übernommen werden.

Dazu definiere ich ein target:

Code: Alles auswählen

date:
          NOW=`date +%d-%b-%Y_%k.%M.%S`
          export NOW
welches vor der Erzeugung des Produktes ausgeführt wird, um in die Environment Variable $(NOW) das aktuelle Datum zu laden.

Anwendungsbeispiel:

Code: Alles auswählen

all: date
         ...
        mv produkt.bla produkt-$(NOW).bla
Leider funktionierts nicht so wie gedacht. Wenn ich die Befehle der Reihe nach in die shell eingeben gehts, aber im makefile nicht. Was mach ich falsch?

Danke für Kommentare und Hilfe!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.09.2005 20:16:45

du mixt da environment und makefile variable, so müßte es funktionieren:

Code: Alles auswählen

NOW=$(shell date +%d-%b-%Y_%k.%M.%S)

all:
       mv product.bla product-$(NOW).bla

Gruß
gms

hellospencer
Beiträge: 10
Registriert: 20.07.2005 10:25:59

Beitrag von hellospencer » 01.09.2005 22:49:30

Nein, das ist es leider nicht. Genaugenommen versuche ich nur Environment Variablen und keine Makefile Variablen zu verwenden. Im target date wird die shell Variable $NOW gesetzt und im target all sollte sie wieder abgefragt werden.

Das Problem mit Deinem Vorschlag ist, dass Makefile Variablen nur Konstanten enthalten können und nicht wie Shell Variablen Rückgabewerte von Funktionen (Output von Befehlen).

Die Frage ist wie kann ich durch eine Kette von Befehlen, die über ein Makefile ausgeführt werden, Environment Variablen setzen und später wieder abrufen? Oder gibt es doch eine Lösung mit Makefile Variablen?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.09.2005 22:58:42

hellospencer hat geschrieben: Das Problem mit Deinem Vorschlag ist, dass Makefile Variablen nur Konstanten enthalten können und nicht wie Shell Variablen Rückgabewerte von Funktionen (Output von Befehlen).
ist doch der Output von einem Befehl:

Code: Alles auswählen

NOW=$(shell date +%d-%b-%Y_%k.%M.%S)
hellospencer hat geschrieben: Die Frage ist wie kann ich durch eine Kette von Befehlen, die über ein Makefile ausgeführt werden, Environment Variablen setzen und später wieder abrufen? Oder gibt es doch eine Lösung mit Makefile Variablen?

Code: Alles auswählen

all:
        $(MAKE) NOW=`date +%d-%b-%Y_%k.%M.%S` target

target:
        echo $(NOW)
gefällt dir das besser ?

Gruß
gms

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 01.09.2005 23:11:57

Ich versuche einmal das Problem mit Environmentvariablen mit zwei Beispielen zu erklären:

Code: Alles auswählen

all:
        NOW=`date +%d-%b-%Y_%k.%M.%S`
        echo now=$$NOW
liefert:

Code: Alles auswählen

root:/home/gms/tmp# make
NOW=`date +%d-%b-%Y_%k.%M.%S`
echo now=$NOW
now=

Code: Alles auswählen

all:
       @ ( NOW=`date +%d-%b-%Y_%k.%M.%S`;\
        echo now=$$NOW; )
liefert:

Code: Alles auswählen

root:/tmp# make
now=01-Sep-2005_23.06.23
also wird praktisch jedes Kommando in einer eigenen Subshell ausgeführt

Gruß
gms

hellospencer
Beiträge: 10
Registriert: 20.07.2005 10:25:59

Beitrag von hellospencer » 02.09.2005 13:32:57

Vielen Dank, jetzt hab ichs kapiert.
jedes Kommando in einer eigenen Subshell ausgeführt
Das wollte ich irgendwie mit einer 'globalen' environment Variablen übergehen.

Bei Deiner Lösung wird die Variable $NOW vor dem Ausführen des Kommandos ins Environment gesetzt, bzw. zwei Befehle hintereinander in derselben Subshell ausgeführt.

Daran hatte ich zum Schluss auch gedacht und mir dem env Befehl experimentiert, konnte aber nicht die richtige Syntax finden.

Dankeschön nochmal, damit können wir den Thread schliessen.

Antworten