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 の下で行う ものとします。
cdmkdir gdcbuildcd gdcbuildbzip2 -dc ~/arc/gcc-4.0.3.tar.bz2 | tar xvf -cd gcc-4.0.3/gccbzip2 -dc ~/arc/gdc-0.22-src.tar.bz2 | tar xvf -cd .../gcc/d/setup-gcc.shmkdir build_cygwincd 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++,dmakemake 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 ~/gdcbuildbzip2 -dc ~/arc/cygwin-src-yyyymmdd.tar.bz2 | tar xvf -cd gcc-4.0.3ln -s ../cygwin-snapshot-yyyymmdd-1/winsup .mkdir /usr/local/gdc/i686-pc-mingw32mkdir /usr/local/gdc/i686-pc-mingw32/binln -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_mingwcd 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++,dmakemake 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回のペース)。
- なにやら動かなくても 自力解決が求められる。
あれ?デメリットの方が多いなぁ(^^; まぁ、「そこに山があるから」という事で。