not - Pasando las opciones del compilador cmake
cmake vs make (2)
Sí, puede agregar opciones de compilador y enlazador.
Pero hay dos cosas que debe diferenciar en CMake: la primera llamada para generar el entorno de compilación y todas las llamadas consecutivas para volver a generar ese entorno de compilación después de los cambios en sus archivos o dependencias
CMakeList.txt
.
Estas son algunas de las posibilidades (excluyendo las variantes de toolchain más complejas):
Agregar banderas del compilador
-
El contenido inicial de la variable
CMAKE_CXX_FLAGS
caché es una combinación deCMAKE_CXX_FLAGS_INIT
establecida por el propio CMake durante la detección del sistema operativo / cadena de herramientas y todo lo que se establece en la variable de entornoCXXFLAGS
. Entonces puede llamar inicialmente:cmake -E env CXXFLAGS="-Wall" cmake ..
-
Posteriormente, CMake esperaría que el usuario modifique la variable en caché
CMAKE_CXX_FLAGS
directamente para agregar cosas, por ejemplo, utilizando un editor comoccmake
commit con CMake. -
Puede introducir fácilmente su propio tipo de compilación como
ALL_WARNINGS
. Se añaden las partes específicas del tipo de construcción:cmake -DCMAKE_CXX_FLAGS_ALL_WARNINGS:STRING="-Wall" -DCMAKE_BUILD_TYPE=ALL_WARNINGS ..
Agregar banderas de vinculador
Las opciones del vinculador son más o menos equivalentes a las opciones del compilador.
Solo que los nombres de las variables de CMake dependen del tipo de destino (
EXE
,
SHARED
o
MODULE
).
-
El
CMAKE_EXE_LINKER_FLAGS_INIT
,CMAKE_SHARED_LINKER_FLAGS_INIT
oCMAKE_MODULE_LINKER_FLAGS_INIT
no se combinan con las variables evironmentLDFLAGS
aCMAKE_EXE_LINKER_FLAGS
,CMAKE_SHARED_LINKER_FLAGS
yCMAKE_MODULE_LINKER_FLAGS
.Entonces puede, por ejemplo, llamar a:
cmake -E env LDFLAGS="-rpath=/home/abcd/libs/" cmake ..
-
Véase más arriba.
-
Se añaden partes específicas del tipo de construcción:
cmake -DCMAKE_SHARED_LINKER_FLAGS_MY_RPATH:STRING="-rpath=/home/abcd/libs/" -DCMAKE_BUILD_TYPE=MY_RPATH ..
Alternativas
Solo tenga en cuenta que CMake proporciona una variable especial para establecer indicadores de compilador / enlazador de una manera independiente de la plataforma. Por lo tanto, no necesita conocer la opción específica del compilador / enlazador.
Aquí hay unos ejemplos:
-
CMAKE_CXX_STANDARD
-
CMAKE_POSITION_INDEPENDENT_CODE
-
CMAKE_BUILD_RPATH
-
CMAKE_INSTALL_RPATH_USE_LINK_PATH
Desafortunadamente, no hay ninguno para el nivel de advertencia del compilador ( yet )
Referencias
Sé cómo pasar las opciones del compilador usando el comando cmake
set(CMAKE_CXX_FLAGS "-Wall -Wno-dev -Wl,-rpath=/home/abcd/libs/")
¿Hay alguna forma de pasar las opciones desde la línea de comandos, que anulará las opciones CMakeList.txt, algo como:
cmake -Wl,-rpath=/home/abcd/newlibs/ path/to/CMakeLists.txt
o
cmake -D CMAKE_CXX_FLAGS="-Wno-dev -Wl,-rpath=/home/abcd/libs/" path/to/CMakeLists.txt
Mi principal problema es que quiero saber cómo agregar banderas y cómo anular las banderas de compilación existentes desde la línea de comandos.
cmake -D CMAKE_CXX_FLAGS="-Wno-dev -Wl,-rpath=/home/abcd/libs/" path/to/CMakeLists.txt
Esto debería funcionar, el problema es que si encuentra_paquete () algún paquete que también cambia CMAKE_CXX_FLAGS, entonces no solo funcionaría parcialmente.