gcc: Operating-System-Define?

Post Reply
Message
Author
Elmi

gcc: Operating-System-Define?

#1 Post 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?

klopskuchen
prolinux-forum-admin
Posts: 1444
Joined: 26. Jun 2004 21:18
Contact:

#2 Post by klopskuchen »

Code: Select all

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


MfG, Klopskuchen
When all else fails, read the instructions .

Elmi

#3 Post 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...

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post 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

Elmi

#5 Post 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?

klopskuchen
prolinux-forum-admin
Posts: 1444
Joined: 26. Jun 2004 21:18
Contact:

#6 Post 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
When all else fails, read the instructions .

Elmi

#7 Post 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

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#8 Post 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

Elmi

#9 Post 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!

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#10 Post 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

Post Reply