2010-06-28 11 views
24

Actualmente estoy trabajando en el uso de cmake para construir algunos proyectos, siendo las principales plataformas Visual C++, MinGW GCC y Linux GCC. Al compilar con GCC, debo especificar la opción del compilador -Wno-invalid-offsetof.¿Cómo aplicar diferentes opciones de compilación para diferentes compiladores en cmake?

Mi solución actual es la siguiente ...

if ( "${CMAKE_GENERATOR}" MATCHES "^Visual Studio" 
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake" 
    ) 
    set (CPPLIB_COMPILER_OPTS "") 
else() 
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof") 
endif() 

... 

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}") 
# repeated for all targets 

Esto funciona, pero suponiendo que todos los generadores distintos de los estudios visuales construirán con gcc obviamente inseguro. Para empezar, hay generadores IIRC para compiladores de Borland. Más importante aún, usar make no siempre significa usar gcc.

Otros compiladores que probablemente usaré son llvm-gcc y clang. Afortunadamente, creo que incluso clang admite opciones compatibles con gcc. Pero esta lógica solo es válida mientras el código relevante nunca se publique.

Cmake parece verificar los compiladores disponibles y generar un archivo MAKE específicamente para ese compilador (planteando la pregunta: ¿por qué no tener al menos la opción de construir el proyecto directamente, sin la necesidad de un intermediario como marca?).

Siendo ese el caso, esperaba poder probar directamente gcc en mis archivos CMakeLists.txt. Hasta ahora, sin embargo, no puedo encontrar una variable apropiada para probar o cualquier otra solución obvia.

¿Esto es posible?

Respuesta

35

Para crear un sistema de compilación portátil, es mejor no probar las plataformas, sino probar las características.

En lugar de probar "si Windows hace esto", compruebe si "funciona el indicador -Wno-invalid-offsetof y utilícelo". Usted puede hacer eso con el módulo CheckCCompilerFlag, por ejemplo:

include(CheckCCompilerFlag) 
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF) 
if (HAS_NO_INVALID_OFFSETOF) 
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof") 
endif() 

para C++ existe una CheckCXXCompilerFlag similar con un comando check_cxx_compiler_flag(flag var).

+1

¡Eso es perfecto! Una cosa irrelevante, sin embargo ... no hay mucho más que verifique esa opción para C, ya que no existe tal compensación inválida en C, solo ocurre en C++. – Steve314

+0

No lo sabía. De hecho, no sabía para qué era la opción, pero tiene mucho sentido, ya que C solo tiene tipos de POD http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Warning-Options.html. Y CMake ignora la advertencia del compilador durante su prueba: "si compila funciona". – richq

+0

¿Hay alguna manera de verificar combinaciones de opciones? También quería asegurarme de que no hubiera advertencias en tiempo de compilación, así que estaba buscando una forma de investigar las advertencias también. – thoni56

Cuestiones relacionadas