パソコンでプログラミングしよう ウィンドウズC++プログラミング環境の構築
1.6.3.6(15)
バージョン番号の設定ポリシー

アプリケーション開発におけるソフトウェアバージョン番号の設定ポリシーを説明する。

ソフトウェアバージョンは時系列による版の違いを明示する目的でアプリケーションに付加される名称であり、ほとんどの場合は整数値の組み合わせ番号として表現される。意外にも標準的な書式が定まっておらず、開発者の好みに任される。

アプリケーション開発は実行形式以外に様々なファイル(例えばヘルプファイル、インストーラ、アーカイブファイル)を伴うのが常で、その全てでバージョン番号を整合させるのは個人レベルの開発でも煩雑で混乱を招く。本サイトは自作ツールでバージョン番号管理を自動化する。

本サイトの書式と設定ポリシー

本サイトはウィキペディア(英語)に例示される多くの書式から以下を選択する。

major.minor[.build[.revision]] (example: 1.2.12.102)

本サイトはrevisionより下位のbuild countを追加定義するが、その表示は他と異なり丸括弧()を用いる。build countはビルド回数をカウントするものとして製品バージョンの一部と見なさない。

major.minor[.build[.revision[(build count)]]] (example: 1.2.12.102(14))

製品バージョンの更新を必要とするイベントが発生した場合はその重要性にふさわしい番号(major、minor、build、revisionのいずれか)を1増加し、それより下位の番号(build countを含む)を0にリセットする。インストーラを作成したら必ずイベントが発生したとして製品バージョンを更新するが、イベント発生はインストーラ作成に限定しない。

build countはある製品バージョンにおけるビルド回数をカウントする。イベントが発生してから次のビルドを実行するまでbuild countは0であるが、実行形式ファイルの作成で必ずビルドが実行されるため、実行形式ファイルのbuild countが0になることはない。開発中プロジェクトの製品バージョンおよびビルド回数はプロジェクトディレクトリのデータファイルに保持され、通常は最後にビルドされた実行形式ファイルの製品バージョンおよびビルド回数と一致するが、イベント発生(製品バージョン更新)から次のビルドまでは一致しない。32ビット/64ビット両方を出荷するアプリケーションではそれぞれの製品バージョンは一致するがビルド回数は異なる。

ソフトウェアステータス(software status)とその省略形(abbreviation)として通常はAlpha(a)、Beta(b)、Release candidate(rc)などが用いられる。しかし本サイトはこれらをプロジェクトターゲット名で代用する。

ターゲット ステータス 省略形
Debug Debug d
Debug32 Debug32 d32
Debug64 Debug64 d64
Release Release r
Release32 Release32 r32
Release64 Release64 r64

製品バージョン(およびビルド回数)にステータス併記する場合は以下のいずれかとする。

major.minor[.build[.revision[(build count)]]](abbreviation) (example: 1.2.12.102(14)(r64))
major.minor[.build[.revision[(build count)]]]-software status (example: 1.2.12.102(14)-Release64)

Code::Blocksのバージョン番号管理機能

統合開発環境Code::Blocksにもメニュー[Project|Autoversioning]にバージョン番号管理機能が組み込まれていて、その書式は本サイトの用いる書式にほぼ等しい。サイト作成者は当初この機能を使用していたが不具合が多く自作ツールを開発するに至った。

  • バージョン番号を管理できるファイルがただ一つ(version.h)でそのフォーマットも固定されている。
  • バージョン番号をC++/C言語のグローバル変数に代入するためマクロ変数なら参照できるデータファイル(ウィンドウズリソース、Inno Setupスクリプト)から利用できない。
  • バージョン番号をマクロ変数に代入するオプションも存在するがファイル(version.h)からのデータ逆読み込みが機能せず役に立たない。

自作ツールのバージョン番号統一管理

本サイトは自作ツールでプロジェクトのバージョン番号(製品バージョンおよびビルド回数)を統一管理する。

  • アプリケーションの表示するバージョン番号
  • 実行形式ファイルメタデータのファイルバージョンと製品バージョン
  • Git for Windowsコミットのタグ
  • Git for Windowsが作成するアーカイブファイル名に付加するバージョン番号
  • Doxygen作成ドキュメント(ソースコード解析およびHTMLヘルプファイル)の表示するバージョン番号
  • インストーラのファイル名に付加するバージョン番号
  • インストーラがインストール時に表示するバージョン番号
覚え書き
自作ツールは任意ファイルにバージョン情報をプレースホルダーで挿入する。プレースホルダー名はCode::Blocksバージョン管理機能からの移行時にCode::Blocksの定義する変数名を参考に定めたが、build countのみ明らかに間違っている(BUILD_COUNTでなくBUILDS_COUNT)ため修正した。
内容 Code::Blocks 自作ツール
DATE #{DATE}
MONTH #{MONTH}
YEAR #{YEAR}
Software Status STATUS #{STATUS}
Abbreviation STATUS_SHORT #{STATUS_SHORT}
Major Version MAJOR #{MAJOR}
Minor Version MINOR #{MINOR}
Build Number BUILD #{BUILD}
Revision REVISION #{REVISION}
Build Count BUILDS_COUNT #{BUILD_COUNT}

管理対象ファイルの配置

バージョン番号を管理するファイル配置を示す。

ディレクトリ ファイル 内容
[プロジェクトディレクトリ] Desktop2.cbp Code::Blocksプロジェクト
autoversion.dat バージョン番号データ
version_macro.h バージョンマクロ定義インクルード
*.cpp, *.h ソースコード、インクルード
resource.rc ウィンドウズリソース
├ bin ... ...
├ obj ... ...
├ doxygen Doxyfile ソースコード解析用Doxygen設定
Doxyfile_winchm HTMLヘルプファイル用Doxygen設定
Doxyfile_autoversion PROJECT_NUMBER定義Doxygen設定
... ...
├ innosetup InnoSetup.iss Inno Setupスクリプト
... ...
└ autoversion-template version_macro.h バージョンマクロ定義インクルードテンプレート
 └ doxygen Doxyfile_autoversion PROJECT_NUMBER定義Doxygen設定テンプレート

autoversion-template\version_macro.hautoversion-template\doxygen\Doxyfile_autoversionはプレースホルダー文字列を含み、自作ツールはプレースホルダー文字列をautoversion.datに記憶されるバージョン情報に置き換えてversion_macro.hとdoxygen\Doxyfile_autoversionを生成する。任意のソースコード(*.cpp)あるいはインクルード(*.h)はversion_macro.hをインクルードしてバージョン番号を得る。resource.rcもversion_macro.hをインクルードし、実行形式ファイルメタデータを設定する。さらにinnosetup\InnoSetup.issもversion_macro.hをインクルードしてインストール時に表示するバージョン番号を得る。doxygen\Doxyfileは@INCLUDEタグでDoxyfile_autoversionをインクルードしてPROJECT_NUMBERオプションに定義されたバージョン番号を得る。