LPMの紹介

べつに何ベントカレンダーでもありませんが便利なのでLPMについて紹介します。

LPMを使うモチベーション

自分が作業するlinuxサーバに必要なソフトがインストールされてないにも関わらず、root権限が無いことがしばしばあります。
大抵のLinuxディストリビューションのパッケージマネージャはビルド済みバイナリをrootユーザ管理下にコピーするため、root権限が無い場合役に立ちません。*1

その場合最も手っ取り早い解決策としてローカルディレクトリで野良ビルドすることになるワケですが、管理するソフト数や環境が増えると破綻します。


それを解決してくれるのがLPM(LocalPackageManager)です。
LPMが対応しているソフトウェアならダウンロードからビルドしてインストールまで全自動で完了します。

同様のソフトにpacoがありますがLPMはこれのラッパーです。(と言っていいのかな?)

LPMの利点

  • root権限が要らない
  • ソースコードのダウンロードが楽(自動)
  • 環境変数が自動で追加/削除される ($PATHや$LD_LIBRARY_PATHを自動で追加してくれます)
  • 手で書いたスクリプトでインストールしてもアンインストール出来る (ファイルを自動追跡してくれる)
  • 特定ディレクトリ以下のソフトをまとめて無効/有効化出来る

インストール

LPMは単一ファイルのperlスクリプトで、単にダウンロードして初期化を実行するだけで使えます。
initlocaldirに指定したディレクトリ(指定しない場合 ~/lcl)以下がLPMの管理対象となります。

$ cd
$ wget http://www.kasahara.ws/lpm/lpm
$ chmod +x lpm
$ ./lpm initlocaldir [--local=/path/to/installdir]
$ rm ./lpm
$ exec $SHELL -l # シェルを再起動(ターミナルを開き直せばよい)

http://www.kasahara.ws/lpm/quickstart_ja.html

使い方

インストール/アンインストール
$ lpm (install|uninstall) <package-name> [--local=<path/to/installdir>]
パッケージ一覧
$ lpm listrepos
ディレクトリ管理

管理領域の追加と削除

$ lpm (init|remove)localdir [--local=<path/to/installdir>]

ディレクトリごとの一時的な有効/無効切り替え

$ lpm ssconfig [<localdir> (on|off)]
その他

使用するツール等をコマンドラインオプションで切り替えることが出来ます。

$ lpm --version
LPM version 1.39

このように '--' を付けて指定します。以下に一覧を載せます。

オプション 意味
debug=[012] デバッグレベルに応じたログを表示(大して量は出ないので2を使えばよさげ)
pacobase pacoのダウンロードサイト
reset 既存のディレクトリをローカルディレクトリに指定する時に指定
force 他のパッケージと共有されているファイルを消す。またはlpmかpaco自体を消す(笑)
local LPMで操作する対象のディレクトリ(デフォルトlcl)
tar
gzip
bzip
xz
unzip
make
gpg
config オプションの設定を書き出したファイル
home ホームディレクトリを指定
version バージョンを表示
backup=[01] バックアップの有無(デフォルト1)。LPMスクリプトを書くときは0がオススメ。
wget
wnocert wgetSSL証明書の警告を無視させる(ヤメロー

空白の箇所は同名のツールを置き換えます。

スクリプトの書き方

LPMスクリプトが公開されていないソフトを扱いたい場合は自分で書きます*2。書いたスクリプト公式サイトに投稿して承認されれば他の人も使うことが出来るようになります。書きましょう。


LPMスクリプトは以下のようなフォーマットのテキストファイルです。
典型的な構成(GNU style)のソフトウェアの場合、ソースコードの場所(とテンプレ)だけ書けば終わりです。素晴らしく簡単ですね。

# 行頭'#'はコメント行
source=<ソースコードのURL>
url=<公式サイトなどのURL> # 人間向け情報
download
extract
# --prefixは自動で付与される
configure [--prefixを除くconfigureのオプション]
make [makeターゲット]
makeinstall

configureやmakeが必要無い場合は書く必要はありません。

書いたファイルはコマンドに直接渡せば動作が確認できます。

lpm install ./myhoge.lpm

debugオプションを指定すると詳細な挙動が確認できます。

lpm --debug=2 install ./myhoge.lpm

git,mercurial,subversionリポジトリからのダウンロードにも対応しています。これを指定する場合extractは不要になります。

# 行頭'#'はコメント行
source=git://gitrepo.example.com/hoge.git
url=http://hogeapp.example.com/
download
# extractは不要
shell
# 常にmasterから取ってくるのは不安なのでタグを指定
git checkout v3.14
EOC
configure
make
makeinstall

特殊なビルド手順への対応

上で挙げたのは典型的なGNU styleに沿った構成のソフトウェアを自動でビルドできる場合でしたが、そうでない構成にも以下のLPMコマンドを使用することで柔軟に対応できます。

name,verコマンド
パッケージ名とバージョンをurlから推測出来ない場合(=GNU styleでない場合)に明示する
topdirnameコマンド
アーカイブ内のトップディレクトリ名が '<パッケージ名>-<バージョン>/' でない場合に指定する
shellコマンド
このコマンドの直後から'EOC'のみから成る行までをシェルスクリプトとして実行する


以下のように、shellと書いた行から 'EOC' と書かれた行までを単一のスクリプトとして処理してくれます。
# 怪しげなインストールスクリプトを書き換えている雰囲気を感じ取ってください(^^;;

shell
sed -e "s!/usr/local!$LOCAL_DIR!g"
EOC

このスクリプトはあらかじめ以下のような環境変数が設定されているものとして記述できます。

変数名
$LOCAL_DIR
$ARCHIVE_DIR /archive
$BIN_DIR /bin
$LIB_DIR /lib
$VAR_DIR /var
$OPT_DIR /opt
$ETC_DIR /opt
$SHARE_DIR /share
$MAN_DIR /share/man
$BUILD_DIR /build
$INCLUDE_DIR /include
$LPMLIB_DIR /lib/lpm
$PACKAGE_NAME hogehoge
$PACKAGE_VER 1.3.2 (アーカイブ名から読み取ったバージョン)
$ARCHIVE_FILE /archive/hogehoge-1.3.2.tar.gz
$ARCH `uname -m` (シェルコマンド)
$OS $^O (perlの特殊変数)
custominstallコマンド
'make install'ではインストール出来ない場合に任意のスクリプトでインストール方法を指定する。ファイル操作はlpm(のバックエンドであるpaco)によって自動的に追跡される。使い方は 'shell' コマンドと同様。


これらのコマンドを使った場合のLPMスクリプトは以下のよう(な雰囲気)になります。

source=git://hoge.example.com/hoge.git
url=http://hoge.example.com/
download
# extract # gitリポジトリなので展開不要
shell
# 任意のスクリプトが書ける
./specialconfigure --prefix=$LOCAL_DIR --enable-benri-feature
EOC
make
custominstall
cp build/hoge $BIN_DIR/
cp lib/*.a    $LIB_DIR/
# ファイルの書き出し,移動等は自動で追跡される
EOC

終わり

LPMを使って快適な野良ビルド生活を送りましょう! 作者の笠原さん++

*1:FreeBSDならLOCALBASEとか設定するだけで…以下略

*2:現在の公式パッケージは150程度ですので、全く書かずに済むにはちょっと厳しいでしょう