CMakeプロジェクトのバージョン番号を自動化:PROJECT_NAME_VERSION変数とVCS連携


構文

PROJECT_NAME_VERSION <major>.<minor>.<patch>
  • <patch>: パッチバージョン番号
  • <minor>: マイナーバージョン番号
  • <major>: メジャーバージョン番号

オプション

  • <suffix>: バージョン番号の末尾に追加する接尾辞を指定できます。
  • <release>: リリースタイプを指定できます。(例:alphabetafinal)

PROJECT_NAME_VERSION 1.0.0

この例では、プロジェクトのバージョン番号が 1.0.0 に設定されます。

PROJECT_NAME_VERSION 1.0.0 alpha

この例では、プロジェクトのバージョン番号が 1.0.0 に設定され、リリースタイプが "alpha" となります。

PROJECT_NAME_VERSION 1.2.3 myrelease

この例では、プロジェクトのバージョン番号が 1.2.3 に設定され、バージョン番号の末尾に "myrelease" という接尾辞が追加されます。

使い方

PROJECT_NAME_VERSION 変数は、CMakeの様々な場所で利用できます。例えば、以下の用途に使用できます。

  • バージョン管理システムとの連携
  • インストーラーのパッケージング
  • ドキュメントのバージョン情報の生成
  • バイナリファイルのバージョン情報の設定

バージョン管理システムとの連携

PROJECT_NAME_VERSION 変数は、バージョン管理システム (VCS) と連携して、バージョン番号を自動的に更新することができます。これを行うには、CMakeの configure_file() コマンドを使用します。

以下の例では、CMakeLists.txt ファイルを使用して、VERSION ファイルを生成します。このファイルには、プロジェクトのバージョン情報が格納されます。

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/VERSION.in"
  "${CMAKE_CURRENT_BINARY_DIR}/VERSION"
  COPYONLY
)

VERSION.in ファイルには、以下の内容を記述します。

# This file is generated by CMake.

PROJECT_NAME MyProject
PROJECT_VERSION 1.0.0
PROJECT_RELEASE alpha

このファイルを生成したら、以下のコマンドを使用してビルドを実行できます。

cmake .
make

ビルドが完了すると、VERSION ファイルが生成され、その中にはプロジェクトのバージョン情報が格納されます。

  • PROJECT_NAME_VERSION 変数は、CMake 2.8.12 以降で使用できます。


cmake_minimum_required(VERSION 3.10)

project(MyProject 1.0.0)

# バイナリファイルのバージョン情報設定
add_executable(my_app main.cpp)
target_version(my_app 1.0.0)

# ドキュメントのバージョン情報生成
set(CMAKE_STRIP_COMMAND "")
add_custom_command(
  TARGET documentation
  COMMAND ${CMAKE_COMMAND} --help > documentation.txt
  COMMENT "Generate project documentation"
)

# インストーラーのパッケージング
install(TARGETS my_app DESTINATION bin)
install(FILES documentation.txt DESTINATION doc)

例2:バージョン管理システムとの連携

cmake_minimum_required(VERSION 3.10)

project(MyProject 1.0.0 alpha)

# VERSION.in ファイルの生成
configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/VERSION.in"
  "${CMAKE_CURRENT_BINARY_DIR}/VERSION"
  COPYONLY
)

# バイナリファイルのバージョン情報設定
add_executable(my_app main.cpp)
target_version(my_app 1.0.0)

# ドキュメントのバージョン情報生成
set(CMAKE_STRIP_COMMAND "")
add_custom_command(
  TARGET documentation
  COMMAND ${CMAKE_COMMAND} --help > documentation.txt
  COMMENT "Generate project documentation"
)

# インストーラーのパッケージング
install(TARGETS my_app DESTINATION bin)
install(FILES documentation.txt DESTINATION doc)

例3:オプションの利用

cmake_minimum_required(VERSION 3.10)

project(MyProject 1.2.3 myrelease)

# バイナリファイルのバージョン情報設定
add_executable(my_app main.cpp)
target_version(my_app 1.2.3)

