rcmdnk's blog

stow bottles

Stow はLinuxなどで手動でパッケージをインストールする際、 なるべく汚さずにインストール出来る様にしてくれるコマンドです。

stow-get はこのStowを使ってyumapt-getなどで管理しづらいパッケージを まとめて管理するパッケージマネージャーです。

stow

stowを利用するには、まず$HOME/usr/local/stow等のstowディレクトリを作り、 その中にパッケージを分けてインストールしていきます。

パッケージをconfigureとかする際、--prefixなどでインストール先を決めたりしますが、 これを

$ configure --prefix=$HOME/usr/local/stow/<package>-<veresion>

みたいな感じにしてインストールを行います。

そして

$ cd $HOME/usr/local/stow/
$ stow <package>-<veresion>

とすると、**-/bin/**や**-/lib/** の中身から**$HOME/usr/local/bin/**や**$HOME/usr/local/lib/** の中にシンボリックリンクが貼られます。

新しいバージョンと入れ替えたい場合は、新しいversionを使ったディレクトリにインストールし、 元のパッケージについては

$ cd $HOME/usr/local/stow/
$ stow -D <package>-<veresion_old>

とすることで$HOME/usr/local/bin/等からシンボリックリンクが削除されるので、

$ stow <package>-<veresion_new>

と新しいバージョンのものを貼り付けてあげればOK。

古いものもstowディレクトリに残しておけば上の様な感じで簡単に入れ替える事も出来ます。

stow-get

特に想定してるのは、管理者権限を持ってない様なシステムで、 個人のホームディレクトリにVimとかGNU Screenとか必要な(バージョンの)物を入れたい、 と言った場合。

加えて管理者としてyumapt-getが使える場合でも、 それらで管理されてるパッケージのバージョンが古かったり オプションが必要なものが入ってなかったりで手動で入れる必要がある場合にも使えます。

この辺で色々書いてますが、VimとかGNU screenと言ったものは 最新版で結構機能が違うので新しいものを使いたいのですが、 システムのアップデートだとなかなか最新のものにならなかったりします。

そんな時に自分用に自分のホームディレクトリに色々インストールしたりするのですが、 パッケージのコンパイルやインストール方法は大体似たような感じなので ある程度同じ作業としてまとめ上げる事が出来ます。

stow-getはそれをスクリプト化して、さらに外部のパッケージごとのconfiguration file を用意することで様々なパッケージをまとめてインストール出来る様にしたものです。

インストール

インストールはcURLでスクリプトを呼ぶことで出来ます。

$ curl -fsSL https://raw.github.com/rcmdnk/stow-get/install/install.sh| bash

これだと$HOME/usr/localをトップディテクトリとして $HOME/usr/local/stowがstowディレクトリになります。

stow-getコマンドが$HOME/usr/local/stow-getに入ります。

ので、

export STOW_TOP=$HOME/usr/local
export PATH=$STOW_TOP/bin:$PATH
export LD_LIBRARY_PATH=$STOW_TOP/lib64:$STOW_TOP/lib:$LD_LIBRARY_PATH
export PYTHONPATH=$STOW_TOP/lib64:$STOW_TOP/lib:$PYTHONPATH

といった感じの設定を.bashrcなり.zshrcなりで行ってください。

もし違うディレクトリにしたい場合は、

$ curl -fsSL https://raw.github.com/rcmdnk/trash/install/install.sh|  prefix=/usr/local bash

みたいな感じでprefixを指定してください。

余談ですが、cURLを使ったスクリプトの実行は時に危ないこともあるので気をつけてください。

基本的な使い方

Vimをインストールしたい場合は

$ stow-get install vim

とすればOK。

アンインストールは

$ stow-get uninstall vim

このコマンドではstowディレクトリにある実体の方も削除します。

また、インストール出来るパッケージは

$ stow-get packages
Mercurial autoconf automake bzip2 curl expat git lua m4 ncurses python
readline screen stow-get stow termcap texinfo unzip vim wget

で確認出来ます。 stow-get/share/stow-get にconfiguration fileが用意されているパッケージです。

$ stow-get info vim
####################################################################
Configuration for vim
####################################################################
version=8.0.0586
inst_type=github
configure_options="--enable-luainterp=yes --enable-perlinterp=yes --enable-pythoninterp=yes --enable-python3interp=yes --enable-rubyinterp=yes --enable-cscope --enable-multibyte"
lib_dep=(libreadline readline libtermcap termcap liblua lua)

みたいにするそのパッケージのconfiguration fileの内容が見れます。

ここでlib_depという設定がありますが、 依存するライブラリが入っています。 lib_depの指定の仕方は2つ一組で最初にライブラリーの名前(.a.soは除いてもOK。libreadline*という感じで検索する)、 2つ目がパッケージの名前になります。 検索する場所はLD_LIBRARY_PATHに入っているディレクトリです。

ここで見つからないとそのパッケージも入れる事になります。

stow-getでインストールして無くても他の所にあればインストールは行いません。

同様にbin_depという設定もあり、こちらは実行ファイルに関する依存です。

bin_dep=(autoconf autoconf)

の様な。こちらも2つ一組で最初が実行ファイル名、2つめがパッケージ名。

GNU Projectのパッケージに関しては 上のリストになくても

$ stow-get install -t gnu wdiff

と、-t gnuオプションを付けるとインストールすることが出来ます。

また、GNU Projectのパッケージの 最新バージョンが知りたい場合、

$ stow-get get_latest wdiff
          wdiff    1.2.2  updated at: 2014-04-14 16:17  1.4M

の様にget_latestを使うとWebから情報を取ってきて最新バージョンを教えてくれます。

この辺でやったことです。

ユーザー設定ファイル

stow-getのユーザー設定ファイルは $HOME/.stow-getになります。 基本的には.bashrcの様にシェルスクリプトとして書いてください。

もし、インストールするディテクトリを変更したい場合は

set_inst_dir /home/USER/usr/local

の様にset_inst_dirという関数に指定したいディレクトリを与えてください。

また、パッケージのconfiguration fileのデフォルトの場所は /PATH/TO/stow-get/../share/stow-getになりますが、 自分でconfiguration fileを作成して使いたい場合は、

conf_dir=(/PATH/TO/YOUR/CONFIGURATION/DIRECTORY ${conf_dir[@]})

の様にconf_dirという配列の先頭に自分のディレクトリを追加してください。

予めインストールするパッケージが決まっている場合、

packages=(git screen vim)

の様に書いておくと

$ stow-get install

installサブコマンドだけでpackagesで指定された パッケージをインストールすることが出来ます。

この機能が割と今回やりたかったことの大きな部分を占めるところだったりもします。

パッケージconfiguration file

各パッケージの設定ファイルは<package>.shの様な名前にする必要があります。

中身は

Parameter Description Default
inst_type Type of installation. Available types are: gnu, tarball, github or github_direct. This parameter is mandatory. -
version Version of th package. -
tarball tarball name. <package>-<version>.tar.gz
url_prefix URL where tarball file is placed. For gnu: http://ftp.gnu.org/gnu/<package>.
For github: https://github.com/<package>/<package>/archive
configure Configure command. Most of packages have configure file to be executed first. ./configure
config_options Options for configure command.
Note: --prefix="$stow_dir/$target/" (where the package substance is installed) option is automatically added if configure is executed.
""
before_configure This is function. Commands executed before configure.
If configure doesn’t have --prefix but it set prefix in other way, then set configure="" and write configure command in before_configure.
function before_configure {
:
}
make_cmd This is function for make command. function make_cmd {
make all && make install
}
bin_dep Array of executable packages on which the package depending on.
One dependency must be a set of executable name and package name like lib_dep=(libcurl curl libexpat expat)
()
lib_dep Array of library packages on which the package depending on.
One dependency must be a set of library name and package name like bin_dep=(automake automake autoconf autoconf)
()

な感じ。 inst_typeでインストール方法の大筋を決めて、後はbefore_configuremake_cmdと言った関数を自分で変更することで 基本的にどんなタイプのインストールも出来る様になっています。

GNU Projectパッケージの場合は単純なので

inst_type=gnu

とだけ書いておけば基本的にインストール出来る様になります。 その他細かいinst_typeの話についてはREADMEにて。

まとめ

というわけで、ターミナル環境で、 マニュアルインストールで 自分用パッケージを管理するスクリプトを作ってみました。

毎回なんとなくその場その場で必要な物を手でコンパイルしてましたが、 これで新しい環境に移ってもぱっと必要なものが揃えられます。

stow-get/share/stow-get に用意してあるパッケージは基本的に自分で必要そうなものだけを入れてるので、 もし他のパッケージとか追加したいものがあれば GitHubの方でPull RequestなりIssueでパッケージ名を言うなりしてもらえれば、と。

Sponsored Links
Sponsored Links

« lessの一歩踏み込んだ使い方 Dellから世界初の無接点充電搭載のノートパソコンが発売される »

}