rcmdnk's blog
Last update

Stow Away: Tosca Abigail: デジタルミュージック

pacoでmake installしたパッケージを管理 で書いた様に、Linux(WindowsのcoLinuxも含む)で make installしたパッケージも管理出来る様にしましたが、 Cygwinにもpacoを入れようとした所コンパイル出来なかったので 代わりにstowと言うインストーラーを入れました。

Cygwinではpacoをコンパイル出来ない

pacoのパッケージを取ってきてCygwinでコンパイルしようとすると

log.c:67:20: error: ‘RTLD_NEXT’ undeclared (first use in this function)

と言った様なエラーが出てコンパイル出来ないのですが、これはglibcが入ってないからですが、 Cygwinではglibcは入れられない様です 1

いくつかそれっぽいものはありましたが 2 3 、素直に入れることは 出来なそうなのでpacoは辞めておくことに。

stow

stowはpacoと同じ様なmake installなどで apt-getなどを通さず直接インストールするパッケージを管理する インストーラーです。

追記: 2015/04/21

Stow にはshare/info/dirが競合してインストールに失敗する問題があります。

代わりに XStow (の-fを使うxstow -f <package>) を使うとこれを簡単に回避できます。

XStowはStowの拡張版みたいなもので、Stowで出来るコトは全てできるので 簡単に置き換えられます。

XStowでStowの代わりにパッケージ管理

追記ここまで

paco v.s. stow

pacoとstowの違いは

  • paco: /usr/local/var/log/paco等のディレクトリ以下にパッケージ名情報ファイルを作り、 その情報を元にインストールされたファイルを管理する。
  • stow: /usr/local/stow/等のディレクトリ以下にパッケージ名ディレクトリを作り、 その中にパッケージをインストールする。 そこから/usr/local/などへリンクを張る。

pacoでインストールした場合は、パッケージ自体は通常通りインストールされるので、/usr/local/var/log/paco自体を削除しても問題有りません。

stowの場合は/usr/local/へはリンクが貼られるだけなので 通常インストールとは形が変わります。 一方、stowは/usr/local/stow/からのリンクを管理するので、 例えば1つのパッケージでバージョンの違う物を両方インストールしておいて、 一時的に切り替える事が簡単に出来ます。 新しいバージョンを入れて取り敢えず試してみる、と言うことができるので、 その点でstowが結構便利かもしれません。

stowインストール

  • Cygwin

apt-cyg

$ apt-cyg install stow
  • Mac

Homebrew

$ brew install stow
  • Linux

apt-getなど。root権限がないところでローカルに入れる場合は自分もstowで管理。

$ cd ~/tmp/
$ wget http://ftp.gnu.org/gnu/stow/stow-2.2.0.tar.gz
$ tar xzf stow-2.2.0.tar.gz
$ cd stow-2.2.0
$ ./configure --prefix=$HOME/usr/local/stow/stow-2.2.0
$ make && make install
$ cd ~/usr/local/stow
$ ./stow-2.2.0/bin/stow stow-2.2.0

stowの使い方

まず、stowで管理するパッケージをインストールするディレクトリを決めておきます。 通常は最終的にインストールするディレクトリ下にstowというディレクトリを作ります。 (上の場合は$HOME/usr/local/bin/stowなどをインストールするので $HOME/usr/local/stowディレクトリを作って入れています。)

パッケージをインストールする際は、prefix等でインストール先を $HOME/usr/local/stow+パッケージ名に指定して後は通常通りインストールします。

インストール後、stowディレクトリへ行き、

$ stow package

とすることで、package内から..//bin/等へリンクが張られます。

アンインストールは

$ stow -D package

とするとリンクが削除されます。パッケージがその後必要なければ stowディレクトリから実体も削除すればOK。

バージョンの違う同じパッケージをインストールしてる場合は

$ stow -D package-1.0
$ stow package-2.0

の様にすれば1.0から2.0へ切り替える事が出来、 実体は残ったままなので、同じ様に1.0に戻る事もすぐ出来ます。

$ stow -n package-2.0

とすると、ドライランすることが出来ます。

通常は、カレントディレクトリがstowディレクトリ、親ディレクトリが リンクを作るインストール先ですが、これを変えたい場合は

  • -d stow_dir--dir=stow_dirでstowディレクトリを指定。
  • -t target_dir--target=target_dirでインストール先ディレクトリを指定。

します。ただ、pacoの場合と違い、これらの情報は残らないので、 特別指定した場合はアンインストールする場合も指定する必要があるので、 管理上、最終的なインストール先の下にstowディレクトリを作るのが良いかと思います。

すでにインストールしてあるパッケージに対してstowで再インストールする場合

すでにパッケージがインストールしてあると、 リンクでなく実体が存在するのでstowでリンクを作ろうとすると エラーが出ます。 (-Dで削除しようとするとリンクじゃない、と言って削除してくれない。) 一旦それらのファイルを削除しないとstowで管理しようがないみたいで、 結構面倒です。

そこでstow_resetと言うスクリプトを作りました。

追記: 2013/12/20

以前のstowResetから名前を変えました。

追記ここまで

使い方は、まず、インストールしたいパッケージをstowディレクトリに インストールした後、 stowディレクトリに行き、

$ stow_reset package

とすると、packageに関連するファイルが親ディレクトリから削除されます。 stow同様に-d-t-nのオプションが使えます(--dir等2重ハイフンオプションは未対応)。

その後、通常通り、