# ドキュメントのバージョン情報生成
set(CMAKE_STRIP_COMMAND "")
add_custom_command(
  TARGET documentation
  COMMAND ${CMAKE_COMMAND} --help > documentation.txt
  COMMENT "Generate project documentation"
)

# インストーラーのパッケージング
install(TARGETS my_app DESTINATION bin)
install(FILES documentation.txt DESTINATION doc)
  • オプションの利用例では、release オプションと suffix オプションを使用して、バージョン番号を拡張しています。
  • バージョン管理システムとの連携例では、VERSION.in ファイルを使用して、プロジェクトのバージョン情報を格納しています。
  • 各例では、バージョン番号の設定、バイナリファイルへのバージョン情報の埋め込み、ドキュメントのバージョン情報生成、インストーラーのパッケージングなどを行っています。
  • 上記の例は、PROJECT_NAME_VERSION 変数の基本的な使用方法を示しています。
  • これらの例はあくまで基本的なものであり、プロジェクトの要件に応じてカスタマイズする必要があります。


CMake には、プロジェクトのバージョン情報を設定するための PROJECT_NAME_VERSION 変数以外にも、いくつかの代替方法があります。これらの代替方法は、以下の理由で PROJECT_NAME_VERSION 変数よりも好まれる場合があります。

  • 特定のツールやワークフローとの互換性
  • 複雑なバージョン番号スキームへの対応
  • より柔軟なバージョン管理

代替方法

  • 外部ツール

    • gitMercurial などのバージョン管理システム (VCS) を使用して、バージョン情報を管理します。
    • VCS コマンドを使用して、バージョン情報を CMake 変数に設定できます。
    • この方法は、バージョン管理システムと密接に連携するプロジェクトに適しています。
  • CMake 変数

    • CMAKE_VERSION_INFO 変数を使用して、バージョン情報を設定します。
    • メジャー、マイナー、パッチ、リリース番号などの個別フィールドを制御できます。
    • この方法は、より柔軟なバージョン管理が必要な場合に適しています。
    • プロジェクトのソースコード内で、バージョン情報を直接定義します。
    • ヘッダーファイルやソースファイルにマクロや定数として定義できます。
    • この方法は、シンプルなプロジェクトや、バージョン番号を頻繁に変更しない場合に適しています。

手動設定

// main.cpp

#define PROJECT_NAME "MyProject"
#define PROJECT_VERSION "1.0.0"

CMake 変数

cmake_minimum_required(VERSION 3.10)

project(MyProject)

set(CMAKE_VERSION_INFO 1 0 0)
set(CMAKE_VERSION_INFO_RELEASE alpha)

# バイナリファイルのバージョン情報設定
add_executable(my_app main.cpp)
target_version(my_app ${CMAKE_VERSION_INFO})

# ドキュメントのバージョン情報生成
set(CMAKE_STRIP_COMMAND "")
add_custom_command(
  TARGET documentation
  COMMAND ${CMAKE_COMMAND} --help > documentation.txt
  COMMENT "Generate project documentation"
)

# インストーラーのパッケージング
install(TARGETS my_app DESTINATION bin)
install(FILES documentation.txt DESTINATION doc)

外部ツール

# .git/config

[core]
    version = 1.2.3
cmake_minimum_required(VERSION 3.10)

project(MyProject)

# git コマンドを使用してバージョン情報を取得
execute_process(
  COMMAND git describe --tags --abbrev-ref --always
  OUTPUT_VARIABLE git_version
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

# git バージョン情報を CMake 変数に設定
set(CMAKE_VERSION_INFO ${git_version})

# バイナリファイルのバージョン情報設定
add_executable(my_app main.cpp)
target_version(my_app ${CMAKE_VERSION_INFO})

# ドキュメントのバージョン情報生成
set(CMAKE_STRIP_COMMAND "")
add_custom_command(
  TARGET documentation
  COMMAND ${CMAKE_COMMAND} --help > documentation.txt
  COMMENT "Generate project documentation"
)

# インストーラーのパッケージング
install(TARGETS my_app DESTINATION bin)
install(FILES documentation.txt DESTINATION doc)
  • 各プロジェクトの要件に応じて、最適な方法を選択する必要があります。
  • これらの例は、各代替方法の基本的な使用方法を示しています。