Mac: 2006年10月アーカイブ

Mac OS X に Xcode を入れると gcc とかがインストールされるのですが、デフォルトで gcc-4.0 になってます。
世の中のアプリは、まだ gcc-4 でコンパイルできないので gcc-3 が通常後方互換性のためにインストールされて、Xcode には gcc-3.3 が入ってます。

しかし、この gcc-3.3 が全く使えない!!!!!!!!!!!!

試しに適当な C のファイルを作って gcc test.c とかしてみてください。

gcc-3.3: installation problem, cannot exec `cc1': No such file or directory

とか言われて怒られます。全く使えません。
単純なミスだと思うんだけど、かなり致命的な不具合じゃないですかね。
まだ修正バージョンは出てないようだ。

さてさて、どうするか...

Mac OS X のライブラリの形式は Mach-O という形式らしい。
Mach 由来の形式でしょうか。
Linux(他のUNIXも?) といろいろ違っていてちょっとしたカルチャーショックを受けてます。

/lib/ld.so がない

/lib/ld.so と言えば共有ライブラリをロードするためのライブラリですが、Mach-O では /lib/ld.so がありません。
当然 ldconfig もない。

ELF のバイナリは /lib/ld.so が共有ライブラリの検索を行うので、ライブラリへのリンクは絶対パスではなく soname(ライブラリのファイル名)で行われますが、Mach-O の場合は絶対パスでリンクされるようです。

Mac OS X では ldd コマンドはなく、otool -L が ldd に相当する機能を提供しているようです。
試しにさっきインストールした memcached がどのライブラリにリンクしてみるか調べてみました。

% otool -L /opt/memcached/bin/memcached
/opt/memcached/bin/memcached:
        /opt/libevent/lib/libevent-1.1b.1.dylib (compatibility version 2.0.0, current version 2.2.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.4)

確かに絶対パスでリンクされてる。

ちなみに Linux での出力はこんな感じ。

% ldd /opt/memcached/bin/memcached
        linux-gate.so.1 =>  (0x006c8000)
        libevent-1.1a.so.1 => /usr/lib/libevent-1.1a.so.1 (0x00111000)
        libc.so.6 => /lib/libc.so.6 (0x006e6000)
        /lib/ld-linux.so.2 (0x006c9000)

/lib/ld-linux.so.2 以外は全て soname になってる。

ライブラリのファイル名は libhoge.x.y.z.dylib

ELF 形式の場合はファイル名は libhoge.so.x.y.z の用にバージョン番号が .so の後にきますが、Mach-O の場合はバージョン番号の後に .dylib がきます。
なので、-lhoge.x.y.z のように特定のバージョンのライブラリにリンクすることができる。これは便利。

libhoge.so -> libhoge.x.y.z.so のようなシンボリックリンクを使ってしかコンパイル時にリンクするライブラリのバージョンを変更する事ができない ELF 形式と比べると柔軟に対応できますね。
もちろんリンクするライブラリのバージョンを毎回指定するわけではなく、通常は libhoge.dylib -> libhoge.x.y.z.dylib のシンボリックリンクがはられているので、-lhoge のようにバージョン番号を指定しなくてもリンクできるようになってます。

直接役に立つ場面は少なそうですが...

Mac のパッケージ管理には fink を使ってて、fink にないパッケージはソースからインストールするという方針でやってます。 memcached は fink で用意されてないのでインストールしてみました。

libeventをインストール

memcached をインストールしようとしたら libevent がないと言われたので、まずは libevent をインストール。

% ./configure --prefix=/opt/libevent
% make
% sudo make install

ソースからインストールするパッケージはすべて /opt/package にインストールするという方針でやってます。 こうしないと簡単にアンインストールできなくて、インストールしたソフトウェアの管理が簡単にできないので。

memcached のインストール

./configure を実行する前に /opt/libevent/lib を環境変数 LD_LIBRARY_PATH に /opt/libevent/include を環境変数 C_INCLUDE_PATH に通しておきます。 こうしないとインストールした libevent が見つからないのでコンパイルに失敗します。

% source ~/.zsh/.zlogin

環境変数はいつも自動で設定しているので、.zlogin を読み込み直すだけで OK。

% ./configure --prefix=/opt/memcached
% make
% sudo make install

インストール完了。 起動して問題ないか確認してみる。

% source ~/.zsh/.zlogin
% memcached

うまくいってるようだ。

launchd で自動起動の設定

Mac OS X 10.4 で導入されたらしい launchd を使ってみる。 ユーザ個別の設定は $HOME/Library/LaunchAgents に XML 形式のファイルを置くといいみたい。 man launchd.plist すると詳しい説明が出てきます。

memcached.plist を作る。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
        <key>Label</key>
        <string>memcached</string>
        <key>OnDemand</key>
        <false/>
        <key>ProgramArguments</key>
        <array>
                <string>/opt/memcached/bin/memcached</string>
                <string>-m 32</string>
        </array>
</dict>
</plist>

launchd に登録する

% launchctl load -w Library/LaunchAgents/memcached.plist
% launchctl list
memcached
% ps x|grep memcached 
 6286  ??  Ss     0:00.07 /opt/memcached/bin/memcached -m 32

ちゃんと登録されて実行されている。

launchd への登録は別にコマンドで実行しなくてもログインしなおすと登録されるようです。

わからないこと

ログアウトしても memcached が実行されたままになってる。 例えばログアウトして他のユーザでログインした場合は memcached を起動しないようにしたいんだが、どうすればいいのかよくわからない。 まあ、どうせ自分でしか使わないのでこれでよしとする。

Mac OS X では xinetd の代わりに launchd を使うみたい。
設定ファイルは /System/Library/LaunchDaemons とかいろんな場所にに XML 形式で置いてある。
詳しくは man launchd で。

ローカルで named を動かそうと思っていろいろ調べてわかったのだが、named はデフォルトで起動しているみたいですね。

システム環境設定でデフォルトで参照する dns を 127.0.0.1 に変更する。
mac.local.bz2.jp のゾーンファイルをこんな感じにして、mac.local.bz2.jp のサブドメインなら何でも 127.0.0.1 が返ってくるようにした。

                IN      A               127.0.0.1
                IN      MX      10      @
*              IN      CNAME           @

こうしておくとローカルでいくらでも簡単にバーチャルドメインが切れるようになります。

僕の MacBook はキーボードが英語キーボードなんですが、ことえりで日本語入力に切り替えるショートカットが Ctrl+Shift+j になってて困ってました。
Ctrl キーが含まれるのが問題らしく、ターミナルで日本語入力に切り替えようとすると改行が入力されてしまいます。
これは不便だなと思ってましたが、解決方法を発見しました!!!!

Apple+Space で前回の入力モードに切り替える事ができます。
これなら Ctrl が含まれないので問題なく入力モードを切り替える事ができる。
どうせ入力モードは英字かひらがなのどちらかしか使わないので全然問題ありません。

ただログインしてから必ず一回はひらがなモードに手動で切り替える必要がありますが、これはしょうがないってことで。

このアーカイブについて

このページには、2006年10月以降に書かれたブログ記事のうちMacカテゴリに属しているものが含まれています。

次のアーカイブはMac: 2006年11月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。