Configuración del tiempo de ejecución de MSVC en CMake

Estoy siguiendo las instrucciones en la entrada de Preguntas Frecuentes de CMake"¿Cómo puedo compilar mi aplicación MSVC con un tiempo de ejecución estático?" para centralizar la selección del tiempo de ejecución de MSVC para un grupo de proyectos CMake anidados (se incorporan como submódulos de Git y se agregan al proyecto maestro utilizando CMake)find_package() directiva).

Por lo tanto, escribí esta macro CMake:

<code>macro(configure_msvc_runtime)
  if(MSVC)

    # Default to statically-linked runtime.
    if("${MSVC_RUNTIME}" STREQUAL "")
      set(MSVC_RUNTIME "static")
    endif()

    # Set compiler options.
    set(variables
      CMAKE_C_FLAGS_DEBUG
      CMAKE_C_FLAGS_MINSIZEREL
      CMAKE_C_FLAGS_RELEASE
      CMAKE_C_FLAGS_RELWITHDEBINFO
      CMAKE_CXX_FLAGS_DEBUG
      CMAKE_CXX_FLAGS_MINSIZEREL
      CMAKE_CXX_FLAGS_RELEASE
      CMAKE_CXX_FLAGS_RELWITHDEBINFO
    )
    if(${MSVC_RUNTIME} STREQUAL "static")
      message(STATUS
        "MSVC -> forcing use of statically-linked runtime."
      )
      foreach(variable ${variables})
        if(${variable} MATCHES "/MD")
          string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}")
        endif()
      endforeach()
    else()
      message(STATUS
        "MSVC -> forcing use of dynamically-linked runtime."
      )
      foreach(variable ${variables})
        if(${variable} MATCHES "/MT")
          string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}")
        endif()
      endforeach()
    endif()
  endif()
endmacro()
</code>

Llamo a esta macro al principio de mi raíz.CMakeLists.txt (antes dealguna add_library() oadd_executable() se realiza la llamada) y agrega un poco de impresiones de depuración:

<code>configure_msvc_runtime()
set(variables
  CMAKE_C_FLAGS_DEBUG
  CMAKE_C_FLAGS_MINSIZEREL
  CMAKE_C_FLAGS_RELEASE
  CMAKE_C_FLAGS_RELWITHDEBINFO
  CMAKE_CXX_FLAGS_DEBUG
  CMAKE_CXX_FLAGS_MINSIZEREL
  CMAKE_CXX_FLAGS_RELEASE
  CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
message(STATUS "Initial build flags:")
foreach(variable ${variables})
  message(STATUS "  '${variable}': ${${variable}}")
endforeach()
message(STATUS "")
</code>

Luego, ejecuto CMake para generar una solución de Visual Studio así:

<code>cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=dynamic
</code>

y me sale las siguientes salidas:

<code>-- MSVC -> forcing use of dynamically-linked runtime.
-- Initial build flags:
--   'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1
--   'CMAKE_C_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
--   'CMAKE_C_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
--   'CMAKE_C_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1
--   'CMAKE_CXX_FLAGS_MINSIZEREL': /MD /O1 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELEASE': /MD /O2 /Ob2 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MD /Zi /O2 /Ob1 /D NDEBUG
</code>

Ahora, lo que ocurre es que cuando comienzo a Visual Studio y examino las propiedades del proyecto en "C / C ++, Generación de código", veo que la configuración de "Biblioteca en tiempo de ejecución" no es coherente con las opciones impresas en el shell. Bajo las configuraciones de "Lanzamiento", "MinSizeRel" y "RelWithDebInfo", obtengo los resultados esperados ("DLL / MD de subprocesos múltiples", pero la configuración de "Debug" todavía muestra "MT / Multi-threaded").

Además, cuando fuerzo el uso del tiempo de ejecución enlazado estáticamente, obtengo resultados similares. Si corro

<code>cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=static
</code>

Obtengo las siguientes salidas:

<code>-- MSVC -> forcing use of statically-linked runtime.
-- Initial build flags:
--   'CMAKE_C_FLAGS_DEBUG': /D_DEBUG /MTd /Zi  /Ob0 /Od /RTC1
--   'CMAKE_C_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
--   'CMAKE_C_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
--   'CMAKE_C_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_DEBUG': /D_DEBUG /MTd /Zi /Ob0 /Od /RTC1
--   'CMAKE_CXX_FLAGS_MINSIZEREL': /MT /O1 /Ob1 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELEASE': /MT /O2 /Ob2 /D NDEBUG
--   'CMAKE_CXX_FLAGS_RELWITHDEBINFO': /MT /Zi /O2 /Ob1 /D NDEBUG
</code>

Y, sin embargo, todas las configuraciones producen el valor "Multi-threaded / MT" para la configuración de "Runtime Library".

¿Qué estoy haciendo mal, o si esto es un error en CMake (2.8.7) o algo así?

Para lo que vale, si genero archivos de proyecto de Visual Studio 2010, obtengo un valor diferente para la configuración "Depurar", pero aún no es el que seleccioné.

En todos los casos, la configuración aparece en la fuente normal para la configuración "Depurar", mientras que aparece en la fuente en negrita para las otras configuraciones, lo que sugiere que esas modificaciones se han anulado. Además, si abro los archivos de proyecto XML, encuentro que la configuración "Debug" no tiene ninguna configuración para el atributo "RuntimeLibrary" del elemento "Tool" con el atributo "Name = VCCLCompilerTool". Todas las demás configuraciones tienen una configuración explícita.

Respuestas a la pregunta(2)

Su respuesta a la pregunta