クロスコンパイラ gcc を作成したい!という病気に再びかかってしまいまして、リトライ中です。色々と試行錯誤の結果 Linux 環境下では何となくうまくいくようになってきまして、現在最終目標である Windows 環境下で動く gcc を作りたいと思って作業中です。
このとき、まずはと思って cygwin を使用しているのですが、結構これが罠でした。 cygwin がというよりは Windows の標準の挙動がマズイ点もあるんですが次のような問題に出遭ってしまいました。
cygwinで eglibc, gcc をビルドするのに致命的だった点
.os, .oS という中間ファイルを生成していた点で windows が通常大文字小文字を区別していないため、同一ファイルとして扱ってしまうこと。これを回避するために、.oST として Makefile らを修正する必要がありました。
結構有名な話のようで、 glibc でも同様だとか。これらについてはパッチが出回っているのでそれを適用すれば OK な模様です。
なお、 eglibc の cygwin ビルドについては、他にもまだ修正箇所があるのでこれもまたパッチを適用して回避します。
cygwin 用のパッチが不十分で、まだエラーが出ることがあります。そのため、以下のようにソースコードに修正を加えて対処します (diff形式で出しておきます) 。自分の場合では、 rpc/types.h が見つからない!というエラーが出ました。
diff -ur eglibc-2.13/libc/sunrpc/rpc/types.h eglibc-2.13_modified/libc/sunrpc/rpc/types.h --- eglibc-2.13/libc/sunrpc/rpc/types.h 2014-11-01 14:20:57.000000000 +0900 +++ eglibc-2.13_modified/libc/sunrpc/rpc/types.h 2014-11-02 12:06:46.479959400 +0900 @@ -69,6 +69,7 @@ #include#endif +/* #ifndef __u_char_defined typedef __u_char u_char; typedef __u_short u_short; @@ -84,6 +85,7 @@ typedef __caddr_t caddr_t; # define __daddr_t_defined #endif +*/ #include #include diff -ur eglibc-2.13/libc/sunrpc/rpc_clntout.c eglibc-2.13_modified/libc/sunrpc/rpc_clntout.c --- eglibc-2.13/libc/sunrpc/rpc_clntout.c 2014-11-01 14:20:57.000000000 +0900 +++ eglibc-2.13_modified/libc/sunrpc/rpc_clntout.c 2014-11-02 12:06:53.232634600 +0900 @@ -31,7 +31,7 @@ */ #include #include -#include +#include "rpc/types.h" #include "rpc_parse.h" #include "rpc_util.h" #include "proto.h"
そのほかにも gcc 4.5.3 の make では問題が発生しました。自分の環境も影響しているかもしれませんが、 gcc のビルドステップ3番目の箇所で libstdc++ の作成箇所でコンパイル内部エラーが発生してしまいました。
これについては、どうやらプリコンパイル済みヘッダの挙動が影響しているらしく、 cygwin 環境時には使用しない方向で、 –disable-libstdcxx-pch オプションをつけることで対処してみました。
gcc の make ってやはり大変です。 cygwin という環境も手伝ってなおさらです。