Réglage de la MSVC de l'exécution dans CMake

Je suis en suivant les instructions dans le CMake entrée de la FAQ "Comment puis-je construire mon MSVC application statique d'exécution?" de centraliser la sélection de la MSVC d'exécution pour un tas de imbriquée CMake projets (ils sont tiré comme submodules et ajouté au projet maître d'utilisation de CMake est find_package() directive).

Alors, j'ai écrit ce CMake macro:

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

- Je appeler cette macro au début de ma racine CMakeLists.txt (avant tout add_library() ou add_executable() appel est fait) et ajouter un peu de débogage imprime:

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

Ensuite, j'ai lancer CMake pour générer une solution Visual Studio comme suit:

cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=dynamic

et j'obtiens les résultats suivants:

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

Maintenant, le truc, c'est que quand je lance Visual Studio et d'examiner les propriétés du projet sous "C/C++, la Génération de Code", je vois que le "Runtime Library" n'est pas compatible avec les options de l'imprimé dans la coquille. En vertu de la "Libération", "MinSizeRel" et "RelWithDebInfo" configurations, j'obtiens les résultats attendus ("DLL multithread /MD", mais le "Debug" configuration affiche toujours "Multi-thread /MT").

Aussi, quand je force l'utilisation de l'statiquement lié runtime, j'obtiens des résultats similaires. Si je lance

cmake -G "Visual Studio 9 2008" ..\.. -DMSVC_RUNTIME=static

J'obtiens les résultats suivants:

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

Et pourtant, toutes les configurations de produire le "Multi-thread /MT" valeur de la "Bibliothèque d'Exécution" réglage de l'.

Ce que je fais mal, ou si c'est un bug dans CMake (2.8.7) ou quelque chose?


Pour ce que ça vaut, si je générer de projet Visual Studio 2010 fichiers, j'obtiens une valeur différente pour le "Debug" de la configuration, mais pas encore celui que j'ai sélectionné.

Dans tous les cas, le paramètre s'affiche dans une police normale pour le "Debug" de la configuration alors qu'il apparaît en caractères gras, la police pour les autres configurations, laissant entendre que ceux-ci sont des remplacements. De plus,si j'ouvre les fichiers de projet XML, je trouve que le "Debug" configuration n'a pas de réglage pour le "RuntimeLibrary" de l'attribut "Outil" élément "Name=VCCLCompilerTool" attribut. Toutes les autres configurations ont une définition explicite.

  • Excellente solution!
InformationsquelleAutor André Caron | 2012-04-11