ruby - らんだむな記憶 で随分と前に CRuby をビルドしていた。記事には何も残していないが少しソースコードを眺めたこともあったが、あれはいつのことだっただろうか・・・。
https://github.com/ruby/ruby でも拾ってきて久しぶりに眺めてみるのも悪くないかもしれない。
Python の関数コール - らんだむな記憶 の Dockerfile を使い回す。
FROM derwind/python-build ENV DEBIAN_FRONTEND noninteractive RUN apt install -y autoconf bison build-essential \ libssl-dev libyaml-dev libreadline6-dev zlib1g-dev \ libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev && \ apt install -y gdb git automake libtool flex && \ git clone git://github.com/cgdb/cgdb.git && \ cd cgdb && \ ./autogen.sh && \ ./configure --prefix=/usr/local && \ make && \ make install && \ cd .. && \ rm -rf cgdb WORKDIR /workdir VOLUME ["/workdir"] CMD ["bash"]
で、
git clone https://github.com/ruby/ruby.git
して
$ cd ruby $ du -h 344M .
だった。cpython よりも小さいか。ビルド後は 675M になっていた。
git checkout v3_0_1 docker run -it --rm -v $PWD:/workdir derwind/python-build:debug bash
で準備をする。なんで python-build なんかというのはあるが、CPython をデバッグする時用に gdb
と cgdb
を入れているからという言い訳・・・。
この時、タグ付けされたファイルに autogen.sh
が含まれていないようなので、自分で master
ブランチからコピーして用意する。
#!/bin/sh PWD= case "$0" in */*) srcdir=`dirname $0`;; *) srcdir="";; esac exec ${AUTORECONF:-autoreconf} --install --symlink "$@" ${srcdir:+"$srcdir"}
あと、ホストに ruby が既に入っている状態でないと configure
が通らないので、
apt install ruby
をしておく。(コンテナの中で)
これで漸く準備ができたので、
./autogen.sh ./configure optflags='-O0' --disable-install-doc make
でビルドは開始する。ここで、optflags='-O0'
は最適化を無効化する意図であり、デフォルトでは -O3
である。--disable-install-doc
を configure
に渡しているのは、これなしでビルドを開始すると、30 分くらい経過したところで
Generating RDoc documentation Parsing sources... Killed835/861] string.c make: *** [uncommon.mk:567: rdoc] Error 137
のように Out of memory
で強制終了させられてしまったからである・・・。f1-micfo
インスタンスでは少し厳しかったようだ。
一応
$ ./ruby -e "puts 'hello my ruby'" `RubyGems' were not loaded. `did_you_mean' was not loaded. hello my ruby
で実行できているので実行形式はビルドできているみたいだ。--disable-install-doc
を使えばビルドできた。別に今回は不要なので問題ない。
`RubyGems' were not loaded. `did_you_mean' was not loaded.
の部分については、
make install
すれば出なくなる。数秒間のコストはかかるがウザさが減るので悪くない。