CygwinでのGDCビルド手順
Table of Contents
1 はじめに
GDCはGCCのD言語 フロントエンドです。 最近のCygwinのパッケージにはGDCバイナリが含まれていたりするのですが、 バージョンが少々古いです。その為、最新のGDC&GCCに追従すべく 敢えて最初からビルドする方法を示してます。
2 前準備
コンパイルの為に、予めCygwinをインストールしておく必要があります。 初期インストール時に選択されたパッケージだけでは、コンパイラなどは インストールされません。最低でも gcc, g++, mingw-runtime パッケージ の追加インストールが必要(configureを通すのに他にも要るかも)と思われます。
3 必要なアーカイブ
以下のtar-ballを公式ページやWebミラーなどからダウンロードしてください。
- gcc-4.0.3.tar.bz2 : GCCのソース一式
- gdc-0.22-src.tar.bz2 : GDCのソース一式
- cygwin-src-yyyymmdd.tar.bz2 : Cygwinソース一式
GCCは実際にビルドして特に問題の無かった4.0.3を使用するものとします。
GDCのソースアーカイブは GDC - D Programming Language for GCC のWebサイトよりダウンロードします。今回は0.22を使用してますが、 今後のバージョンアップでも大きく手順が変わる事は無いでしょう。
CygwinのソースアーカイブはMinGW対応のGDCをビルドするのに使用します。 Cygwinスナップショットのページ から ダウンロードするのが良いでしょう。 CygwinターゲットのGDCをビルドするだけであれば、特に用意する必要はありません。
4 Cygwinをターゲットとしたビルド
/usr/local/gdc にインストールするものとしてビルドします。 アーカイブ群は ~/arc の下に、ビルドは ~/gdcbuild の下で行う ものとします。
cd
mkdir gdcbuild
cd gdcbuild
bzip2 -dc ~/arc/gcc-4.0.3.tar.bz2 | tar xvf -
cd gcc-4.0.3/gcc
bzip2 -dc ~/arc/gdc-0.22-src.tar.bz2 | tar xvf -
cd ..
./gcc/d/setup-gcc.sh
mkdir build_cygwin
cd build_cygwin
../configure --prefix=/usr/local/gdc --with-gnu-ld --with-gnu-as --enable-threads --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-languages=c,c++,d
make
make install
以上で、/usr/local/gdc/binにパスを通せば、gdcコンパイラが使用できます。
$ gdc -v Using built-in specs. Target: i686-pc-cygwin Configured with: ../configure --prefix=/usr/local/gdc --with-gnu-ld --with-gnu-as --enable-threads --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-languages=c,c++,d Thread model: posix gcc version 4.0.3 (gdc 0.22, using dmd 1.004)
configureオプションはCygwin用gdcバイナリと同じにしてみました。 コマンドラインだけを列記しましたが、gdcのREADMEやINSTALLなども 読んでみてください。
5 MinGWをターゲットとしたビルド
「Cygwinをターゲットとしたビルド」の手順「8.」まで実行した所から 始めます。
cd ~/gdcbuild
bzip2 -dc ~/arc/cygwin-src-yyyymmdd.tar.bz2 | tar xvf -
cd gcc-4.0.3
ln -s ../cygwin-snapshot-yyyymmdd-1/winsup .
mkdir /usr/local/gdc/i686-pc-mingw32
mkdir /usr/local/gdc/i686-pc-mingw32/bin
ln -s /usr/bin/ar.exe /usr/local/gdc/i686-pc-mingw32/bin/.
ln -s /usr/bin/as.exe /usr/local/gdc/i686-pc-mingw32/bin/.
ln -s /usr/bin/ld.exe /usr/local/gdc/i686-pc-mingw32/bin/.
ln -s /usr/bin/nm.exe /usr/local/gdc/i686-pc-mingw32/bin/.
ln -s /usr/bin/strip.exe /usr/local/gdc/i686-pc-mingw32/bin/.
ln -s /usr/bin/ranlib.exe /usr/local/gdc/i686-pc-mingw32/bin/.
mkdir /usr/local/gdc/i686-pc-mingw32/include
/bin/cp -pr /usr/include/mingw/* /usr/local/gdc/i686-pc-mingw32/include/.
mkdir /usr/local/gdc/i686-pc-mingw32/lib
/bin/cp -pr /usr/lib/mingw/* /usr/local/gdc/i686-pc-mingw32/lib/.
mkdir /usr/local/gdc/i686-pc-mingw32/sys-include
/bin/cp -pr /usr/include/w32api/* /usr/local/gdc/i686-pc-mingw32/sys-include/.
mkdir build_mingw
cd build_mingw
../configure --prefix=/usr/local/gdc --target=i686-pc-mingw32 --with-gnu-ld --with-gnu-as --enable-threads --disable-win32-registry --disable-shared --enable-sjlj-exceptions --disable-nls --enable-languages=c,c++,d
make
make install
以上で、-mno-cygwin オプションが使用可能となり、cygwin1.dll非依存の 実行バイナリを生成できます。
$ gdc -mno-cygwin -v Using built-in specs. Target: i686-pc-mingw32 Configured with: ../configure --prefix=/usr/local/gdc --with-gnu-ld --with-gnu-as --enable-threads --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-languages=c,c++,d Thread model: posix gcc version 4.0.3 (gdc 0.22, using dmd 1.004)
6 その他
gdc-0.22ではgcc-4.1.x対応されているようですが、Cygwinパッケージ版の gcc-3.4.4ではビルドでコンパイルエラーが発生するようです。一度gcc-4.0.3を ビルドして、それを踏み台にgcc-4.1.xをビルドすれば Cygwinターゲットの gdcはビルドできるようですが、MinGWターゲットのgdcはビルド時にコンパイル エラーになるようです。(2007/03/03時点)
実は本家のdmdコンパイラは使用した事がありません。ライブラリやツールの 事が良くわからないから、というのが理由です(^^; GDCを使用するメリットは多数りますが、デメリットも多数存在します。
- メリット
- Cygwin用にビルドされたライブラリが使用できる。
- デメリット
- DMDサイトなどで書かれている例がそのまま使えない場合がある。
- DMD最新バージョンへの追従はできない(GDCのリリースは半年に1回のペース)。
- なにやら動かなくても 自力解決が求められる。
あれ?デメリットの方が多いなぁ(^^; まぁ、「そこに山があるから」という事で。