Macでbash-4をビルド
リポジトリを作る
githubに、なにか面白いプロジェクトないかなぁ、bashとかないかなぁと思っていたら、ありました。これです。始める前は、githubでリポジトリをフォークしてそのURLに対して
$ git checkout http://... # 誤用
ってやってローカルのMacBookに作業コピーを作れば良いのかと思ってたのですが、入門gitを読むと全然違ってました。分散バージョン管理ってのを根本的に勘違いしてました。gitってリポジトリのコピーとマージが簡単にできるsvnかと思ってたんですが、そうではなく、「ローカルにリポジトリを持ってきてそこで作業をする」んですね。という訳で、最初のコマンドは
$ git clone git@github.com:endu/bash-4.git
が正解なのでした。
bash-4をビルドする
とりあえず、ローカルにリポジトリができたので、早速ビルドです。
$ cd bash-4
$ ./configure
$ make
(略)
gcc -L./builtins -L./lib/readline -L./lib/readline -L./lib/glob -L./lib/tilde -L./lib/sh -g -O2 -o bash shell.o eval.o y.tab.o general.o make_cmd.o print_cmd.o dispose_cmd.o execute_cmd.o variables.o copy_cmd.o error.o expr.o flags.o jobs.o subst.o hashcmd.o hashlib.o mailcheck.o trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o alias.o array.o arrayfunc.o assoc.o braces.o bracecomp.o bashhist.o bashline.o list.o stringlib.o locale.o findcmd.o redir.o pcomplete.o pcomplib.o syntax.o xmalloc.o -lbuiltins -lsh -lreadline -lhistory -ltermcap -lglob -ltilde lib/intl/libintl.a -liconv -ldl Undefined symbols:
(略)
"_rl_completion_suppress_append", referenced from:
_bash_default_completion in bashline.o
_command_subst_completion_function in bashline.o
_pcomp_set_readline_variables in pcomplete.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [bash] Error 1
$
がーん。なんで!?どうやら最後のリンクで失敗しているみたいです。
リンクエラーの原因を究明する
リンクエラーの理由を求めてWebをさまようと、やはり困っている人がいて、どうやら、最新のreadlineライブラリ入れる必要があるみたい。readlineのライブラリってどれかなぁ。これかな?なんかへんなの。
$ ls -l /usr/lib/libreadline.dylib
lrwxr-xr-x 1 root wheel 15 9 24 2009 /usr/lib/libreadline.dylib@ -> libedit.2.dylib
うーん、じゃあ具体的にはどうしたらイイのさ、と思っていたら、 決定的な記事を見つけました。以下激しく引用。
Mac OS X では GNU の Readline ライブラリがインストールには含まれておらず、Readline 互換の Libedit というライブラリへのシンボリックリンクとなっている(こうなっている理由はライセンス上の問題からだと思われる。GNU の Readline ライブラリは GPL で、Libedit は BSD ライセンスだ)。
しかし、これが原因で Readline 対応のプログラムがコンパイルできない、コンパイルできてもヒストリ機能などが使えない、といった問題がしばしば起こる。
なるほど!で、readlineをインストールするには、MacPortsとやらを使うのが簡単みたいです。MacPortsって名前だけ知ってて何かと思ったら、yumとかapt-getとかそういうやつみたいですね。もし間違ってたら指摘して頂けるととうれしいです。
MacPortsでlibreadline.aをインストールする
まずはMacPortsから。安直に本家からsnow leopard版の.dmgファイルをDL→mount→.pkg起動。あとはインストーラのボタンを順次押すだけでインストール完了。svnでソースをcheckoutするとか、ソースのtarをDLしてmakeもできるみたいだけど、makeで苦労しているのにさらにmakeするのはしんどいので楽なやり方で。.bash_profileに環境変数の設定が追加されているのを確認して、反映。portコマンドが見える!
$ cd ~
$ cat .bash_profile
(略)
# MacPorts Installer addition on 2010-08-20_at_12:03:34: adding an appropriate PATH variable for use with MacPorts.
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
# Finished adapting your PATH environment variable for use with MacPorts.
$ . .bash_profile
$ which port
/opt/local/bin/port
ので、早速libreadline.aを入れてみます
$ sudo port install readline
Password:
---> Computing dependencies for readline
---> Dependencies to be installed: ncurses ncursesw
---> Fetching ncursesw
---> Attempting to fetch ncurses-5.7.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/ncurses
(略)
---> Fetching readline
---> Attempting to fetch readline-6.1.tar.gz from ftp://ftp.dti.ad.jp/pub/GNU/readline
(略)
---> Cleaning readline
$
ncurses,ncureswってのも必要なんですね。portが自動で入れてくれました。
再度bash-4をビルド
configureを走らせる時に、CPPFLAGSとLDFLAGSを、MacPortsで入れたライブラリのパスに設定するのを忘れずに・・・(といいつつ良く分っておりません。最初失敗して、その後Makefileを手で修正しようとして、結局先ほどの記事を参考にさせていただきました。configureの仕組を良く理解せねば。)
$ make clean
(略)
$ CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib ./configure
(略)
$ make
(略)
ls -l bash
-rwxr-xr-x 1 hide staff 944128 8 20 13:14 bash
size bash
__TEXT __DATA __OBJC others dec hex
638976 32768 0 4295249920 4295921664 1000e9000
$
できたぁ!
$ ./bash --version
GNU bash, version 4.0.35(1)-release (i386-apple-darwin10.4.0)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $
| 固定リンク
この記事へのコメントは終了しました。


コメント