CMake: CMAKE_RUNTIME_OUTPUT_DIRECTORY変数を使って出力ディレクトリを制御

2024-04-02

CMakeの変数 CMAKE_RUNTIME_OUTPUT_DIRECTORY の詳細解説

CMAKE_RUNTIME_OUTPUT_DIRECTORY は、CMake でビルドされた実行可能ファイル(exeファイルなど)の出力ディレクトリを指定する変数です。これは、ビルドされた実行ファイルをどこに配置するかを制御するのに役立ちます。

デフォルトでは、CMAKE_RUNTIME_OUTPUT_DIRECTORY は以下のようになります。

  • Unix 系: <build_directory>/bin
  • Windows: <build_directory>/Debug または <build_directory>/Release (構成によって異なります)

設定方法

CMAKE_RUNTIME_OUTPUT_DIRECTORY は、以下の方法で設定できます。

  • CMakeLists.txt ファイルで set() コマンドを使用する
  • CMake GUI で設定する

# CMakeLists.txt ファイル

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

上記の例では、CMAKE_RUNTIME_OUTPUT_DIRECTORY<build_directory>/bin に設定しています。

詳細

  • CMAKE_RUNTIME_OUTPUT_DIRECTORY は、ターゲットごとに個別に設定することもできます。
  • CMake は、CMAKE_RUNTIME_OUTPUT_DIRECTORY の値にジェネレータ式を使用することができます。
  • マルチ構成ジェネレータを使用している場合、CMAKE_RUNTIME_OUTPUT_DIRECTORY には構成名が付加されたサブディレクトリが作成されます。

補足

  • CMAKE_RUNTIME_OUTPUT_DIRECTORY は、CMAKE_LIBRARY_OUTPUT_DIRECTORY と似ていますが、こちらはライブラリファイルの出力ディレクトリを指定します。
  • CMAKE_ARCHIVE_OUTPUT_DIRECTORY は、アーカイブファイルの出力ディレクトリを指定します。

CMAKE_RUNTIME_OUTPUT_DIRECTORY に関する質問があれば、お気軽にコメントしてください。



CMake の CMAKE_RUNTIME_OUTPUT_DIRECTORY を使ったサンプルコード

# CMakeLists.txt ファイル

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

add_executable(my_app src/main.cpp)

この例では、my_app という名前の実行可能ファイルが <build_directory>/bin ディレクトリに生成されます。

ターゲットごとの設定

# CMakeLists.txt ファイル

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/bin/Debug")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/bin/Release")

add_executable(my_app src/main.cpp)

target_compile_definitions(my_app PUBLIC DEBUG=1)
target_link_libraries(my_app PRIVATE debug_library)

set_target_properties(my_app PROPERTIES
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY_<CONFIG>}")

この例では、my_app という名前の実行可能ファイルが、デバッグ構成の場合は <build_directory>/bin/Debug ディレクトリに、リリース構成の場合は <build_directory>/bin/Release ディレクトリに生成されます。

ジェネレータ式

# CMakeLists.txt ファイル

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE}")

add_executable(my_app src/main.cpp)

この例では、my_app という名前の実行可能ファイルが <build_directory>/bin/<build_type> ディレクトリに生成されます。<build_type> は、デバッグ構成の場合は Debug、リリース構成の場合は Release になります。

マルチ構成ジェネレータ

# CMakeLists.txt ファイル

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/${CMAKE_CONFIG_NAME}")

add_executable(my_app src/main.cpp)

この例では、my_app という名前の実行可能ファイルが <build_directory>/bin/<config_name> ディレクトリに生成されます。<config_name> は、構成名になります。

インストール

# CMakeLists.txt ファイル

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

install(TARGETS my_app
    RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")

この例では、my_app という名前の実行可能ファイルが <install_prefix>/bin ディレクトリにインストールされます。

これらのサンプルコードは、CMAKE_RUNTIME_OUTPUT_DIRECTORY の使い方を理解するのに役立ちます。



CMakeで実行可能ファイルの出力ディレクトリを指定する他の方法

CMAKE_INSTALL_PREFIX と DESTINATION

CMAKE_INSTALL_PREFIX は、インストール時のデフォルトのプレフィックスディレクトリを指定します。 DESTINATION は、個々のターゲットに対してインストール先ディレクトリを指定できます。

# CMakeLists.txt ファイル

set(CMAKE_INSTALL_PREFIX "/usr/local")

add_executable(my_app src/main.cpp)

install(TARGETS my_app
    RUNTIME DESTINATION bin)

この例では、my_app という名前の実行可能ファイルは /usr/local/bin ディレクトリにインストールされます。

add_custom_command を使って、実行可能ファイルの生成後にコピーコマンドを実行することができます。

# CMakeLists.txt ファイル

add_executable(my_app src/main.cpp)

add_custom_command(TARGET my_app
    POST_BUILD
    COMMAND cp $<TARGET_FILE:my_app> /usr/local/bin)

この例では、my_app という名前の実行可能ファイルはビルド後に /usr/local/bin ディレクトリにコピーされます。

手動でコピー

ビルド後に手動で実行可能ファイルをコピーすることもできます。

# ビルド後

cp <build_directory>/bin/my_app /usr/local/bin

この方法は、単純ですが、他の方法に比べて柔軟性に欠けます。

  • 多くのプロジェクトでは、CMAKE_RUNTIME_OUTPUT_DIRECTORY で十分です。
  • インストール時に実行可能ファイルの場所をカスタマイズしたい場合は、CMAKE_INSTALL_PREFIXDESTINATION を使います。
  • ビルド後に実行可能ファイルに対して特別な処理を行いたい場合は、add_custom_command を使います。
  • 手動でコピーする方法は、単純なプロジェクトにのみ適しています。



CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。



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

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


CMake の if() コマンド: デバッグとトラブルシューティング

構文条件式if() コマンドの引数には、条件式を指定します。条件式は、以下のいずれかの形式で記述できます。変数の比較: <variable> <operator> <value>コマンドの存在チェック: COMMAND <command-name>


CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。


CMake find_libraryコマンドとfind_packageモジュールの比較

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。コマンドフォーマット<VAR>: 検索結果を格納する変数名



CMakeポリシー CMP0094 を徹底解説:プロジェクトのソースツリーの変更を検知する

この解説では、CMP0094ポリシーについて詳しく説明します。このポリシーは、プロジェクトのソースツリーが変更されたかどうかを検知し、必要に応じてビルドプロセスを再実行するのに役立ちます。CMP0094ポリシーは、以下の2つの主要な機能を提供します。


CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。


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

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


cmake_policy()コマンドを使いこなしてCMakeプロジェクトをマスター

cmake_policy()コマンドの基本的な構文は以下の通りです。<policy-id>: ポリシーの識別子。CMP<NNNN>形式で指定されます。<behavior>: ポリシーの動作。OLDまたはNEWを指定します。OLDとNEWの動作の違い


CMake ポリシー CMP0060 とは?

CMake ポリシー CMP0060 は、CMake 3.3 で導入されたポリシーで、ライブラリのリンク方法に影響を与えます。このポリシーは、デフォルトで OLD 動作に設定されていますが、NEW 動作に変更することもできます。OLD 動作と NEW 動作の違い