2012-04-17 13 views
12

Tengo un CMakeLists donde quiero construir algunos objetivos usando la versión dinámica del tiempo de ejecución C, y algunos otros objetivos usando la versión estática.¿Cómo puedo establecer indicadores de compilación específicos para un objetivo específico en una configuración de compilación específica utilizando CMake?

Como esto debe establecerse para cada objetivo, el método predeterminado de configuración CMAKE_CXX_FLAGS_<Config> no funciona; esto anula para todos los objetivos.

Para ello, he intentado algo como lo siguiente:

# @fn  set_target_dynamic_crt 
# @brief Sets the given target to use the dynamic version of the CRT (/MD or 
#   /MDd) 
# @param ... A list of targets to which this setting should be applied. 
function(set_target_dynamic_crt) 
    if (MSVC) 
     message (WARNING ${CMAKE_BUILD_TYPE}) 
     if (CMAKE_BUILD_TYPE STREQUAL "Debug") 
      set_target_properties (${ARGN} PROPERTIES COMPILE_FLAGS "/MDd") 
     else() 
      set_target_properties (${ARGN} PROPERTIES COMPILE_FLAGS "/MD") 
     endif() 
    endif() 
endfunction() 

Sin embargo, esto siempre elige la versión de lanzamiento (/MD) y cuando me consulta para el tipo de generación (la message llamada arriba) me sale el cuerda vacía. (Sospecho que esto es porque estoy usando el generador de Visual Studio; he visto más de una referencia que dice que CMAKE_BUILD_TYPE es solo para archivos make ...)

¿Cómo puedo establecer opciones de compilación como esta por objetivo?

+0

Ahora hay una solución mejor que la que se muestra a continuación para solucionar este problema. Publiqué sobre esto también, ya que corrí en el mismo problema y no encontré tu pregunta primero, mira aquí: http://stackoverflow.com/questions/18065299/is-it-possible-in-the-same -cmakelists-txt-to-setup-projects-with-mt-and-other/18068420 # 18068420 –

Respuesta

0

CMAKE_BUILD_TYPE solo es válido para generadores de configuración única. Los generadores de configuraciones múltiples (MSVC y Xcode) pueden compilarse para múltiples configuraciones en un directorio de construcción y, como tal, el indicador CMAKE_BUILD_TYPE no tendría ningún significado.

La propiedad de destino COMPILE_FLAGS no distingue las diferentes configuraciones (Consulte kitware bugtracker para obtener más información).

Una solución alternativa sería tener dos directorios de compilación, similar a cómo las personas usan los generadores de Makefile, y definir un indicador adicional al compilar los binarios para su distribución. (es decir, la configuración de versión)

+0

Sin embargo, la solución no funciona: termina teniendo que configurar eso en un trillón de lugares diferentes. (Específicamente, para cambiar las configuraciones, debe pasar por un centenar de proyectos y cambiarlos, y luego cambiarlos en el VS IDE al construir, etc.) –

+0

No, quiero decir que debe usar el código exacto que publicó en la pregunta, pero en lugar de usar CMAKE_BUILD_TYPE, use MY_RELEASEBUILD, y solo defina eso cuando esté a punto de crear una construcción para su distribución. (Suponiendo que está bien usar/MDd cuando está ejecutando localmente) – phb

+0

pero luego tiene que seleccionar lo correcto dentro de VS para que coincida, y no se puede establecer para cada objetivo. El objetivo de hacer esto fue poder utilizar el soporte de configuración de construcción de CMAke. –

2

La única opción que conozco para este escenario es dividir el proyecto en subdirectorios por destino y usar add_subdirectory.

Dependiendo de cómo esté configurado su proyecto actualmente, podría ser un proceso doloroso, supongo.

El resultado sería un CMakeLists.txt de nivel superior que se veía como p.

cmake_minimum_required(VERSION 2.8 FATAL_ERROR) 
project(Test) 
add_subdirectory(libB) 
add_subdirectory(libA) 
add_executable(main_exe "main.cpp") 
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") 
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") 
target_link_libraries(main_exe lib_a lib_b) 

continuación libA/CMakeLists.txt podrían especificar MD y MDd banderas:

project(LibA) 
add_library(lib_a a.cpp a.hpp) 
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") 
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") 

y libB/CMakeLists.txt para MT y MTd banderas:

project(LibB) 
add_library(lib_b b.cpp b.hpp) 
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") 
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") 

Por supuesto, puedes añadir todos los objetivos que necesitan vinculados a la estática CRT en el subdirectorio y CMakeLists.txt y todo el dy namic CRT en el otro si tienes muchos objetivos.

+0

Tenga en cuenta que ahora hay una mejor solución con la función cmake target_compile_options(). Es completamente nuevo (junio de 2013) y solo está disponible en las compilaciones diarias, ¡pero está bien! Vea aquí: http://stackoverflow.com/questions/18065299/is-it-possible-in-the-same-cmakelists-txt-to-setup-projects-with-mt-and-other/18068420#18068420 –

26

En CMake 2.8.12 he añadido un target_compile_options comando para hacer frente a esta necesidad:

http://public.kitware.com/Bug/view.php?id=6493

http://www.cmake.org/cmake/help/git-master/manual/cmake-generator-expressions.7.html

target_compile_options(tgt PRIVATE "/MD$<$<CONFIG:Debug>:d>") 

Ver

http://www.cmake.org/cmake/help/git-next/manual/cmake-buildsystem.7.html#build-specification-with-generator-expressions

para más relacionada con CMAKE_BUILD_TYPE y varias razones por las que la expresión del generador es mejor (por ejemplo, asignación de configuración de destino IMPORTADA) .

Cuestiones relacionadas