« Ruby 1.8.5 | Main | Copy&Pasteもやっぱりコマンドラインでしょ。 »
2006年8月27日
MacOSXでpkgsrc
繰り返しになりますが、 MacOSXでpkgsrcを使う人は物好きらしいです。 そんな物好きに贈る、pkgsrc on MacOSX講座。 ただし、pkgsrcの若干の知識を前提としています。あしからず。
前準備(前編)
まずは、 特にpkgsrcに限らず一般的にやっておいた方がいいと思われることから。
なににつけても、まずは開発環境が必要です。 Xcodeを入手してインストールしましょう。 OSXのインストールメディアにも入ってますが、 ADC (Apple Developer Connection)からも入手可能です。 ADCのメンバじゃない場合は適当にサインアップしてください。 ちなみに、最新版はXcode 2.4です。
それから、 なにかにつけX11が(使わなくても)インストールされているほうがよいです。 こいつはOSXのインストール時にカスタマイズで選択するのですが、 あとからインストールすることもできます。 正式なインストール方法はいまいちよく分からないんですが、 インストールメディアをつっこんで Optional Installsを起動すればいいようです。
前準備(後編)
次に、pkgsrcに特化した準備を。
前提として、 pkgsrcを使うためにはcase-sensitiveなファイルシステムが必要です。 すなわち、ファイル名で大文字と小文字の区別ができなければなりません。 以下、bootstrap/README.Darwin (このファイルはまだみなさんの手元にありません)から抜粋。
(Why can't you just use the HFS+ filesystem you've already got? Because pkgsrc currently requires the underlying filesystem to be case-sensitive, and HFS+ isn't.)
OSXで普通に使えるcase-sensitiveなファイルシステムは、 UFSとHFSXのふたつです。 前者はOSXのインストール時に 「UNIXファイルシステム」として選択できるものです… が、このフォーマットでシステムをインストールした場合、 市販の多くのアプリケーションが動かない可能性が高いのです。 したがって、この選択肢は捨てた方がよいでしょう。
一方、後者はHFS+のcase-sensitive拡張です。 HFSXでOSXをインストールするには、 インストール時に「ディスクユーティリティ」を起動してごにょごにょする必要があり、 という若干難易度が高いかもしれません。 昔は起動パーティションをHFSXにすると不具合があると言われてましたが、 実際にやってみたところ、特に問題は見あたりませんでした。 ATOK2006も普通に動くし。 とはいえ、 未だにcase-insensitiveなファイルシステムを前提にしている市販アプリケーションもありそうなので、 猛者でなければお勧めはできないことも事実です。
ではどうするのか。 前出のbootstrap/README.Darwinでは、 UFSのディスクイメージを利用する方法が説明されています。 つまり、システムはHFS+のままインストールし、 pkgsrcの部分だけをディスクイメージにしてマウントしちゃおうという作戦です。 若干遅くなるかもしれませんが、後で自由が効くのでお勧めです。 というわけで、この方法を採用することにします。
まず、 このディスクイメージとマウントポイントを置くためのディレクトリを作ります。
$ sudo mkdir -p /PKGSRC/mnt $
次に、適当な大きさのディスクイメージを作ります。 「適当な大きさ」は、 どれくらいのパッケージをインストールするかに依存しまするわけですが、 多くの場合で4Gもあれば十分だと思います。 ファイルシステムは、上記の通りUFSにしてもかまいませんが、 折角なのでHFSXにしましょう。 サイズが大きいと若干時間がかかるかもしれません。
$ sudo hdiutil create /PKGSRC/HFSX.dmg \ -size 4g -layout SPUD -type UDIF -volname pkgsrc \ -partitionType Apple_HFSX -fs 'Case-sensitive Journaled HFS+' ............................................................................... created: /PKGSRC/HFSX.dmg $
ディスクイメージができたらマウントします。
$ sudo hdiutil attach /PKGSRC/HFSX.dmg \ -mountpoint /PKGSRC/mnt \ -owners on -nobrowse -notremovable /dev/disk1 Apple_partition_scheme /dev/disk1s1 Apple_partition_map /dev/disk1s2 Apple_HFSX /PKGSRC/mnt $
以下のように、必要なディレクトリを作ります。 つまり、pkgsrcに必要な部分だけをHFSX.dmgに押し込め、 シンボリックリンクを張るぜという方針です。 /varは必要ないのではないかと思われるかもしれませんが、 これがあるとディスクイメージごとほかのホストに移動して利用できます。 また、pkgsrcに関係のあるファイルの実体を、 全てディスクイメージに入れられるので、 システムとの切り分けという意味でも望ましいでしょう。
$ sudo mkdir -p /PKGSRC/mnt/{usr/pkg/etc,var/db/pkg{,.refcount}}
$
で、これらを所定の場所へシンボリックリンクを張ります。 これがいやな場合は、PREFIXを変更するという手もありますが、 無用なトラブルを避けたいのであれば、 シンボリックリンクをお勧めします。
$ sudo ln -s /PKGSRC/mnt/usr/pkg{,src} /usr
$ sudo ln -s /PKGSRC/mnt/var/db/pkg{,.refcount} /var/db
$
/PKGSRC/mnt/usr/pkgsrcなんてmkdirしてないよ? というあなた、正解です。 このディレクトリはあとでpkgsrcを取得するときにできるのですが、 先走ってシンボリックリンクを張っています。
というわけで、ここまでで準備はほぼ終わりました。
pkgsrcで、ごー。
それでは、pkgsrcをチェックアウトしましょう。 Xcodeはインストール済みのはずなので、 cvsは既に利用可能です。
$ cvs -d :pserver:anoncvs@anoncvs.netbsd.org/cvsroot login
Logging in to :pserver:anoncvs@anoncvs.netbsd.org:2401/cvsroot
CVS password: ←anoncvs
$ cd /PKGSRC/mnt/usr
$ sudo cvs -d :pserver:anoncvs@anoncvs.netbsd.org:/cvsroot co -P pkgsrc
cvs checkout: Updating pkgsrc
U pkgsrc/Makefile
U pkgsrc/README
:
U pkgsrc/x11/zenity
$
NetBSDであればこのままお好みのパッケージをインストールすればいいのですが、 それ以外のプラットフォームの場合は、 pkgsrc用のコンパイル環境、bootstrapが必要です。 といっても、BSD makeとかそのあたりの軽いものばかりですけど。
$ cd /usr/pkgsrc/bootstrap $ sudo ./bootstrap ===> bootstrap command: ./bootstrap ===> bootstrap started: Sat Aug 26 21:49:10 JST 2006 Working directory is: /usr/pkgsrc/bootstrap/work : Hopefully everything is now complete. Thank you ===> bootstrap started: Sat Aug 26 21:49:10 JST 2006 ===> bootstrap ended: Sat Aug 26 21:51:47 JST 2006 $
余談ですが、このbootstrapというディレクトリの中に、 前述のREADME.Darwinがあります。
さて、pkgsrcでは、 コンパイル時のさまざまなオプション指定に /etc/mk.conf、または、/usr/pkg/etc/mk.confというファイルで使います。 NetBSDのmakeの場合は前者、bootstrapが提供するbmakeの場合は後者です。 したがって、MacOSXの場合は/usr/pkg/etc/mk.confに設定を記述します。
mk.confは、 システムにあらかじめインストールされているなにかを、 pkgsrcで提供されているものより優先的に使う、 という指定も可能です。 例えば、MacOSXではzlibがシステムで提供されているので、 特に必要がなければこれを優先して使いたい、と思うわけです。 mk.confの内容は試行錯誤ですが、 MacOSXではおおよそ以下のような感じで問題ないと思います (というか、あまり綿密にチェックしてないので、 意味をなしてない設定も多いかもしれません)。
.ifdef BSD_PKG_MK # begin pkgsrc settings
PKG_DBDIR= /var/db/pkg
LOCALBASE= /usr/pkg
FETCH_CMD= ${LOCALBASE}/bin/ftp
PAX= ${LOCALBASE}/bin/pax
PREFER_NATIVE= readline freetype2 Xft2 fontconfig \
Xrender render Xrandr randrext xcursor \
MesaLib glu xpm zlib iconv openssl pam \
dlcompat curl ncurses sun-jre13 sun-jre14 \
tcp_wrappers openldap openldap-client cups \
net-snmp pthread cyrus-sasl2 libxml2 libpcap \
tcl mit-krb5 libltdl gmake bzip2 bunzip \
flex pth unzip
TOOLS_PLATFORM.unzip?= /usr/bin/unzip
TOOLS_PLATFORM.gm4?= /usr/bin/gm4
PKG_DEFAULT_OPTIONS+= inet6
.endif # end pkgsrc settings
個々のパッケージのオプションに関してはお好みで追加してください。 このへんは、NetBSDでつかうpkgsrcとまったく同じです。 たとえば、w3mだったら以下のようなものを追加すればいいでしょう。
PKG_OPTIONS.w3m= w3m-image-imlib2 w3m-m17n w3m-unicode
あとはがんがんインストールするのみです。 日本語でTeXを使いたいのであれば、
$ cd /usr/pkgsrc/textproc/ja-ptex $ sudo make install :
ってな感じです。
起動時にマウントしたいんですけど。
とりあえずこれでpkgsrcが使えるようになりました。 が、実はOSXを再起動するとマウントが外れてしまいます。 なんとか起動時に自動的にマウントするようにしたいものです。 OSXでは、 /System/Library/StartupItemsや /Library/StartupItemsにある設定を起動時に実行するので、 これを使って自動マウントを実現しましょう。 なお、上記ディレクトリのうち、前者はシステムで提供されているもの、 後者はローカルで利用するものです。 /etcと/usr/local/etcの関係と同じと云えばわかりやすいでしょうか。
まずはPKGSRC用StartupItemsディレクトリを作成します (注意!これはシンボリックリンクでは動作しません)。
$ sudo mkdir /Library/StartupItems/PKGSRC $
ここに、 PKGSRCおよびStartupParameters.plistというふたつのファイルを準備します。 PKGSRCの内容は以下の通り。
#!/bin/sh
exec > /tmp/PKGSRC.log 2>&1
##
# Mount HFSX Filesystem for PKGSRC
##
. /etc/rc.common
PKGSRC_DISKIMAGE="/PKGSRC/HFSX.dmg"
PKGSRC_MOUNTPOINT="/PKGSRC/mnt"
StartService ()
{
local device
if [ ! -f "${PKGSRC_DISKIMAGE}" ]; then
ConsoleMessage "No diskimage ${PKGSRC_DISKIMAGE}"
return 0;
fi
ConsoleMessage "Mounting HFSX Filesystem for PKGSRC"
hdiutil attach ${PKGSRC_DISKIMAGE} \
-mountpoint ${PKGSRC_MOUNTPOINT} \
-owners on -nobrowse -notremovable
sleep 1
if [ -d /usr/pkg/etc/rc.d ]; then
for rc in /usr/pkg/etc/rc.d/*; do
ConsoleMessage "Starting ${rc##*/}";
sh ${rc} start;
done;
fi
}
StopService ()
{
return 0;
}
RestartService ()
{
return 0;
}
RunService "$1"
これは実行可能でなければなりません。
$ sudo chmod 755 /Library/StartupItems/PKGSRC/PKGSRC $
一方、StartupParameters.plistはこれ。
{
Description = "Mount Filesystem for PKGSRC";
Provides = ("PKGSRC");
Requires = ("Disks");
}
これで再起動すると自動的にマウントしてくれるようになります。