6

2 つの独立したサブプロジェクトを含むプロジェクトがあるとします。CMakeLists.txt私が cmake を正しく理解していれば、1 つのルートで a を定義しproject(...)、それを使用add_subdirectory(...)してサブプロジェクトをインクルードするという考えになります。各サブプロジェクトには、独自のプロジェクトをCMakeLists.txt定義する独自のプロジェクトがあります。このようにして、プロジェクトを一緒に (ルート cmake ファイルを使用して) ビルドすることも、個別に (サブプロジェクトの cmake ファイルを使用して) ビルドすることもできます。

を変更したいと思いCMAKE_CONFIGURATION_TYPESます。ルートCMakeLists.txtまたは各サブプロジェクト、またはその両方でこれを行う必要がありますか?

ルートで変更すると、サブプロジェクトを個別にビルドすると、間違った構成タイプが提供されることになります。他のオプションは cmake コードを複製します。ここで何かが足りないと思います。

4

2 に答える 2

14

構成に依存する設定をセットアップするコードを因数分解します。SetUpConfigurations.cmakeたとえば、次の内容でファイルを作成します。

if(NOT SET_UP_CONFIGURATIONS_DONE)
    set(SET_UP_CONFIGURATIONS_DONE TRUE)

    # 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.
    get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
    if(isMultiConfig)
        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

を配置する場所については 2 つの選択肢があり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> ...
    

この場合、スクリプトにinclude(SetUpConfigurations)(.cmake拡張子なし) を含めます。

multiconfig ジェネレーターとは何かについてのメモ:

XcodeおよびVisual Studiomulticonfig ジェネレーターです。これらは の値を尊重しますがCMAKE_CONFIGURATION_TYPES、が処理CMAKE_BUILD_TYPEされるときに具体的な構成が定義されていないため、効果はありませんCMakeLists.txt。後で IDE のユーザー インターフェイスで選択されます。

一方、makefile スタイルのジェネレーターは .xml には関心がありませんCMAKE_CONFIGURATION_TYPESCMAKE_BUILD_TYPE構成を定義します。ファイルが処理されるときの具体的な値ですが、次CMakeLists.txtの値に基づいて決定を下すことはありませんCMAKE_BUILD_TYPE:

if(CMAKE_BUILD_TYPE STREQUAL "Release") # WRONG!
    ....
endif()

プロジェクトは、マルチコンフィグ ジェネレーターで意図したとおりに動作しません。

于 2015-07-21T20:09:54.333 に答える