Tengo una serie de proyectos creados con CMake y me gustaría poder cambiar fácilmente entre usar GCC o Clang / LLVM para compilarlos. Creo (¡corríjame si me equivoco!) Que para usar Clang necesito configurar lo siguiente:
SET (CMAKE_C_COMPILER "/usr/bin/clang")
SET (CMAKE_C_FLAGS "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_CXX_COMPILER "/usr/bin/clang++")
SET (CMAKE_CXX_FLAGS "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET (CMAKE_AR "/usr/bin/llvm-ar")
SET (CMAKE_LINKER "/usr/bin/llvm-ld")
SET (CMAKE_NM "/usr/bin/llvm-nm")
SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
SET (CMAKE_RANLIB "/usr/bin/llvm-ranlib")
¿Existe una manera fácil de cambiar entre estas y las variables GCC predeterminadas, preferiblemente como un cambio en todo el sistema en lugar de un proyecto específico (es decir, no solo agregarlas a CMakeLists.txt de un proyecto)?
Además, ¿es necesario usar los llvm-*
programas en lugar de los valores predeterminados del sistema al compilar usando clang en lugar de gcc? ¿Cual es la diferencia?
CMAKE_USER_MAKE_RULES_OVERRIDE
obras. Parece que el archivo se está ignorando (es decir, a pesar deCMAKE_C_FLAGS_RELEASE
estar configurado-O4
en el archivo de anulaciones, muestra el valor predeterminado de-O3 -DNDEBUG
in cmake).src/build-clang
directorio se ignoran las anulaciones.CC
yCXX
, puede ser porque primero debe eliminar todos los archivos del directorio de compilación.rm CMakeCache.txt
Puede que no sea eficiente.Cambio de C ++ en todo el sistema en Ubuntu:
Imprimirá algo como esto:
Luego solo selecciona clang ++.
fuente
There is only one alternative in link group cc (providing /usr/bin/cc): /usr/bin/gcc
Puede usar el comando de opción:
y luego envuelva la configuración del compilador clang en if () s:
De esta manera, se muestra como una opción de cmake en las herramientas de configuración de GUI.
Para hacerlo en todo el sistema, por supuesto, puede usar una variable de entorno como valor predeterminado o quedarse con la respuesta de Ferruccio.
fuente
cmake -DCMAKE_COMPILER_DEFINITIONS=MyLlvmDefinitions.cmake
.Cambio de C en todo el sistema en Ubuntu:
sudo update-alternatives --config cc
Cambio de C ++ en todo el sistema en Ubuntu:
sudo update-alternatives --config c++
Para cada uno de los anteriores, presione el número de selección (1) e Intro para seleccionar Clang:
fuente
/opt/clang-llvm-3.5/
instalado, primero instale una nueva alternativa:sudo update-alternatives --install /usr/bin/c++ c++ /opt/clang-llvm-3.5/bin/clang++ 30
Puede utilizar el mecanismo de archivo de cadena de herramientas de cmake para este propósito, consulte, por ejemplo, aquí . Usted escribe un archivo de cadena de herramientas para cada compilador que contiene las definiciones correspondientes. En el momento de la configuración, ejecuta, por ejemplo
y toda la información del compilador se establecerá durante la llamada del proyecto () desde el archivo de cadena de herramientas. Aunque en la documentación se menciona solo en el contexto de la compilación cruzada, también funciona para diferentes compiladores en el mismo sistema.
fuente
Definitivamente no necesita usar los diferentes programas llvm-ar, etc.
Estos están diseñados para funcionar en el formato interno llvm y, como tales, no son útiles para la construcción de su aplicación.
Como nota, -O4 invocará LTO en su programa, lo que puede que no desee (aumentará enormemente el tiempo de compilación) y el sonido predeterminado de clang al modo c99, por lo que esa bandera tampoco es necesariamente necesaria.
fuente
Si el compilador predeterminado elegido por
cmake
esgcc
y ha instaladoclang
, puede usar la manera fácil de compilar su proyecto conclang
:fuente
De acuerdo con la ayuda de
cmake
:Puede crear archivos como
gcc_compiler.txt
eclang_compiler.txt
incluye toda la configuración relativa en la sintaxis de CMake.Ejemplo de Clang (clang_compiler.txt):
Luego ejecútalo como
CCG:
Sonido metálico:
fuente
Puede usar la sintaxis:
$ENV{environment-variable}
en suCMakeLists.txt
para acceder a las variables de entorno. Puede crear scripts que inicialicen un conjunto de variables de entorno de manera adecuada y solo tengan referencias a esas variables en susCMakeLists.txt
archivos.fuente
-DCMAKE_C_COMPILER ...
etc?CMakeLists.txt
cada proyecto y hacer que consulte las nuevas variables. Esperaba que hubiera una forma conveniente de hacerlo en todo el sistema, sin tener que modificar ningún archivo de proyecto. Similar a pasar aCMAKE_TOOLCHAIN_FILE
.