>> 古い記事: Ruby 1.8.7 でファイルの行数カウント
<< 新しい記事: 2010-02: MinGW版Ruby 1.8.7 で csvscan をインストール

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010-02: MinGW(インストーラ不使用)で Ruby 1.8.7 をビルドする

諸事情により「インストーラ使わない」縛りにしてますが
普通にインストーラで MinGW 入れた方が早いしめんどくさくないし
良いと思います。

また、「問題の解決法」もメモっておきたかったため
ライブラリの不足などに対してその都度パッケージを探してますが、
このメモに沿ってインストーラを使わずにビルドする場合でも
先に全部ダウンロードしておくと楽だと思います。


Rubyのバージョンは 1.8.7-p249

C:\mingw をベースディレクトリとし、
ビルド用の実行ファイルやライブラリなどを

C:\mingw\bin
C:\mingw\lib
...

となるように置く。

c:\mingw\bin を環境変数 PATH に追加する必要はない。


lzma で圧縮されたファイルを開くために 今回はポータブル版の PeaZip PeaZip Portable | PortableApps.com - Portable software for USB drives http://portableapps.com/apps/utilities/peazip_portable を使った。解凍できれば何でもいい。
msysCORE-1.0.12-1-msys-1.0.12-bin.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20Base%20System/msys-1.0.12/ をダウンロードして解凍。 中身を C:/mingw に移動
msys.bat をダブルクリックしてシェルを起動。
Cannot find the rxvt.exe or sh.exe binary -- aborting. 続行するには何かキーを押してください . . .
# rxvt-2.7.10.20050409-1-msys-1.0.11-bin.tar.lzma # http://sourceforge.net/projects/mingw/files/MSYS%20rxvt/ rxvt は動かなかったので代わりに bash で bash-3.1.17-2-msys-1.0.11-bin.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20bash/ をダウンロードして解凍。 bin ディレクトリを C:\mingw に移動。 うまく動かない → パッケージを探してきて mingw ディレクトリに入れる という手順は大体同じなので以下では略します。 確認のダイアログが出てきたら「すべて上書き」で特に問題ないと思います。 msys.bat で起動するようになった。
このままでは ls すら使えないので coreutils を入れる。 coreutils-5.97-2-msys-1.0.11-bin.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20coreutils/ 中身:
 basename.exe
 cat.exe
 chmod.exe
 comm.exe
 cp.exe
 cut.exe
 date.exe
 dirname.exe
 echo.exe
 env.exe
 expr.exe
 false.exe
 fold.exe
 head.exe
 id.exe
 install.exe
 install.exe.manifest
 join.exe
 ln.exe
 ls.exe
 md5sum.exe
 mkdir.exe
 mv.exe
 od.exe
 paste.exe
 printf.exe
 pwd.exe
 rm.exe
 rmdir.exe
 sleep.exe
 sort.exe
 split.exe
 stty.exe
 tail.exe
 tee.exe
 touch.exe
 tr.exe
 true.exe
 uname.exe
 uniq.exe
 wc.exe

ruby-1.8.7-p249.tar.bz2 を解凍したディレクトリに移動 ここでは C:\mingw\__ruby_build\ruby-1.8.7-p249 以下に array.c bignum.c ... などがある状態にした。
$ pwd
/c/mingw/__ruby_build/ruby-1.8.7-p249

$ ls *.c
array.c   dmydln.c      file.c   main.c     parse.c    regex.c    struct.c
bignum.c  dmyext.c      gc.c     marshal.c  prec.c     ruby.c     time.c
class.c   enum.c        hash.c   math.c     process.c  signal.c   util.c
compar.c  enumerator.c  inits.c  numeric.c  random.c   sprintf.c  variable.c
dir.c     error.c       io.c     object.c   range.c    st.c       version.c
dln.c     eval.c        lex.c    pack.c     re.c       string.c

$ ./configure --prefix=C:/mingw/__ruby_build/ruby
./configure: line 557: sed: command not found
./configure: line 1473: sed: command not found
./configure: line 1820: grep: command not found
configure: error: could not determine MAJOR number from version.h
./configure: line 1916: sed: command not found
./configure: line 1862: sed: command not found
sed-4.2.1-1-msys-1.0.11-bin.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20sed/ grep-2.5.4-1-msys-1.0.11-bin.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20grep/
$ ./configure --prefix=C:/mingw/__ruby_build/ruby
checking build system type... i686-pc-mingw32
checking host system type... i686-pc-mingw32
checking target system type... i686-pc-mingw32
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details.

