10 votes

Trouver le vendeur / la version du compilateur en utilisant qmake

Existe-t-il un moyen d'obtenir la version et le fournisseur du compilateur utilisé par l'utilisateur via qmake ? Ce dont j'ai besoin est de désactiver la construction de certaines cibles de mon projet lorsque g++ 3.x est utilisé et de les activer lorsque g++ 4.x est utilisé.

Mise à jour : La plupart des réponses ciblaient le préprocesseur. C'est quelque chose que je veux éviter. Je ne veux pas qu'une cible soit construite pour une version spécifique du compilateur et je veux que cette décision soit prise par le système de construction.

15voto

Caleb Huitt - cjhuitt Points 9764

En plus de ashcatch La réponse de la Commission, qmake vous permet de interroger la ligne de commande et récupérer la réponse sous forme de variable. Vous pourriez donc faire quelque chose comme ça :

linux-g++ {
    system( g++ --version | grep -e "\<4.[0-9]" ) {
        message( "g++ version 4.x found" )
        CONFIG += g++4
    }
    else system( g++ --version | grep -e "\<3.[0-9]" ) {
        message( "g++ version 3.x found" )
        CONFIG += g++3
    }
    else {
        error( "Unknown system/compiler configuration" )
    }
}

Puis, plus tard, lorsque vous voudrez l'utiliser pour spécifier des cibles, vous pourrez utiliser les règles de scoping de la configuration :

SOURCES += blah blah2 blah3
g++4: SOURCES += blah4 blah5

7voto

dismine Points 441

Ma réponse est basée sur Caleb Huitt - cjhuitt 's. Mais son approche ne fonctionne pas pour moi.

*-g++ {
    GCC_VERSION = $$system("g++ -dumpversion")
    contains(GCC_VERSION, 6.[0-9]) {
        message( "g++ version 6.x found" )
        CONFIG += g++6
    } else {
        contains(GCC_VERSION, 5.[0-9]) {
            message( "g++ version 5.x found" )
            CONFIG += g++5
        } else {
            contains(GCC_VERSION, 4.[0-9]) {
                message( "g++ version 4.x found" )
                CONFIG += g++4
            } else {
                message( "Unknown GCC configuration" )
            }
        }
    }
}

Comme vous le voyez, vous pouvez obtenir la version de GCC et ensuite la comparer avec une expression regex.

Le mode d'emploi est le même :

SOURCES += blah blah2 blah3
g++4: SOURCES += blah4 blah5

2voto

ashcatch Points 1464

Pour commencer, je regarderais la fonctionnalité de cadrage que qmake supporte :

Champ d'application et conditions

Mais en lisant à ce sujet, il semble que par défaut, vous pouvez utiliser les conditions générales de la plate-forme, telles que win32 o unix ou vous pouvez utiliser le nom de la spécification de qmake comme linux-g++ . Vous pourriez tester la version Visual Studio de cette façon (puisque les différentes versions de Visual Studio utilisent différentes spécifications de qmake), mais je ne pense pas que vous puissiez tester la version gcc de cette façon (du moins je ne sais pas comment).

2voto

Eric Lemanissier Points 347

Ma réponse est basée sur réponse de dismine
Nous pouvons simplement extraire le numéro de version majeure en utilisant $$str_member

gcc | clang {
    COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion")
    COMPILER_MAJOR_VERSION = $$str_member($$COMPILER_VERSION)
    greaterThan(COMPILER_MAJOR_VERSION, 3): message("gcc 4 or later")
    greaterThan(COMPILER_MAJOR_VERSION, 4): message("gcc 5 or later")
    greaterThan(COMPILER_MAJOR_VERSION, 5): message("gcc 6 or later")
    greaterThan(COMPILER_MAJOR_VERSION, 6): message("gcc 7 or later")
}

1voto

fantastory Points 319

Je le fais.

isEmpty(MGWVER) {
    MGW_MAJ = $$system(echo | gcc -dM -E - | fgrep __GNUC__ | cut -d\" \" -f 3)
    MGW_MIN = $$system(echo | gcc -dM -E - | fgrep __GNUC_MINOR__ | cut -d\" \" -f 3)
    MGWVER =$$MGW_MAJ$$MGW_MIN
    message(MGWVER $$MGWVER)
}

Il renvoie "48". Je l'utilise pour lier les bibliothèques de boost appropriées :

USER_BOOST_CFG=mgw$${MGWVER}-mt-s-$$(BOOST_VER)
message($$USER_BOOST_CFG)
LIBS *= -L$$(BOOST_ROOT)/lib
LIBS *= -L$$(BOOST_ROOT)/stage/lib

LIBS *= -lboost_system-$$USER_BOOST_CFG
LIBS *= -lboost_filesystem-$$USER_BOOST_CFG
LIBS *= -lboost_date_time-$$USER_BOOST_CFG

donner efficacement : -lboost_system-mgw48-mt-s-1_54

Je suis sur mingw.

Une autre idée est de regarder la vaariable QMAKESPEC et d'en faire l'analyse syntaxique :

message(QMAKESPEC $$QMAKESPEC)
SPLITED=$$section(QMAKESPEC, "/", 0, -3)
message(SPLITED $$SPLITED)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X