descarga - cmake vs make
¿Cómo aplicar diferentes opciones de compilación para diferentes compiladores en cmake? (1)
Para crear un sistema de compilación portátil, es mejor no probar las plataformas, sino probar las funciones.
En lugar de probar "si Windows hace esto", compruebe si "el indicador -Nno-inválido-offsetof funciona, entonces utilícelo". Puedes hacerlo 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 ++ hay un CheckCXXCompilerFlag similar con un check_cxx_compiler_flag(flag var)
.
Actualmente estoy trabajando en el uso de cmake para compilar algunos proyectos, con las plataformas principales Visual C ++, MinGW GCC y Linux GCC. Al -Wno-invalid-offsetof
con GCC, necesito especificar la opción del compilador -Wno-invalid-offsetof
.
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 que no sean los de Visual Studio se construirán con gcc obviamente no es seguro. Para empezar, hay generadores IIRC para compiladores Borland. Más importante aún, usar make no siempre significa usar gcc.
Otros compiladores que probablemente use 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 libere.
Parece que Cmake busca compiladores disponibles y genera un makefile específicamente para ese compilador (lo que plantea la pregunta: ¿por qué al menos no tienen la opción de construir el proyecto directamente, sin la necesidad de un intermediario como el de la creación?).
Siendo ese el caso, esperaba poder probar directamente gcc en mis archivos CMakeLists.txt. Hasta ahora, sin embargo, no puedo encontrar una variable adecuada para probar o cualquier otra solución obvia.
es posible?