Software > Programmieren, Kompilieren
Sun C-Compiler: Makro zum Erkennen des Betriebssystems
Padde:
Hallo,
derzeit versuche ich, einige C-Programme auf Solaris zu portieren. Als ich diese vor längerer Zeit für FreeBSD und NetBSD entwickelte, hatte ich häufig von bedingter Kompilierung Gebrauch gemacht. Es handelt sich dabei um relativ "systemnahe" Programme, und da gibt es doch häufig subtile Unterschiede zwischen den verschiedenen Unices, was dann zu Konstrukten wie den folgenden führt:
--- Code: ---#ifdef __FreeBSD__
// ... FreeBSD-related stuff ...
#endif
#ifdef __NetBSD__
// ... NetBSD-related stuff ...
#endif
--- Ende Code ---
Das funktioniert so aber nur mit dem GCC, bei dem man sich netterweise auch mit -dM alle vom Compiler bereitgestellten Makros auflisten lassen kann.
Unter Solaris soll das ganze natürlich mit dem Sun C-Compiler (Version 5.8) kompiliert werden. Aber mit welchem Makro kann ich dann erkennen, daß ich unter Solaris unterwegs bin? Leider habe ich dazu keinerlei Informationen finden können. Etwas ähnliches wie -dM, um sich einen Überblick zu verschaffen, scheint es nicht zu geben.
Alternativ könnte man natürlich auch beim Compiler-Aufruf "von Hand" ein Makro wie __SunOS__ o.ä. setzen oder mit uname(3) hantieren. "Sauberer" fände ich es aber, wenn der Compiler ein Makro liefern würde.
Das beschäftigt mich jetzt schon eine ganze Weile. Vielleicht kennt sich jemand von euch besser mit dem Sun-Compiler aus und kann mir da einen Tip geben. Danke im Voraus. :)
llothar:
Also wenn ich mit dem GCC
'cpp -dM /dev/null'
eintippe, kriege ich alle predefined macros aufgelistet. Kannst ja mal schauen ob es sowas auch bei Suns Compiler gibt. Und wenn du es weisst, nochmal melden, das interessiert mich demnächst auch.
Padde:
Wie ich eingangs schon geschrieben habe: Ich konnte nichts finden, was dem -dM von GCC entspricht. Genau das ist ja mein Problem. ???
escimo:
Vielleicht helfen Dir Informationen unter folgendem Link:
http://docs.sun.com/source/806-3567/sun.html
Gruß
escimo
Padde:
Danke dir, das bringt mich schon ein gutes Stück weiter. Etwas unglücklich finde ich allerdings diese Definition hier:
--- Code: ---__`uname -s`_`uname -r` (example: __SunOS_5_7)
--- Ende Code ---
Das hätte IMO vielleicht besser so aussehen sollen:
--- Code: ---__`uname -s`=`uname -r` (example: __SunOS=5_7)
--- Ende Code ---
Dann könnte man die Versionsnummer immer noch explizit abfragen, wenn man sie wirklich braucht, aber ansonsten einfach mit __SunOS arbeiten. Doch so muß ich ja nun jede Solaris-Version, auf der ich mein Programm laufen lassen will, in die Prüfung einbeziehen:
--- Code: ---#if (defined __Sun_OS_5_8) || (defined __Sun_OS_5_9) || (defined __Sun_OS_5_10)
// ... Solaris-related stuff ...
#endif
--- Ende Code ---
Mit Wildcards kann man bei Präprozessor-Direktiven vermutlich nicht arbeiten. :-[ Wie kann man Solaris sonst eindeutig identifizieren? Mit __sun && __unix vielleicht? Hmm, das muß ich mir nochmal genauer ansehen.
PS: Der RAM für die SS20 ist angekommen und funktioniert.
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln