IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Systèmes de compilation Discussion :

Problème definition de variables avec make


Sujet :

Systèmes de compilation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Points : 17
    Points
    17
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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) ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    De souvenir, on peut passer une variable à make ainsi, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    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.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    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.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    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.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    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.

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    Salut,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    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.

Discussions similaires

  1. Definition nouvelle variable avec format dans datastep
    Par dachboden dans le forum Débutez
    Réponses: 9
    Dernier message: 10/06/2011, 10h15
  2. problème de variable avec événement
    Par seb-oulba dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/09/2006, 17h16
  3. Problèmes dimensions boutons variable avec browser
    Par vano dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 08/08/2006, 11h37
  4. Problèmes dimensions boutons variable avec browser
    Par vano dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 07/08/2006, 15h08
  5. Réponses: 6
    Dernier message: 07/07/2006, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo