バリケンのRuby日記 RSSフィード

2007-11-15

[][]「Rubyソースコード完全解説」を読む(4) 「Rubyソースコード完全解説」を読む(4) - バリケンのRuby日記 を含むブックマーク はてなブックマーク - 「Rubyソースコード完全解説」を読む(4) - バリケンのRuby日記 「Rubyソースコード完全解説」を読む(4) - バリケンのRuby日記 のブックマークコメント

今日も「Rubyソースコード完全解説」を読んでいくよ。今日は「序章 導入」の「ビルド」の節を読んだよ。

じゃあ、この節に書かれているとおりにRubyをコンパイルしてみよう!この節ではUNIX系OSWindowsでのビルドについて書かれているけど、Windowsでのビルドは大変そうだったから、ぼくはラクしてDebian GNU/Linux Etch(UNIX系OS)でやってみることにするよ。

まずはwgetコマンドでファイルを入手して、tarコマンドで展開して展開ディレクトリに移動するよ。

$ wget http://i.loveruby.net/ja/rhg/ar/ruby-rhg.tar.gz
$ tar xzf ruby-rhg.tar.gz
$ cd ruby-rhg

あとはconfigure、makemake installすればいいみたいだけど、すでにこのマシンにはRubyをインストールしちゃっているから、makeまでにしてみようと思うよ。

$ ./configure
checking build system type... i686-pc-linux
checking host system type... i686-pc-linux
checking target system type... i686-pc-linux
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking how to run the C preprocessor... gcc -E
checking whether gcc needs -traditional... no
checking for bison... no
checking for byacc... no
checking for ranlib... ranlib
checking for ar... ar
(中略)
checking whether char is unsigned... no
checking for inline... inline
checking whether right shift preserve sign bit... yes
checking read count field in FILE structures... not found(OK if using GNU libc)
checking read buffer ptr field in FILE structures... _IO_read_ptr
checking read buffer end field in FILE structures... _IO_read_end
checking whether ELF binaries are produced... yes
checking whether OS depend dynamic link works... yes
creating config.h
configure: creating ./config.status
config.status: creating Makefile
$

Makefileができたから、makeしてみるよ。

% make
gcc -g -O2 -I. -I. -c array.c
gcc -g -O2 -I. -I. -c bignum.c
gcc -g -O2 -I. -I. -c class.c
gcc -g -O2 -I. -I. -c compar.c
gcc -g -O2 -I. -I. -c dir.c
dir.c: In function ‘fnmatch’:
dir.c:204: warning: passing argument 1 of ‘range’ discards qualifiers from pointer target type
gcc -g -O2 -I. -I. -c dln.c
dln.c: In function ‘dln_load’:
dln.c:1300: warning: passing argument 2 of ‘init_funcname_len’ discards qualifiers from pointer target type
gcc -g -O2 -I. -I. -c enum.c
gcc -g -O2 -I. -I. -c error.c
gcc -g -O2 -I. -I. -c eval.c
gcc -g -O2 -I. -I. -c file.c
gcc -g -O2 -I. -I. -c gc.c
gcc -g -O2 -I. -I. -c hash.c
hash.c: In function ‘ruby_setenv’:
hash.c:1121: warning: passing argument 1 of ‘envix’ discards qualifiers from pointer target type
gcc -g -O2 -I. -I. -c inits.c
gcc -g -O2 -I. -I. -c io.c
gcc -g -O2 -I. -I. -c marshal.c
gcc -g -O2 -I. -I. -c math.c
gcc -g -O2 -I. -I. -c numeric.c
gcc -g -O2 -I. -I. -c object.c
gcc -g -O2 -I. -I. -c pack.c
yacc parse.y
make: yacc: コマンドが見つかりませんでした
make: *** [parse.c] エラー 127
%

あれー?yaccコマンドがない、って言われちゃった。色々と調べてみたら、yaccコマンドはbisonかbyaccのどちらかをインストールすればいいみたい。というわけで、bisonをインストールしてみたよ。

# aptitude install bison
Reading package lists... Done
Building dependency tree... Done
Reading extended state information
Initializing package states... Done
Writing extended state information... Done
Building tag database... Done
The following NEW packages will be automatically installed:
  m4
The following NEW packages will be installed:
  bison m4
0 packages upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 599kB of archives. After unpacking 1872kB will be used.
Do you want to continue? [Y/n/?]
Writing extended state information... Done
Get:1 http://www.t.ring.gr.jp etch/main m4 1.4.8-2 [178kB]
Get:2 http://www.t.ring.gr.jp etch/main bison 1:2.3.dfsg-4 [421kB]
Fetched 599kB in 2s (215kB/s)
Selecting previously deselected package m4.
(Reading database ... 25252 files and directories currently installed.)
Unpacking m4 (from .../archives/m4_1.4.8-2_i386.deb) ...
Selecting previously deselected package bison.
Unpacking bison (from .../bison_1%3a2.3.dfsg-4_i386.deb) ...
Setting up m4 (1.4.8-2) ...

Setting up bison (2.3.dfsg-4) ...

#

今度は大丈夫かな?

$ make
(中略)
gcc -g -O2 -rdynamic   main.o  libruby.a -ldl -lcrypt -lm   -o ruby
libruby.a(error.o): In function `set_syserr':
/home/your_home/ruby-rhg/error.c:550: warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead
make[1]: ディレクトリ `/home/your_home/ruby-rhg' から出ます
$

今度はうまく行ったよ!試しにruby -vでバージョンを見てみよう!

% ./ruby -v
ruby 1.7.3 (2002-09-11) [i686-linux]
%

きちんとコンパイルできたみたい。でも、日付が「同時多発テロのちょうど一年後」なのが、意味深だねえ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20071115