2009-04-29 8 views
9

¿Hay alguna forma de obtener la versión y el proveedor del compilador utilizado por el usuario a través de qmake? Lo que necesito es deshabilitar la construcción de algunos objetivos de mi proyecto cuando se usa g ++ 3.x y habilitarlos cuando se usa g ++ 4.x.Encontrar proveedor de compilador/versión usando qmake

Actualización: La mayoría de las respuestas se enfocaron en el preprocesador. Esto es algo que quiero evitar No quiero que se cree un objetivo para una versión de compilación específica y quiero que el sistema de compilación tome esta decisión.

Respuesta

13

Además de ashcatch 's respuesta, qmake que permite a query the command line y obtener la respuesta de vuelta como una variable. Por lo que podría a algo como esto:

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") 
    } 
} 

Luego, más tarde, cuando usted quiere usarlo para especificar los objetivos, puede utilizar las reglas de configuración de alcance:

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

perfecto gracias. Estaba pensando en hacer algo así, pero pensé en preguntar si hay algo que ya se admite desde el primer momento. Dado que aparentemente su solución no está lista, está lista para usar :-) –

+0

@Caleb: existe una posible simplificación si utiliza el comando 'gcc -dumpversion', lo que podría hacer que grep sea redundante. ¿Puedo editar tu respuesta o debo escribir otra? – user23573

+0

@BogdanWilli Siéntase libre. –

0

Cada proveedor de compiladores utiliza para definir algunos símbolos específicos que identifican el compilador y la versión. Podrías hacer el chequeo usando esos símbolos.

Sé, por ejemplo, que _MSC_VER proporciona la versión del compilador de Microsoft C++.

Lo que también sé es que Boost Libraries usa este tipo de selección de funciones y adaptación.

Puede consultar los encabezados de Boost Config, que se encuentran en la carpeta include, en la ruta: boost/config/*, especialmente en select_compiler_config.hpp.

Al usar esos símbolos específicos del compilador, puede seleccionar las características en la fase de preprocesamiento para generar el código.

2

Para empezar, me gustaría ver la función de alcance que QMake soportes:

Scopes and Conditions

Pero mientras lo leí, parece que por defecto se puede utilizar condiciones generales plataforma como win32 o unix o puede usar el nombre de la especificación qmake como linux-g++. Puede probar la versión de Visual Studio de esta manera (ya que las diferentes versiones de Visual Studio usan diferentes especificaciones de qmake), pero no creo que pueda probar la versión de gcc de esta manera (al menos no sé cómo).

0

Los siguientes macros se definen en mi versión de gcc y g ++

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

Adicionalmente g ++ define:

#define __GNUG__ 4 
1

hago

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) 
} 

Devuelve "48". lo uso para vincular a impulsar las bibliotecas adecuadas:

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 

dando efectivamente: -lboost_system-mgw48-mt-s-1_54

estoy en MinGW.

Otra idea es mirar QMAKESPEC vaariable y analizar de ella, pista:

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

esto no funciona en Qt 5.4 (Kit seleccionado: Desktop Qt 5.4.1 MinGW 32bit) 'fgrep' no está disponible. – user23573

+0

fgrep no es parte de qt. Necesita http://gnuwin32.sourceforge.net/. Recomiendo instalar https://chocolatey.org/ y 'choco install gnuwin'. Todo desde la línea de comandos o script – fantastory

3

Mi respuesta basada en Caleb Huitt - cjhuitt 's. Pero su enfoque no funciona para mí.

*-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") 
      } 
     } 
    } 
} 

Como ve, puede obtener la versión de GCC y luego compararla con la expresión de expresiones regulares.

La manera cómo utilizar es el mismo:

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

Mi respuesta se basa en dismine's answer
Simplemente, puede extraer el número de versión principal utilizando $$ 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") 
} 
Cuestiones relacionadas