概要
Cygwin 環境で Ruby の単体テストフレームワーク: Test::Unit の GUI インターフェイスを使ってみた。そのところ、必要な gem パッケージのインストールで、問題が生じた。問題は、gem の native extensions のコンパイルに失敗するというものだった。これに対処するため、gem install のオプションとして、--with-opt-include=/usr/include/cairo を指定し、解決した。
以下にこの問題の現象、問題の解析、対処法、結果を述べる。(追記2014-04-24: Markdown で書き直した)
現象
Cygwin 環境では、gem パッケージ: test-unit-runner-gtk2 のインストール時にエラーが発生する。
$ ruby ../test/test_shell.rb ../test/test_shell.rb:3:in `require': no such file to load -- test/unit/runner/gtk2 (LoadError) from ../test/test_shell.rb:3
$ gem install test-unit-runner-gtk2 Building native extensions. This could take a while... Building native extensions. This could take a while... Building native extensions. This could take a while... ERROR: Error installing test-unit-runner-gtk2: ERROR: Failed to build gem native extension. /usr/bin/ruby.exe extconf.rb checking for GCC... yes checking for Win32 OS... yes checking for Mac OS X... no checking for cairo version (>= 1.2.0)... yes checking for HAVE_RUBY_ST_H in ruby.h... no checking for ruby/st.h... no checking for HAVE_RUBY_IO_H in ruby.h... no checking for ruby/io.h... no checking for rb_errinfo() in ruby.h... no checking for enum ruby_value_type in ruby.h... no creating Makefile /usr/lib/ruby/1.8/mkmf.rb:1322: warning: global variable `$preload' not initialized make gcc -I. -I. -I/usr/lib/ruby/1.8/i386-cygwin -I. -DRUBY_CAIRO_PLATFORM_WIN32 -DRB _CAIRO_COMPILATION -g -O2 -Wall -I../../vendor/local/include -I../../vendor /local/include/cairo -I../../vendor/local/include/pixman-1 -I../../vendor/local/ include/freetype2 -I../../vendor/local/include -I/usr/include/libpng12 -c rb_cairo.c In file included from rb_cairo.c:17: rb_cairo.h:20:19: error: cairo.h: No such file or directory In file included from rb_cairo.c:17: rb_cairo.h:205: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:206: error: expected ‘)’ before ‘*’ token rb_cairo.h:208: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:209: error: expected ‘)’ before ‘*’ token rb_cairo.h:211: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:212: error: expected ‘)’ before ‘*’ token rb_cairo.h:219: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:220: error: expected ‘)’ before ‘*’ token rb_cairo.h:222: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:223: error: expected ‘)’ before ‘*’ token rb_cairo.h:225: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:226: error: expected ‘)’ before ‘*’ token rb_cairo.h:228: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:229: error: expected ‘)’ before ‘*’ token rb_cairo.h:231: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:232: error: expected ‘)’ before ‘*’ token rb_cairo.h:234: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:235: error: expected ‘)’ before ‘*’ token rb_cairo.h:237: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:238: error: expected ‘)’ before ‘*’ token rb_cairo.h:245: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘*’ token rb_cairo.h:246: error: expected ‘)’ before ‘*’ token rb_cairo.h:248: error: expected ‘)’ before ‘*’ token rb_cairo.h:293: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_operator_from_ruby_object’ rb_cairo.h:294: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_antialias_from_ruby_object’ rb_cairo.h:295: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_fill_rule_from_ruby_object’ rb_cairo.h:296: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_line_cap_from_ruby_object’ rb_cairo.h:297: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_line_join_from_ruby_object’ rb_cairo.h:298: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_font_slant_from_ruby_object’ rb_cairo.h:299: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_font_weight_from_ruby_object’ rb_cairo.h:300: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_subpixel_order_from_ruby_object’ rb_cairo.h:301: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_hint_style_from_ruby_object’ rb_cairo.h:302: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_hint_metrics_from_ruby_object’ rb_cairo.h:303: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_path_data_type_from_ruby_object’ rb_cairo.h:304: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_content_from_ruby_object’ rb_cairo.h:305: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_format_from_ruby_object’ rb_cairo.h:306: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_extend_from_ruby_object’ rb_cairo.h:307: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__ ’ before ‘rb_cairo_filter_from_ruby_object’ rb_cairo.h:331: error: expected ‘)’ before ‘status’ rb_cairo_private.h:81: error: expected declaration specifiers or ‘...’ before ‘cairo_glyph_t’ rb_cairo_private.h:84: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attri bute__’ before ‘rb_cairo__is_kind_of’ rb_cairo_private.h:112: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attr ibute__’ before ‘rb_cairo__exception_to_status’ rb_cairo.c: In function ‘rb_cairo_satisfied_version’: rb_cairo.c:40: error: ‘CAIRO_VERSION_MAJOR’ undeclared (first use in this function) rb_cairo.c:40: error: (Each undeclared identifier is reported only once rb_cairo.c:40: error: for each function it appears in.) rb_cairo.c:40: error: ‘CAIRO_VERSION_MINOR’ undeclared (first use in this function) rb_cairo.c:40: error: ‘CAIRO_VERSION_MICRO’ undeclared (first use in this function) rb_cairo.c: In function ‘Init_cairo’: rb_cairo.c:59: error: ‘CAIRO_VERSION_MAJOR’ undeclared (first use in this function) rb_cairo.c:60: error: ‘CAIRO_VERSION_MINOR’ undeclared (first use in this function) rb_cairo.c:61: error: ‘CAIRO_VERSION_MICRO’ undeclared (first use in this function) rb_cairo.c:63: warning: implicit declaration of function ‘cairo_version’ make: *** [rb_cairo.o] Error 1 Gem files will remain installed in /cygdrive/d/home/cygwin/gems/cairo-1.10.0 for inspection. Results logged to /cygdrive/d/home/cygwin/gems/cairo-1.10.0/ext/cairo/gem_make.out
解析
エラーメッセージから、ヘッダファイル: cairo.h が、コンパイラ gcc によって認識されていないことが、分かる。そこで、ディレクトリ: /usr/include 配下を確認すると、このファイルは /usr/include/cairo/ 配下に存在することが、判明した。
したがって、gem による native extensions のコンパイル時に、このディレクトリを、追加指定できればよい。
そこで Google で
- cygwin cairo.h gtk
- ruby test/unit GUI Gtk
- CAIRO_VERSION_MAJOR ruby Test Unit ruby
- gem install パス コンパイル
- gem install パスの指定 コンパイル include native extensions
- gem install include native “—with-extensions”
などをキーワードとして検索していたら、以下のような情報を見つけた:
$ sudo gem install mysql -- --with-mysql-config Building native extensions. This could take a while...
- Pistolfly, gem install mysql でエラー; Aug. 28, 2008.
checking for rb_thread_blocking_region()... *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=C:/ruby/bin/ruby
- Mishra, Re: Re: not able to start my first RoR project, RubyForum; Oct. 8, 2010.
gem で MySQL 関連のパッケージをインストールしたときのエラーだった。どうやら、gem install のオプション指定があるらしい。
また、gem help install を参照すると
If an extension fails to compile during gem installation the gem
specification is not written out, but the gem remains unpacked in the
repository. You may need to specify the path to the library’s headers and
libraries to continue. You can do this by adding a — between RubyGems’
options and the extension’s build options:
(gemインストール中にコンパイルに失敗する場合、gem specificationは書き
出されないが、gem はリポジトリに展開されて残る。続行するには、ライブ
・ヘッダやライブラリへのパスの指定が必要ないかも知れない。これは、
RubyGemsのオプションとextensionのビルド・オプションとの間に、— を追
加することでできる)
とある。
そこで
$ gem install test-unit-runner-gtk2 -- --with-opt-include=/usr/include/cairo
として、再度コンパイルを試みる。
この結果、コンパイルに成功した。以下がそのログ。コンパイルは40分かかった……(なんでこんなにコンパイル時間長いの?):
$ gem install test-unit-runner-gtk2 -- --with-opt-include=/usr/in clude/cairo Building native extensions. This could take a while... Building native extensions. This could take a while... $ date Fri Mar 4 04:56:38 2011 $ gem install test-unit-runner-gtk2 -- --with-opt-include=/usr/in clude/cairo ; date Building native extensions. This could take a while... Successfully installed gtk2-0.90.7 Successfully installed test-unit-runner-gtk2-0.0.2 2 gems installed Installing ri documentation for gtk2-0.90.7... Installing ri documentation for test-unit-runner-gtk2-0.0.2... Installing RDoc documentation for gtk2-0.90.7... Installing RDoc documentation for test-unit-runner-gtk2-0.0.2... Fri Mar 4 05:34:41 2011
gem でインストール・リストに載るか確認。
$ gem list|grep 'test-unit' test-unit (2.2.0) test-unit-runner-gtk2 (0.0.2)
結果
GUI の使い方は、ソースコードに必要な記述をおこない (rubyのバージョンが1.9ベースの場合は必要ないかも知れない。当方の環境は1.8ベースである)、必要なオプション指定でテストを実行することである。
テストケースの冒頭で
#for --runner=gtk2 require "rubygems" gem "test-unit", "2.2.0" require 'test/unit' require 'test/unit/runner/gtk2'
とする。
そして、コマンド・ラインで
$ ruby ../test/test_shell.rb --runner=gtk2
を実行。おっと、X Server を上げておくのを忘れずに。
せっかくインストールできたけど、起動が重いです……
References
- “gem help install”, gem help install, gemコマンドのヘルプ
- “Test::Unit - Ruby用単体テストフレームワーク”, Ruby Forge, http://test-unit.rubyforge.org/index.html.ja
- “Re: Re: not able to start my first RoR project”, Ruby Forum, http://www.ruby-forum.com/topic/218220#946720
- “mysqlアーカイブ”, , http://www.pistolfly.jp/weblog/mysql/
- “[ruby] gem install mysql でエラー”, Memorandum, http://www.pistolfly.jp/weblog/2008/08/gem-install-mysql.html
0 件のコメント:
コメントを投稿
何かありましたら、どうぞ: