bar_1

contents_map

2011年3月4日金曜日

Ruby の Test::Unit の GUI インターフェイス

概要


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...
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
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

0 件のコメント:

コメントを投稿

何かありましたら、どうぞ: