======アップデート方法======
===== プロジェクトのバージョン管理形式 =====
バージョン番号は、
メジャー.マイナー.リビジョン
で管理する。
=== メジャーバージョン ===
プログラムの根幹にかかわるような大きな変更
=== マイナーバージョン ===
それなりに大きな変更。
(外部から見える)新しい関数の追加など。
プログラマが大きな変更だと思えば自由に増加させて良い。
ここが増えるとやる気が上がるらしい。
メジャーバージョンが上がると0にリセットされる。
=== リビジョン番号 ===
バグフィックスや外部から見えない小さな変更など。
マイナーバージョンが上がると0にリセットされる。
ユーティリティーやサンプルプログラムの追加・変更はここの変更で行う。
=== ライブラリのバージョン管理形式 ===
プロジェクト内部の共有ライブラリはプロジェクトのバージョンに加えて別のバージョン管理を行う。
このプロジェクトのバージョン管理システムを使うことで、Makeしなおさなくてもライブラリが使えるようになる。
=== バージョニング ===
以下Manpageより抜粋。
libtool は共有ライブラリ用に独自のバージョニングシステムを持っている。
このシステムを使いたい場合は、-version-info オプションを使わなければならない。
このオプションは 、
CURRENT[:REVISION[:AGE]]
という形式の引数を受け付ける。
== CURRENT ==
インターフェースのバージョン。インターフェースとは "外側" の世界に見えるすべてのもので、変数・関数プロトタイプ・出力形式などである。
== REVISION ==
CURRENT からの相対値で与える実装のバージョン。
== AGE ==
このライブラリが実装している最新のインターフェースと最古のインターフェースとの違い。
言い替えると、このライブラリは `CURRENT - AGE' から CURRENT までの範囲のすべてのインターフェース番号を実装していて、
このバージョンの範囲にあるライブラリに対して過去にリンクされたすべての実行ファイルは、このライブラリを使うことができる、ということである。
REVISION と AGE が省略された場合のデフォルトは 0 である。
AGE は CURRENT インターフェース番号より小さいか等しくなければならないことにも注意すること。
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
で終ることができる。
異なる CURRENT バージョンのライブラリや異なる -release のライブラリはバイナリ非互換であろう。
=== 更新方法 ===
各ライブラリのMakefile.amの '_la_LDFLAGS' を更新する。
上記を簡単にまとめると、更新したときは、
^ ^CURRENT ^ REVISION ^ AGE|
|バグフィクスしたときは|C|R++|A|
|インターフェースを追加したときは|C++|R=0|A++|
|インターフェースを削除・変更したときは|C++|R=0|A=0|
* ここでいうインターフェースとはユーザプログラムで使用する関数のこと。
* インターフェースを削除、変更するとユーザープログラムを再コンパイルする必要がある。
^ ^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 ===
自動的にMakefile、依存ライブラリのチェックなどを行ってくれる支援ソフト。
配布パッケージの作成、インストールなどを自動的に行ってくれるので、便利。
使い方は[[how-to-autotools]]が詳しい。
== 作り方 ==
$ make dist
でtarファイルが作成されることが望ましい。
自分の環境をtarでまとめると、編集したときのバックアップファイルなどのゴミが残ってしまう。
そこでmake distで配布するファイルだけがtarにまとまるような状況が望ましい。
(Autotoolsで作成すれば、自動的にmake distでtarファイルができるようになります。)
== 作業手順 ==
上のバージョン管理方法に従って更新する。
ChangeLogに変更した部分を書いておくこと!
*autotoolsを使っている場合
$ emacs configure.ac // configure.ac[in?]のバージョン部分を更新~
$ emacs Makefie.am // (lib***.cを変更したとき、そのlibがあるフォルダのMakefileでライブラリのバージョン部分を変更)
$ emacs ChangeLog // 更新した部分を書く
$ autoconf -i -f
$ ./configure
$ make
$ make dist
*autotoolsを使っていない場合
Makefileのバージョン部分を更新
$ gedit Makefile
$ emacs ChangeLog
$ make
$ make dist
== 配布形式 ==
tar.bz2形式で配布している。
これはsh-spurのころからの引継ぎ。tar.gzよりも圧縮率も高いので、こちらを使用している。
=== ldconfigについて ===
現在 make install時に自動的に ldconfig が実行されるようになっている。
デフォルトでわざわざldconfigが実行されないようになっている。
これは、ldconfigを実行するにはroot権限が必要であることから、sudoを付けて実行しないとき(/usr/local/にインストールではなく別の場所を指定したときなど)にエラーがでることを防いでいるためである。
本当は自分がroot権限を持っているかを確認してからldconfigを実行すべきである。