freebsdクロスコンパイル(gdc-1g)


cygwin->freebsdのクロスコンパイル(gdc-1g)

ここではaaacafeでC言語、D言語のCGIを動かすクロスコンパイラの作り方を紹介します。 ここ読んで難しいと思う人は、freebsdクロスコンパイラバイナリを参照してみてください。

Cygwinのインストール

あたりを参考にインストールしてください。

私は、ftp://ftp.u-aizu.ac.jp/pub/gnu/gnu-win32/ からsetup.exeをダウンロードしてきて次へ次へとボタンを押していってインストールしています。

注意すべき点はSelect Packagesで以下のツールをデフォルトに加えてチェックすることです。

bisonクロスコンパイラのコンパイルに必要
flexbinutilsのコンパイルに必要
makeコンパイル時に必要
perldmdのスクリプトの実行に必要
patchgccにパッチをあてるのに必要
gccgcc-3.3.1-3 クロスコンパイラのコンパイルに必要
gcc-g++gcc-g++3.3.1-3 std.reclsのクロスコンパイラではないほうの通常のコンパイルに必要となったりします。なくてもいいけど、とりあえず入れておいてください。
vimコマンドラインからエディットしたいときに必要

この作業を忘れても後からsetup.exeを使用して追加できます。

ダウンロード

以下のソースファイルをインターネット上からダウンロードしてきます。

ファイル説明URL
GNU binutils-2.10.1.tar.gzfreebsd用のリンカとかその他もろもろをコンパイルするために必要なツール群です。http://ftp.gnu.org/gnu/binutils/
GNU gcc-3.3.2.tar.bz2(現在gcc-3.4.0.tar.bz2は、c++が通らない) freebsd用のgcc,g++,gdcを作るためのものです。http://ftp.gnu.org/gnu/gcc/
gdc-1g.tar.bz2dのgccフロントエンドです。http://home.earthlink.net/~dvdfrdmn/d/
  • 拾ってきたファイルは/usr/src/以下においておきます。

binutilsのインストール

cd /usr/src/
tar zxf binutils-2.10.1.tar.gz

これで、/usr/src/binutils-2.10.1/ディレクトリができる。

cd /usr/src/binutils-2.10.1/
./configure --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin
make
  • prefix インストールするディレクトリです。
  • target クロスコンパイルする先の名前です。
  • host クロスコンパイルするマシンの環境の名前です。
Error on line 1061: '+' is not a valid filename char

と出た場合はDOSコマンドのほうのc:\dm\bin\makeが使われている可能性があります。 DOSのコマンドが混ざるとわけがわからなくなるのでパスをはずします。

  • etc/profileの以下の部分を直します。
#PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:$PATH"
PATH="/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin"
make install
ls /usr/local/freebsd/bin

で以下のファイルができていればbinutilsのインストールは成功です。

i386-freebsd4-addr2line.exe  i386-freebsd4-objcopy.exe
i386-freebsd4-ar.exe         i386-freebsd4-objdump.exe
i386-freebsd4-as.exe         i386-freebsd4-ranlib.exe
i386-freebsd4-c++filt.exe    i386-freebsd4-readelf.exe
i386-freebsd4-gasp.exe       i386-freebsd4-size.exe
i386-freebsd4-ld.exe         i386-freebsd4-strings.exe
i386-freebsd4-nm.exe         i386-freebsd4-strip.exe
export PATH=/usr/local/freebsd/bin:$PATH

などとしてパスを通します。.bash_profileあたりに書いておきましょう。

gdcのインストール

  • 解凍
cd /usr/src/
tar jxf gcc-3.3.2.tar.bz2

これで/usr/src/gcc-3.3.2/ディレクトリができます。

tar jxf gdc-1g.tar.bz2

これで/usr/src/d/ディレクトリができます。

mv d gcc-3.3.2/gcc/.

として移動します。

  • gcc のパッチ当てを行います。

dディレクトリ内にバージョンにあったGCCパッチがあります。名前はpatch-gcc-....といった感じです。今回はpatch-gcc-3.3.2を使います。

cd /usr/src/gcc-3.3.2/gcc/
patch -p1 < d/patch-gcc-3.3.2

としてパッチをあてます。

  • freebsdのincludeファイルとlibファイルのダウンロード
    • aaacafeの/usr/include 以下をダウンロードしてきて、 /usr/local/freebsd/i386-freebsd4/include以下にコピーします。
    • aaacafeの/usr/lib 以下をダウンロードしてきて、/usr/local/freebsd/i386-freebsd4/lib以下にコピーします。

ダウンロード方法は、cgiスクリプトを書いて、自分の見えるフォルダにコピーしてftpでダウンロードすればOKです。何十メガと大きいので心配かもしれませんが、200Mまでaaacafeで領域を使えるので大丈夫です。この作業は各自の責任で十分注意しながら行ってください。

includeとlibは全部必要なわけでもないと思いますが、どれが必要でどれが必要でないか調べることができないので(ファイルが多すぎてめんどくさい)全部ダウンロードしています。


クロスコンパイラのコンパイル

cd /usr/src/gcc-3.3.2/
./configure --enable-languages=c,d,c++ --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin
make
make install
  • prefix インストールするディレクトリです。
  • target クロスコンパイルする先の名前です。
  • host クロスコンパイルするマシンの環境の名前です。

