構成に依存する設定をセットアップするコードを因数分解します。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
ます。それは、プロジェクトやリポジトリをどのように整理するかによって異なります。
手っ取り早い方法: このスクリプトを必要な各プロジェクトにコピーしてコミットします。その場所はCMakeLists.txt
、プロジェクトの に対して固定されます。したがって、たとえば次のように含めることができますinclude(${CMAKE_CURRENT_SOURCE_DIR}/<...>/SetUpConfigurations.cmake)
規律ある方法: このようなカスタム CMake スクリプトを使用してリポジトリを維持します。コマンドでプロジェクトを生成するたびに、cmake
このリポジトリへのパスをCMAKE_MODULE_PATH
変数に渡します。
cmake -DCMAKE_MODULE_PATH=<dir-of-cmake-script-repo> ...
この場合、スクリプトにinclude(SetUpConfigurations)
(.cmake
拡張子なし) を含めます。
multiconfig ジェネレーターとは何かについてのメモ:
Xcode
およびVisual Studio
multiconfig ジェネレーターです。これらは の値を尊重しますがCMAKE_CONFIGURATION_TYPES
、が処理CMAKE_BUILD_TYPE
されるときに具体的な構成が定義されていないため、効果はありませんCMakeLists.txt
。後で IDE のユーザー インターフェイスで選択されます。
一方、makefile スタイルのジェネレーターは .xml には関心がありませんCMAKE_CONFIGURATION_TYPES
。CMAKE_BUILD_TYPE
構成を定義します。ファイルが処理されるときの具体的な値ですが、次CMakeLists.txt
の値に基づいて決定を下すことはありませんCMAKE_BUILD_TYPE
:
if(CMAKE_BUILD_TYPE STREQUAL "Release") # WRONG!
....
endif()
プロジェクトは、マルチコンフィグ ジェネレーターで意図したとおりに動作しません。