Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > Autres
Autres Vos questions sur les autres EDI ou éditeurs : Emacs, Vim, Kdevelop, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/03/2009, 21h59   #1
kzwix
Invité régulier
 
Inscription : août 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 30
Points : 5
Points : 5
Par défaut Problème definition de variables avec make

Bonjour,

Pour un projet multi-plateformes, nous avons un Makefile parametré. Grâce à du "ifeq", je reussis à obtenir des variables configurées pour une compilation Windows ou Linux. Cependant, ce fonctionnement est contraignant : Il oblige à definir une variable d'environnement, dans le fichier, ou exportée à partir du shell appelant, voire passee en ligne de commande à make.


J'aimerais, si c'est possible, definir le contenu de plusieurs variables via des cibles .PHONY

Voici un apperçu de ce que j'ai essayé (et qui ne marche pas), ce qui vous donnera une idée de ce que je souhaite faire :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
.PHONY: linux
linux:
        VAR=valeur_pour_linux
        VAR2=valeur_pour_linux
        VAR3=valeur_pour_linux
        $(MAKE) -e all
 
.PHONY: windows
windows:
        VAR=valeur_pour_windows
        VAR2=valeur_pour_windows
        VAR3=valeur_pour_windows
        $(MAKE) -e all
 
 
all:
        <Compilation utilisant VAR, VAR2, VAR3... >



Après avoir galéré plusieurs heures, j'ai l'impression que cela n'est pas possible. En effet, les variables d'environnement semblent impossibles à modifier via les lignes de commandes. J'ai également essayé export, tenté de echo la valeur juste après mes tentatives de changements de valeurs, mais rien n'y fait, ces variables semblent refuser obstinément de changer de valeur via des lignes de commandes...

Y'a-t'il une solution, ou est-il obligatoire d'utiliser des moyens détournés pour obtenir ce que je souhaite réaliser ?


Merci par avance
kzwix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2009, 15h28   #2
kzwix
Invité régulier
 
Inscription : août 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 30
Points : 5
Points : 5
Bon, j'ai finalement réussi à obtenir, plus ou moins, l'effet souhaité, par une combinaison de definitions blindées par des "ifeq", et d'appels recursifs en passant un parametre de config en ligne de commande.

En gros :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#Valeur par defaut de PLATE_FORME
PLATE_FORME = linux
 
ifeq($(PLATE_FORME),windows)
VAR1=...
VAR2=...
else
VAR1=...
VAR2=...
endif
 
.PHONY: linux
linux:
        make all PLATE_FORME=linux
 
.PHONY: windows
windows
        make all PLATE_FORME=windows
 
all: $(OBJS)
        @echo "Cible all : travail terminé"

Cela dit, par curiosité, et parce que je me suis bien ennervé sur le problème avant de trouver ça, j'aimerais tout de même une réponse, si quelqu'un sait si, oui ou non, il est possible de définir les valeurs des variables dans les lignes de commandes dans le makefile (lignes executées pour construire une cible) ?
kzwix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2009, 22h44   #3
aoyou
Membre émérite
 
Inscription : mars 2005
Messages : 860
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 860
Points : 964
Points : 964
De souvenir, on peut passer une variable à make ainsi, non ?
Code :
make VAR1=value1 VAR2=value2
Si tu veux te simplifier la vie avec les Makefiles multi-plateformes, je te conseille l'utilisation de CMake. Ce genre de choses est très simple à réaliser avec CMake. Un court example ici http://cmake.org/cmake/help/examples.html
aoyou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2009, 16h47   #4
kzwix
Invité régulier
 
Inscription : août 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 30
Points : 5
Points : 5
Merci pour la réponse, c'est en effet la technique que j'ai utilisé, mes cibles "linux" et "windows" se contentant d'appeler récursivement, et selon cette syntaxe, le makefile.

Je regrette juste que cela ne soit pas un peu plus proche d'un vrai langage de programmation, avec possibilité de redéfinir le contenu des variables à l'execution.
kzwix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2009, 16h52   #5
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 393
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2005
Messages : 22 393
Points : 32 042
Points : 32 042
Envoyer un message via MSN à Médinoc
D'un autre côté, si je me souviens bien, make détecte les appels récursifs, ce qui ferait de ça une technique "officielle" pour l'écriture de makefile...
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.
-- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2009, 16h57   #6
kzwix
Invité régulier
 
Inscription : août 2007
Messages : 30
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 30
Points : 5
Points : 5
Oui, tout à fait, il existe une variable MAKELEVEL qui est automatiquement incrementee a chaque invocation d'un sous-make.

Cela dit, j'aurais préféré que make se borne à un rôle de "lanceur de scripts" récursif, plutôt que de restreindre ainsi les commandes disponibles.
kzwix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2009, 17h00   #7
Médinoc
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 22 393
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : septembre 2005
Messages : 22 393
Points : 32 042
Points : 32 042
Envoyer un message via MSN à Médinoc
Le pire exemple de récursivité que j'aie vu, ça reste quand même un programme de l'IOCCC, qui écrivait les "twelve days of christmas" uniquement par des appels récursifs de main(). Et les chaînes de caractères employées étaient cryptées.
__________________
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone.
-- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2010, 20h38   #8
LoGGi
Invité régulier
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 7
Points : 7
Salut,

Je me permets de relancer la discussion car j'ai repris la technique de kzwix, j'ai donc ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
#give your OS on the command line :
#make linux
#make mac
#make windows
 
#OS by default :
OS = LINUX
 
.PHONY: linux
linux:
        make all OS=LINUX
 
.PHONY: windows
windows:
        make all OS=WIN32
 
.PHONY: mac
mac:
        make all OS=MAC
 
 
ifeq ($(OS), WIN32)
    GCC = cl.exe /c /EHsc
else
    GCC = g++ -c -Wall
endif
 
 
all: maLib

Le hic c'est que ça fonctionne sous linux mais pas sous mac os ou windows où j'obtiens :
make: Nothing to be done for `windows'.

Est-ce que j'ai loupé une étape ?
LoGGi est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/10/2010, 21h01   #9
LoGGi
Invité régulier
 
Inscription : juin 2010
Messages : 19
Détails du profil
Informations forums :
Inscription : juin 2010
Messages : 19
Points : 7
Points : 7
Ah j'ai trouvé mon erreur,

l'indentation n'était pas respectée au niveau des make all ...
Il y avait une tab en trop

Ca ne posait pas de problème sous linux mais sous windows et mac si.

Sorry pour ces posts qui ne servent pas à grand chose.
LoGGi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h27.


 
 
 
 
Partenaires

Hébergement Web