Phobos(ライブラリのコンパイル)

cd /usr/src/gcc-3.3.2/gcc/d/phobos/
./prepcygwin.sh
CC=i386-freebsd4-gcc CXX=i386-freebsd4-g++ DFLAGS="-O2 -frelease" \
./configure --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin
cd boehm-gc
host_alias=i386-cygwin target_alias=i386-freebsd4 \
CC=i386-freebsd4-gcc CXX=i386-freebsd4-g++ DFLAGS="-O2 -frelease" \
./configure --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin \
--cache-file=/dev/null --srcdir=.
cd ..
  • gcc/d/phobos/configure.in の AC_CONFIG_SUBDIRS([$d_config_subdirs]) を削除。
autoconf
  • boem-gc以下のgen_unix.c、gen_config1.c のmain()関数にそれぞれprintf("content-type: text/html\n\n");を追加
make

途中でとまる。

cp gen_unix gen_unix.cgi
  • サーバにgen_unix.cgiをup実行、結果を、gcc/d/phobos/frag-unixに保存

aaaの場合の広告を消すのを忘れずに。

make

途中でとまる。

cp gen_config1 gen_config1.cgi
  • サーバにgen_config1.cgiをup実行、結果を、gcc/d/phobos/frag-genに保存

aaaの場合の広告を消すのを忘れずに。

touch config/gen_math.o
touch gen_math
  • frag-mathを以下の内容で保存
	extern(C) {
	enum {
	  FP_NAN = 0,
	  FP_INFINITE = 1,
	  FP_ZERO = 2,
	  FP_SUBNORMAL = 3,
	  FP_NORMAL = 4,
	}
	}
make
  • libphobos.specの*lib: -lm -lc_r %(liborig) この個所を*lib: -lm -lc_rと直す。
make install

ライブラリ(phobos)のコピー

これで、完璧と言いたいところですが、どうも、エラーが出る処理が出てしまっています。

shinichiro_hさんからいただいたものが安定しているのでそちらを使います。

  • phobosはここからダウンロードしてください。filelibphobos.tgz
  • libphobos.a を/usr/local/freebsd/lib/に入れます。
  • libphobosnm.a を/usr/local/freebsd/lib/に入れます。

コンパイル

これで、環境はすべて整いました。
i386-freebsd4-gdc main.d

これで、mainができていればOKです。

mv main main.cgi

シンボルが含まれているようなので、サイズが妙に大きいので、

strip main.cgi

として完成です。

UPLOAD

aaacafeにupしてパーミッションを705に変えてブラウザで動作を確認しましょう。


dmdでコンパイルできるようにする。

cygwin上ではクロスコンパイルしかしない場合

cp /usr/local/freebsd/bin/i386-freebsd4-gdc.exe /usr/local/freebsd/bin/gdc.exe

とすれば、

dmd main.d

でコンパイルできるようになります。 また、

export PATH=/usr/local/freebsd/i386-freebsd4/bin:$PATH

としておけば、gccやg++などもi386-freebsd4-*と入力しなくてもクロスコンパイルできるようになります。

cygwin アンインストール

上記のサイトを参考にしてください。

gcc-3.4.0のc++のクロスコンパイル(未完)

./configure --enable-languages=c++ --prefix=/usr/local/freebsd/ --target=i386-freebsd4 --host=i386-cygwin

c++はなぜか、makeの段階で以下のエラーをはいてとまってしまいます。

/usr/src/gcc-3.4.0/gcc/xgcc -shared-libgcc -B/usr/src/gcc-3.4.0/gcc/ -nostdinc++
 -L/usr/src/gcc-3.4.0/i386-freebsd4/libstdc++-v3/src -L/usr/src/gcc-3.4.0/i386-f
reebsd4/libstdc++-v3/src/.libs -B/usr/local/freebsd//i386-freebsd4/bin/ -B/usr/l
ocal/freebsd//i386-freebsd4/lib/ -isystem /usr/local/freebsd//i386-freebsd4/incl
ude -isystem /usr/local/freebsd//i386-freebsd4/sys-include -I/usr/src/gcc-3.4.0/
i386-freebsd4/libstdc++-v3/include/i386-freebsd4 -I/usr/src/gcc-3.4.0/i386-freeb
sd4/libstdc++-v3/include -I/usr/src/gcc-3.4.0/libstdc++-v3/libsupc++ -O2 -g -O2
-g -O2 -fno-implicit-templates -Wall -W -Wwrite-strings -Wcast-qual -fdiagnostic
s-show-location=once -ffunction-sections -fdata-sections -I/usr/src/gcc-3.4.0/i3
86-freebsd4/libstdc++-v3/include/backward -Wno-deprecated -c ../../.././libstdc+
+-v3/src/strstream.cc  -fPIC -DPIC -o .libs/strstream.o
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s: Assembler messages:
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s:8818: Error: ignoring jun
k `(%ecx)' after expression
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s:8832: Error: ignoring jun
k `(%ecx)' after expression
/cygdrive/c/DOCUME~1/ADMINI~1/LOCALS~1/Temp/ccXeyeF0.s:8983: Error: ignoring jun
k `(%ecx)' after expression

参考リンク

コメント

*MenuBar

人気の10件

  • counter: 7960
  • today: 1
  • yesterday: 0
  • online: 1