Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio CMake行为:Visual Studio的自定义配置类型需要多次CMake运行才能正确显示。这是有意的吗? 上下文:_Visual Studio_Visual Studio 2012_Cmake - Fatal编程技术网

Visual studio CMake行为:Visual Studio的自定义配置类型需要多次CMake运行才能正确显示。这是有意的吗? 上下文:

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个警告,这就是为什么我不想在标准

我正在将一个项目从普通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_配置_类型的多种组合进行测试相互之间的相对位置我想分享我的发现

  • 项目(s4 Fortran C)之后的CMAKE_配置类型,例如省略启用语言:
    如果不使用enable_语言,代码需要2次CMake过程,以使Visual Studio在第一次过程更新缓存时识别新设置。因此,enable_语言似乎将设置传播到Visual Studio*.sln文件

  • CMAKE_配置_类型在项目(s4)声明之前:
    需要第二个cmake过程才能将设置传播到CMakeCache.txt。但是Visual Studio无法识别这些设置。通过此设置,似乎可以更改可用的生成类型,但由于Visual Studio无法识别它们,并且需要第二个cmake过程来传播它们,因此此选项对于我的情况不可行

  • CMAKE_配置类型在项目(s4)和启用语言(Fortran C)之间:
    在CMakeCache.txt和Visual Studio中,通过第一次传递即可识别设置。后续的cmake过程不会改变缓存。因此,我认为这种方法是适当的。
  • 尽管删除某些构建类型或重写CMAKE_配置_类型似乎是不可能的。我测试了上述讨论组的建议,例如,使用列表(append…)显式附加新构建类型,并检查/删除重复项。但是,这些措施似乎是在配置例程中隐式实现的,因为添加(或省略)这些措施不会改变行为或缓存文件(无论是使用语句列表(APPEND…)还是SET(…)

    我注意到的另一个行为是

       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_配置_类型后的项目()-调用时不使用语言-但在启用_语言()之前
    在您的解决方案中,在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)