stowでソースからmakeしたプログラムを管理する

スポンサード リンク

aptやyumと違って,makeしたプログラムはアンインストールなど管理が面倒。そこで,ちょっと前に paco でソースからコンパイルしたプログラムを管理するのが流行っていたように思う。しかし, paco は開発終了しているので今から使うには難があるし,なによりもcygwinに対応していない。

参考: pacoでmake installしたパッケージを管理

そこで,今回は stow を使ってみることにした。stowはperlで動くかなーりシンプルなプログラムなので管理も楽だ。

stow自体のインストールはパッケージマネージャから。

$ aptitude install stow     # debian
$ apt-cyg install stow      # cygwin

まずは初期設定を済ませる。 ~/.local/stow 以下にmakeしたプログラムをおいておきたい場合は次のようにする。いうまでもないことだが,新規シェルでも有効になるように .bashrc とかにも PATH を追加しておくこと。

$ mkdir -p ~/.local/stow           # stowの管理フォルダを作成
$ export PAHT=~/.local/bin:$PATH   # stowがシンボリックリンクを貼るディレクトリにPATHを通しておく

次に,stowを使って hoge-0.01 みたいなプログラムをインストールする流れは,次のようになる。こうするとstowは ~/.local/bin~/.local/share などにシンボリックリンクを貼ってくれて,普通にプログラムが使えるようになる。

$ ./configure --prefix=~/.local/stow/hoge-0.01   # stow管理フォルダ以下にmakeする
$ make && make install
$ cd ~/.local/stow
$ stow hoge-0.01                 # stowでシンボリックリンクを作る

その他の機能(アンインストールなど)はhelpを見てください。

$ stow --help
stow (GNU Stow) version 2.2.0

SYNOPSIS:

    stow [OPTION ...] [-D|-S|-R] PACKAGE ... [-D|-S|-R] PACKAGE ...

OPTIONS:

    -d DIR, --dir=DIR     Set stow dir to DIR (default is current dir)
    -t DIR, --target=DIR  Set target to DIR (default is parent of stow dir)

    -S, --stow            Stow the package names that follow this option
    -D, --delete          Unstow the package names that follow this option
    -R, --restow          Restow (like stow -D followed by stow -S)

    --ignore=REGEX        Ignore files ending in this Perl regex
    --defer=REGEX         Don't stow files beginning with this Perl regex
                          if the file is already stowed to another package
    --override=REGEX      Force stowing files beginning with this Perl regex
                          if the file is already stowed to another package
    --adopt               (Use with care!)  Import existing files into stow package
                          from target.  Please read docs before using.
    -p, --compat          Use legacy algorithm for unstowing

    -n, --no, --simulate  Do not actually make any filesystem changes
    -v, --verbose[=N]     Increase verbosity (levels are 0,1,2,3;
                            -v or --verbose adds 1; --verbose=N sets level)
    -V, --version         Show stow version number
    -h, --help            Show this help

Report bugs to: bug-stow@gnu.org
Stow home page: <http://www.gnu.org/software/stow/>
General help using GNU software: <http://www.gnu.org/gethelp/>

で,毎回このインストール作業をするのは面倒なので, astow というシェルスクリプトを書いてみた [1]

#!/bin/bash

# 自動的にstowするスクリプト
# 1番目の引数はパッケージ名
# 2番目以降はconfigureの引数になる

if test $# -ge 1 ; then
    PACKAGENAME=$1
    shift
else
    PACKAGENAME=$(basename `pwd`)
    echo '$PACKAGENAME' = $PACKAGENAME [y/n] n:
    read ans
    test "$ans" != "y"  && exit
fi

if [ ! -d $HOME/.local/stow/ ] ; then
    mkdir -p $HOME/.local/stow/
fi

echo ====  ./configure --prefix=$HOME/.local/stow/$PACKAGENAME "$@"  =====================
./configure --prefix=$HOME/.local/stow/$PACKAGENAME "$@"

if test $? = 0; then
    echo ==== make =======================================================
    make
    MAKEERROR=$?
else
   echo "Error : ./conifigure --prefix=$HOME/.local/stow/$PACKAGENAME $@"
    exit
fi

if test $MAKEERROR = 0; then
    echo ==== make install prefix=$HOME/.local/stow/"$PACKAGENAME" =====================
    make install prefix=$HOME/.local/stow/"$PACKAGENAME"
    MAKEERROR=$?
else
    echo "ERROR : make"
    exit
fi

if test $MAKEERROR = 0; then
    echo ==== stow $PACKAGENAME ==========================================
    cd $HOME/.local/stow
    stow $PACKAGENAME
else
    echo "ERROR : make install prefix=$HOME/.local/stow/$PACKAGENAME"
    exit
fi

astow は第一引数としてパッケージ名( stow ディレクトリ以下に作るフォルダ名),第二引数として configure のオプションを要求する。つまり, astow を使うとインストール作業は次のように簡略化できるのだ。

$ cd hoge-0.01  # ソースコードのあるディレクトリへ移動
$ astow hoge-0.01 --prefix=~.local/stow

ちなみに,引数なしで実行するとカレントディレクトリ名を元にパッケージ名を決定する。良かったら使ってみてください。

[1]automated stow の略のつもり

Comments !

social