GNU Stow で 環境を汚さずに tarballのmake installでインストール・アンインストールする

# あらまし

## tarballをインストールするN個の方法

### いつものやつ

よくあるインストール方法で、こんなのがある。

```bash
$ ./configure; make; sudo make install
```

間違っちゃいないが、たいていはファイルが`/usr/local/`以下の`bin, lib, share`に散らばってインストールされる。
`make uninstall`が用意されているものもたまに見る。
しかしそれ以外の場合は、アンインストールはめんどい。

### ちょっと賢い?

じゃあ、これはどうだ。

```bash
$ ./configure --prefix=/opt/foo; make; sudo make install
```

`rm -rf /opt/foo`でガラガラポンできる。しかし`/opt/foo/bin`にパスを通したりしなきゃいけない。
この方法もなくはない。なくはないが、う〜ん。

## パッケージを使うのが一番だけども

正道は RPM, DEB, Portageなど、ディストリビューションのパッケージシステムを利用して作ることだが、
必要な知識と手間とプラットフォームやディストリビューションへの依存という問題が発生するので、お手軽ではない。

## そこで GNU Stow が颯爽と登場

そんな問題を解決するのが [GNU Stow](http://www.gnu.org/software/stow/ "GNU Stow") だ。

やってくれるのは単純。
`/usr/local`直下以外の適当なフォルダに`make install`したあと、
`stow`コマンドを叩くと、`/usr/local/`以下にシンボリックリンクを貼ってくれる。
`stow -D`コマンドで、貼ったシンボリックリンクを消してくれる。
そんだけ。

# GNU Stowの使い方

Linux, WebKit, Android NDK 開発者の強い味方、 [ccache](http://ccache.samba.org/ "ccache") を例に、Stowでtarball からのインストールをしていく。

## GNU Stowのインストール

ここは横着して、ディストリビューションのパッケージを使う。

```bash:Ubuntu13.04
$ sudo apt-get install stow

# インストールされているかチェック
$ which stow
/usr/bin/stow
$ test -d /usr/local/stow && echo true
true
```

## ccache を インストール

まずはダウンロード、展開。

```bash
$ wget http://samba.org/ftp/ccache/ccache-3.1.9.tar.xz
$ tar xvJf ccache-3.1.9.tar.xz -C ~/src/
$ cd ~/src/ccache-3.1.9/
```
`./configure --prefix`には、 **`/usr/local/stow/YOUR-PACKAGE-NAME`を指定しなければいけないことに注意** 。

```bash
$ ./configure --prefix=/usr/local/stow/ccache-3.1.9
$ make
$ sudo make install

# Check
$ test -e /usr/local/stow/ccache-3.1.9/bin/ccache && echo true
```

これで、`/usr/local/stow/ccache-3.1.9`にすべてがインストールされた。
このままではパスが通っていないので、`/usr/local/stow/ccache-3.1.9/bin/ccache`とタイプしないとインストールした`ccache`が使えない。

## GNU Stowの出番です

では、`stow`で、「使えない」`ccache`を使えるようにしよう。

```bash
$ cd /usr/local/stow
$ stow -vv ccache-3.1.9/
stow dir is /usr/local/stow
stow dir path relative to target /usr/local is stow
Planning stow of package ccache-3.1.9...
--- Skipping bin/ccache as it already points to ../stow/ccache-3.1.9/bin/ccache
--- Skipping share/man/man1 as it already points to ../../stow/ccache-3.1.9/share/man/man1
Planning stow of package ccache-3.1.9... done
Processing tasks...
# Check
$ which ccache
/usr/local/bin/ccache
$ ls -l $(which ccahce)
lrwxrwxrwx 1 root root 31  3月  2 03:59 /usr/local/bin/ccache -> ../stow/ccache-3.1.9/bin/ccache
```
はい、出来あがり。

シンボリックリンクによって、`ccache`は`/usr/local/bin/ccache`となり、`./configure; make; sudo make install`とほぼ同じ状態で使えるようになりました！！

## もちろん、元に戻せる

今度は、使えない状態に戻そう。

```bash
$ cd /usr/local/stow
$ stow -D -vv ccache-3.1.9/
stow dir is /usr/local/stow
stow dir path relative to target /usr/local is stow
Planning unstow of package ccache-3.1.9...
UNLINK: bin/ccache
UNLINK: share/man/man1
Planning unstow of package ccache-3.1.9... done
Processing tasks...
Processing tasks... done
# Check
$ which ccache || echo false
false
$ test -d /usr/local/stow/ccache-3.1.9 && echo true
true
```

Okay, `stow -D`で、前回貼ったシンボリックリンクは削除され、PATHからも消えました。
しかも、`ccache-3.1.9`は残ったままなので、また`stow`でインストールできる。

### 完全削除

もしが不要になったら、`stow -D `をしてから`sudo rm -f /usr/local/stow/ccache-3.1.9`を実行することで後腐れなく削除することができる。

# 参考文献

ググるといっぱい出てくるけど、以下のページだけでやりたいことは全部足りてしまいました。

* http://linuxgazette.net/75/peda.html
    * このページの人はGNU Stow のtarballを`/opt`以下にインストールして、`/usr/local/stow`ではなく`/opt/stow`を使っているようです。本文読んでいないのですが、そういう流儀もあるということなのでしょう。

# 後継者

* [XStow](http://xstow.sourceforge.net/ XStow)
    * 利点については @lamsh のコメント参考 (Thx!)
    * GNU Stowは最終更新2012/2/18, XStow は2014/01/04 といった感じ

# 類似品

* [CheckInstall](http://asic-linux.com.mx/~izto/checkinstall/ CheckInstall)
    * RPMやDEBなどパッケージファイル作るのを自動化できるらしい
    * 試してはいないが、きちんと作れるのか不安