Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité régulier
    Inscrit en
    août 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 30
    Points : 6
    Points
    6

    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

  2. #2
    Invité régulier
    Inscrit en
    août 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 30
    Points : 6
    Points
    6

    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 :
    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 Expert
    Inscrit en
    mars 2005
    Messages
    865
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 865
    Points : 1 060
    Points
    1 060

    Par défaut

    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

  4. #4
    Invité régulier
    Inscrit en
    août 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 30
    Points : 6
    Points
    6

    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 Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 161
    Points : 35 291
    Points
    35 291

    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
    Invité régulier
    Inscrit en
    août 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : août 2007
    Messages : 30
    Points : 6
    Points
    6

    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 Confirmé Sénior Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    24 161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 24 161
    Points : 35 291
    Points
    35 291

    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
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 20
    Points : 8
    Points
    8

    Par défaut

    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 ?

  9. #9
    Invité régulier
    Inscrit en
    juin 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : juin 2010
    Messages : 20
    Points : 8
    Points
    8

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •