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
#include "ruby/st.h"
となっているところを
#include <sys/time.h> #include "ruby/st.h"
と書き加えて保存してから,makeすると,struct timevalに起因する警告もエラーも,なくなりました.
zsh設定
過去に書いた記事
(リリース:Wed May 15 21:02:21 JST 2013ごろ)