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 find_file() コマンドの代替方法:もっと柔軟なファイル検索

<variable>: 検索結果を格納する CMake 変数<file_names>: 検索するファイル名のリスト (スペース区切り)<path_list>: 検索するパス名のリスト (スペース区切り)<options>: 検索オプション (後述)



CMakeの"Commands"における"fltk_wrap_ui()"プログラミングを徹底解説!

この解説では、CMakeの"Commands"における"fltk_wrap_ui()"プログラミングについて、分かりやすく説明します。"fltk_wrap_ui()"は、CMakeでFLTK GUIアプリケーションをビルドするために使用されるマクロです。このマクロは、FLTK GUI定義ファイルをC++コードに変換し、プロジェクトに組み込みます。


プログラミング初心者でもわかる!CMake の "set_directory_properties()" コマンドの使い方

set_directory_properties() コマンドは、CMakeプロジェクト内のディレクトリとサブディレクトリにプロパティを設定するために使用されます。これらのプロパティは、ビルドプロセス、インストール、その他の CMake 動作を制御するために使用できます。


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

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


CMakeのCommandsにおけるuse_mangled_mesa()

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



CMAKE_NOT_USING_CONFIG_FLAGS 変数の設定方法とサンプルコード

デフォルトでは、CMake はビルドタイプに基づいてコンパイルオプションを設定します。例えば、Debug ビルドでは、デバッグ情報を生成するためのオプションが設定されます。しかし、場合によっては、これらのオプションを無効化したい場合があります。


最適化された Release ビルドを実現: CMAKE_LANG_FLAGS_RELEASE_INIT の活用

CMAKE_LANG_FLAGS_RELEASE_INIT は、CMake の "Variables" における変数のひとつです。これは、Release ビルド設定におけるコンパイラフラグを初期化する際に使用されます。詳細CMake バージョン 3.7 で導入されました。


Visual StudioでCMakeを使う時に知っておきたいCMAKE_VS_SDK_LIBRARY_DIRECTORIES

CMAKE_VS_SDK_LIBRARY_DIRECTORIES は、Visual Studio で生成されるプロジェクトファイルで使用されるライブラリディレクトリを指定する CMake 変数です。この変数を設定することで、Visual Studio 標準のライブラリ検索パスを上書きし、プロジェクトに必要なライブラリを確実にリンクすることができます。


CMake_PROJECT_VERSION_MAJOR を使用してヘッダーファイルのバージョンマクロを定義する方法

CMAKE_PROJECT_VERSION_MAJOR は、CMake プロジェクトのメジャーバージョンを表す変数です。プロジェクトのバージョン情報を設定する project() コマンドによって設定されます。この変数は、ビルドプロセス全体で使用でき、プロジェクトのバージョンを特定するために役立ちます。


CMakeFindDependencyMacro モジュールの代替方法

CMakeFindDependencyMacro モジュールは、find_dependency コマンドの動作を拡張し、より柔軟で強力な依存関係管理を実現します。これは、主にパッケージ構成ファイル (<PackageName>Config