« Ruby 1.8.5 | Main | Copy&Pasteもやっぱりコマンドラインでしょ。 »

2006年8月27日

MacOSXでpkgsrc

[ カテゴリ: MacOSX ]

繰り返しになりますが、 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");
}

これで再起動すると自動的にマウントしてくれるようになります。

Comments

Post a comment




Remember Me?