在具有子项目的项目中设置CMAKE_CONFIGURATION_TYPES的位置

Flo*_*ogo 5 cmake subproject

假设我有一个项目有两个独立的子项目.如果我正确地理解了cmake,那么想法是让一个根CMakeLists.txt定义a project(...)然后使用add_subdirectory(...)包含子项目.每个子项目都有CMakeLists.txt自己的项目定义.这样,项目可以一起构建(使用根cmake文件),也可以单独构建(使用子项目cmake文件).

我现在想改变CMAKE_CONFIGURATION_TYPES.我应该在根目录CMakeLists.txt或每个子项目中执行此操作,还是两者都执行此操作?

在根中更改它意味着单独构建子项目将提供错误的配置类型; 其他选项会复制cmake代码.我想我在这里遗漏了一些东西.

tam*_*nez 9

对设置依赖于配置的设置的代码进行分解.例如,SetUpConfigurations.cmake使用此内容创建一个文件:

if(NOT SET_UP_CONFIGURATIONS_DONE)
    set(SET_UP_CONFIGURATIONS_DONE 1)

    # No reason to set CMAKE_CONFIGURATION_TYPES if it's not a multiconfig generator
    # Also no reason mess with CMAKE_BUILD_TYPE if it's a multiconfig generator.
    if(CMAKE_CONFIGURATION_TYPES) # multiconfig generator?
        set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Profile" CACHE STRING "" FORCE) 
    else()
        if(NOT CMAKE_BUILD_TYPE)
            message("Defaulting to release build.")
            set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
        endif()
        set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
        # set the valid options for cmake-gui drop-down list
        set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;Profile")
    endif()
    # now set up the Profile configuration
    set(CMAKE_C_FLAGS_PROFILE "...")
    set(CMAKE_CXX_FLAGS_PROFILE "...")
    set(CMAKE_EXE_LINKER_FLAGS_PROFILE "...")
endif()
Run Code Online (Sandbox Code Playgroud)

然后include(..)这个文件在开头CMakeLists.txt的.

您有两个选择SetUpConfigurations.cmake,它取决于您组织项目的方式,存储库:

  1. 快速的方法:将此脚本复制并提交到需要它的每个项目中.相对于CMakeLists.txt项目,它的位置将是固定的.所以你可以把它包括在里面include(${CMAKE_CURRENT_SOURCE_DIR}/<...>/SetUpConfigurations.cmake)

  2. 规范的方法:使用自定义CMake脚本维护存储库,就像这样.每次使用该cmake命令生成项目时,都会将该路径传递给CMAKE_MODULE_PATH变量中的此存储库:

    cmake -DCMAKE_MODULE_PATH=<dir-of-cmake-script-repo> ...
    
    Run Code Online (Sandbox Code Playgroud)

在这种情况下包括脚本include(SetUpConfigurations)(没有.cmake扩展名).

关于multiconfig生成器的注意事项:

Xcode并且Visual Studio是multiconfig生成器.它们尊重价值,CMAKE_CONFIGURATION_TYPESCMAKE_BUILD_TYPE没有效果,因为在CMakeLists.txt处理时没有定义具体的配置.稍后将在IDE的用户界面中选择它.

另一方面,makefile样式的生成器不感兴趣CMAKE_CONFIGURATION_TYPES.CMAKE_BUILD_TYPE定义配置.CMakeLists.txt处理文件时它是一个具体的值,但仍然:永远不会根据以下值做出任何决定CMAKE_BUILD_TYPE:

if(CMAKE_BUILD_TYPE STREQUAL "Release") # WRONG!
    ....
endif()
Run Code Online (Sandbox Code Playgroud)

您的项目将无法在multiconfig生成器中按预期工作.