让CMake明确选择MSVC平台工具集

时间:2014-08-14 07:37:31

标签: c++ visual-studio-2012 cmake nmake

嗨,我有一个问题,我有一个使用select C ++ 11/14功能的C ++项目,MSVC编译器最多只能出现在CTP_Nov2013编译器工具集中。我知道有一个非常相似的主题here,最相关的答案是工具集不能在脚本中修改,因为最终用户会想要修补它。

  1. 首先,我不同意工具集的选择是最终用户的特权(如果正在开发的库中可能会引用任何人)。
  2. 其次,我唯一要做的就是CMake检测是否存在各种编译器功能,如果它们丢失,并且平台是MSVC,那么根据MSVC CMake的版本尝试更改CTP版本的平台工具集。我知道一个事实,VS 12将不再接收任何编译器更新(至少不会在CTP中),因为这是VS 13 Beta的特权,所以可以安全地假设MSVC_VER 1700(如果是这样的话)是与VS 12对应的版本。可以使用脚本选择工具集。
  3. 第三,手动更新生成的Visual Studio项目文件通常会导致项目文件失效。不考虑一个接一个地更改大约十二个目标的工具集是很繁琐的,如果源路径包含unicode字符(他们在我的情况下这样做),那么cl.exe将无法找到它们。这是CMake的一个问题,与项目文件的字符编码和CMake写路径的方式有关。我无能为力。项目文件必须足够准备好让我只需要点击F7。
  4. 我找到了一种通过命令实现我想要的方法

    set(CMAKE_GENERATOR_TOOLSET "CTP_Nov2013" CACHE STRING "Platform Toolset" FORCE) 
    set(CMAKE_VS_PLATFORM_TOOLSET "CTP_Nov2013" CACHE STRING "Platform Toolset" FORCE)
    

    然而,问题是脚本需要运行两次才能使其生效。由于使用

    调用cmake命令行
    cmake -G"Visual Studio 12 2013 Win64"
    

    已经选择了一个工具集,但我立即希望覆盖合并到所选生成器的x64配置中的工具集。最终,用户通常使用生成器规范从命令行中选择32/64位构建,但我希望隐藏MSVC编译器无法从"最终用户"以防他/她安装了CTP。

    如何编写脚本并从命令行调用它,以便它适用于Visual Studio和NMake Makefiles生成器以及第一次调用CMake?

1 个答案:

答案 0 :(得分:0)

使用@Tanuki和 set_target_properties 的回复,您可以强制在目标中使用平台工具集

if (CMAKE_VS_PLATFORM_TOOLSET MATCHES "CTP_Nov2013")
  set_target_properties(${your_target}
  PROPERTIES
  PLATFORM_TOOLSET "${CMAKE_VS_PLATFORM_TOOLSET}")
endif()