Visual studio CMake行为:Visual Studio的自定义配置类型需要多次CMake运行才能正确显示。这是有意的吗? 上下文:
我正在将一个项目从普通makefile迁移到CMake,以增加对多个编译器(gfortran+ifort)和操作系统(Windows+Linux)的支持。当我结束整个过程时,我试图简化CMake行为,并为用户提供一些额外的功能 在对编译器选项进行规范化和调整之后,在操作系统和使用的编译器的可能组合中,添加一个用户定义的构建类型“DEBUGVERBOSE”,并启用所有检查和警告似乎是合理的。因为我们正在处理非常旧的旧Fortran 77代码,这些设置会生成>3000个警告,这就是为什么我不想在标准调试生成类型中包含所有警告的原因。不过,对于将来的代码清理和调试来说,这似乎是合适的Visual studio CMake行为:Visual Studio的自定义配置类型需要多次CMake运行才能正确显示。这是有意的吗? 上下文:,visual-studio,visual-studio-2012,cmake,Visual Studio,Visual Studio 2012,Cmake,我正在将一个项目从普通makefile迁移到CMake,以增加对多个编译器(gfortran+ifort)和操作系统(Windows+Linux)的支持。当我结束整个过程时,我试图简化CMake行为,并为用户提供一些额外的功能 在对编译器选项进行规范化和调整之后,在操作系统和使用的编译器的可能组合中,添加一个用户定义的构建类型“DEBUGVERBOSE”,并启用所有检查和警告似乎是合理的。因为我们正在处理非常旧的旧Fortran 77代码,这些设置会生成>3000个警告,这就是为什么我不想在标准
问题: 我想将此用户定义的生成类型“DEBUGVERBOSE”添加到Visual Studio 2012中的可用配置列表中。同时,我想摆脱cmake生成的构建类型“MinSizeRel”和“RelWithDeInfo”,以简化用户界面(因为我们从不使用这些配置) 根据,我设置了我的构建类型,如下所示:
# Set Project Name and supported Languages(optional)
project (s4 Fortran C)
# Set Version Number
set (S4_VERSION_MAJOR 1)
set (s4_VERSION_MINOR 0)
# Set Source Language
enable_language (Fortran)
...
if(WIN32)
# Release flags
set(CMAKE_Fortran_FLAGS_RELEASE " ${CMAKE_Fortran_FLAGS_RELEASE} /D__WIN_intel__ /assume:byterecl")
# Debug Flags
set(CMAKE_Fortran_FLAGS_DEBUG " ${CMAKE_Fortran_FLAGS_DEBUG} /D__WIN_intel__ /assume:byterecl /Od /warn:all /check:all
/warn:notruncated_source /warn:nodeclarations /warn:nounused")
# verbose Debug flags (user-defined build type)
set(CMAKE_Fortran_FLAGS_DEBUGVERBOSE " /debug:full /dbglibs /D__WIN_intel__ /assume:byterecl /Od /warn:all /check:all"
CACHE STRING "Extended Debug Flags used by the Fortran compiler during verbose Debug builds.")
set(CMAKE_CXX_FLAGS_DEBUGVERBOSE " ${CMAKE_CXX_FLAGS_DEBUG}"
CACHE STRING "Flags used by the C++ compiler during verbose Debug builds." FORCE )
set(CMAKE_C_FLAGS_DEBUGVERBOSE " ${CMAKE_C_FLAGS_DEBUG}"
CACHE STRING "Flags used by the C compiler during verbose Debug builds." FORCE )
set(CMAKE_EXE_LINKER_FLAGS_DEBUGVERBOSE "${CMAKE_EXE_LINKER_FLAGS_DEBUG}"
CACHE STRING "Flags used for linking binaries during verbose Debug builds." FORCE )
set(CMAKE_SHARED_LINKER_FLAGS_DEBUGVERBOSE "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}"
CACHE STRING "Flags used by the shared libraries linker during verbose Debug builds." FORCE )
elseif(UNIX)
...<definition of Release, Debug, DebugVerbose Compiler Options>
endif()
# Edit available Configrations to make them available in IDE that support multiple-configuration (for example Visual Studio)
if(CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES Release, Debug, Debugverbose)
set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
"Reset the configurations to what we need" FORCE)
endif()
...<definition of lots of source files and build targets>...
# Visual Studio Userfile (set the debugging environment):
CreateUserfile()
我在这次修改中所经历的唯一不同是,将新的CMakeCache.txt与以前的版本进行比较:CMake为“CXX”添加了编译器标志。我假设这意味着C++,C**等。
在此基础上进行构建,在重新阅读了cmake讨论组的内容后,我开始进行实验。使用项目、enable_语言和CMAKE_配置_类型的多种组合进行测试相互之间的相对位置我想分享我的发现
如果不使用enable_语言,代码需要2次CMake过程,以使Visual Studio在第一次过程更新缓存时识别新设置。因此,enable_语言似乎将设置传播到Visual Studio*.sln文件
需要第二个cmake过程才能将设置传播到CMakeCache.txt。但是Visual Studio无法识别这些设置。通过此设置,似乎可以更改可用的生成类型,但由于Visual Studio无法识别它们,并且需要第二个cmake过程来传播它们,因此此选项对于我的情况不可行
在CMakeCache.txt和Visual Studio中,通过第一次传递即可识别设置。后续的cmake过程不会改变缓存。因此,我认为这种方法是适当的。
set(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}
CACHE STRING "Append user-defined configuration to list of configurations to make it usable in Visual Studio" FORCE)
仅针对2个项目进行识别。案例使用3。Case似乎被忽略,并且在缓存中似乎设置了标准的CMake字符串
结果: 根据这些发现,遵循当前实现的代码
# Set Project Name
project (s4)
# Set Version Number
set (S4_VERSION_MAJOR 1)
set (s4_VERSION_MINOR 0)
# Edit available Configrations to make them available in IDE that support multiple-configuration (for example Visual Studio)
# has to be between "project" and "enable_language" to work as intended!
if(CMAKE_CONFIGURATION_TYPES)
list(APPEND CMAKE_CONFIGURATION_TYPES Debugverbose)
set(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}
CACHE STRING"Append user-defined configuration to list of configurations to make it usable in Visual Studio" FORCE)
endif()
# Set Source Language
enable_language (Fortran C)
...
我采用了LIST(APPEND…)语句,因为它提高了可读性,并明确说明了代码正在做什么。如上所述,它不会改变CMake的行为,例如自动检查重复项
开放性问题: 我的实验有没有错误的结论?也许有人对CMake的内部程序了解得足够透彻,足以详细说明上述行为?例如,为什么集合(CMAKE\U配置\U类型…)语句中的字符串无法识别? 原来的问题仍然存在: 是否有方法将CMAKE\u配置类型重置为用户定义的列表,并仅通过1次CMAKE传递将这些设置传递给缓存和Visual Studio?在您提到的帖子中,您应该
- 在项目()之前设置CMAKE_配置_类型
- 附加到CMAKE_配置_类型后的项目()-调用时不使用语言-但在启用_语言()之前
project (s4 Fortran C)
最好是将CMAKE_配置_类型设置为CMAKE命令的参数
cmake ..... -DCMAKE_CONFIGURATION_TYPES:STRING=Debug ...
如果要在不使用任何语言的情况下调用“project”,则必须使用以下语法:
project(s4 LANGUAGES NONE)
否则
project(s4)
将使用两种默认语言CXX和C调用项目。感谢您指出此错误。在修复此问题时,我测试了PROJECT和enable_语言位置的几种组合,它们之间的相对关系及其对CMAKECHACHE.txt和Visual Studio 2012的影响。我将编辑我的帖子以显示我的发现并详细说明问题否,似乎此错误只产生了轻微影响。唯一改变的是CMakeCache.txt文件中出现了CMAKE_CXX_…_标志。不幸的是,有关Visual Studio的行为没有改变。相关:
project(s4 LANGUAGES NONE)
project(s4)