OpenIndianaにSmartOSのパッケージを流用する
お久しぶりです。完全に記事の執筆をサボっていましたが、Gehirn Newで1番投稿数の多い社員としてのプライドは捨てられないと思いまして、数週間ぶりに投稿することにしました。みんなもっと記事書こうよ!>社員(俺が暇なだけとか言わない)。
さて、ついにやってしまいました。記事のタイトル。もうタイトルだけでドン引きですよね。誰得記事なんでしょうか。今まで、内容はニッチでもタイトルだけは穏やかに、という考えでタイトルをつけていたのですが、今回は内容があまりにニッチすぎて、(よく考えたのですが)ゆるいタイトルをつけることができませんでした。ここにお詫び申し上げます。
目標
未だについてこられていない読者をさらに置いてけぼりにして解説を始めてしまいます。
今回は例としてgcc 4.7のインストールをして、Node.jsをビルドしてみます。というのも実はOpenIndianaの公式リポジトリのgccのバージョンは4.4止まりで、少し残念なのです。しかし、SmartOSのリポジトリにはバージョン4.7のgccがあるので、ぜひともこれを使いたいわけです。
前提知識
というわけで早速流用したいのですが、そもそもSmartOSのパッケージ管理システムはOpenIndiana標準のものとは違い、pkginというものなのです。つまりこのpkginをはじめにインストールしないといけないのです。(pkginはpkgsrcのバイナリパッケージマネージャです)
また、無事pkginを導入できてもたくさんのハマリポイントがあるので、こちらにも注意が必要です。具体的なハマリポイントについては順を追って解説します。
作業
pkgsrcの導入
ではまずpkginをインストールします。SmartOSの公式サイトを参考に、次のコマンドを実行します。
# cd /
# curl -k http://pkgsrc.joyent.com/packages/SmartOS/bootstrap/bootstrap-2013Q1-x86_64.tar.gz | gzcat | tar -xf -
すると/opt以下あたりにいろいろ展開されます。
次に、PATHの設定を変更します。以下の行を.bashrcなどに追記してください。
PATH=/opt/local/bin/:/opt/local/sbin/:$PATH
再読み込みも忘れずに。
# source ~/.bashrc
するとpkgin関連のコマンドが使えるようになります。ここでパッケージデータベースの再構築とアップデートをしておきます。
# pkg_admin rebuild
# pkgin -y up
以上で、pkginの導入は終わりです。
ハマりポイント1(pkg_alternativesのインストール)
ここでさっそくハマリポイントです。
pkginをインストールしただけでは一部のパッケージ(gccなど)をインストールしても、コマンドのパスが通りません。これはpkg_alternativesというパッケージをインストールすることで解決します。
# pkgin install pkg_alternatives-1.6
gccのインストール
pkginを導入できたので、お次はgccのインストールです。
次のようにコマンドを入力します。
# pkgin install gcc47
バイナリインストールなので割とダウンロードに時間がかかりますが、気長に待ちましょう。SmartOSのリポジトリは日本国外にあるので、比較的遅いです。
ハマりポイント2(依存ファイルのインストール)
ここでまたハマりポイントです。
また、gccをインストールしても、依存しているヘッダーファイルなどが見つからずにビルドできない例があります。基本的なヘッダーファイルなどは標準のパッケージマネージャからインストールしておきましょう。
# pkg install pkg:/system/header
# pkg install pkg:/system/library/math/header-math
# pkg install pkg:/developer/library/lint
これくらいあればとりあえずNode.jsのビルドはできます。
gmakeのインストール
Node.jsのMakefileはGNU makeの書式なので、gmakeの導入が必要です。
以下のコマンドでインストールします。
# pkgin install gmake
Node.jsのビルド
ビルドツールのインストールが済んだので、Node.jsのビルドをします。
まずはtarballのダウンロードです。同時に解凍もしてしまいたいので、以下のコマンドを入力します。
# curl -k http://nodejs.org/dist/v0.10.9/node-v0.10.9.tar.gz | gzcat | tar xf -
あとは普通のNode.jsのビルドです。ただし、makeではなく、gmakeなので注意です。
# cd node-v0.10.9
# ./configure
# gmake
# gmake install
というわけでNode.jsのインストールができました。めでたしめでたし!
まとめ
SmartOSがOpenIndianaの親戚ということもあって、割とスムーズに導入することができました。今回はglobal zoneに導入しましたが、同様の方法でnon-global zoneにも導入できます。また、pkginを導入したnon-global zoneをテンプレートとして作っておき、cloneすることではじめからpkginを使えるnon-global zoneを量産することが簡単にできます。
というわけで安全性は保証できませんがお試しあれ(?)