$ gcc
sh: gcc: command not found
gcc-full-4.4.0-mingw32-bin-2.tar.lzma http://sourceforge.net/projects/mingw/files/GCC%20Version%204/ (gcc-core だと後の make で失敗した)
$ ./configure --prefix=C:/mingw/__ruby_build/ruby
checking build system type... i686-pc-mingw32
checking host system type... i686-pc-mingw32
checking target system type... i686-pc-mingw32
checking for gcc... gcc
checking for C compiler default output file name...
configure: error: C compiler cannot create executables
See `config.log' for more details.

config.log を見てみる。
configure:2526: checking for C compiler default output file name
configure:2553: gcc    conftest.c  >&5
gcc.exe: CreateProcess: No such file or directory
configure:2556: $? = 1
configure:2594: result: 
configure: failed program was:
| /* confdefs.h.  */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define USE_BUILTIN_FRAME_ADDRESS 1
| /* end confdefs.h.  */
| 
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:2601: error: C compiler cannot create executables
See `config.log' for more details.
configure がコンパイラの動作を確認するために 簡単なプログラムのコンパイルが通るかチェックする箇所で ひっかかっているようなので、 試しに次のような簡単な C のソースがコンパイルできるか試してみる。
// test.c
#include <stdio.h>

int main(){
  printf("compile test\n");
  return 0;
}
コンパイルしてみる。
$ gcc --version
gcc.exe (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ gcc test.c
test.c:2:19: error: stdio.h: No such file or directory
test.c: In function 'main':
test.c:5: キルケ・ incompatible implicit declaration of built-in function 'printf'

$ LANG=C gcc test.c
test.c:2:19: error: stdio.h: No such file or directory
test.c: In function 'main':
test.c:5: warning: incompatible implicit declaration of built-in function 'printf'
ヘッダがない。
mingwrt-3.17-mingw32-dev.tar.gz http://sourceforge.net/projects/mingw/files/MinGW%20Runtime/
$ LANG=C gcc 000.c
gcc.exe: CreateProcess: No such file or directory
これだけではさすがに情報が少ないので -v オプションを付けて実行。
$ LANG=C gcc -v test.c
Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.4.0/configure --enable-languages=c,ada,c++,fortran,jav
a,objc,obj-c++ --disable-sjlj-exceptions --enable-shared --enable-libgcj --enabl
e-libgomp --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enab
le-version-specific-runtime-libs --prefix=/mingw --with-gmp=/mingw/src/gmp/root
--with-mpfr=/mingw/src/mpfr/root --build=mingw32
Thread model: win32
gcc version 4.4.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-mtune=i386'
 c:/mingw/bin/../libexec/gcc/mingw32/4.4.0/cc1.exe -quiet -v -iprefix c:\mingw\b
in\../lib/gcc/mingw32/4.4.0/ test.c -quiet -dumpbase test.c -mtune=i386 -auxbase
 test -version -o C:\DOCUME~1\user\LOCALS~1\Temp\cc3wcg3X.s
ignoring duplicate directory "/mingw/lib/gcc/mingw32/4.4.0/../../../../include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/inclu
de-fixed"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.4.0/../..
/../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
 c:\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../include
 c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include
 c:\mingw\bin\../lib/gcc/mingw32/4.4.0/include-fixed
 c:\mingw\bin\../lib/gcc/mingw32/4.4.0/../../../../mingw32/include
End of search list.
GNU C (GCC) version 4.4.0 (mingw32)
        compiled by GNU C version 4.4.0, GMP version 4.2.4, MPFR version 2.4.1.
GGC heuristics: --param ggc-min-expand=99 --param ggc-min-heapsize=129949
Compiler executable checksum: bcf3217a89a1fc135c30a5464fb171e6
COLLECT_GCC_OPTIONS='-v' '-mtune=i386'
 as -o C:\DOCUME~1\user\LOCALS~1\Temp\ccmNYym5.o C:\DOCUME~1\user\LOCALS~1\Temp\
cc3wcg3X.s
gcc.exe: CreateProcess: No such file or directory
最後の方を見ると
 as -o C:\DOCUME~1\user\LOCALS~1\Temp\ccmNYym5.o C:\DOCUME~1\user\LOCALS~1\Temp\
cc3wcg3X.s
となっていて、「ここで止まっていて次に行けないのでは?」と推測。 as というコマンドがあるかどうか確認すると、 そもそもこのコマンドが入っていない。 (ちなみに as はアセンブラです)
$ as
sh: as: command not found
binutils-2.20-1-mingw32-bin.tar.gz http://sourceforge.net/projects/mingw/files/GNU%20Binutils/
$ LANG=C gcc test.c
c:/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot find -luser32
collect2: ld returned 1 exit status
調べてみると w32apiパッケージに入っている libuser32.a が必要と分かった。 w32api-3.14-3-msys-1.0.12-dev.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20w32api/ 参考: Cygwin なんでも掲示板 http://sohda.net/cygwin/treebbs/treebbs.cgi?kako=1&all=44&s=44 入れてみたが、まったく同じメッセージが出てやはり失敗する。
$ LANG=C gcc 000.c
c:/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot fin
d -luser32
collect2: ld returned 1 exit status
libuser32.a は mingw/lib ではなく mingw/lib/w32api に入っているので、-L オプションで指定してみる。
$ LANG=C gcc -L /c/mingw/lib/w32api test.c

$ ./a.exe
compile test
という訳で、ライブラリの探索パスとして mingw/lib/w32api を見ていなかったのが原因だった test.c はコンパイルできたが、 configure や make の時にいちいち -L オプションを 指定する訳にもいかないので 環境変数経由で mingw/lib/w32api ディレクトリのことを 教える方向で調べる。
gcc -v test.c から:
LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/4.4.0/;c:/mingw/bin/../lib/gcc/;c:/
mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/lib/;c:/mingw/bin/../lib/
gcc/mingw32/4.4.0/../../../;/mingw/lib/
COLLECT_GCC_OPTIONS='-v' '-mtune=i386'
 c:/mingw/bin/../libexec/gcc/mingw32/4.4.0/collect2.exe -Bdynamic c:/mingw/bin/.
./lib/gcc/mingw32/4.4.0/../../../crt2.o c:/mingw/bin/../lib/gcc/mingw32/4.4.0/cr
tbegin.o -Lc:/mingw/bin/../lib/gcc/mingw32/4.4.0 -Lc:/mingw/bin/../lib/gcc -Lc:/
mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/lib -Lc:/mingw/bin/../lib
/gcc/mingw32/4.4.0/../../.. -L/mingw/lib C:\DOCUME~1\user\LOCALS~1\Temp\cc8ttzjz
.o -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -l
advapi32 -lshell32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt c:/min
gw/bin/../lib/gcc/mingw32/4.4.0/crtend.o
c:/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot fin
d -luser32
collect2: ld returned 1 exit status
環境変数 LIBRARY_PATH を見てるっぽい。 (ここらへんについては 「ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み」 の 539ページあたりも参考にしました )
$ echo $LIBRARY_PATH

$ export LIBRARY_PATH=/c/mingw/lib/w32api

$ echo $LIBRARY_PATH
/c/mingw/lib/w32api
$ LANG=C gcc test.c

$ ./a.exe
compile test
コンパイルできた!
$ ./configure --prefix=C:/mingw/__ruby_build/ruby
configure も成功。
$ make
sh: make: command not found
make-3.81-2-msys-1.0.11-bin.tar.lzma http://sourceforge.net/projects/mingw/files/MSYS%20make/
$ LANG=C make
gcc -g -O2     -DRUBY_EXPORT  -I. -I.    -c array.c
In file included from defines.h:186,
                 from ruby.h:37,
                 from array.c:15:
win32/win32.h:31:21: error: windows.h: No such file or directory
win32/win32.h:32:21: error: winsock.h: No such file or directory
In file included from defines.h:186,
                 from ruby.h:37,
                 from array.c:15:
(略)
ヘッダが見えてない。 ライブラリのパスが LIBRARY_PATH なら ヘッダのパスは INCLUDE_PATH かな? と思ったが C_INCLUDE_PATH が正解らしい。
$ echo $C_INCLUDE_PATH

$ export C_INCLUDE_PATH=/c/mingw/include/w32api

$ echo $C_INCLUDE_PATH
/c/mingw/include/w32api
$ make
$ make install
configure で指定したパス C:\mingw\__ruby_build\ruby にインストールされるので、 環境変数 PATH に C:\mingw\__ruby_build\ruby\bin を追加すると使えるようになる。 コマンドプロンプトで確認。
>ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mingw32]
めでたくビルド&インストール完了。 お疲れ様でした。
あとは C:\mingw\__ruby_build\ruby を ZIP圧縮したりしておけば ポータブルに使えたりします。

参考(外部リンク)

>> 古い記事: Ruby 1.8.7 でファイルの行数カウント
<< 新しい記事: 2010-02: MinGW版Ruby 1.8.7 で csvscan をインストール
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。