build Ruby on Windows 【第 1 回】

書いた人:たむらけんいち

はじめに

あなたはコンピュータを使っているだろうか。「もちろん。プログラムを使うってことは、コンピュータに命令しているってことだからね」

果たしてそうなのだろうか?

プログラムは OS を介してコンピュータに命令をしている。でもあなたとプログラムの関係は本当に

(主) あ な た - (従) プ ロ グ ラ ム

なのだろうか。

人間は仕様という名前の制限の下で使わされてるに過ぎないのではないのか?

Ruby は、ライセンス*1 に基づいて、 公開されているフリーソフトウェア *2 だ。 ここでは「動かすことの出来る有用なプログラムのソースコードがある」事実をひとまず考えてみたい。

ソースコードは ruby インタプリタの設計図だ。理論的には、あなたはその全てを確認することが出来るし 自分の思うままに書き換えることが可能である。昔から ruby に 『++』(インクリメント)を導入して欲しい というリクエストがあるが、これだって自分で仕様を考えて、自分でコーディングして、自分で ruby インタプリタを作りさえすれば手に入る。自分の手のひらの中だけでだけど *3

この記事を読んでいるあなたは、(アプリケーション)プログラムを触るだけでなく、スクリプティング言語 に興味があるのだと思う。自分から PC に歩み寄る選択肢を選んだあなたなら、この気持ちは判ると思う。

そ こ に ソ ー ス が あ る の だ か ら 、 コ ン パ イ ル し な き ゃ 損 な の だ

あるいは、こう考える人もいるかも知れない。「プログラムを作るっていったって、OS の制限下での 話じゃないか」その通りである。しかし我々には Linux もあるし、FreeBSD / NetBSD / OpenBSD もあるし、 ソース公開したソラリスや OpenDOS や、えーっとえーっとたくさんのフリー OS があるではないか。

OS をいぢる前に(もちろん、いぢることから始めても良いけれど)プログラムをビルド(コンパイル)することから始めてみようじゃないか。 この連載は Windows OS (具体的には、Windows 2000 以降の Microsoft 製の OS たち)上で *4 、 ruby.exe をビルドする方法について説明していく。

ビルド(コンパイル)するとは?

ソースコードをコンピュータが処理可能な命令を出すモノ(プログラム)に変換する作業がコンパイルだ。 正確にはコンパイルとはソースコード→オブジェクトコードの変換を指すため、最終的なプログラム および必要なファイル群*5 を生成する 後処理的な部分も合わせて「ビルドする」といった言い方*6 を本稿では用いることとする。

開発環境

開発環境とは、ビルドするためのツール群のことだ。コンパイラやリンカなどのツール、ヘッダ/ライブラリ*7などが含まれる。 また、OS やコンパイラによっても、ビルドに必要なツールは変わっていく。

Windows OS には、基本的に開発環境は含まれないのでインストールする必要がある。

Ruby が対応している Windows 開発環境(コンパイラ)

そもそも Ruby は作者のまつもとさん曰く、「Windows は(触ってないから)知らない」(ruby-list:40205)と明言していることもあって、各環境毎にコミッターがいる状態である。