$ stow package

とすればリンクを作れる様になります。

まとめ

pacoに比べて、新しいバージョンのテスト等にも便利に使えそうなので、 MacやLinuxでもpacoからstowへ移行しようと思います。

pacoだとconfigureの引数等の情報がそのまま残るのでちょっと便利ですが、 その点はちゃんとメモするようにしておけばOKかな、と。

追記: 2013/08/28

暫く使ってみて問題発見。stowだと、`~/usr/local/stow`の下にパッケージディレクトリを置いて、 そこから`~/usr/local/`へリンクを張るわけですが、その際、例えば `~/usr/local/bin`がある場合はその下からリンクを作り始め、一方`bin`ディレクトリが ない場合は`bin`自体がリンクになってしまうみたいです。 つまり、最初に何も`~/usr/local/`にない状態で`vim`などをインストールすると、 `~/usr/local/bin`が`~/usr/local/stow/vim/bin`などへのシンボリックリンクになってしまいます。 こうなると、次に別のソフトをインストールするときに実質的に`~/usr/local/stow/vim/bin`内に シンボリックリンクを置くことになってしまうので`~/usr/local/stow/vim/`を削除してしまうと `~/usr/local/bin`自体がリンク切れになってしまいますし、vimをアップデートすると他のソフトのインストールが消えます。 stowのインストールでディレクトリはリンクでなく必ず掘る様にして、 また、アンインストール時はディレクトリ内に何も無いときに限り消す、みたいなラッパーを作れば良いのだと思うのですが。。。 (sourceコード直接いじった方が楽かな。。。?)そのうちなんとかしたい所。 できればpacoみたいにconfigureオプションを保存出来る様になればなおもよしですが。。。

追記ここまで

追記: 2013/08/29

stowは意外と賢かったです。マニュアルを見たらこの辺をきちんと処理する様になってることが 分かりました。

最初にインストールする時は最も上位のディレクトリだけのリンクを作ろうとして これをfoldingと呼んでいます。

で、~/usr/local/bin等が~/usr/local/stow/vim/binなどへのシンボリックリンクの 状態で、次にgit等をインストールすると、binがシンボリックだと言う事を理解して、 まず、vimへのリンクを消し、新たにディレクトリを作り、 その中にvimとgitのbin内のコンテンツへのリンクを作りなおしてくれます。

逆に、stow -Dで削除していく時も、中身が1つのパッケージだけになったディレクトリは まとめてシンボリックリンクに変えられます。

自分でディレクトリを作ってしまったりするとこのアンインストール時に 無駄にディレクトリを残してしまうことが有ります。 (2つ以上のパッケージが同じディレクトリを使っていると、アンインストールしていって 最後の1つになった時にそのディレクトリをシンボリックリンクにしてくれますが、 最初から1つしか無いとそのディレクトリはパッケージをアンインストールしても残ってしまいます。)

なので、基本的にbin等を自分で作るべきではないです。

これに関連するオプションで--no-foldingというオプションが有ります(stow -hでは記述を忘れてるのか出て来ない)。 このオプションをインストール時につけると、所謂上で間違って指摘していたような、 各ディレクトリをシンボリックリンクでなく全て掘り下げる様に作ってくれます。 ただ、これをしてしまうとアンインストール時にからディレクトリのゴミが残ります。

また、--no-foldingをアンインストール時に使うと、仮にそのディレクトリ内が 1つのパッケージだけになるような場合でもシンボリックリンクに変えたりしないで そのまま残します。 この場合も後々アンインストールするときにゴミが残るような状態になります。

ので、特別理由がない限りあまり使うことはなさそうです。

他に、--adoptというオプションもあり、ちょっと特殊な動きをします。 通常、stowでインストールするとき、上に書いたように、先にシンボリックリンクでない 普通のファイルがインストールされていると上書きできずにエラーとなります。 しかし、このオプションを使うと、もし、通常ファイルがある場合、 そのファイルをstowディレクトリにあるパッケージにコピーした上でシンボリックリンクを作る、という動きをします。

ここで注意しなければいけないのは、もともとパッケージに入っているファイルが上書きされることです。 つまり、古いファイルが残っていて、それを上書きできる様なオプションではありません。

このオプションの使い道としては、上で作っったstow_resetを使わなくてはいけない様な状況で、 パッケージをstowディレクトリにインストール後、一度そのコピーを作り、 そのコピーパッケージでadoptし、その後、オリジナルのパッケージをrestowする、とかでしょうか?

$ pwd
~/usr/local/stow
$ ls
vim
$ cp -r vim vim.tmp
$ stow --adopt vim.tmp && stow -D vim.tmp && rm -rf stow.tmp
$ stow vim

これで、stow_resetでやってることとだいたい同じことが出来ます。

ただし、パッケージ内にシンボリックリンクが元々入ってる場合があり (ライブラリーや実行ファイルの別名など)それらは--adoptしようとすると 他のパッケージに管理されてるとみなされて無視されます。 従ってそのまま残り新しくインストール出来ません。その場合にはstow_resetを 使ってみてください。 (数ファイルだけだと思うので、その際には手作業でもいいかもしれませんが。)

追記ここまで

Sponsored Links
  1. Where is glibc?

  2. Building GLibc in the Cygwin VM

  3. Index of /cygwin.org/pub/glibc/releases

Sponsored Links

« apt-cygでsetup.iniが404 Not Foundになった Vim 7.4をCygwinへインストール »

}