reconnaissance d'une variable d'environnement à la compilation

reconnaissance d'une variable d'environnement à la compilation - C++ - Programmation

Marsh Posté le 30-03-2005 à 17:08:29    

Bonjour,
 
J'aimerais savoir comment forcer le compilateur à passer dans certaines parties d'un programme et pas d'autres, en fonctions de la valeur d'une variable d'environnement (si c'est possible). Ainsi, si on prend OS qui vaut 'Linux' sous le système Linux, j'aimerais quelque chose de reconnu au lancement du compilateur du genre :
 

Code :
  1. if (OS == 'Linux)
  2. compiler cette partie
  3. else if (OS == 'Windows)
  4. compiler cette autre partie
  5. endif


 
Est-ce que c'est réalisable (je crois que c'est le cas quand on cherche juste l'existence ou non d'une variable d'environnement) ? Comment dois-je m'y prendre ?
 
J'aimerais réaliser la même chose avec un programme fortran, est ce que la syntaxe est identique ?
 
Merci d'avance de votre aide,
 
 
 
 
 
 

Reply

Marsh Posté le 30-03-2005 à 17:08:29   

Reply

Marsh Posté le 30-03-2005 à 17:32:26    

Pour la partie code il faut que tu utilises les #if/#elif/#endif en fonction d'un define que tu définirais dans ton makefile qui serais specifique à une plateforme.
Pour le fortran, joker j'y connais rien...

Reply

Marsh Posté le 30-03-2005 à 17:58:59    

Oui, mais je voudrais faire quelque chose de plus sans passer, dans un premier temps, par un Makefile et en utilisant une variable d'environnement déja connue (du type de celle donnée par la commande " env " sous Linux).
 
Après, je voudrais insérer ces lignes dans un programme défini et non pas guider le Makefile en fonction de la valeur de telle ou telle variable.
 
Est-ce possible ?
 
Sinon, pour " #if ", comment faut-il compléter la ligne pour avoir quelque chose du genre " if (OS == 'Linux) " ? Est ce qqch comme #if eq(OS,'Linux') ?
Pourriez vous me donner la syntaxe exacte ?
 
D'avance merci,
 

Reply

Marsh Posté le 30-03-2005 à 18:20:32    

Le compilateur compile tout le source que lui transmets le précompilateur. Hors tu ne peux compiler que ce que ta plateforme connait car le C++ n'est pas multi-plateforme au même titre que le Java ce que j'ai l'impression que tu penses. Tu doit passer au minimum par une recompilation...
Exemple :

Code :
  1. #include <iostream>
  2. int main(int argc, char **argv)
  3. {
  4.    #if defined WIN32
  5.       std::cout << "je suis sur Windows";
  6.    #else if defined LINUX
  7.       std::cout << "je suis sur linux";
  8.    #endif
  9.    return 0;
  10. }


edit : et pour compiler sans passer par un makefile, tu dois saisir un #define LINUX ou #define WIN32 selon la plateforme sur laquelle tu compiles


Message édité par IrmatDen le 30-03-2005 à 18:22:22
Reply

Marsh Posté le 30-03-2005 à 18:29:21    

ou en paramètre au compilateur -DLINUX ou -DWIN32 non ?

Reply

Marsh Posté le 30-03-2005 à 18:31:40    

hum... oui j'ai oublié de le préciser :/

Reply

Marsh Posté le 30-03-2005 à 18:34:52    

Ok, je crois comprendre le type de syntaxe que tu me conseilles. En gros, je dois passer la définition/non défintion de deux variables d'environnement. Je dois donc définir l'une ou l'autre au début de la compilation.
 
C'est ça ?
 
Ce que je souhaitais faire initialement, c'était conserver une même variable (ex : OS) , quelque soit la plateforme, et lui affecter une valeur précise, avant compilation. Ensuite, le compilateur aurait comparé la valeur de cette variable aux différentes valeurs proposées (ex : Linux, Windows ....) afin de choisir la partie du code à compiler. Est-ce que ce genre de syntaxe existe ou est-il impossible d'y faire appel ?
 
Merci déja de cet aide, en attendant la réponse à ces dernières questions,

Reply

Marsh Posté le 30-03-2005 à 18:39:03    

Je sais que c'est ce genre de syntaxe que j'ai dans plusieurs makafiles que j'ai écrit et j'aurais voulu la transposer dans mes programmes.

Reply

Marsh Posté le 30-03-2005 à 20:14:09    

La seule chose que tu peux faire dans ce cas, c'est faire en sorte de n'utiliser que du code standard ou multiplateforme, ce qui ôte sans doute l'intérêt de l'éxécuter en fonction de l'OS. Sans indiscrétion, quel en serait l'utilité par exemple ?

Reply

Marsh Posté le 31-03-2005 à 09:39:02    

En pratique, j'ai un code développé sous Visual C++ 6.0, pour Windows. Il y a plusieurs syntaxes du type USE DFPORT, typique de Windows. Je pourrais ne pas les compiler avec tes indications (avec #if defined), mais j'ai aussi d'autres choses plus génantes avec des chemins de fichier qui sont définies avec \ sous Windows et / sous Linux. Les chaines de caractères définissant ces chemins posent problème dès la compilation. Ainsi, sous Linux, la défintion de qqch du type :
 
PATH = E:\moncompte\mmon repertoire\monfichier
 
n'est pas acceptée car les caractères \ ne passent pas. Il faut écrire qqch du type:
 
PATH = /moncompte/mmon repertoire/monfichier
 
Ce que je voudrais c'est que dès la compilation, selon la valeur de la variable d'environnement OS, le compilateur passe par une ligne ou l'autre pour compiler et que le choix du chemin pour le fichier se fasse à ce moment là. On aurait :
 
[cpp]
 
if (OS == 'Linux)  
 
PATH = /moncompte/mmon repertoire/monfichier
 
else if (OS == 'Windows)  
 
PATH = E:\moncompte\mmon repertoire\monfichier  
 
endif
 
[\cpp]
 
Est ce que c'est possible ?

Reply

Marsh Posté le 31-03-2005 à 09:39:02   

Reply

Marsh Posté le 31-03-2005 à 09:39:59    

Problème avec les " cpp ". Je voulais écrire :
 
En pratique, j'ai un code développé sous Visual C++ 6.0, pour Windows. Il y a plusieurs syntaxes du type USE DFPORT, typique de Windows. Je pourrais ne pas les compiler avec tes indications (avec #if defined), mais j'ai aussi d'autres choses plus génantes avec des chemins de fichier qui sont définies avec \ sous Windows et / sous Linux. Les chaines de caractères définissant ces chemins posent problème dès la compilation. Ainsi, sous Linux, la défintion de qqch du type :  
 

Code :
  1. PATH = E:\moncompte\mmon repertoire\monfichier

 
 
n'est pas acceptée car les caractères \ ne passent pas. Il faut écrire qqch du type:  
 

Code :
  1. PATH = /moncompte/mmon repertoire/monfichier

 
 
Ce que je voudrais c'est que dès la compilation, selon la valeur de la variable d'environnement OS, le compilateur passe par une ligne ou l'autre pour compiler et que le choix du chemin pour le fichier se fasse à ce moment là. On aurait :  
 

Code :
  1. if (OS == 'Linux) 
  2. PATH = /moncompte/mmon repertoire/monfichier
  3. else if (OS == 'Windows) 
  4. PATH = E:\moncompte\mmon repertoire\monfichier 
  5. endif

 
 
Est ce que c'est possible ?

Reply

Marsh Posté le 31-03-2005 à 11:24:23    

Pour tes problèmes de chemins, utilise des chemins relatifs avec des simples slashs: ça passe sous tous les OS (y compris Windows.)
Donc:

PATH = moncompte/mon_repertoire/monfichier


 
Tu n'auras qu'à utiliser les répertoires d'include si ça marche pas super (-I/moncompte/mon_rep en ligne de commande du compilo sous unix).
 
 
Pour tes problèmes de USE, ça sera plutôt:

Code :
  1. #ifdef WIN32
  2.   lalala
  3. #else
  4.   // on est probablement sous Unix
  5.   lere lere lere
  6. #endif


 
Dernière feinte: le #ifdef qui va bien pour détecter Visual C++, c'est "_MSC_VER". Puisque "WIN32" est défini par tous les compilos sous Windows.


Message édité par Lam's le 31-03-2005 à 11:25:04
Reply

Marsh Posté le 31-03-2005 à 18:54:36    

Bon, j'ai deux gros problèmes en travaillant sous Linux :
 
Pour les programmes C++, la syntaxe  
 

Code :
  1. #ifdef WIN32
  2.   lalala
  3. #else 
  4.   // on est probablement sous Unix  
  5.   lere lere lere
  6. #endif


 
est reconnue à la compilation qui s'éxécute normalement mais quelquesoit la variable WIN32, TOTO, TATA ... on y passe toujours. C'est à dire, que à l'éxécution lalala est toujours éxécuté :/
 
En fortran (je sais c'est pas trop le sujet ici ;) ), cette syntaxe en #ifdef/#else/#endif n'est absolument pas reconnue, quelquesoit le compilateur ! Pourtant, elle passe très bien sous Visual qui semble éxécuter la partie demandée.
 
Sauriez vous m'aider sur ces deux problèmes ?
D'avance merci !

Reply

Marsh Posté le 31-03-2005 à 19:24:35    

Autant pour moi, cette syntaxe marche sous Linux, pour les programmes C++ avec le compilateur gcc ...
 
Mais avec le compilateur Portland pgCC, j'ai l'impression d'avoir plus de problème. Par exemple si lalala correspond à cout << "lalala" << endl; , la compilation ne se fait pas ! Si c'est a = 1+1, ça semble marcher.
 
Je vais essayer de comprendre ce qui se passe.
 
Par contre pour les programmes fortran, il me semble avoir toujours les mêmes soucis !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed