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で出来るコトは全てできるので 簡単に置き換えられます。
追記ここまで
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 install stow
- Mac
$ 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
追記ここまで
追記: 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
を
使ってみてください。
(数ファイルだけだと思うので、その際には手作業でもいいかもしれませんが。)
追記ここまで
Index of /cygwin.org/pub/glibc/releases↩