Page 1 of 1

gcc: Operating-System-Define?

Posted: 02. Apr 2006 16:49
by Elmi
Hi,

hat der gcc eigentlich ein fest eingebautes define a la "_LINUX", an dem man im Code festmachen kann, auf welchem OS man sich gerade befindet?

Posted: 02. Apr 2006 18:50
by klopskuchen

Code: Select all

#ifdef LINUX
[...]
#endif
user@host# gcc [...] -D"LINUX"


MfG, Klopskuchen

Posted: 03. Apr 2006 10:12
by Elmi
Naja, wenn ich die Option dem gcc per Kommandozeile mitgebe, ist das ja eher kein fest eingebautes define...ich suche aber einen Weg, um innerhalb von portablem Code das OS zu ermitteln, eben ohne dass der User da irgend welche Makefiles anpassen muss um ein -DLINUX zu setzen...

Posted: 03. Apr 2006 12:01
by Janka
Elmi wrote:Naja, wenn ich die Option dem gcc per Kommandozeile mitgebe, ist das ja eher kein fest eingebautes define...ich suche aber einen Weg, um innerhalb von portablem Code das OS zu ermitteln, eben ohne dass der User da irgend welche Makefiles anpassen muss um ein -DLINUX zu setzen...
Und was ist mit dem allgemeinen Fall TARGET_OS != BUILD_OS? So wie du das machen willst, kann dein Programm nicht Cross-compiliert, d.h. beispielsweise auf einer i386-Maschine für amd64 oder xScale (so bräuchte ich das beispielsweise), werden. Das ist also Mist.


Stattdessen nimmt man am besten die autotools. Da wird dann jeweils beim ./configure durch Beispielcode getestet, wie die Spezifikation der jeweiligen Funktion im Target-OS umgesetzt wurde. Wenn du die autotools nicht benutzen willst, mach die Target-Plattform irgendwie anders selektierbar, z.B. über ein selbstgemachtes ./configure-Skript.

Janka

Posted: 03. Apr 2006 13:33
by Elmi
Hm Ok, aber die autotools müssen das doch auch irgend wie in ein Define umwandeln, oder? Ich denke damit kann ich ja wohl kaum meinen Code an den entsprechenden Positionen verändern lassen?

Posted: 03. Apr 2006 22:31
by klopskuchen
Elmi wrote:Ich denke damit kann ich ja wohl kaum meinen Code an den entsprechenden Positionen verändern lassen?
Weshalb verändern lassen? Richtig schreiben.

Code: Select all

{
/* immer kompilieren */
func_independent();

/* hier wirds plattformabhängig */
#ifdef OS1 {
        func_os1();
        [...]
 }
#elif OS2 {
        func_os2();
        [...]
 }
# endif
Der Compiler ist dazu da, deinen Quellcode zu assemblieren. Freundlicherweise ruft der gcc per default sogar den Linker auf. Programmieren mußt du aber selbst.


MfG, Klopskuchen

Posted: 04. Apr 2006 6:55
by Elmi
Drücke ich mich so unverständlich aus oder warum sonst drehen wir uns hier im Kreis?

Das mit den defines ist mir klar - nur wie bekomme ich heraus, auf welcher Plattform der Code gerade compiliert wird? DAS ist meine (Ursprungs)frage, und die ist bis heute ungeklärt.

Es ist mir im prinzip ja herzlich egal, ob der gcc ein Plattform-Define mitbringt oder ob das von irgend welchen autotools gemacht wird, aber ich würde gerne wissen, wie man sowas realisiert und welche Defines es da möglicherweise schon voreingestellt gibt.

Elmi

Posted: 04. Apr 2006 11:00
by Janka
Elmi wrote: Das mit den defines ist mir klar - nur wie bekomme ich heraus, auf welcher Plattform der Code gerade compiliert wird? DAS ist meine (Ursprungs)frage, und die ist bis heute ungeklärt.

Es ist mir im prinzip ja herzlich egal, ob der gcc ein Plattform-Define mitbringt oder ob das von irgend welchen autotools gemacht wird, aber ich würde gerne wissen, wie man sowas realisiert und welche Defines es da möglicherweise schon voreingestellt gibt.
Damit's beim Cross-Compilieren auch klappt guckt ./configure sich z.B. gcc -dumpmachine an. Das hättest du jetzt aber auch durch man gcc herausfinden können. autotools kennt aber auch andere Compiler, so dass es auch dort das Target richtig bestimmen kann.

Daraus wird dann im Makefile ein CFLAGS=-DPLATFORM=LINUX gemacht. Schon hast du ein Define, mit dem du die Plattform feststellen kannst.

Was autotools aber auch macht ist, feingliederige Defines der Form SIGNAL_SEMANTICS=SYSV bereitzustellen. Da muss man dann nicht jedes Detail der Plattform selbstzuordnen, sondern kann die mitgelieferten m4-Skripte benutzen, die bei ./configure die Headerfiles des Target-Systems scannen, um solche Feinheiten automatisch herauszufinden.

Janka

Posted: 04. Apr 2006 11:21
by Elmi
Janka wrote:Daraus wird dann im Makefile ein CFLAGS=-DPLATFORM=LINUX gemacht.
Das heißt die Antwort auf meine Frage lautet schlichtweg "LINUX". Lang war die Geburt, aber nun hats ja doch noch geklappt...thx!

Posted: 04. Apr 2006 11:55
by Janka
Elmi wrote:
Janka wrote:Daraus wird dann im Makefile ein CFLAGS=-DPLATFORM=LINUX gemacht.
Das heißt die Antwort auf meine Frage lautet schlichtweg "LINUX". Lang war die Geburt, aber nun hats ja doch noch geklappt...thx!
NEIN! Das ist nicht die Antwort. Das oben war nur ein Beispiel, wie man es selbst machen muss!

Janka