Forum: PC-Programmierung Sed in makefile unter Windows


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
ich schreibe gerade ein makefile, das unter Linux und Windows 
funktionieren soll. Ziel ist eine .h-Datei, die lediglich ein Define für 
die Subversion-Versionsnummer erhält, also so aussieht:
1
/* File generated by make process */
2
#define SVN_REVISION "123M"

Unter Linux ist das ganz einfach: ich schreibe ins makefile:
1
svn_version.h: FORCE
2
  echo "/* File generated by make process \n */" > svn_version.h; \
3
  echo '#define SVN_REVISION "\c' >> svn_version.h; \
4
  svnversion -n  >> svn_version.h; \
5
  echo '"\c' >> svn_version.h; \

Unter Windows ist das auch ganz einfach: Ich nutze einfach subwcrev.exe 
und eine template-Datei.

Dummerweise ist unter Windows das Verhalten von "echo" deutlich anders, 
so daß die Linux-Variante nicht so einfach portierbar ist, also muß ich 
das irgendwie stattdessen mit "sed" zusammensetzen - nur da komme ich 
auf keinen grünen Zweig. Wie schaffe ich es, die Konsolenausgabe von 
"svnversion -n" auf SED umzuleiten?

Viele Grüße
W.T.

von old fart (Gast)


Lesenswert?

cywin installieren, dann musst du gar nix ändern.

von Peter II (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Dummerweise ist unter Windows das Verhalten von "echo" deutlich anders,

wo ist damit genau das Problem, ich würde auch sagen das es unter 
Windows genauso geht wie du oben geschrieben hast.

von Vlad T. (vlad_tepesch)


Lesenswert?

für sowas gibt es doch die SVN-Tags, die das SVN beim einchecken 
automatisch in den Dateien  ersetzt. Warum sollte man sowas so 
kompliziert machen.

Ansonsten kann ich gnuwin32 empfehlen. Das ist eine 
Linux-Kommandozeilen-Tool-Sammlung die direkt unter win läuft, ohne 
diesen Cygwin mist.

von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

old fart schrieb:
> cywin installieren, dann musst du gar nix ändern.

Das schließe ich schon einmal aus. Für ein blödes Echo meine gesamte 
Build-Umgebung komplett umzukrempeln ist (für mich) Unsinn.

Peter II schrieb:
> wo ist damit genau das Problem, ich würde auch sagen das es unter
> Windows genauso geht wie du oben geschrieben hast.

Das wäre sehr schön, aber das Ergebnis ist leider:
1
"/* File generated by make process \n */" ; echo '#define SVN_REVISION "\c' >> svn_version.h; svnversion -n  >> svn_version.h; echo '"\c' ;

d.h. Windows-Echo versteht keine String-Begrenzungen und keine 
Escape-Character. Deswegen vermute ich mal, daß "sed" das Mittel der 
Wahl ist - ich finde nur keinen Startpunkt, wie ich eine Konsolenausgabe 
als Input verwende.

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Diese Variante müsste mit GNU Make unter Linux und Windows 
funktionieren:
1
version=$(shell svnversion -n)
2
3
svn_version.h: FORCE
4
  echo '\* File generated by make process */' > svn_version.h
5
  echo '#define SVN_REVISION "$(version)"' >> svn_version.h

von Walter T. (nicolas)


Lesenswert?

Bernd schrieb:
> Diese Variante müsste mit GNU Make unter Linux und Windows
> funktionieren:

Nicht ganz, aber so paßt es:
1
svn_version.h: FORCE
2
  > svn_version.h echo /* File generated by make process */
3
  >> svn_version.h echo #define SVN_REVISION "$(version)"
Die Anführungszeichen werden vom Windows-Echo nicht richtig 
interpretiert, und Klammern mag die Linux-Bash nicht.

Danke für die Hilfe!

Viele Grüße
W.T.

Edit: Doch nicht so einfach. Ohne Anführungszeichen funktioniert es 
unter Linux nicht. Mal weiter knobeln.

: Bearbeitet durch User
von Bernd (Gast)


Lesenswert?

Hmmm..

Ich hatte meine Lösung sowohl unter Linux als auch in einer Windows XP 
VM getestet.

Möglicherweise ein Unterschied in der verwendeten Unix-Shell oder ein 
anderes Verhalten in neueren Windowsversionen...

von Walter T. (nicolas)


Lesenswert?

Bernd schrieb:
> Möglicherweise ein Unterschied in der verwendeten Unix-Shell oder ein
> anderes Verhalten in neueren Windowsversionen...

Das ist durchaus möglich. Ich verwende Windows 7, und das Ergebnis der 
obigen Variante ist dann:
1
'\* File generated by make process */' 
2
'#define SVN_REVISION "462:464M"'
d.h. echo übernimmt die Anführungszeichen dreist.

Temporär habe ich erst einmal eine Lösung:
1
  > svn_version.h echo $(ECHOQUOTE)/* File generated by make process */$(ECHOQUOTE)
2
  >> svn_version.h echo $(ECHOQUOTE) #define SVN_REVISION "$(version)"$(ECHOQUOTE)
wobei ECHOQUOTE je nach OS ein Hochkomma oder ein Leerzeichen enthält.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.