ここではaaacafeでC言語、D言語のCGIを動かすクロスコンパイラの作り方を紹介します。 ここ読んで難しいと思う人は、freebsdクロスコンパイラバイナリを参照してみてください。
あたりを参考にインストールしてください。
私は、ftp://ftp.u-aizu.ac.jp/pub/gnu/gnu-win32/ からsetup.exeをダウンロードしてきて次へ次へとボタンを押していってインストールしています。
注意すべき点はSelect Packagesで以下のツールをデフォルトに加えてチェックすることです。
bison | クロスコンパイラのコンパイルに必要 |
flex | binutilsのコンパイルに必要 |
make | コンパイル時に必要 |
perl | dmdのスクリプトの実行に必要 |
patch | gccにパッチをあてるのに必要 |
gcc | gcc-3.3.1-3 クロスコンパイラのコンパイルに必要 |
gcc-g++ | gcc-g++3.3.1-3 std.reclsのクロスコンパイラではないほうの通常のコンパイルに必要となったりします。なくてもいいけど、とりあえず入れておいてください。 |
vim | コマンドラインからエディットしたいときに必要 |
この作業を忘れても後からsetup.exeを使用して追加できます。
以下のソースファイルをインターネット上からダウンロードしてきます。
ファイル | 説明 | URL |
GNU binutils-2.10.1.tar.gz | freebsd用のリンカとかその他もろもろをコンパイルするために必要なツール群です。 | 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.bz2 | dのgccフロントエンドです。 | http://home.earthlink.net/~dvdfrdmn/d/ |
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
Error on line 1061: '+' is not a valid filename char
と出た場合はDOSコマンドのほうのc:\dm\bin\makeが使われている可能性があります。 DOSのコマンドが混ざるとわけがわからなくなるのでパスをはずします。
#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あたりに書いておきましょう。
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/.
として移動します。
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
としてパッチをあてます。
ダウンロード方法は、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
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 ..
autoconf
make
途中でとまる。
cp gen_unix gen_unix.cgi
aaaの場合の広告を消すのを忘れずに。
make
途中でとまる。
cp gen_config1 gen_config1.cgi
aaaの場合の広告を消すのを忘れずに。
touch config/gen_math.o touch gen_math
extern(C) { enum { FP_NAN = 0, FP_INFINITE = 1, FP_ZERO = 2, FP_SUBNORMAL = 3, FP_NORMAL = 4, } }
make
make install
これで、完璧と言いたいところですが、どうも、エラーが出る処理が出てしまっています。
shinichiro_hさんからいただいたものが安定しているのでそちらを使います。
これで、環境はすべて整いました。 i386-freebsd4-gdc main.d
これで、mainができていればOKです。
mv main main.cgi
シンボルが含まれているようなので、サイズが妙に大きいので、
strip main.cgi
として完成です。
aaacafeにupしてパーミッションを705に変えてブラウザで動作を確認しましょう。
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-*と入力しなくてもクロスコンパイルできるようになります。
上記のサイトを参考にしてください。
./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