HN 日本語サマリー

← 一覧へ戻る
プログラミング

DMD を使った GDC のブートストラップ

Bootstrapping GDC with DMD (briancallahan.net)

14 pointsby LorenDB1 コメント

要約

この記事は、FreeBSDにGDC(GNU D Compiler)をDMD(D言語のリファレンスコンパイラ)を使ってブートストラップする方法を解説しています。公式ドキュメントではGDCはGDC自身でビルドする必要があるとされていますが、筆者はDMDと簡単なラッパープログラムを用いることで、この制約を回避しGDCのビルドに成功したことを報告しています。この手法は、GDCパッケージが存在しないシステムでの利用に役立ちます。

全文翻訳

Dr. Brian Robert Callahan 学者、開発者、より明るいテクノ社会を目指して ホーム | ブログアーカイブ | LinkedIn | CV | コード | 追加情報 [前] [次] 2026-07-13 DMD を使って GDC をブートストラップした ソースコードはこちらから入手できます。FreeBSD には GDC、つまり GCC の D 言語フロントエンドである GNU D Compiler のパッケージがありません。私は研究ツールとして FreeBSD 上で GDC を頻繁に使用しています。そのため、実際に FreeBSD 用に GDC をブートストラップする必要がありました。その方法を共有するのを忘れていました。この記事はその点を修正することを目的としています。非常に簡単で手軽です。DMD をお持ちであれば、簡単に GDC を入手できます。できるだけ簡単かつ迅速に行うために、小さなラッパープログラムを作成しました。GCC が主張すること GCC のドキュメントでは、GDC は GDC でビルドする必要があると述べています。具体的には、「GDC、D コンパイラをビルドするには、動作する GDC コンパイラ(GCC バージョン 9.4 以降)と D ランタイムライブラリである 'libphobos' が必要です。D フロントエンドは D で書かれているためです。」とあります。ドキュメントはさらに、「12 より前のバージョンの GDC は、ISO C++11 コンパイラでビルドでき、それをインストールしてから D フロントエンドの新しいバージョンをブートストラップするために使用できます。」と続けています。その一部は間違いなく真実です。GCC 12 以降、GDC は D で書かれています。しかし、一部はテストされていないように感じます。GDC が GDC をビルドできる唯一の D コンパイラであるのはなぜでしょうか?すべての D コンパイラはフロントエンドを共有しており、D フロントエンドは言語の特殊な部分を使用していません。たとえ使用していたとしても、3 つの D コンパイラすべてがフロントエンドを共有しているため、理論的にはどの D コンパイラでも GDC をブートストラップできるはずです。これは私がテストしたかったことです。新しい GCC バージョンをビルドするために古い GCC バージョンをビルドするのは非常に時間がかかるため、それ以外の理由はありません。DMD をビルドするには数秒しかかかりません。現実は何を示すか GDC をビルドするには、D コンパイラと、ステージ 1 GDC のみをビルドするのに十分なバージョンの libphobos が必要です。ステージ 1 GDC はステージ 1 libphobos をビルドします。動作するステージ 1 GDC をビルドするのに十分な機能を持つ D コンパイラがあれば、私たちは成功です。それが私たちが克服する必要のある唯一のハードルです。リファレンス D コンパイラである DMD コンパイラは、これを完璧に実行できます。障害となるのは、DMD がステージ 1 GDC をビルドできるかどうかではなく、3 つの D コンパイラフロントエンド(DMD、GDC、LDC)すべてが異なるフラグセットを使用しているという事実です。DMD と LDC は互いに近いです。GDC は GCC に合わせるために非常に異なるフラグスタイルを使用します。これらのフラグの違いを変換する小さなラッパープログラムを書くことができれば、DMD でステージ 1 GDC をビルドできるはずです。gdc-wrapper この小さなプログラムは、機械的にフラグを変換し、他のすべての引数を変更せずに追加し、変換された引数リストで DMD を呼び出します。ほとんど試行錯誤で、DMD がステージ 1 GDC をビルドできるようになるまで続けました。GDC のビルドを実行し、何かが失敗したときに、そのフラグをラッパーに追加しました。最も対処が難しかったフラグは、依存関係ルールファイルを作成する -MF と -MT でした。ここでは -MT を無視し、-MF で指定されたファイルを、単一の改行文字のみを含めて作成しました。これは少しハックですが、正確に実行することには興味がなく、ステージ 1 GDC をビルドして次に進むことに興味があります。それ以外では、警告フラグを無視し、-o output.o を -ofoutput.o に変換し、-finline を -inline に変更し、-fversion=VERSION を -version=VERSION に変更し、正しくリンクされるようにするためにいくつかの小さな変更を行いました。そして、それは機能します FreeBSD x86_64 DMD 2.112.0 バイナリを D のウェブサイトからダウンロードし、ホームディレクトリに展開しました。その後、./configure --dmd=/home/briancallahan/dmd2/freebsd/bin64/dmd && make で gdc-wrapper をビルドしました。そして、/home/briancallahan/gdc-wrapper を一時的に PATH の末尾に追加する export PATH=$PATH:$PWD だけで、問題なく GDC をビルドできました。本当にそれだけ簡単でした。これで FreeBSD 15 上で GDC 15.2.0 と GDC 16.1.0 をビルドできます。結論 FreeBSD、NetBSD、GNU Hurd、または Illumos を使用している方々の助けになれば幸いです。または、GDC パッケージがない Linux ディストリビューションを使用している方々も同様です。明らかな制限は、現時点では DMD が x86 と x86_64 のバックエンドしか持っていないことです(ARM64 バックエンドは近日登場予定です!)。したがって、異なる CPU アーキテクチャ用の GDC が必要な場合は、まずこの手順でネイティブ GDC をブートストラップし、その後、以前の投稿のいずれかに従って、異なる CPU アーキテクチャ用のネイティブ GDC に向かうクロス GDC をビルドする必要があります。OpenBSD httpd