MinGWターゲットのクロスGDCをCygwinでビルド

目次

1 はじめに

GDCはGCCのD言語(本家,日本語(少し古い)) フロントエンドです。 2016年8月現在 github でメンテナンスが行われています。

MinGWでGDCのネイティブビルドを行っていたのですが、MinGWコンパイラをアップデートすると 動かないCコンパイラがインストールされるようになった為、Cygwin上でMinGWターゲットの クロスGDCコンパイラをビルドしてみました。 ここでは、(ほぼ)最新のGDC&GCCに追従すべく敢えてソースからビルドする方法を示してます。

2 前準備

クロスコンパイラをビルドする為にいくつかのCygwinパッケージを予めインストール しておく必要があります。確認には32bit-Cygwinを使用しています。 64bit-Cygwin(Cygwin64)では試していませんが、多分 イケるんじゃないかと思います (ダメそうだった時は どうにかがんばってみて下さい(^^;)。

  • コンパイラ本体のビルドに必要なツール群。 gcc-core, gcc-g++, libgmp-devel, libmpfr-devel, libmpc-devel, .... 他にも 必要なものがあるかも知れませんが、足りなければ入れていただく感じで。

ビルドしたクロスコンパイラで使用するアセンブラやライブラリをインストール しておく必要があります。必要であれば全部入れても良いですし、必要なターゲット だけ入れても良いと思います。

  • i686-pc-mingw32ターゲットのツール群。 mingw-gcc-core, mingw-w32api, ....
  • i686-w64-mingw32ターゲットのツール群。 mingw64-i686-gcc-core, mingw64-i686-headers, ....
  • x86_64-w64-mingw32ターゲットのツール群。 mingw64-x86_64-gcc-core, mingw64-x86_64-headers, ....

いずれも、ターゲットgccを入れれば関連するライブラリ等のパッケージはついでに 入るかも知れませんが、足りなければ入れていただく感じで。 各ターゲットのCコンパイラで、簡単なC言語のプログラムをコンパイル&実行できれば、 ひとまずインストールできていると思われます。

$ cat test.c
#include <stdlib.h>
#include <stdio.h>

void main()
{
    printf("Hello " TARGET " World\n") ;
    return ;
}

$ i686-pc-mingw32-gcc -DTARGET='"i686-pc-mingw32"' test.c

$ ./a.exe
Hello i686-pc-mingw32 World

$ i686-w64-mingw32-gcc -DTARGET='"i686-w64-mingw32"' test.c

$ ./a.exe
Hello i686-w64-mingw32 World

$ x86_64-w64-mingw32-gcc -DTARGET='"x86_64-w64-mingw32"' test.c

$ ./a.exe
Hello x86_64-w64-mingw32 World

3 必要なファイル

以下のアーカイブを公式ページやWebミラーなどからダウンロードしてください。

3.1 全ターゲットに共通のファイル

3.2 i686-pc-mingw32ターゲットのクロスGDCビルドに必要なファイル

CygwinパッケージでインストールしたMinGWライブラリではビルドしたGDCを使って うまく動く実行ファイルを生成できませんでした。この為、不本意ながら出来合いの ライブラリを使用します。

3.3 i686-w64-mingw32ターゲットのクロスGDCビルドに必要なファイル

追加で必要なファイルはありません。

3.4 x86_64-w64-mingw32ターゲットのクロスGDCビルドに必要なファイル

CygwinパッケージでインストールしたMinGWライブラリではビルドしたGDCを使って うまく動く実行ファイルを生成できませんでした。この為、不本意ながら出来合いの ライブラリを使用します。

3.5 使用するGDCのソースについて

GCCは実際にビルドして特に問題の無かった バージョン6.1.0 を使用しています。 GDCのソースアーカイブはgithubのGDCページからダウンロードします。 ただし、masterブランチはgcc-7向けにメンテナンスされていますので、 gdc-6のブランチからソースを取得します。 ソースの取得方法は色々ありますが、TANEは Network から取得する方法を使用しています。 gdc-6の線から任意のバージョンを選択して画面移動、「Browse files」ボタンを 押して更に画面移動し、「Clone or download」ボタンを押すと表示される「Download ZIP」 ボタンでソース一式を取得します。

2016年8月時点では、MinGW向けはアルファ品質という位置付けの為、 必ずしも最新のソースが万事問題無しという訳ではありません。この為、 本ページでは、ビルド&実行がうまくできたバージョンで説明しています。

4 クロスGDCのビルド手順

4.1 GDCソースの展開とセットアップ

まずはGDCのソース本体を展開し、パッチを適用します。 アーカイブ群は ~/Downloads の下に、ビルドはカレントディレクトリで行うものとします。

  1. unzip ~/Downloads/GDC-e9bcb3abd15e2987d2d46f7a49e7e34ac0975d22.zip
  2. xz -dc ~/Downloads/gcc-6-patches_160812.tar.xz | tar xf -
  3. cd GDC-e9bcb3abd15e2987d2d46f7a49e7e34ac0975d22
  4. bzip2 -dc ~/Downloads/gcc-6.1.0.tar.bz2 | tar xf -
  5. ./setup-gcc.sh gcc-6.1.0
  6. pushd gcc-6.1.0
  7. patch -p1 < ../../gcc-6-patches_160812/mingw-gdc-gcc.patch
  8. popd
  9. patch -p0 < ../gcc-6-patches_160812/mingw-gdc.patch
  10. bzip2 -dc ~/Downloads/binutils-2.23.1.tar.bz2 | tar xf -
  11. pushd binutils-2.23.1
  12. patch -p1 < ../../gcc-6-patches_160812/mingw-tls-binutils-2.23.1.patch
  13. popd

以降、必要なターゲットについてビルドしていきます。

4.2 i686-pc-mingw32ターゲットでビルド

例では /usr/local/gdc2068_610_mingwcross にインストールするものとしてビルドします。 アーカイブ群は ~/Downloads の下に、ビルドは「GDC-ソースの展開とセットアップ」を実行 した直後をカレントディレクトリ(GDC-*ディレクトリの中)とします。 もし本ターゲットのクロスコンパイラが必要無ければビルドの必要はありません。

binutilsをビルドします(TLS(Thread Local Storage)対応が必要な為)。

  1. mkdir build_binutils_i686-pc
  2. pushd build_binutils_i686-pc
  3. ../binutils-2.23.1/configure --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-pc-mingw32 --with-arch=i686 --prefix=/usr/local/gdc2068_610_mingwcross --disable-nls --disable-win32-registry --with-sysroot=/usr/i686-pc-mingw32/sys-root --disable-werror
  4. make
  5. make install
  6. popd

gcc,g++とgdcをビルドします。

  1. mkdir build_gdc_i686-pc
  2. pushd build_gdc_i686-pc
  3. ../gcc-6.1.0/configure --with-pkgversion=gdc-6" e9bcb3abd1(DMD2.068)" --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-pc-mingw32 --enable-languages=c,c++,d --prefix=/usr/local/gdc2068_610_mingwcross --with-sysroot=/usr/i686-pc-mingw32/sys-root --enable-threads --disable-libssp --disable-nls --enable-sjlj-exceptions --disable-bootstrap
  4. make
  5. make install
  6. popd

TLSパッチの当たったMinGWライブラリバイナリをインストールします。

  1. pushd /usr/local/gdc2068_610_mingwcross/i686-pc-mingw32/lib
  2. xz -dc ~/Downloads/mingwlibs_for_i686-pc-mingw32.tar.xz | tar xf -
  3. popd

以上で、/usr/local/gdc2068_610_mingwcross/binと/usr/i686-pc-mingw32/binにパスを通せば gdcクロスコンパイラが使用できます。

$ export PATH="/usr/local/gdc2068_610_mingwcross/bin:/usr/i686-pc-mingw32/bin:$PATH"

$ i686-pc-mingw32-gdc.exe -v
Using built-in specs.
COLLECT_GCC=i686-pc-mingw32-gdc
COLLECT_LTO_WRAPPER=/usr/local/gdc2068_610_mingwcross/libexec/gcc/i686-pc-mingw32/6.1.0/lto-wrapper.exe
Target: i686-pc-mingw32
Configured with: ../gcc-6.1.0/configure --with-pkgversion='gdc-6 e9bcb3abd1(DMD2.068)' --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-pc-mingw32 --enable-languages=c,c++,d --prefix=/usr/local/gdc2068_610_mingwcross --with-sysroot=/usr/i686-pc-mingw32/sys-root --enable-threads --disable-libssp --disable-nls --enable-sjlj-exceptions --disable-bootstrap
Thread model: win32
gcc version 6.1.0 (gdc-6 e9bcb3abd1(DMD2.068))

4.3 i686-w64-mingw32ターゲットでビルド

例では /usr/local/gdc2068_610_mingwcross にインストールするものとしてビルドします。 アーカイブ群は ~/Downloads の下に、ビルドは「GDC-ソースの展開とセットアップ」を実行 した直後をカレントディレクトリ(GDC-*ディレクトリの中)とします。 もし本ターゲットのクロスコンパイラが必要無ければビルドの必要はありません。

binutilsをビルドします。

  1. mkdir build_binutils_i686-w64
  2. pushd build_binutils_i686-w64
  3. ../binutils-2.23.1/configure --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-w64-mingw32 --with-arch=i686 --prefix=/usr/local/gdc2068_610_mingwcross --disable-nls --disable-win32-registry --with-sysroot=/usr/i686-w64-mingw32/sys-root --disable-werror
  4. make
  5. make install
  6. popd

gcc,g++とgdcをビルドします。

  1. mkdir build_gdc_i686-w64
  2. pushd build_gdc_i686-w64
  3. ../gcc-6.1.0/configure --with-pkgversion=gdc-6" e9bcb3abd1(DMD2.068)" --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-w64-mingw32 --enable-languages=c,c++,d --prefix=/usr/local/gdc2068_610_mingwcross --with-sysroot=/usr/i686-w64-mingw32/sys-root --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --enable-threads=win32 --disable-win32-registry --enable-target-optspace --disable-nls --disable-bootstrap --disable-shared --disable-multilib --enable-long-long
  4. make
  5. make install
  6. popd

以上で、/usr/local/gdc2068_610_mingwcross/binと/usr/i686-w64-mingw32/binにパスを通せば gdcクロスコンパイラが使用できます。

$ export PATH="/usr/local/gdc2068_610_mingwcross/bin:/usr/i686-w64-mingw32/bin:$PATH"

$ i686-w64-mingw32-gdc.exe -v
Using built-in specs.
COLLECT_GCC=i686-w64-mingw32-gdc
COLLECT_LTO_WRAPPER=/usr/local/gdc2068_610_mingwcross/libexec/gcc/i686-w64-mingw32/6.1.0/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../gcc-6.1.0/configure --with-pkgversion='gdc-6 e9bcb3abd1(DMD2.068)' --build=i686-pc-cygwin --host=i686-pc-cygwin --target=i686-w64-mingw32 --enable-languages=c,c++,d --prefix=/usr/local/gdc2068_610_mingwcross --with-sysroot=/usr/i686-w64-mingw32/sys-root --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --enable-threads=win32 --disable-win32-registry --enable-target-optspace --disable-nls --disable-bootstrap --disable-shared --disable-multilib --enable-long-long
Thread model: win32
gcc version 6.1.0 (gdc-6 e9bcb3abd1(DMD2.068))

4.4 x86_64-w64-mingw32ターゲットでビルド

例では /usr/local/gdc2068_610_mingwcross にインストールするものとしてビルドします。 アーカイブ群は ~/Downloads の下に、ビルドは「GDC-ソースの展開とセットアップ」を実行 した直後をカレントディレクトリ(GDC-*ディレクトリの中)とします。 もし本ターゲットのクロスコンパイラが必要無ければビルドの必要はありません。

binutilsをビルドします。

  1. mkdir build_binutils_x86_64-w64
  2. pushd build_binutils_x86_64-w64
  3. ../binutils-2.23.1/configure --build=i686-pc-cygwin --host=i686-pc-cygwin --target=x86_64-w64-mingw32 --prefix=/usr/local/gdc2068_610_mingwcross --disable-nls --disable-win32-registry --with-sysroot=/usr/x86_64-w64-mingw32/sys-root --disable-werror
  4. make
  5. make install
  6. popd

gcc,g++とgdcをビルドします。

  1. mkdir build_gdc_x86_64-w64
  2. pushd build_gdc_x86_64-w64
  3. ../gcc-6.1.0/configure --with-pkgversion=gdc-6" e9bcb3abd1(DMD2.068)" --build=i686-pc-cygwin --host=i686-pc-cygwin --target=x86_64-w64-mingw32 --enable-languages=c,c++,d --prefix=/usr/local/gdc2068_610_mingwcross --with-sysroot=/usr/x86_64-w64-mingw32/sys-root --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --enable-threads=win32 --disable-win32-registry --enable-target-optspace --disable-nls --disable-bootstrap --disable-shared --disable-multilib --enable-long-long
  4. make
  5. make install
  6. popd

MinGWライブラリバイナリをインストールします。

  1. pushd /usr/local/gdc2068_610_mingwcross/x86_64-w64-mingw32/lib
  2. xz -dc ~/Downloads/mingwlibs_for_x86_64-w64-mingw32.tar.xz | tar xf -
  3. popd

以上で、/usr/local/gdc2068_610_mingwcross/binと/usr/x86_64-w64-mingw32/binにパスを通せば gdcクロスコンパイラが使用できます。

$ export PATH="/usr/local/gdc2068_610_mingwcross/bin:/usr/x86_64-w64-mingw32/bin:$PATH"

$ x86_64-w64-mingw32-gdc -v

5 外部ライブラリのMinGWクロスビルド

全てD言語で書かれたプログラムでは必要ありませんが、画像などを扱う場合は 既存のC言語で書かれたライブラリを利用するのが便利な場合があります。 ここではクロスCコンパイラを使用してライブラリをビルドする例をいくつか示します。

5.1 ライブラリの使用にあたって

MinGWターゲットのGDCでは、明にスタティックリンク指示しないと 動かない実行ファイルが生成される場合があります。 コンパイルした実行ファイルをCygwinのコマンドプロンプトから実行したが起動できない とか、ファイルエクスプローラから起動したら

[エラーダイアログ]

のようなエラーダイアログが表示される場合があるようです。スタティックリンク するには -static オプションをコンパイラ引数に加えてみてください。

i686-pc-mingw32-gdc -static ....

5.2 前準備

ターゲット毎にビルドする必要があります。ビルドするターゲット用のコンパイラが 使用できるように予めPATHを通しておきます。

本項の説明では i686-w64-mingw32 を例にしています。また、 /usr/local/gdc2068_610_mingwcross にインストールするものとし、ソースアーカイブは ~/Downloads の下に置いてあるものとしています。

5.3 JPEGライブラリのビルド

http://www.ijg.org/ よりソースアーカイブ(2015/9/3時点で jpegsrc.v9a.tar.gz) を取得し、以下の手順でビルドします。

  1. gzip -dc ~/Downloads/jpegsrc.v9a.tar.gz | tar xf -
  2. mkdir -p jpeg-9a/build_i686-w64
  3. pushd jpeg-9a/build_i686-w64
  4. ../configure --target=i686-w64-mingw32 --host=i686-w64-mingw32 --build=i686-pc-cygwin --prefix=/usr/local/gdc2068_610_mingwcross/i686-w64-mingw32 --disable-shared
  5. make
  6. make install
  7. popd

5.4 zlibライブラリのビルド

http://www.zlib.net/ よりソースアーカイブ(2015/9/3時点で zlib-1.2.8.tar.xz) を取得し、以下の手順でビルドします。

  1. xz -dc ~/Downloads/zlib-1.2.8.tar.xz | tar xf -
  2. pushd zlib-1.2.8
  3. make -fwin32/Makefile.gcc CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar
  4. cp -p zlib.h zconf.h /usr/local/gdc2068_610_mingwcross/i686-w64-mingw32/include/.
  5. cp -p libz.a /usr/local/gdc2068_610_mingwcross/i686-w64-mingw32/lib/.
  6. popd

configureがクロスコンパイル対応になっていないようなので、make実行時にクロスコンパイラと クロスアーカイバを指定しています。 また、ヘッダファイルとスタティックライブラリを手動コピーしてインストールしています。

5.5 PNGライブラリのビルド

http://www.libpng.org/pub/png/ よりソースアーカイブ (2015/9/3時点で libpng-1.6.18.tar.xz)を取得し、以下の手順でビルドします。

予め zlibライブラリをビルド&インストールしておく必要があります。インストールされていないと configure実行が失敗します。

  1. xz -dc ~/Downloads/libpng-1.6.18.tar.xz | tar xf -
  2. mkdir -p libpng-1.6.18/build_i686-w64
  3. pushd libpng-1.6.18/build_i686-w64
  4. ../configure --target=i686-w64-mingw32 --host=i686-w64-mingw32 --build=i686-pc-cygwin --prefix=/usr/local/gdc2068_610_mingwcross/i686-w64-mingw32 --disable-shared
  5. make
  6. make install
  7. popd

5.6 どうしてもクロスビルドがうまくいかないとき

configureがクロスコンパイルに対応していなかったり、cmakeを使用していたりするような ライブラリでは、クロスコンパイルが簡単でない場合があります。 MinGWネイティブビルドできるのであれば、理論上は 時間と根気を使ってビルドできるハズ なのですが、実際のところ 途中で挫けざるを得ない事が多々あります。 そのような場合は諦めて (ちょっと古いコンパイラでビルドする事になるかも知れませんが) MinGWネイティブ環境でビルドし、出来上がったヘッダファイルとライブラリをコピーして 使うのが現実的な対応だと思います。

逆に、全てD言語化できればこのような悩みは無くなるかも知れません。 既存ライブラリのビルドがうまくいかない事をきっかけにD言語で再実装するのは、 実はアリかも知れません。

5.7 configure実行時の注意点

「--prefix」は(ほぼ)必ず指定しなくてはなりません。省略するとビルドされたファイル群は /usr/local/ の下にインストールされてしまいます。つまり、Cygwinのネイティブ環境が 破壊されてしまうので要注意です。もし心配な場合は「make -n install」でどこに何が インストールされるかを予め確認するか、ヘッダファイルとライブラリを手動でインストール (ファイルコピー)するのが良いでしょう。

6 不具合とパッチについて

ビルドしたコンパイラを使用してみたのですが、いくつか不具合に見舞われました。

6.1 ビルド時の問題

  • CygwinでのMinGWクロスgdcのビルドに失敗する
    現象
    gcc/d/dfrontend/object.hの「#define POSIX ...」の中に __CYGWIN__を 含めないと、 CygwinでのMinGWクロスgdcのビルドに失敗する。
    対処
    gcc/d/dfrontend/object.hにワークアラウンドを入れています (参考)
  • libssp/ssp.cのコンパイル に失敗する
    現象
    5.x.0および6.1.0をベースにmingwターゲットでビルドするとlibssp/ssp.cのコンパイル に失敗する libssp/ssp.c内に #if defined (_WIN32) && !defined (__CYGWIN__) というifdefが 新たに追加されていて、そちらのコードブロックが選択された 結果エラーになる模様。
    対処
    gcc-4.9.2では存在しなかったコード、且つかつそれで問題無かったのでコメントアウトで 対応しています。configureオプションに--disable-libsspを付けるとlibsspはビルドされないので 本現象には遭遇しないかも。
  • venix1さんのパッチ がいくつか必要。
    現象
    gdc-2.05x時代に venix1さんが作成したパッチが無いと、コンパイラのビルドに失敗する、 生成したコンパイラでTLS関連シンボルが見つからないなどの現象が発生する。
    対処
    gcc-4.x.x向けだったパッチを6.1.0向けに再作成して対応しています。 (mingw-gdc-gcc.patchの一部, mingw-tls-binutils-2.23.1.patch)

6.2 クロスコンパイラおよびライブラリの問題

  • メソッド/構造体メンバー関数呼び出しにfastcallコードが生成される
    現象
    gdcをi686-*-mingw32ターゲットでビルドすると、メソッド/構造体メンバー関数呼び出しに fastcallコードが生成されて連想配列アクセスで Segfaultする。
    対処
    gcc/config/i386/i386.cに手を入れる事でワークアラウンドしています (参考)
  • std.regex内で Segfaultする(その1)
    現象
    DMD2.065,2.066.1ベースのgdcをi686-*-mingw32およびx86_64-w64-mingw32ターゲットで ビルドするとstd.regex内で Segfaultする。i686-*-mingw32ではGCをdisableにすると大丈夫そう。
    対処
    std.regexに手を入れる事でワークアラウンドしています (参考1, 参考2, 参考3)
  • std.regex内で Segfaultする(その2)
    現象
    DMD2.065,2.066.1ベースのgdcをi686-*-mingw32ターゲットでビルドするとstd.regex内で Segfaultする。
    対処
    std.functionalに手を入れる事でワークアラウンドしています (参考)
  • リンク時にcurl.o内でcore.sys.posix.sys.socketが見つからなくてエラー
    現象
    libphobos/src/etc/c/curl.dで無条件に「import core.sys.posix.sys.socket;」 されているが、 Windowsターゲットだとリンク時に 「undefined reference to `_D4core3sys5posix3sys6socket12__ModuleInfoZ'」 でリンクに失敗する。
    対処
    libphobos/src/etc/c/curl.d内で無条件に「import core.sys.posix.sys.socket;」している のをコメントアウトしています。
  • libphobsのビルドでエラーする
    対処
    libphobos/libdruntime/core/stdc/stdarg.d、libphobos/libdruntime/core/stdc/stdio.d、 libphobos/src/std/stdio.d をMinGW向けに対応しました。
  • x86_64-w64-mingw32ターゲットのgdcをビルドするとき libphobsのビルドでエラーする
    現象
    x86_64-w64-mingw32ターゲットのgdcで「CRuntime_Microsoft」がversion予約文字列に指定 されているが、有効化されない為 libphobos/libdruntime/core/stdc/stdio.dのビルドができなくなる。
    対処
    gcc/d/dfrontend/cond.cから「CRuntime_Microsoft」をversion予約文字列から除外しました (参考)。
  • x86_64-w64-mingw32ターゲットのlibphobs内 getoptが正しく動作しない
    現象
    getoptコードが オプション文字列を正しく解釈しない。
    対処
    libphobos/src/std/getopt.dに手を加えています。 (参考)。
  • wstring文字列リテラルの終端文字がchar型になっている
    現象
    wstring文字列リテラルの終端文字がchar型になっている。この為、W系のWinAPIの引数に 「LoadLibrary("uxtheme.dll")」のように渡すと終端が見つけられずに実行に失敗します (参考)。
    対処
    「LoadLibrary(toUTFz!(wchar*)("uxtheme.dll"))」の様にstd.utfで変換して渡すという ワークアラウンドで対応しています。

6.3 その他

  • libphobos/src/std/socket.d内の関数シンボルが見つけられずリンクに失敗してしまう場合がある
    現象
    i686-pc-mingw32 および i686-w64-mingw32 および x86_64-w64-mingw32 ターゲットのクロスgdcを使用すると libphobos/src/std/socket.d内の関数シンボルが見つけられずリンクに失敗してしまう場合がある。
    対処
    以前は一部のターゲットでのみ発生する現象でしたが、全てのターゲットで発生するようになって しまいました。リンク時に「-lgphobos2 -lgdruntime -lws2_32」を追加する必要があります。
  • x86_64-w64-mingw32ターゲットのツールで リンクに時間がかかる
    現象
    CPUもディスクアクセスも使用してないのに リンクに時間がかかる。Cygwinのchmod()システム コールエミュレーション内で使用されるWinAPI NtSetSecurityObject() の実行に何故か時間がかかる 事があるようです(参考)。 クロスツールなのでCygwin本体は ターゲットによらず同じなのですが、何故か x86_64-w64-mingw32をターゲットにしたリンクでのみ発生します。
    対処
    2016/08/13時点では対処方法は見つかっていません。我慢して待ちます。

7 その他

MinGWネイティブでGDCをビルドする手段はあるのですが、動かないCコンパイラが パッケージとして置かれていたり、MSYSはなんだか訳が分からない感じになって いたりしたため、CygwinでMinGWターゲットのクロスGDCをビルドできないか? と試してうまくいったのが、本文書にまとめるきっかけになりました。

本家のdmdコンパイラはバグの再現性確認程度にしか使用した事がありません。 ライブラリやツールの事が良くわからないからというのが理由です(^^; GDCを使用するメリットは多数ありますが、デメリットも多数存在します。

  • メリット
    1. MinGW用にビルドされたライブラリが使用できる。
    2. gdbが使用できる。gdb-7.2でD言語がサポートされました。
    3. DMDよりもGDCの方がオプティマイズが効いてるらしい。
  • デメリット
    1. DMDサイトなどで書かれている例がそのまま使えない場合がある。
    2. DMD最新バージョンリリースよりも遅れる。2016年8月時点でもgithubで活発に更新されていますが、 少し離れてます(DMD2.071.1 vs GDC2.068)。この先も大丈夫な保証はありません。
    3. コンパイルが遅い。
    4. GDCでしか起こらない不具合がありうる。
    5. MinGWターゲットでGDCを使う人が殆ど居ない(2016年8月時点で 公式にはアルファ品質とされている)。 GDCのフォーラム でも「MinGW-gdcを使うならDMDを使った方が...」 という雰囲気になってたりします。 この為、なにやら動かなくても ある程度自力解決が求められる。

うーむ、やっぱりデメリットの方が多いなぁ(^^; まぁ、「そこに山があるから」という事で。

8 履歴

  2015/09/03 : 初版。
  2015/09/05 : 補足文言などを追記。
  2015/09/12 : GDCバージョンを5b7a4a93c75d0d170da578c816196eac600a5897→dadb5a3784fc9e12761e49c35937ad1c594c824dに変更。
               i686-w64-mingw32,x86_64-w64-mingw32についてもbinutilsをビルドするように変更。
               configureオプションをGDC公式バイナリに揃えた。
               その他、文言調節。
  2015/09/13 : 「x86_64-w64-mingw32ターゲットでコンパイルした場合に format()でreal型を指定するとSegfault」について追記。
  2015/10/17 : リンクが一部切れたのを修正。
  2016/08/13 : gcc-6.1.0、DMD2.068ベースのGDC-e9bcb3abd15e2987d2d46f7a49e7e34ac0975d22 に書き換え。

TOP PREV

著者: TANE

Emacs 24.5.1 (Org mode 8.2.10)