Definindo o tempo de execução do MSVC no CMake

Estou seguindo as instruções na entrada da FAQ do CMake"Como posso construir meu aplicativo MSVC com um tempo de execução estático?" para centralizar a seleção do tempo de execução do MSVC para vários projetos CMake aninhados (eles são puxados como submódulos Git e adicionados ao projeto mestre usando o CMakefind_package() directiva).

Então, eu escrevi 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>

Eu chamo essa macro no começo da minha raizCMakeLists.txt (antesqualquer add_library() ouadd_executable() chamada é feita) e adicionar um pouco de depuração de impressões:

<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>

Em seguida, executo o CMake para gerar uma solução do Visual Studio assim:

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

e recebo as seguintes saídas:

<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>

Agora, a coisa é que quando inicio o Visual Studio e examino as propriedades do projeto em "C / C ++, Geração de Código", vejo que a configuração "Biblioteca de Tempo de Execução" não é consistente com as opções impressas no shell. Nas configurações "Release", "MinSizeRel" e "RelWithDebInfo", recebo os resultados esperados ("DLL / MD multithread", mas a configuração "Debug" ainda exibe "Multi-threaded / MT").

Além disso, quando forço o uso do tempo de execução vinculado estaticamente, obtenho resultados semelhantes. Se eu correr

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

Eu recebo as seguintes saídas:

<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>

E, no entanto, todas as configurações produzem o valor "Multi-threaded / MT" para a configuração "Runtime Library".

O que estou fazendo errado, ou se este é um bug no CMake (2.8.7) ou algo assim?

Por que vale a pena, se eu gerar arquivos de projeto do Visual Studio 2010, recebo um valor diferente para a configuração "Depurar", mas ainda não é o que eu selecionei.

Em todos os casos, a configuração aparece em fonte regular para a configuração "Debug", enquanto ela aparece em fonte em negrito para as outras configurações, indicando que elas são substituídas. Além disso, se eu abrir os arquivos de projeto XML, eu acho que a configuração "Debug" não tem nenhuma configuração para o atributo "RuntimeLibrary" do elemento "Tool" com o atributo "Name = VCCLCompilerTool". Todas as outras configurações têm uma configuração explícita.

questionAnswers(2)

yourAnswerToTheQuestion