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

时间:2015-07-21 17:55:05

标签: cmake subproject

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

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

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

2 个答案:

答案 0 :(得分:8)

对设置依赖于配置的设置的代码进行分解。使用此内容创建一个文件,例如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()

然后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> ...
    
  3. 在这种情况下,请添加include(SetUpConfigurations)(无.cmake分机号)的脚本。

    关于multiconfig生成器的说明:

    XcodeVisual Studio是multiconfig生成器。它们尊重CMAKE_CONFIGURATION_TYPES的值,但CMAKE_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()
    

    您的项目在多通道生成器中无法正常工作。

答案 1 :(得分:1)

在子项目目录中使用add_subdirectory时,几乎将所有变量传播到该子项目中,这与&#34;子项目独立性&#34;相矛盾。

相反,最好使用cmake内的嵌套execute_process()调用来构建和安装子项目。如果您想为顶级项目提供一些子项目的定义,您需要&#34; export&#34;安装子项目时的此定义。 This问题/答案帖子描述了如何做到这一点。