差分
この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
tips:how-to-update [2014/10/07 17:53] rpp [配布パッケージ] |
tips:how-to-update [2014/10/31 07:41] (現在) rpp [配布パッケージ] |
||
---|---|---|---|
ライン 2: | ライン 2: | ||
===== プロジェクトのバージョン管理形式 ===== | ===== プロジェクトのバージョン管理形式 ===== | ||
- | バージョン番号は、\\ | + | バージョン番号は、 |
- | メジャー.マイナー.リビジョン\\ | + | メジャー.マイナー.リビジョン |
- | で管理する。\\ | + | で管理する。 |
- | ** メジャーバージョン **\\ | + | === メジャーバージョン === |
プログラムの根幹にかかわるような大きな変更 | プログラムの根幹にかかわるような大きな変更 | ||
- | ** マイナーバージョン**\\ | + | === マイナーバージョン === |
- | それなりに大きな変更。\\ | + | それなりに大きな変更。 |
- | (外部から見える)新しい関数の追加など。\\ | + | |
- | プログラマが大きな変更だと思えば自由に増加させて良い。\\ | + | (外部から見える)新しい関数の追加など。 |
- | ここが増えるとやる気が上がるらしい。\\ | + | |
+ | プログラマが大きな変更だと思えば自由に増加させて良い。 | ||
+ | |||
+ | ここが増えるとやる気が上がるらしい。 | ||
メジャーバージョンが上がると0にリセットされる。 | メジャーバージョンが上がると0にリセットされる。 | ||
- | ** リビジョン番号 **\\ | + | === リビジョン番号 === |
- | バグフィックスや外部から見えない小さな変更など。\\ | + | バグフィックスや外部から見えない小さな変更など。 |
- | マイナーバージョンが上がると0にリセットされる。\\ | + | |
- | ユーティリティーやサンプルプログラムの追加・変更はここの変更で行う. | + | マイナーバージョンが上がると0にリセットされる。 |
+ | |||
+ | ユーティリティーやサンプルプログラムの追加・変更はここの変更で行う。 | ||
+ | |||
+ | === ライブラリのバージョン管理形式 === | ||
+ | プロジェクト内部の共有ライブラリはプロジェクトのバージョンに加えて別のバージョン管理を行う。 | ||
- | ==== ライブラリのバージョン管理形式 ==== | ||
- | プロジェクト内部の共有ライブラリはプロジェクトのバージョンに加えて別のバージョン管理を行う。\\ | ||
このプロジェクトのバージョン管理システムを使うことで、Makeしなおさなくてもライブラリが使えるようになる。 | このプロジェクトのバージョン管理システムを使うことで、Makeしなおさなくてもライブラリが使えるようになる。 | ||
- | === バージョニング === | + | === バージョニング === |
- | 以下Manpageより抜粋\\ | + | 以下Manpageより抜粋。 |
- | libtool は共有ライブラリ用に独自のバージョニングシステムを持っている。\\ | + | |
- | このシステムを使いたい場合は、-version-info オプションを使わなければならない。\\ | + | libtool は共有ライブラリ用に独自のバージョニングシステムを持っている。 |
- | このオプションは CURRENT[:REVISION[:AGE]] という形式の引数を受け付ける。\\ | + | |
+ | このシステムを使いたい場合は、-version-info オプションを使わなければならない。 | ||
+ | |||
+ | このオプションは 、 | ||
+ | <code> | ||
+ | CURRENT[:REVISION[:AGE]] | ||
+ | </code>という形式の引数を受け付ける。 | ||
- | ** CURRENT **\\ | + | == CURRENT == |
インターフェースのバージョン。インターフェースとは "外側" の世界に見えるすべてのもので、変数・関数プロトタイプ・出力形式などである。 | インターフェースのバージョン。インターフェースとは "外側" の世界に見えるすべてのもので、変数・関数プロトタイプ・出力形式などである。 | ||
- | ** REVISION **\\ | + | == REVISION == |
CURRENT からの相対値で与える実装のバージョン。 | CURRENT からの相対値で与える実装のバージョン。 | ||
- | ** AGE **\\ | + | == AGE == |
- | このライブラリが実装している最新のインターフェースと最古のインターフェースとの違い。\\ | + | このライブラリが実装している最新のインターフェースと最古のインターフェースとの違い。 |
- | 言い替えると、このライブラリは `CURRENT - AGE' から CURRENT までの範囲のすべてのインターフェース番号を実装していて、このバージョンの範囲にあるライブラリに対して過去にリンクされたすべての実行ファイルは、このライブラリを使うことができる、ということである。 \\ | + | |
- | REVISION と AGE が省略された場合のデフォルトは 0 である。\\ | + | 言い替えると、このライブラリは `CURRENT - AGE' から CURRENT までの範囲のすべてのインターフェース番号を実装していて、 |
- | AGE は CURRENT インターフェース番号より小さいか等しくなければならないことにも注意すること。\\ | + | |
- | 2 つのライブラリが同一の CURRENT 番号と AGE 番号であるとき、ダイナミックリンカは大きい REVISION 番号のライブラリを選択する。 | + | |
- | == バージョニングのガイドライン == | + | このバージョンの範囲にあるライブラリに対して過去にリンクされたすべての実行ファイルは、このライブラリを使うことができる、ということである。 |
- | 1. それぞれの libtool ライブラリについて `0:0:0' というバージョン情報から始めなさい。\\ | + | |
- | + | ||
- | 2. バージョン情報を更新するのはソフトウェアの公開リリースの直前だけにしなさい。\\ | + | |
- | 頻繁な更新は不必要であり、現在のインターフェース番号が大きくなるのを早くするだけである。\\ | + | |
- | + | ||
- | 3. 前回の更新からライブラリのソースコードがすっかり変更されたなら、REVISION を増加させなさい (C:R:A が C:R+1:A になる)。\\ | + | |
- | 4. 前回の更新からインターフェースが追加・削除・変更されたなら、CURRENT を増加させ、REVISION を 0 にしなさい。\\ | + | REVISION と AGE が省略された場合のデフォルトは 0 である。 |
- | + | ||
- | 5. 前回の公開リリースからインターフェースが追加されたなら、AGE を増加させなさい。\\ | + | AGE は CURRENT インターフェース番号より小さいか等しくなければならないことにも注意すること。 |
- | + | ||
- | 6. 前回の公開リリースからインターフェースが削除されたなら、AGE を 0 にしなさい。 \\ | + | 2 つのライブラリが同一の CURRENT 番号と AGE 番号であるとき、ダイナミックリンカは大きい REVISION 番号のライブラリを選択する。 |
+ | |||
+ | === バージョニングのガイドライン === | ||
+ | - それぞれの libtool ライブラリについて `0:0:0' というバージョン情報から始めなさい。 | ||
+ | - バージョン情報を更新するのはソフトウェアの公開リリースの直前だけにしなさい。頻繁な更新は不必要であり、現在のインターフェース番号が大きくなるのを早くするだけである。 | ||
+ | - 前回の更新からライブラリのソースコードがすっかり変更されたなら、REVISION を増加させなさい (C:R:A が C:R+1:A になる)。 | ||
+ | - 前回の更新からインターフェースが追加・削除・変更されたなら、CURRENT を増加させ、REVISION を 0 にしなさい。 | ||
+ | - 前回の公開リリースからインターフェースが追加されたなら、AGE を増加させなさい。 | ||
+ | - 前回の公開リリースからインターフェースが削除されたなら、AGE を 0 にしなさい。 | ||
- | パッケージバージョンをライブラリ名にエンコードしたい場合や、 libtool のバージョニングと衝突せずに他のバージョニングシステムを使いたい場合は、-release を使うこと。たとえば binutils-2.7.0.2 に付属する `libbfd.so.2.7.0.2' は libtool のバージョニングと明らかに衝突する。 `-release 2.7.0' を使えば `libbfd-2.7.0.so.0.0.0' で終ることができる。 | + | パッケージバージョンをライブラリ名にエンコードしたい場合や、 libtool のバージョニングと衝突せずに他のバージョニングシステムを使いたい場合は、 |
+ | <code>-release</code> を使うこと。たとえば binutils-2.7.0.2 に付属する <code>libbfd.so.2.7.0.2</code> は libtool のバージョニングと明らかに衝突する。 <code>-release 2.7.0</code> を使えば <code>libbfd-2.7.0.so.0.0.0</code> で終ることができる。 | ||
異なる CURRENT バージョンのライブラリや異なる -release のライブラリはバイナリ非互換であろう。 | 異なる CURRENT バージョンのライブラリや異なる -release のライブラリはバイナリ非互換であろう。 | ||
=== 更新方法 === | === 更新方法 === | ||
- | 各ライブラリのMakefile.amの '_la_LDFLAGS' を更新する。\\ | + | 各ライブラリのMakefile.amの '_la_LDFLAGS' を更新する。 |
- | 上記を簡単にまとめると、更新したときは、\\ | + | |
- | CURRENT : REVISION : AGE | + | 上記を簡単にまとめると、更新したときは、 |
- | 1. バグフィクスしたときは C : R++ : A | + | |
- | 2. インターフェースを追加したときは C++ : R=0 : A++ | + | |
- | 3. インターフェースを削除・変更したときは C++ : R=0 : A=0 | + | |
- | + | ||
- | ※ここでいうインターフェースとはユーザプログラムで使用する関数のこと | + | |
- | ※ インターフェースを削除、変更するとユーザープログラムを再コンパイルする必要がある | + | |
- | CURRENT : REVISION : AGE | + | ^ ^CURRENT ^ REVISION ^ AGE| |
- | 1. Bugfix C : R++ : A | + | |バグフィクスしたときは|C|R++|A| |
- | 2. Add Interface C++ : R=0 : A++ | + | |インターフェースを追加したときは|C++|R=0|A++| |
- | 3. Delete or Change Interface C++ : R=0 : A=0 | + | |インターフェースを削除・変更したときは|C++|R=0|A=0| |
- | + | ||
- | * 1 This interface means a function for users. | + | * ここでいうインターフェースとはユーザプログラムで使用する関数のこと。 |
- | * 2 If you delete or change interface, users must rebuild user's program. | + | * インターフェースを削除、変更するとユーザープログラムを再コンパイルする必要がある。 |
+ | |||
+ | ^ ^CURRENT ^ REVISION ^ AGE| | ||
+ | |Bugfix|C|R++|A| | ||
+ | |Add Interface|C++|R=0|A++| | ||
+ | |Delete or Change Interface|C++|R=0|A=0| | ||
+ | |||
+ | * This interface means a function for users. | ||
+ | * If you delete or change interface, users must rebuild user's program. | ||
==== 配布パッケージ ==== | ==== 配布パッケージ ==== | ||
=== autotools === | === autotools === | ||
- | 自動的にMakefile、依存ライブラリのチェックなどを行ってくれる支援ソフト。\\ | + | 自動的にMakefile、依存ライブラリのチェックなどを行ってくれる支援ソフト。 |
- | 配布パッケージの作成、インストールなどを自動的に行ってくれるので、便利。\\ | + | |
- | 使い方は[[index:internal-notice:how-to-autotools]]が詳しい | + | 配布パッケージの作成、インストールなどを自動的に行ってくれるので、便利。 |
+ | |||
+ | 使い方は[[how-to-autotools]]が詳しい。 | ||
== 作り方 == | == 作り方 == | ||
$ make dist | $ make dist | ||
- | でtarファイルが作成されることが望ましい。\\ | + | でtarファイルが作成されることが望ましい。 |
- | 自分の環境をtarでまとめると、編集したときのバックアップファイルなどのゴミが残ってしまう。\\ | + | |
- | そこでmake distで配布するファイルだけがtarにまとまるような状況が望ましい。\\ | + | 自分の環境をtarでまとめると、編集したときのバックアップファイルなどのゴミが残ってしまう。 |
- | (Autotoolsで作成すれば、自動的にmake distでtarファイルができるようになります) | + | |
+ | そこでmake distで配布するファイルだけがtarにまとまるような状況が望ましい。 | ||
+ | |||
+ | (Autotoolsで作成すれば、自動的にmake distでtarファイルができるようになります。) | ||
== 作業手順 == | == 作業手順 == | ||
- | #バージョンの更新 | + | 上のバージョン管理方法に従って更新する。 |
- | 上のバージョン管理方法に従って更新する。\\ | + | |
ChangeLogに変更した部分を書いておくこと! | ChangeLogに変更した部分を書いておくこと! | ||
- | **autotoolsを使っている場合 **\\ | + | *autotoolsを使っている場合 |
$ emacs configure.ac // configure.ac[in?]のバージョン部分を更新~ | $ emacs configure.ac // configure.ac[in?]のバージョン部分を更新~ | ||
$ emacs Makefie.am // (lib***.cを変更したとき、そのlibがあるフォルダのMakefileでライブラリのバージョン部分を変更) | $ emacs Makefie.am // (lib***.cを変更したとき、そのlibがあるフォルダのMakefileでライブラリのバージョン部分を変更) | ||
ライン 110: | ライン 130: | ||
$ make dist | $ make dist | ||
- | **autotoolsを使っていない場合 **\\ | + | *autotoolsを使っていない場合 |
Makefileのバージョン部分を更新 | Makefileのバージョン部分を更新 | ||
$ gedit Makefile | $ gedit Makefile | ||
ライン 123: | ライン 144: | ||
=== ldconfigについて === | === ldconfigについて === | ||
- | 現在 make install時に自動的に ldconfig が実行されるようになっている。\\ | + | 現在 make install時に自動的に ldconfig が実行されるようになっている。 |
- | デフォルトでわざわざldconfigが実行されないようになっている。\\ | + | |
+ | デフォルトでわざわざldconfigが実行されないようになっている。 | ||
これは、ldconfigを実行するにはroot権限が必要であることから、sudoを付けて実行しないとき(/usr/local/にインストールではなく別の場所を指定したときなど)にエラーがでることを防いでいるためである。 | これは、ldconfigを実行するにはroot権限が必要であることから、sudoを付けて実行しないとき(/usr/local/にインストールではなく別の場所を指定したときなど)にエラーがでることを防いでいるためである。 | ||
- | 本当は自分がroot権限を持っているかを確認してからldconfigを実行すべきである。\\ | + | 本当は自分がroot権限を持っているかを確認してからldconfigを実行すべきである。 |