BSD UnixやLinuxなどのフリーOSでいつも悩むのが、 OSに付属しているソフトウェアパッケージの管理フレームワークと 自前で入れたソフトウェア*1とが 干渉しないかという問題だ。 どちらの方法も、次に示すように一長一短があるので、 場合によって使い分けることになる。

野良makeとパッケージ管理の比較
野良makeパッケージ
バージョンアップへの対応ソースが準備できればいつでも配布されるのを待つ
管理の手間掛かるわりと楽
カスタマイズいくらでも好きなように制約あり
依存関係なし。人間が管理自動で管理

OpenBSDの場合のパッケージ管理は、ports(7)やpackages(7)により 行う。上に挙げたように管理が楽な半面、最新のものに追従できなかったり、 依存関係の定義から本来必要ないものまで大量にインストール されたり、逆にビルド時に付加して欲しい機能が指定されず、 決め打ちでインストールされる場合もある。なので、現在は、

  • そのマシンでメインとなる機能や、セキュリティ的に早く対応したいものなど ... 野良make
  • 運用上必要だが、付加的でありあまり手間をかけたくないもの ... ports/packages

というような使い分けをしている。

ports/packagesは、通常/usr/localの下にインストールされるが、野良makeする場合もconfigureを無指定で走らせると、やはり/usr/localの下にインストールされる。 この時、パッケージ管理により入れてあるものが、野良installにより上書きされ、 パッケージ管理を破綻させる可能性がある。

なので、以前から安全な野良makeの方法を色々と試行していたのだが、現在行っている(原始的な)手順を紹介する。

コンセプト

以下のとおり;

  • /usr/localとは別のベースディレクトリに分離
  • 一つのソフトウェアは、ベースディクトリ直下にそのソフトウェア専用の サブディレクトリを作成し、そこにソースツリーを含むビルド環境と、 ビルド後インストールされるものをまとめて置いておく。

この手法は、SerioWare GNU/LinuxのPROGパッケージやNEXTSTEPのパッケージ管理方法、GNU stowなどがヒントとなっている。

管理手順

インストール

ベースディレクトリ(以降BASEDIRと表記)を決める。場所は/usr/local以外の適当な場所でよいが、空き容量に余裕のあるパーティションを選定するとよい。

例として、ソフトウェアfooのバージョンI.J.Kをインストールすると仮定する。この場合、以下のようにtar ballを置き、ソースツリーを展開する。

- BASEDIR -+- foo -+- build -+- foo-I.J.K.tar.gz
                             |
                             +- foo-I.J.K -+- README
                             |             +- INSTALL
                             |             +- configure
                             |             (other source files...)
                             |
                             +- doconf.sh

ソースツリーの展開されたディレクトリ BASEDIR/foo/build/foo-I.J.K上でソフトウェアのビルド作業を行う。

fooのインストール先は、BASEDIR/fooの直下になるようにする。configureを用いてビルドを行う場合は、

./configure --prefix=BASEDIR/foo

その他にもconfigureにオプションを付ける場合は、シェルスクリプトBASEDIR/build/doconf.shなどを作成しておき、

../doconf.sh && make

などとすればよい。BASEDIR/buildに置くのは、ソースツリーを消去してもあとに残るし、将来foo-I.J.Kがバージョンアップしてfoo-I.J.Lが出た場合も、同じ手順でビルドできるため。

コンパイル終了後、インストールする。上に述べたようなファイルレイアウトを行っていれば、インストール後のファイル配置は以下のようになる。

- BASEDIR -+- foo -+- build -+- foo-I.J.K.tar.gz
                   |         |
                   |         +- foo-I.J.K -+- README
                   |         |             +- INSTALL
                   |         |             +- configure
                   |         |             (other source files...)
                   |         |
                   |         +- doconf.sh
                   |
                   +- bin -+- ...
                   |
                   +- lib -+- ...
                   |
                   +- etc -+- ...
                   |
                   +- man -+- ...
                   :

設定

ソフトウェアfooのインストール終了後は、PATHが通っていなかったりするので、実行やマニュアルページの閲覧に手間が掛かる。また、同じ方法で別のソフトをインストールした場合にもいちいちPATHの設定をしなければならず、非常に繁雑。これを解消するため、/usr/localからシンボリックリンクを張ることとする。

ln -s BASEDIR/foo/bin/* /usr/local/bin
ln -s BASEDIR/foo/lib/* /usr/local/lib
ln -s BASEDIR/foo/man/man1/* /usr/local/man/man1
      :
      :

若しくは、

cd /usr/local
lndir BASEDIR/foo

(注: この方法は、build以下にもリンクが張られるので注意。build以下へのリンクは手動で消去する)

必要な他の付加的な設定(例えばldconfigなど)を実施。

fooの動作を確認する。OKならディレクトリfoo-I.J.Kやtar ball foo-I.J.K.tar.gzは消去してもよい。

アンインストール手順

  • BASEDIR/foo以下を消去
    • 再インストールするつもりの場合はBASE/foo/build以下は残す。
  • /usr/local以下の、リンク先が存在しなくなったシンボリックリンクを消去

FrontPage



*1 これを「野良make」と言っている
Reload  New Edit Freeze Diff Attach Copy Rename  Top Index Search Recent Backups  Help  RSS
Last-modified: 2005-04-17 (Sun) 17:01:47 (4752d)