« なぜコンピュータの画像はリアルに見えるのか | トップページ | リファクタリング・ウェットウェア »

2010年8月20日 (金)

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. $

|

« なぜコンピュータの画像はリアルに見えるのか | トップページ | リファクタリング・ウェットウェア »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/207693/49198426

この記事へのトラックバック一覧です: Macでbash-4をビルド:

« なぜコンピュータの画像はリアルに見えるのか | トップページ | リファクタリング・ウェットウェア »