Cygwin Rubyにwin32utilsのwin32-clipboardをインストールする

Rubyist Magazineの

Ruby Library Report 【第 4 回】 Win32Utils」
http://jp.rubyist.net/magazine/?0005-RLR

この記事を読んで、Rubyでも簡単にクリップボードが使えるのだと思ってCygwin Rubyにwin32-clipboardをインストールして動かしてみようと思ったのですが、私がまだRuby初心者のこともあっていろいろと苦労しましたので報告したいと思います。
結論として現在の最新版のwin32-clipboard-0.4.3をCygwin Rubyのgemsに以下の手順でインストールしました。
1. win32-apiのビルドとインストール
本来であればwin32-apiはgemでwin32-clipboardに関連するパッケージとしてインストールできるはずなのですがgemを使ったインストールがうまくいきません。
そこでzipファイルをダウンロードして手動でビルドとインストールを実行します。
1.1. win32-api-1.0.3.zipをダウンロード
RubyForgeのwin32utilsのダウンロードページからwin32-api-1.0.3.zipをダウンロードして、適当な場所に展開します。
1.2. rakeとnmakeの準備
win32-api-1.0.3のビルドとインストールにはrakeとnmakeが必要です。
rakeがインストールされていない場合にはgemでインストールします。

gem install rake --remote

Rakefileの中でnmakeが使用されていますのでnmakeが存在しない場合には対応が必要です。
Rakefileの中のnmakeの記述をmakeに修正するという手もありますが、私はCygwinのmakeをシンボリックリンクすることで対応しました。

ln -s /usr/bin/make /usr/local/bin/nmake

1.3. win32-apiのビルド
win32-api-1.0.3.zipファイルを展開したフォルダに移動してrakeでbuildタスクを実行します。

rake -f Rakefile build

1.4. gemsにインストール
rakeでinstall_gemを実行します。

rake -f Rakefile install_gem

2. gemで残りのコンポーネントをインストール
これで残りのコンポーネントをすべてgemでインストールします。

gem install win32-clipboard --remote --include-dependencies

3. 動作の確認
irbで動作確認を行います。

$ irb
irb(main):001:0> require 'Win32API'
=> true
irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'win32/clipboard'
=> true
irb(main):004:0> include Win32
=> Object
irb(main):005:0> Clipboard.set_data 'Hello!'
=> Win32::Clipboard
irb(main):006:0> Clipboard.data
=> "Hello!"
irb(main):007:0> Clipboard.set_data 'Hi World!!'
=> Win32::Clipboard
irb(main):008:0> Clipboard.data
=> "Hi World!!"
irb(main):009:0>

以上でインストール完了です。


あと同様の問題ではまった方のために私がトラブったところを以下に解説しておきます。
始めにいきなりwin32-clipboardをgemでインストールしようとしたら以下のようなエラーになってしまいました。

$ gem install win32-clipboard --remote --include-dependencies
Select which gem to install for your platform (i386-cygwin)
 1. win32-api 1.0.3 (mswin32)
 2. win32-api 1.0.3 (ruby)
 3. win32-api 1.0.2 (mswin32)
 4. win32-api 1.0.2 (ruby)
 5. Skip this gem
 6. Cancel installation
> 2
Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

ruby extconf.rb install win32-api --remote
checking for strncpy_s()... no
creating Makefile

make
make: Nothing to be done for `all'.

make install
make: *** No rule to make target `/usr/local/lib/ruby/gems/1.8/gems/win32-api-1.0.3/lib/win32', needed by `install-so'.  Stop.


Gem files will remain installed in /usr/local/lib/ruby/gems/1.8/gems/win32-api-1.0.3 for inspection.
Results logged to /usr/local/lib/ruby/gems/1.8/gems/win32-api-1.0.3/ext/gem_make.out

またここで"1. win32-api 1.0.3 (mswin32)"を選択するとインストールは正常終了しますが実行時に以下の様なエラーになります。

$ irb -rubygems
irb(main):001:0> require 'Win32API'
=> true
irb(main):002:0> require 'win32/clipboard'
NameError: uninitialized constant Windows::API::Win32
        from /usr/local/lib/ruby/gems/1.8/gems/windows-api-0.2.0/lib/windows/api.rb:211:in `initialize'
        from /usr/local/lib/ruby/gems/1.8/gems/windows-pr-0.7.1/lib/windows/clipboard.rb:26
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in`require'
        from /usr/local/lib/ruby/gems/1.8/gems/win32-clipboard-0.4.3/lib/win32/clipboard.rb:1
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in`require'
        from (irb):2

次にwin32-apiのbuildの際にnmakeが存在しない場合には以下の様なエラーになります。

$ rake -f Rakefile build
(in /home/Yoichi/win32-api-1.0.3)
cp win32/api.c .
/usr/local/bin/ruby extconf.rb
checking for strncpy_s()... no
creating Makefile
nmake
rake aborted!
Command failed with status (127): [nmake...]
/home/Yoichi/win32-api-1.0.3/Rakefile:36
(See full trace by running task with --trace)

あと動作確認の際にwin32-clipboardの仕様変更に戸惑いました。
以前にはwin32-clipboardは"require 'win32/clipboard'"だけで良かったようですが、該当のバージョンではこの前に"require 'Win32API'"が必要になっています。
またクリップボードへのテキストの貼り付けの際に以前はWin32::Clipboard.dataへの代入で良かった様ですが、該当のバージョンはWin32::Clipboard.set_data関数を使用する様になっています。(不具合っぽい?)
具体的な動作は以下のとおりです。

$ irb -rubygems
irb(main):001:0> require 'win32/clipboard'
NameError: uninitialized constant Win32::Clipboard::Win32API
        from /usr/local/lib/ruby/gems/1.8/gems/win32-clipboard-0.4.3/lib/win32/c
lipboard.rb:25
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:32:in
`require'
        from (irb):1
irb(main):002:0> quit

$ irb -rubygems
irb(main):001:0> require 'Win32API'
=> true
irb(main):002:0> require 'win32/clipboard'
=> true
irb(main):003:0> Win32::Clipboard.data = 'text data'
NoMethodError: undefined method `data=' for Win32::Clipboard:Class
        from (irb):3
irb(main):004:0> Win32::Clipboard.set_data 'text data'
=> Win32::Clipboard
irb(main):005:0> Win32::Clipboard.data
=> "text data"
irb(main):006:0>


またRuby初心者の私は以下のことを学びました。

まだまだ、、、、
ですね。

2007-10-14:追記

従来のWin32APIは将来dl/win32で置き換えられる予定ということです。
"ruby 1.8.4 (2005-12-24) [i386-cygwin]"で"require 'Win32API'"の箇所を"require 'dl/win32'"としても動作します。