わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

Rubyのスナップショットをビルド―2.1.0dev & 2.0.0対応―

Ruby 2.0.0に最初のパッチレベルリリースが出ました([ruby-list:49360], メール).
当ブログでは,Cygwinでスムーズにビルドするための注意点を,自らの経験をもとに記してきましたが,このパッチレベルリリース,それから最新版スナップショット(2.1.0dev)・安定版スナップショット(2.0.0)ともに,そのままではビルドできないことがあります.
しかし,簡単な操作によって問題が解消し,ビルドできましたので,以下,その不具合の状況と回避策を書き残しておきます.

2.1.0devのビルドエラーと対策

configureまでは問題ありません.make時に,次のメッセージが出ることがあります.

compiling dmydln.c
      0 [main] gcc-4 13304 fhandler_disk_file::fixup_mmap_after_fork: requested 0xFFE90000 != 0x0 mem alloc base 0x0, state 0x10000, size 65536, Win32 error 487
    217 [main] gcc-4 13304 (略)\gcc-4.exe: *** fatal error in forked process - recreate_mmaps_after_fork_failed
    816 [main] gcc-4 13304 open_stackdumpfile: Dumping stack trace to gcc-4.exe.stackdump
      2 [main] gcc 12764 fork: child -1 - forked process 13304 died unexpectedly, retry 0, exit code 256, errno 11

手元の環境では,Windows 8 + Cygwinでのみ発生します.
この件は,組み込みLinuxのメモ書き: Windows8 64bit上での Cygwinに情報があります.そこでは,「export LANG=C」で解消したとのこと.
しかし自分のところでこれを実行してから,makeしても,同じメッセージが出てきます.もう少し,作業してみたところ,環境変数LANGのほか,LC_ALLも値をCとすること,コマンドとしては

$ env LANG=C LC_ALL=C make

を実行することで,エラーが出なくなりました.自分のところでは,LC_ALLにも日本語設定(値はja_JP.UTF-8)をしていたのが,災いのもとだったようです.

なお,上のコマンドは,"env "を書かなくても,同じ動作になります.環境変数LANGとLC_ALLにそれぞれ値として"C"を割り当て,makeを実行します.コマンド終了後のシェルでは,環境変数LANGとLC_ALLがあっても,値はコマンド実行前と同じであり,ない場合には作られません.
個人的には,次のaliasを~/.zshrcに書いています.

alias eng='LANG=C LANGUAGE=C LC_ALL=C'

そして,1回限りで非日本語ロケールにしたければ「eng コマンド」を実行し,シェル終了まで非日本語ロケールにしたいときは「eng」を実行しています.なお,LANG,LANGUAGE,LC_ALLは環境変数として別途宣言しています.

2.0.0のビルドエラーと対策

次の不具合は,パッチレベルリリース,安定版スナップショットの両方で,そしてWindows 7,8の両方で出現します.
configureまでは問題ありません.make時に,「'struct timeval'」を含む警告が出ることがあります.そしてprocess.cのコンパイル中に次のようなエラーが出て,ビルドが停止します.

compiling process.c
In file included from ./include/ruby/ruby.h:1567:0,
                 from process.c:14:
./include/ruby/intern.h:293:72: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:293:72: warning: its scope is only this definition or declaration, which is probably not what you want
In file included from ./include/ruby/ruby.h:1567:0,
                 from process.c:14:
./include/ruby/intern.h:412:1: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:413:79: warning: 'struct timeval' declared inside parameter list
./include/ruby/intern.h:414:32: warning: 'struct timeval' declared inside parameter list
process.c: In function 'rb_f_sleep':
process.c:4105:2: error: type of formal parameter 1 is incomplete
Makefile:325: recipe for target `process.o' failed
make: *** [process.o] Error 1

エラーは,process.cからprocess.oを作ることができなかったというものですが,手直しするのはinclude/ruby/intern.hのほうです.適当な場所に,「#include 」を書くだけです.テキストエディタでintern.hを開き,

#include "ruby/st.h"

となっているところを

#include <sys/time.h>
#include "ruby/st.h"

と書き加えて保存してから,makeすると,struct timevalに起因する警告もエラーも,なくなりました.

zsh設定

Gistスクリプトを編集しました.主な変更箇所は次のとおりです.

  • 安定版スナップショットの伸張ディレクトリ(日付を含むディレクトリ名に変更する前の値)を,rubyからstable-snapshotに変更しました.
  • libyamlがあるときにconfigureのオプションで指定するという処理を,なくしました.
  • aliasのうち,use-ruby2はuse-ruby-snに,use-ruby18はuse-ruby-ssに名称を変更しました.
  • engのaliasを追加しました.
  • Cygwinでビルドに失敗する場合の対処法について,コメントをつけました.