MSWin32
俗にいう VC++(Microsoft VisualStudio) をコンパイラとして利用。うさ氏 ( http://www.garbagecollect.jp/ruby/mswin32/ja/ ) が主に担当。なかださん ( http://nokada.jin.gr.jp/t/ ) や 、eban さん ( http://jarp.jin.gr.jp/diary/ ) や他多くのコントリビュータが対応。
MinGW
MSWin32 と同じ Runtime を利用する GCC。環境構築が容易という利点を持つ。担当は、Ruby全般でコントリビュートしている eban さん ( http://jarp.jin.gr.jp/diary/ )
Cygwin
UNIX エミュレート環境で動く GCC 。メインはMinGW 同様 ebanさん。
BCC32
Borland FreeCompilerを使用(bcc32.exe) 。もりきゅう氏 ( http://moriq.tdiary.net/ ) が基礎の対応(ruby-list:31865)をし、現在小西さん ( http://www001.upp.so-net.ne.jp/konishi/ruby/ja/ ) がバイナリ提供などコントリビュートしている。

詳しく知りたい向きは、青木日記突込付(2004/03/10)および、Microsoft Windows版のビルト環境による違い(ちょっと内容が古い)を読んで欲しい。

そこで MinGW ですよ

さて本稿では MinGW の開発環境をセットアップして Ruby のビルドに挑戦しようと思う。なぜ MinGW かというと

  1. Free で提供されているセットアッププログラムから簡単にインストール可能
  2. UNIX 的考えを比較的考慮しなくても利用出来る
  3. 別 PC に持っていく場合の可搬性に優れている

それでは、もう少し詳細に MinGW について見ていこう。

Minimalist GNU for Windows

MinGW Project の WEB PAGE において MinGWはこう説明されている。

MinGW: A collection of freely available and freely distributable Windows specific header files and import libraries combined with GNU toolsets that allow one to produce native Windows programs that do not rely on any 3rd-party C runtime DLLs.

なんちゃって日本語訳すると「MinGWってのはさぁ、とりあえず他に何もインストールしなくても動作するプログラムを作るための 自由に使える GNU の開発環境の Windows版なんだよね」くらいの意味である。

この文章のキモは次の2点にある

  1. 他に何もインストールしなくても動作する
  2. GNUの開発環境

同様に GCC というコンパイラが使える Cygwin では、 cygwin1.dll という動作用の DLL 他を入れないと動かない*8、しかし、UNIX 系 OS とほぼ同等の環境まで用意してくれる という違いがある。MSWin32版および bccwin32版でも基本的にフリーで環境をそろえることも可能なのだが、今回はインストールなどの手間が一番小さいと思われる MinGW および MSYS にて環境を作ることとする。

MSYS?

さていきなり出てきた MSYS であるが、先程のMinGW Projectにはこう説明がある。

MSYS: A Minimal SYStem to provide POSIX/Bourne configure scripts the ability to execute and create a Makefile used by make.

またまた適当になんちゃって訳すると「最小限の POSIX*9 と configureスクリプトが動作して Makefileを作ることが出来る環境」ってとこだ。元々 UNIX環境を祖とする Rubyの場合 UNIX的環境(上記 POSIXおよび configureスクリプトが動作する環境だ)がある方がビルドの手間がかからない。 まぁ、知ってるに越した事はないんだが「コンパイラ以外のビルドに必要なツール群が入ってる」くらいの認識でも今は OK だ。おいおい知るハメにもなるわけだし。

MinGW/MSYS環境と Cygwin 環境との大きな違いはコンパイルした実行ファイルが、動作用の DLL(msys-1.0.dll)が無くても動くことを前提にしてる部分である。

MinGW/MSYS に関しては MinGW公式ページの FAQDocumentationにも情報がある*10 。この後紹介するページにも有用な解説もあるので見て欲しい。

インストールしてみる

それではインストールについて解説する。といっても、インストール自体の解説は行わない。各自で GoogleJ:MinGW インストール から探して欲しい。だけだとあんまりなので、例えば、

MinGWを使う
http://www.geocities.jp/turtle_wide/tools/gccwin.htm :画像付きの説明ページあり
Win32 + MSYS + MinGW 2.0 で SDL の開発環境を構築
http://cefiro.homelinux.org/topics/SDL/setup-win32-mingw-2.0.html :SDL *11 用に環境構築を説明している。ただし現在は MinGW3.0

がまとまっている。で、今回は MinGW/MSYS セットアップのみをインストールする。

MinGW セットアップ

ファイルをダウンロードしたら、MinGW-3.0.0-1.exe をダブルクリックするとインストーラが起動するので画面の指示に従うだけである。

以 上

というか、上記 Google経由のページにたくさんあるので。

一つだけ忠告するならば、インストール先は C:\MinGW にしとくが吉である。他のアップデータパッケージに関しては入れないことを前提に以降は解説を行う。

MSYS

こちらも MinGW 同様インストーラからマウスクリックするだけである。インストール先は C:\MSYS\1.0 にしておく。最後にコマンドプロンプトで入力を求めてくるので

This is a post install process that will try to normalize between
your MinGW install if any as well as your previous MSYS installs
if any.  I don't have any traps as aborts will not hurt anything.
Do you wish to continue with the post install? [yn ]

「インストール後処理をするか?」 なので、『y』を入力してエンター。

Do you have MinGW installed? [yn ] y

「MinGW インストール済みか?」 その通りなので、『y』を入力してエンター。

Please answer the following in the form of c:/foo/bar.
Where is your MinGW installation?

「MinGW のインストール場所を答えよ」 なので、『C:/MinGW』を入力してエンター。

こ れ だ け で あ る

通はコンソールで CUI

さて、MinGW/MSYS 環境であるが、どうやって触るかというとコマンドプロンプトのようにキーボードから入力する環境であるコンソールが用意されている。

rxvt

MSYS のアイコンから起動すると、一瞬コマンドプロンプトが表示された後で MINGW32 というタイトルの画面が表示される。

msys_rxvt.png

rxvt は Linuxなどの UNIX互換OSなどで動くターミナルプログラムの移植版である。詳しくはこれも GoogleJ:rxvtから探索して欲しい。そうそう、こいつは初期設定のままでは、日本語は通らない *12

bash

Linuxディストリビューションではシェルはほとんどコレである。詳しいことは、GoogleJ:bashする ... というのも飽きてきたな。CUIであっても最近のシェルはファイル名補完機能というものがあって、

/c/Do(TABキー)                        →  /c/Documents and Settings
/c/Documents and Settings/ta(TABキー) →  /c/Documents and Settings/tamura

などと TAB キーを押すことで、入力を補佐してくれる機能だ。ちなみに MSYS では C:\は /c/ となる。この辺は慣れるしかないので、bash に関することと MSYS特有なことを区別して理解していく必要があるだろう。

gcc -v で確認

さて、インストールの確認も兼ねてコンパイラである gcc の環境を見ておこう。

$ gcc -v
Reading specs from c:/mingw/bin/../lib/gcc-lib/mingw32/3.2.3/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld
--with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw
--enable-threads --disable-nls --enable-languages=c++,f77,objc
--disable-win32-registry --disable-shared --enable-sjlj-exceptions
Thread model: win32
gcc version 3.2.3 (mingw special 20030504-1)

ここで、gccがありません系の反応だったり、specファイルが異常などの表示が無ければインストールは正常である。何か実際にコンパイルしてみよう。

最初は hello.c だ

こういう場合は古(いにしえ)より『Hello,World!!』と表示するプログラムを書くことになっている。で、早速ということだが、まずどうやってソースコードを書くのか?

でも Windows 連携

まず MSYSというか rxvt 上でコードを書くためのエディタとしては、vi がある。

O K ! v i 問 題 な い っ

という向きはそのまま書いていただきたい。無問題である。が、vi のキー操作を知らない向きにいきなりコードを書けってのも厳しい話だ。よって、今回は Windowsのメモ帳で書くこととする。が、しかし

rxvt で作業しているディレクトリに存在しているファイルを、どうやってメモ帳で編集するのか?

メモ帳でコードを書く

今回はその辺は、きっちりやり方を説明させていただく。しかし

今 度 だ け だ よ ん *13

$ mkdir src
$ cd src

現在は、ホームディレクトリ(/home/#{ユーザー名})にいると思うのでソースコード用にディレクトリを用意して移動する。

$ start .
$

これで、Homeディレクトリをエクスプローラが開いた状態で表示されるはずだ *14 後は何とかメモ帳から hello.cファイルを開いた状態にして欲しい。

そうしたら、以下のソースコードをコピペだ。

/* hello.c */
#include <stdio.h>
int main(void)
{
  printf("Hello,World!!\n");
  return(0);
}

gcc hello.c

ではコンパイルだ。

$ gcc hello.c
$ ls
a.exe
$ a
Hello,World!!

*15 特に問題は無いはずだ。

ruby.exe作ってみるよ

さてそれでは、第1回目を締めくくる前に Ruby をソースからビルドしてみよう。

ruby-1.8.2 preview3をコンパイルしてみる

現在の安定版は、1.8.1である。それから次期安定版の1.8.2 preview3 がアナウンスされている。最新のソースコードをWEB経由でCVSでも取得可能ではある。今回は新しさ、安定度、当原稿の都合を考え、1.8.2 preview3を対象とする。

インターネットエクスプローラでも、Firefoxでも何でも構わないので、ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.2-preview3.tar.gz をダウンロードする。その後で先ほど作った src ディレクトリにコピーをして欲しい。

解凍(展開)しなきゃ

再度 rxvtコンソールでの操作だ。コマンドラインでソースコードを解凍しよう。

$ tar xfz ruby-1.8.2-preview3.tar.gz
$ ls
ruby-1.8.2-preview3.tar.gz ruby/
$ mv ruby ruby-1.8.2-preview3
$ cd ruby-1.8.2-preview3

展開した rubyソースコードのバージョンなどが判るようにディレクトリ名を変更しておく。

たったこんだけ?

それでは、Ruby インストールガイド UNIX全般の通りにコマンドを入力する。mingw32 (ソースから)は若干古い内容なので、Cygwinを使えとか configure にオプションが必要とあるが、現在は単純にconfigureを実行するだけだ。

$ ./configure && make
(略)
$ ruby -v
ruby 1.8.2 (2004-11-06) [i386-mingw32]

道は遠い

さて ruby.exeも正常に作れたし、後は make install するだけと思ったあなた。はっきりいって

甘 い な

これから、MinGW の環境の内部・Windows の DLL などの仕組み・C言語とライブラリの関係などがあなたを待っている。実は Ruby と根本的には関係ないことなのだけど。

という訳で、次回までに2つほど宿題として課題を提示させておいてもらう。

課題その1:拡張ライブラリ

今回のビルドではいくつかの拡張ライブラリ*16が作られていない。

以下で拡張ライブラリの名前*17を表示させている *18。作られなかったライブラリの共通点を考えてみよう。

$ find . -name \*.so
./ext/bigdecimal/bigdecimal.so
./ext/digest/digest.so
./ext/digest/md5/md5.so
./ext/digest/rmd160/rmd160.so
./ext/digest/sha1/sha1.so
./ext/digest/sha2/sha2.so
./ext/dl/dl.so
./ext/enumerator/enumerator.so
./ext/etc/etc.so
./ext/fcntl/fcntl.so
./ext/nkf/nkf.so
./ext/racc/cparse/cparse.so
./ext/readline/readline.so
./ext/sdbm/sdbm.so
./ext/socket/socket.so
./ext/stringio/stringio.so
./ext/strscan/strscan.so
./ext/syck/syck.so
./ext/tk/tkutil.so
./ext/Win32API/Win32API.so
./ext/win32ole/win32ole.so

この原因を考えて欲しい。

課題その2:エディタ

vi を操作することに問題のない向きは関係ないが、メモ帳は開発に使うにはシンプル過ぎる *19。 やはりプログラミング言語用にカラーリングをしてくれたり、開発向き機能に特化したエディタの使い方に慣れた方が後々楽だ。

以下でフリーな開発系のエディタをいくつか紹介するので、インストールして試しておいて欲しい。もちろん秀丸エディタなどのシェアウェアのものであっても構わない。

Terapad
http://www5f.biglobe.ne.jp/~t-susumu/library/tpad.html
KaoriYa.net(VIM6.3)
http://www.kaoriya.net/#VIM63
まったくやる気のないぺぇじ(xyzzy)
http://www.jsdlab.co.jp/~kamei/
Meadow Wiki
http://www.meadowy.org/meadow/wiki/

あとがき

本稿を書いているときに、まつもとさんより ruby-1.8.2 のリリースが 12/25に予定されていることが発表された(ruby-dev:25193)。たくさんのコミッターの成果である。

願わくば、未来のコミッターとなる人が、この記事を読んだ方の中から出てきてくれればと思う。

Link

Ruby関連

Rubyホームページ
http://www.ruby-lang.org/ja/
1.8.2 preview3 リリース
http://www.ruby-lang.org/ja/20041108.html

Rubyのビルド

Ruby インストールガイド
http://www.ruby-lang.org/ja/install.cgi?cmd=view;name=top
rubyビルドガイド
http://i.loveruby.net/ja/rhg/cd/build.html
Ruby Binaries
http://ftp.ruby-lang.org/pub/ruby/binaries/

MinGW関連

MinGW - Minimalist GNU for Windows
http://www.mingw.org/
GnuWin32
http://gnuwin32.sourceforge.net/
MinGW 関係文書の翻訳@Studio Sixnine.
http://www.sixnine.net/cygwin/translation/index.html#s1-2 :FAQ や Documentation の翻訳文書

著者について

たむら (tamura at ruby-lang dot org)

退役エンジニア。最近人の管理だなんだで開発的な仕事が出来ないため 逃避を兼ねてるびまや雑誌原稿を書きなぐっています。

this writing special thanks for The Police on Synchronicity and VIRGIN RADIO GROOVE


*1 GPL ライセンス、または Ruby's と呼ばれる独自ライセンス http://www.ruby-lang.org/ja/LICENSE.txt を参照のこと

*2 実は『フリーソフトウェア』の定義ってやつも難しいのだが

*3 フリーソフトウェアの場合、改変が自由であるケースが多い。この辺はライセンスをきちんと確認すること

*4 ユーザーが多い、なじみがないというのがチョイスした理由だ

*5 ruby でいうならライブラリとかマニュアル関係とか

*6 configure とかもコンパイルじゃないな

*7 予め用意されている、プログラムに組み込むための材料

*8 おまけに以前はこいつの動作が不安定という問題もあった。最近はかなり安定して動作するようではある

*9 UNIX系で共通の開発的インターフェースの共通仕様のこと。詳細は http://www.atmarkit.co.jp/icd/root/31/5787131.html

*10 残念ながら英語である。この辺に関しては英語のページを避けることは現状無理だ。ちょっとした辞書と根気と慣れがあれば何とかなるものである。探すと翻訳されたページが発見されたりするわけだが

*11 http://www.libsdl.org/ フリーなクロスプラットフォームのマルチメディア開発用ライブラリ

*12 http://fun.sci.fukuoka-u.ac.jp/RWiki/rw-cgi.rb?cmd=view;name=MSYS に msys.bat の修正をすることで表示は可能だと書かれている

*13 これは決していぢわるで言っているのではなく、自分の頭で解決出来るやり方やクセをつける方が、その人のためだからである

*14 C:\msys\1.0\home\tamura とか

*15 gcc -o hello.exe hello.c など出力ファイル名を指定しなければ、a.exe が作られる。ちなみに Linuxなどの環境では ./a.out としなければ実行されない

*16 C言語で記述されたRubyを拡張する機能を持つライブラリ

*17 Windowsでは hogehoge.so という名前になる

*18 コンパイル直後に実行だ

*19 容量が 64Kまでだったり、文字コードがShiftJISしか対応してなかったり