CMakeのCMAKE_CFG_INTDIR変数: 非推奨と代替案

2024-04-02

CMakeにおけるCMAKE_CFG_INTDIR変数

CMAKE_CFG_INTDIR は、CMakeプロジェクトのビルド時に、各コンフィギュレーション(Debug、Releaseなど)の出力ファイルを格納する中間ディレクトリの名前を指定する変数です。ただし、この変数はCMake 3.21以降で非推奨となり、代わりに<CONFIG>ジェネレータ式を使用することを推奨されています。

詳細

  • デフォルト値: <CONFIG>
  • データ型: STRING
  • スコープ: CACHE

使用例

# デバッグビルドの出力ファイルを`Debug`ディレクトリに格納
set(CMAKE_CFG_INTDIR "Debug" CACHE STRING "" FORCE)

# リリースビルドの出力ファイルを`Release`ディレクトリに格納
set(CMAKE_CFG_INTDIR "Release" CACHE STRING "" FORCE)

非推奨

CMAKE_CFG_INTDIR は以下の理由で非推奨となっています。

  • Ninja Multi-Config でのサポートが不十分
  • <CONFIG>ジェネレータ式の存在

<CONFIG>ジェネレータ式の使用

CMAKE_CFG_INTDIR の代わりに、<CONFIG>ジェネレータ式を使用して、コンフィギュレーションごとに異なる出力ディレクトリを指定できます。

# 各コンフィギュレーションの出力ファイルを`build/<CONFIG>`ディレクトリに格納
set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/build")

# ソースファイル
add_executable(my_app main.c)

# 出力ファイル
set_target_properties(my_app PROPERTIES
  OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>")


CMakeのCMAKE_CFG_INTDIR変数を使ったサンプルコード

デバッグとリリースビルドで異なる中間ディレクトリを使用する

# デバッグビルドの出力ファイルを`Debug`ディレクトリに格納
set(CMAKE_CFG_INTDIR "Debug" CACHE STRING "" FORCE)

# リリースビルドの出力ファイルを`Release`ディレクトリに格納
set(CMAKE_CFG_INTDIR "Release" CACHE STRING "" FORCE)

# ソースファイル
add_executable(my_app main.c)

# 出力ファイル
set_target_properties(my_app PROPERTIES
  OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>")

<CONFIG>ジェネレータ式を使用して中間ディレクトリを指定する

# 各コンフィギュレーションの出力ファイルを`build/<CONFIG>`ディレクトリに格納
set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/build")

# ソースファイル
add_executable(my_app main.c)

# 出力ファイル
set_target_properties(my_app PROPERTIES
  OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>")

サブディレクトリを含むプロジェクトで中間ディレクトリを使用する

# サブディレクトリを含むプロジェクト
set(CMAKE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src")

# 各コンフィギュレーションの出力ファイルを`build/<CONFIG>`ディレクトリに格納
set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/../build")

# ソースファイル
add_executable(my_app main.c)

# 出力ファイル
set_target_properties(my_app PROPERTIES
  OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<CONFIG>")

カスタムビルドルールで中間ディレクトリを使用する

# カスタムビルドルール
add_custom_command(
  TARGET my_app
  POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy
  ARGS "<TARGET_FILE_DIR>/my_app"
  DESTINATION "${CMAKE_BINARY_DIR}/$<CONFIG>")

# ソースファイル
add_executable(my_app main.c)


CMakeで中間ディレクトリを指定する他の方法

<BUILD_TYPE>ジェネレータ式

CMAKE_CFG_INTDIR変数と同様に、<BUILD_TYPE>ジェネレータ式を使用して、ビルドタイプ(Debug、Releaseなど)ごとに異なる中間ディレクトリを指定できます。

# 各ビルドタイプの出力ファイルを`build/<BUILD_TYPE>`ディレクトリに格納
set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/build")

# ソースファイル
add_executable(my_app main.c)

# 出力ファイル
set_target_properties(my_app PROPERTIES
  OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$<BUILD_TYPE>")

CMAKE_BINARY_DIR変数は、CMakeプロジェクトのビルド全体の中間ディレクトリを指定します。この変数を設定することで、すべての出力ファイルをこのディレクトリ以下に格納できます。

# 全ての出力ファイルを`build`ディレクトリに格納
set(CMAKE_BINARY_DIR "${CMAKE_SOURCE_DIR}/build")

# ソースファイル
add_executable(my_app main.c)

手動で中間ディレクトリを作成する

CMakeLists.txtファイルとは別に、手動で中間ディレクトリを作成することもできます。この方法は、複雑なプロジェクトや、特定の要件を満たす必要がある場合に役立ちます。

# 手動で中間ディレクトリを作成
mkdir -p build/Debug
mkdir -p build/Release

# ソースファイル
add_executable(my_app main.c)

# 出力ファイル
set_target_properties(my_app PROPERTIES
  OUTPUT_DIRECTORY "build/${CMAKE_BUILD_TYPE}")

外部ツールを使用する

CPackなどの外部ツールを使用して、中間ディレクトリを管理することもできます。これらのツールは、ビルド後のクリーニングや、配布パッケージの作成など、さまざまな機能を提供します。

どの方法を選択するかは、プロジェクトのニーズと要件によって異なります。 上記の情報を参考に、ご自身のプロジェクトに合った方法を選択してください。




CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。



CMakeの「Commands」における「cmake_path()」関数

試合形式試合時間は前半40分、後半40分の計80分です。ハーフタイムは15分以内です。試合は2チームで行われ、それぞれ15人の選手がフィールドに出ます。選手は、ボールを持って走る、パスする、キックするなどのプレーができます。相手選手をタックルして倒すこともできます。


【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。


CMakeにおける"get_target_property()"コマンド: ターゲットの情報を自在に操る

get_target_property()コマンドは、CMakeプロジェクトで定義されたターゲットからプロパティを取得するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御するために使用される情報です。構文引数VAR: ターゲットプロパティの値を格納する変数名


CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。



Android向けCMakeでRTTIを有効・無効にする方法

CMAKE_ANDROID_RTTIは、CMakeにおける変数の一つで、Android向けにNDKを使用してクロスコンパイルする際に、RTTI(Run-Time Type Information)の有効・無効を指定するために使用されます。デフォルト値はONです。つまり、RTTIはデフォルトで有効になっています。


CMakeの「Properties of Global Scope」に潜む力:AUTOUIC_SOURCE_GROUP徹底解説

"AUTOUIC_SOURCE_GROUP" は、CMake の "Properties of Global Scope" におけるプロパティであり、AUTOUIC ツールによって生成されたソースファイルのソースグループを指定するために使用されます。このプロパティは、CMake 3.21 以降で導入されました。


CMakeにおけるCMAKE_CROSSCOMPILING変数の詳細解説

CMAKE_CROSSCOMPILING変数は、CMakeがクロスコンパイル環境で実行されているかどうかを判断するために使用されます。これは、ターゲットプラットフォームとビルドプラットフォームが異なる場合に設定されます。設定方法CMAKE_CROSSCOMPILING変数は、以下の方法で設定できます。


CMakeでプロジェクトディレクトリを基準としたパスを使用する方法

CMakeポリシーCMP0021は、ターゲットプロパティINCLUDE_DIRECTORIESで相対パスを使用する際の動作を制御します。このポリシーは、CMake 2.8で導入され、CMake 3.29で非推奨になりました。旧動作 (CMake 2.8以前)


CMake include() で効率的なビルドを実現

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。機能他の CMake ファイルを読み込んで、その中のコマンドを実行する