web-dev-qa-db-ja.com

プログラムコードにバージョン番号をエンコード/埋め込む正しい方法

ソフトウェアバージョンをコードに埋め込み、後で-v--versionなどの引数のようなコマンドを使用してプログラムバイナリから取得したいと思います。例として、GNU/Linuxソフトウェアバイナリの一部は、コマンドラインで-vまたは-V引数を指定すると、バージョン情報を出力します。例としてlsを取り上げます。

$ ls --version
ls (GNU coreutils) 8.13
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

これを行うための規則や標準はありますか?この情報を検索しようとしましたが、正しい用語がわからなかったため、検索の結果、バージョン管理のハウツーしか見つかりませんでした。ソフトウェアコードは、問題への対処に役立つ場合はC++言語で記述されています。

15
Barracuda

通常、メジャーバージョン番号とマイナーバージョン番号(1.2、1はメジャー、2はマイナー)の場合、ほとんどの場合、コードに直接、通常は#defineとして記述されます(条件付きコンパイル、つまり#ifで必要になる場合があるため)ブロック)。

通常、依存関係を最小限に抑えるために、これらの定義のみを含み、他には何も含まない(ヘッダーガードを除く)個別のヘッダーがあります。

一部の人々は、ビルドシステム(cmakeなど)を使用してバージョン管理(git、svn、cvsなど)からバージョン番号を取得し、そのバージョン番号を「バージョン」ヘッダーに配置します。または、 cmakeチュートリアル に示すように、バージョン番号をビルドシステム構成ファイルに入れてからヘッダーに入れます。個人的には、このアプローチはヘッダーファイルを頻繁に変更し、頻繁で無意味な再コンパイルを引き起こす傾向があるため、好きではありません。

ヘッダーファイルにバージョン番号を書き込んでから、それらのバージョン番号(メジャー、マイナー、..)をヘッダーからビルドシステムに引き出すことをお勧めします。これは、cmakeが非常に簡単に実行できるもう1つのことです。

ビルド番号やリビジョン番号など、非常に日々のバージョン番号をソフトウェアに埋め込みたい場合は、ヘッダーファイルに#defineとしてではなく、定義したextern const変数として配置する必要があります。 1つのcppファイルで。たとえば、cmakeを使用してバージョン管理システムからリビジョン番号を取得し、それを(cmakeのextern const int revision;関数を介して)このconfigure_file変数を定義するcppファイルに追加し、プログラムをそのcpp /オブジェクトファイルにリンクできます。このように、リビジョン番号は再ビルドのたびにプログラムに自動的に組み込まれ、更新されるたびに(コミットのたびに)完全な再コンパイルがトリガーされることはありません。

重要なのは、メジャーバージョン番号とマイナーバージョン番号は、いかなる種類の自動メンテナンスも必要とするほど頻繁には変更されないということですが、手動で1つの場所にのみ書き込み、関連する可能性のある他の場所に自動的に伝播する必要があります(この場所はヘッダーファイル自体です)。完全に自動化する必要があるのはリビジョン番号またはビルド番号だけです(バージョン管理によって生成され、他のすべての場所に自動的に伝達されます)。

14
Mikael Persson

バージョン番号は専用のヘッダーファイルに保存するのが通例だと思います。一部のツールでは、これを自動的に生成できます。たとえば、CMakeでそれを行う方法は次のとおりです。 http://www.cmake.org/cmake-tutorial/

「バージョン番号と構成済みヘッダーファイルの追加」のセクションを参照してください。

3
Gábor Angyal