パッケージ管理ツール porg (1)実践的インストール



## 概要
porg は、ソースコードからビルドを行ったパッケージソフトウェアなどを管理するためのパッケージ管理ツールです。通常の Linux ディストリビューションなどでは、既定のパッケージ管理ツールが提供されていますから、普通はこんなツールを必要としません。これが必要となるのは、既定のパッケージ管理ツールの範囲外において、そもそも必要なパッケージが提供されていなかったり、パッケージ提供はあるけれども root 権限がないので導入できなかったり、あるいは既存パッケージをカスタマイズしてインストールしたかったり、といった場面を通じて、各種ソフトウェアを導入および管理する際に porg が活用できます[^1]。

porg は元々は paco という名で開発されていたものが、名前が変わり開発者も変わって porg となりました。何人かの方が porg (あるいは paco) のことを紹介したり説明したりするサイトが存在していますから、覗いて見るのも良いかと思います。ただ筆者はこれまで porg の扱いに慣れ親しんできていて、他の方の紹介サイトなどには、後一歩、実践的な手順が抜けているようにも感じます。ですから、porg の実践的活用方法を示すことにします。まずここではインストールまでの話をします。

[^1]: そもそもこのツールは [Linux From Scratch](http://www.linuxfromscratch.org "Linux From Scratch") に集う開発者の中から作り出されたツールであるようで、実践として Linux From Scratch をビルド構築する際のパッケージ管理に活用することができます。

## 入手とインストール

### 提供サイトからのソース入手

提供サイトは以下です：
porg Source Code Package Organizer
https://sourceforge.net/projects/porg/files/

本文執筆時点での最新バージョンは porg-0.10 ですので、上記サイトから porg-0.10.tar.gz をダウンロードします。

```shell-session
$ wget https://sourceforge.net/projects/porg/files/porg-0.10.tar.gz
```

### 標準的なインストール

porg のソースからのビルド・インストールは、標準的には以下のようにします。ここでいう標準的とは、root 権限も有していて、porg を全ユーザー向けにインストールするような状況を指すものとします。そしてこの節の後に、実践的なインストール手順も示しますが、一通りここでの手順も一読ください。

```shell-session
$ tar xf porg-0.10.tar.gz
$ cd porg-0.10
$ ./configure --prefix=/usr \
$    --sysconfdir=/etc      \
$    --disable-grop
$ make
$ sudo ./porg/porg -lD make install
```

ポイントをいくつか示します。

* ```--prefix=/usr``` により、porg の実行モジュールを ```/usr/bin``` にインストールするようにします。必要に応じて ```--prefix=/usr/local``` などとします。
* ```--sysconfdir=/etc``` により porg の設定ファイル ```porgrc``` などを ```/etc``` ディレクトリ配下にインストールします。これがない場合は ```${PREFIX}/etc``` になってしまい、FHS 的には不適当となります。
* ```--disable-grop``` は porg の GUI バージョンをインストールしないようにします。デスクトップ環境 (X 環境) でのインストールであって GUI 版も利用する場合には、このオプションをはずします。ちなみにこの GUI 版はあまり期待しない方がよいです。コマンドラインを叩く方法をしっかり身につければよいと思います。
* ```sudo ./porg/porg ...``` は、他のサイトでは見かけないインストールの仕方かと思います。これが正しいのです。
```./porg/porg``` というのは、ソースディレクトリ内にてビルドされた、出来立てホヤホヤの porg 実行モジュールです。
porg のバージョン 0.8 以下か、あるいはその前身である paco を操作されていた方は、ここで ```make install``` とした上で続けて ```make logme``` としていたはずです。
この logme というのは、porg そのものを porg のパッケージ管理の中に登録するコマンドになっていました。こうしないと登録が出来なかったのです。
しかしこの logme は porg 0.9 以降はなくなりました。
代わりに ```./porg/porg -lD make install``` で、porg のインストールと同時に、管理登録までも行うようになりました。

### 実践的なインストール

そもそもなぜ porg を利用したいかと言えば、端的に言って「root 権限を持っていないけど、パッケージ管理をしたい」ということになるかと思います。となると、上で示した標準的インストールの手順は使えません。なぜなら ```/usr``` ディレクトリは管理権限なしには操作できないからです。さらに porg は登録されるパッケージ情報をテキストファイルに保存するのですが、その保存先ディレクトリはデフォルトでは ```/var/log/porg``` となっています。これもまた管理権限なしには操作できません。

ちなみに上の標準的なインストールを行った porg を、一般ユーザーが利用すると以下のように、

```shell-session
$ porg -lp package somecommands....
porg: /var/log/porg: Permission denied
```

といったように ```/var/log/porg``` にアクセスできず porg 操作ができません。

一般ユーザーでの利用を前提に (一般ユーザーが自分だけで porg を導入して利用することを前提に) porg をインストールするのであれば、例えば以下のようなインストール手順とします。ここでの要点は、root 権限を必要とするディレクトリにはインストールを行わないようにすることです。

```shell-session
$ tar xf porg-0.10.tar.gz
$ cd porg-0.10
$ ./configure --prefix=$HOME/usr           \
$    --sysconfdir=$HOME/etc                \
$    --with-porg-logdir=$HOME/var/log/porg \
$    --disable-grop
$ make
$ mkdir -p $HOME/var/log/porg
$ ./porg/porg -lD make install
```

ポイントは以下となります。各種ディレクトリは適宜、好みに合わせて変更してください。

* ```--prefix=$HOME/usr``` は、自分のホームディレクトリ配下の ```$HOME/usr/bin``` (具体的に例えば ```/home/foo/usr/bin```) に porg 実行モジュールをインストールするようにします。
当然 ```$HOME/usr/bin``` には PATH を通す必要があります[^2]。
* ```--sysconfdir=$HOME/etc``` も同様です。```/etc``` ではなく ```$HOME/etc``` を指定します。
* 新たに ```--with-porg-logdir=$HOME/var/log/porg``` を加えます。前述した「porg が管理する各種パッケージ情報を示したテキストファイル」を ```$HOME/var/log/porg``` に置くことを指示します。
* ```mkdir -p $HOME/var/log/porg``` により、上のディレクトリを生成します。

こうすることで、porg を root 権限なしに自在に操作していくことができます。
[^2]: ```~/.bashrc``` などに ```export PATH=$HOME/usr/bin:$PATH``` といった記述を書き加えることになります。さらに man ページも参照したいなら、同じように ```~/.bashrc``` に ```export MANPATH=$HOME/usr/share/man:$MANPATH``` も加えることになるでしょう。

### インストール後の動作確認

porg のバージョンを確認します。

```shell-session
$ porg --version
porg-0.10 (17 May 2016)
Written by David Ricart <http://porg.sourceforge.net>
```

porg そのものが porg によって管理されているかどうかを確認します。

```shell-session
$ porg porg
porg-0.10
```

管理されている porg のインストール済ファイルを一覧確認します。(```foo``` は自ユーザー名を表わします。)

```shell-session
$ porg -f porg
porg-0.10:
/home/foo/etc/bash_completion.d/porg_bash_completion
/home/foo/etc/porgrc
/home/foo/usr/bin/paco2porg
/home/foo/usr/bin/porg
/home/foo/usr/bin/porgball
/home/foo/usr/lib/libporg-log.a
/home/foo/usr/lib/libporg-log.la
/home/foo/usr/share/man/man5/porgrc.5
/home/foo/usr/share/man/man8/porg.8
/home/foo/usr/share/man/man8/porgball.8
/home/foo/usr/share/porg/README
/home/foo/usr/share/porg/download.png
/home/foo/usr/share/porg/faq.txt
/home/foo/usr/share/porg/index.html
/home/foo/usr/share/porg/porg.png
/home/foo/usr/share/porg/porgrc
```
なおこの出力結果は、先に示した「実践的インストール」を行った結果です。「標準的インストール」を行った場合は、ちょうど ```\home\foo``` を取り除いた出力結果となります。

また ```bash-completion``` パッケージがインストールされていない場合は、ファイル一覧先頭の ```/home/foo/etc/bash_completion.d/porg_bash_completion``` はインストールされていないはずです。

## ```/usr/bin/porg``` を一般ユーザーが使うための環境整備

porg が root 権限で既にインストールされている環境において、自ユーザーが独自に porg によるパッケージ管理を行いたいとします。つまり porg がごく標準的に ```/usr/bin/porg``` にインストールされている状態で、root ではない自ユーザーが porg を使う方法です。単純に ```porg -lD make install``` を実行するだけでは、上で示したように ```/var/log/porg``` へのアクセス権限がないため正常処理ができません。

そこで ```/var/log/porg``` というディレクトリアクセスを、実行時に変更する方法をとります。porg の実行オプション ```--logdir=<log directory>``` を使います。前述のとおり、このディレクトリは「porg が管理する各種パッケージ情報を示したテキストファイル」が収容される場所であるため、そういったディレクトリを自ユーザーが自由にアクセスできるディレクトリに振り替えてしまうというやり方になります。

まずは自ユーザーのホームディレクトリ配下に、上で言うディレクトリを新たに作ります。ここでは ```$HOME/.var/log/porg``` というディレクトリにします。

```shell-session
$ mkdir -p $HOME/.var/log/porg
```

そして例えば bar パッケージを ```make install``` によりインストールする際には、```--logdir``` オプションをつけて以下のように実行します。

```shell-session
$ porg -lp bar-0.0.1 --logdir=$HOME/.var/log/porg make install
```

```$HOME/.var/log/porg``` へは、今の場合 bar パッケージに関する情報を収めたテキストファイルが新たに作り出されます。

これより先は注意が必要です。
```/usr/bin/porg``` によって管理された通常のパッケージ情報は ```/var/log/porg``` 配下にあるはずですので、単純に ```porg``` を実行すると、それは ```/var/log/porg``` 配下にあるパッケージ情報を取り扱うことになります。したがってもし、上の bar パッケージを以下のようなコマンドにより参照しようとしても、参照できないことになります。bar パッケージの情報は ```$HOME/.var/log/porg``` にあるのであって、```/var/log/porg``` にはないからです。

```shell-session
$ porg bar
(...何も表示されない...)
```

bar パッケージの情報は ```$HOME/.var/log/porg``` にあるわけですから、これを参照するためにはここでも ```--logdir``` オプションを使わなければなりません。

```shell-session
$ porg --logdir=$HOME/.var/log/porg bar
bar-0.0.1
```

この後に、自ユーザー管理のもとに、別のパッケージを新たにインストールする場合や、それまでの自分が管理する登録パッケージを参照する場合など、すべての局面において ```--logdir=$HOME/.var/log/porg``` をつけていくことになります。毎回毎回 ```--logdir``` オプションをつけての実行は面倒になるので、いっそのこと alias を定義してしまいましょう。```~/.bashrc``` あたりに以下の１行を加えます。

```text
alias porg="porg --logdir=$HOME/.var/log/porg"
```

もう一度、今度は ```--logdir``` オプションを入力せずに bar パッケージを参照してみます。(```source ~/.bashrc``` を行うなどして alias を有効にしておきます。)

```shell-session
$ porg bar
bar-0.0.1
```

bar パッケージの情報が表示されます。もうこれから先は、```--logdir``` をつけずに利用していくことができます。

なお ```/var/log/porg``` に登録されているパッケージ情報も、同時に参照したいような場合は、alias を無効にするために ```porg``` の前に ```\``` (バックスラッシュ) をつけて実行します。

```shell-session
$ \porg somepackage
somepackage-1.2.3
```

このあたりは、かなり個人的な嗜好もあるところかと思いますので、適宜ご対処ください。