【環境やバージョンに依存する実行ファイル名も楽々!】CMakeのRUNTIME_OUTPUT_NAME_CONFIGで実現する柔軟なビルド


CMakeは、クロスプラットフォームのビルドシステムであり、プロジェクトの構成とビルドを自動化するのに役立ちます。Properties: Targets は、ターゲットのさまざまな属性を設定するための機能です。

RUNTIME_OUTPUT_NAME_CONFIG は、ターゲットの 実行時出力名 を構成するために使用されるプロパティです。これは、ターゲットが実行されるときに生成されるファイルの名前を制御します。

詳細解説

動作原理

RUNTIME_OUTPUT_NAME_CONFIG は、ターゲットの RUNTIME_OUTPUT_NAME プロパティと組み合わせて使用されます。RUNTIME_OUTPUT_NAME は、ターゲットの デフォルトの実行時出力名 を設定します。

RUNTIME_OUTPUT_NAME_CONFIG は、構成固有 の実行時出力名を指定するために使用されます。これは、ビルド構成によって異なる実行時出力名を持つようにターゲットを構成する場合に役立ちます。

設定方法

RUNTIME_OUTPUT_NAME_CONFIG は、ターゲットの CMakeLists.txt ファイルで設定できます。次の例は、mytarget というターゲットの RUNTIME_OUTPUT_NAME_CONFIG を設定する方法を示します。

target_properties(mytarget PROPERTIES RUNTIME_OUTPUT_NAME_CONFIG "Release=mytarget_release Debug=mytarget_debug")

この例では、Release 構成の場合、ターゲットの実行時出力名は mytarget_release になります。Debug 構成の場合、ターゲットの実行時出力名は mytarget_debug になります。

使用例

RUNTIME_OUTPUT_NAME_CONFIG は、さまざまな状況で使用できます。たとえば、次のような場合に使用できます。

  • 実行ファイル名をバージョン情報に依存させる
  • 実行ファイル名を環境に依存させる
  • 異なる構成で異なる実行ファイルを作成する

注意点

RUNTIME_OUTPUT_NAME_CONFIG は、ターゲットの実行時出力名のみを制御します。ターゲットの 生成ファイル名 は、TARGET_LINKED_LIBRARIESTARGET_SOURCES などの他のプロパティによって制御されます。

関連プロパティ

  • TARGET_SOURCES
  • TARGET_LINKED_LIBRARIES
  • RUNTIME_OUTPUT_NAME

RUNTIME_OUTPUT_NAME_CONFIG は、CMake でターゲットの実行時出力名を構成するための便利なプロパティです。構成固有の実行時出力名を作成したり、実行ファイル名を環境やバージョン情報に依存させたりする場合に役立ちます。

  • CMake の詳細については、公式ドキュメントを参照してください。
  • 上記の説明は、基本的な概念を理解するためのものです。より複雑な構成には、追加の設定が必要になる場合があります。


cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

target_properties(mytarget PROPERTIES RUNTIME_OUTPUT_NAME_CONFIG "Release=mytarget_release Debug=mytarget_debug")

この例では、mytarget というターゲットが作成されます。Release 構成の場合、ターゲットの実行時出力名は mytarget_release になります。Debug 構成の場合、ターゲットの実行時出力名は mytarget_debug になります。

実行ファイル名を環境に依存させる

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

if(NOT DEFINED ENV{MYTARGET_NAME})
    set(MYTARGET_NAME mytarget)
endif()

target_properties(mytarget PROPERTIES RUNTIME_OUTPUT_NAME_CONFIG "${CMAKE_BUILD_TYPE}=${MYTARGET_NAME}")

この例では、mytarget というターゲットが作成されます。MYTARGET_NAME という環境変数が設定されている場合は、ターゲットの実行時出力名は MYTARGET_NAME になります。環境変数が設定されていない場合は、ターゲットの実行時出力名は mytarget になります。

実行ファイル名をバージョン情報に依存させる

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

set(VERSION_MAJOR 1)
set(VERSION_MINOR 2)
set(VERSION_PATCH 3)

set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")

target_properties(mytarget PROPERTIES RUNTIME_OUTPUT_NAME_CONFIG "${CMAKE_BUILD_TYPE}=mytarget-${VERSION_STRING}")

この例では、mytarget というターゲットが作成されます。ターゲットの実行時出力名は、mytarget- に続いてメジャーバージョン、マイナーバージョン、パッチバージョンが連結されます。

  • CMake には、さまざまな機能があります。詳細については、公式ドキュメントを参照してください。


CMake の RUNTIME_OUTPUT_NAME_CONFIG プロパティは、ターゲットの実行時出力名を構成するための便利な機能です。しかし、状況によっては、他の方法で実行時出力名を制御したい場合があります。

ここでは、RUNTIME_OUTPUT_NAME_CONFIG の代替方法として、以下の 2 つの方法を紹介します。

インストールディレクトリを使用する

ターゲットの実行時出力名を制御する 1 つの方法は、CMAKE_INSTALL_PROGRAMS プロパティを使用して、ターゲットを特定のディレクトリにインストールすることです。その後、そのディレクトリから実行ファイルを直接実行できます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

install(TARGETS mytarget DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)

この例では、mytarget というターゲットが作成され、/usr/local/bin ディレクトリにインストールされます。このディレクトリから mytarget コマンドを実行することで、ターゲットを実行できます。

カスタムスクリプトを使用する

ターゲットの実行時出力名を制御するもう 1 つの方法は、カスタムスクリプトを使用して、ターゲットがビルドされた後に実行ファイルの名前を変更することです。

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(mytarget mytarget.cpp)

add_custom_command(TARGET mytarget
                   POST_BUILD
                   COMMAND ${CMAKE_CURRENT_BINARY_DIR}/rename-target ${mytarget})

この例では、mytarget というターゲットが作成され、rename-target というカスタムスクリプトを使用して実行ファイルの名前が変更されます。rename-target スクリプトは、ターゲットの実行時出力名を構成するために自由に使用できます。

状況に応じた方法を選択する

どの方法を使用するかは、状況によって異なります。

  • より複雑な構成 または 実行ファイル名を動的に生成 する必要がある場合は、カスタムスクリプトを使用する方が柔軟性があります。
  • シンプルな構成 の場合は、CMAKE_INSTALL_PROGRAMS プロパティを使用する方が簡単です。
  • CMake には、さまざまな機能があります。詳細については、公式ドキュメントを参照してください。
  • 上記の方法は、あくまでも例示であり、実際のプロジェクトでは状況に合わせて調整する必要があります。