Improve this page Github へのログインが必要です。 簡単な修正は、ここから fork、オンライン編集、pull request ができます。 大きな修正については、 通常の clone で行って下さい。 Page wiki 関連するWikiページを参照・編集 English このページの英語版(原文)

DMD コンパイラ Windows 版

必要なもの

  1. Dコンパイラのダウンロード
  2. 32 bit Windows (Win32) OS (Windows XP など)
  3. Win32用 dmc.zip (C/C++ コンパイラ) のダウンロード (2.025から必要ではなくなりましたが、いくつかの追加ツールはこちらに含まれています)

ファイルリスト

\dmd2\src\phobos\
D ランタイムライブラリのソース。
\dmd2\src\dmd\
D コンパイラフロントエンドのソース。GPL もしくは Artistic License のデュアルライセンスです。
\dmd2\html\d\
ドキュメント
\dmd2\samples\d\
サンプル
\dmd2\windows\bin\dmd.exe
Dコンパイラ実行ファイル
\dmd2\windows\bin\shell.exe
簡単なコマンド型シェル
\dmd2\windows\bin\sc.ini
コンパイラの設定ファイル
\dmd2\windows\lib\phobos.lib
Dランタイムライブラリ

インストール

まず、コンソールウインドウを開きます。(Windows XP なら、 [スタート][コマンドプロンプト] をクリックしてください)。 配布されているツールは全てコマンドラインツールなので、 コンソールから操作する必要があります。 ルートディレクトリに移動し、 ファイルをルートディレクトリにunzipで展開します。 dmd.zip を展開すると、 \dmd2 ディレクトリが作られその中に全てのファイルが含まれています。 dmc.zip を展開すると、 \dm ディレクトリが作られその中に全てのファイルが含まれています。

おおよそこんな感じになるでしょう:

C:\Documents and Settings\Your Name>cd \
C:\>unzip dmd.zip
C:\>unzip dmc.zip

\dmd2\samples\d ディレクトリで以下を実行して下さい:

\dmd2\windows\bin\shell all.sh

小さなサンプルが幾つか実行されます。

コンパイラの引数とスイッチ

dmd files... -switches...
files...
ファイルの拡張子
拡張子 ファイルの種類
なし D言語のソース
.d D言語のソース
.dd Ddoc のソース
.di D インターフェイスファイル
.obj リンクしたいオブジェクトファイル
.lib 検索対象にするオブジェクトコードライブラリ
.exe 出力する実行ファイルの名前
.def 実行モジュール定義ファイル
.res リソースファイル
@cmdfile
cmdfile が環境変数の名前であれば、 その環境変数から、 コンパイラへの引数とスイッチを読み込みます。 それ以外の場合、 テキストファイル cmdfile から引数とスイッチを読み込みます。
-c
コンパイルのみ。リンクはしません
-cov
コードカバレッジ解析 を有効にする
-D
ソースから ドキュメント を生成
-Dddocdir
ドキュメントファイルを docdir ディレクトリに出力。 -op を同時に指定することで、 元の階層構造を保って出力することができます。
-Dffilename
ドキュメントファイルを filename に出力
-d
非推奨(deprecated)な機能を有効化
-debug
デバッグ 用にコンパイル
-debug=level
デバッグレベル <= level でコンパイル
-debug=ident
デバッグ識別子 ident を有効にしてコンパイル
-debuglib=libname
デバッグ情報つきのコンパイル時に、libname をデフォルトライブラリとして phobos.lib の代わりにリンク
-defaultlib=libname
デバッグ情報なしのコンパイル時に、libname をデフォルトライブラリとして phobos.lib の代わりにリンク
-deps=filename
モジュールの依存関係をテキストで filename に書き込み
-g
Ddbg 等のデバッガ向けに Codeview 4 シンボル情報を D extensions として
-gc
\dmd2\bin\windbg 等のデバッガ向けに Codeview 4 シンボル情報を追加
-gs
常に標準的なスタックフレームを生成
-H
Dインターフェイスファイル の生成
-Hddir
Dインターフェイスファイルの出力ディレクトリ dir の指定。 -op を同時に指定することで、 元の階層構造を保って出力することができます。
-Hffilename
Dインターフェイスファイルのファイル名 filename の指定
--help
ヘルプメッセージを出力
-Ipath
import されたモジュールを検索するパスの指定。 path は ; で分かち書きしたパスのリストとします。 複数回 -I を使うことも可能で、 パスは指定された順番に検索されます。
-ignore
非対応のpragmaを無視
-inline
関数のインライン展開を有効にします。 これによってパフォーマンスは向上しますが、 デバッグが難しくなります。
-Jpath
ImportExpression で指定したファイルを探すパス。このスイッチは ImportExpression を使う際に必須となります。 path には ; で区切ったパスのリストを指定します。 複数の -J スイッチを指定することも可能で、 パスは指定された順番に検索されます。
-Llinkerflag
linkerflagリンカ へ渡します。例えば -L/ma/li
-lib
オブジェクトファイルの代わりにライブラリファイルを出力します。 コンパイルされたソースファイルおよび、 引数で指定されたオブジェクトファイルやライブラリが、 まとめて出力ライブラリに格納されます。 粒度を上げるために、コンパイルされたソースモジュールはライブラリ内で 別々のオブジェクトへと分割して格納されることがあります。 ライブラリの名前は、最初に渡されたソースファイルの名前から取られます。 これは、 -of スイッチによる上書きが可能です。
-man
このページをデフォルトのブラウザで開きます。
-map
.map ファイルを生成
-noboundscheck
全ての配列境界チェックを(safe関数の中でさえも)無効にします。
-nofloat
浮動小数点演算コードが存在する場合であっても、オブジェクトファイルから __fltused への参照を除去します。ライブラリコードに対して有用です。
-O
生成コードを最適化。 最高速の出力を得るには、-O -release -inline を使用してください。
-o-
オブジェクトファイルを生成させないようにします。 -D-H フラグと同時に使うと便利です。
-odobjdir
オブジェクトファイルをカレントではなく objdir からの相対で出力
-op を同時に指定することで、 元の階層構造を保って出力することができます。
-offilename
出力ファイル名を filename に設定。出力ファイルは、 他のスイッチに応じてオブジェクトファイル、実行ファイル、 あるはライブラリファイルのいずれかになります。
-op
オブジェクトファイルや.diファイル、ddocの出力の名前を決める際、通常は ソースファイル名のディレクトリ名部分を削りますが、-op はこれを残します。
-profile
生成したコードの実行パフォーマンスを測定する プロファイリング 用の情報を追加
-property
プロパティ関数に対して @property の使用を強制
-quiet
重要でないコンパイラのメッセージを抑制
-release
リリース用にコンパイル つまり、契約やassertのコードを生成しなくなります。 システム関数と信頼済み関数については配列境界チェックを行わなくなります。
-run srcfile args...
srcfile のコンパイル、リンクを行い、 生成されたプログラムに残りのコマンドライン引数 args... を渡して起動します。 .obj や実行ファイルを後に残すことはありません。
-unittest
unittest 用コードをコンパイルし、assertを有効にします。 また unittest バージョン識別子 を有効にします。
-v
メッセージを冗長に出力
-version=level
バージョン番号level 以上のコードを全てコンパイル
-version=ident
バージョン識別子 ident を指定してコンパイル
-vtls
スレッドローカル記憶域に割り当てられた変数名をコンパイル時に表示します。 デフォルトsharedへの移行のための利便性のためのスイッチです。
-w
警告 を有効にします
-wi
情報表示だけの警告 (コンパイルはそのまま続く) を有効にします
-X
JSON ファイルを生成
-Xffilename
JSON ファイルの書き込み先ファイル filename を指定

空のスイッチ、つまり "" は無視されます。

リンク

リンク処理は dmd コンパイラによって、 コンパイルが成功した後自動的に実行されます。これを止めるには、 -c スイッチを使用します。

プログラムは、Dのランタイムライブラリ phobos.lib と、 それに続けて Cのランタイムライブラリ snn.lib とリンクしなければなりません。この動作は、ライブラリが環境変数 LIB の指すパスに存在すれば自動的に実行されます。LIB を設定する方法は、例えば次のようになります:

set LIB=\dmd2\lib;\dm\lib

If the dmd コマンドをコンパイルと実行ファイルへのリンクの両方に使う場合、 Windows の実行ファイルにのみ有効なある種の最適化が行われます。 出力された .obj ファイルを DLL に使うことはできません。 exe と DLL の両方で使える .obj ファイルにコンパイルするには、 -c オプションでコンパイルします。

リンクは optlink リンカで行われます。

環境変数

Dコンパイラ dmd は以下の環境変数を使用します:

DFLAGS
dmd.exe は、コマンドラインの最後に DFLAGS の内容が追加されたかのように動作します。
LIB
リンカが、ライブラリファイルを探すために環境変数 LIB を用います。 Dでは通常は、次のように指定されます:
set LIB=\dmd2\lib;\dm\lib
LINKCMD
dmd は、通常はリンカとして PATH の通ったところにある link.exe を使おうとします。代わりに特定のリンカを使うためには、 LINKCMD にて指定します。例えば:
set LINKCMD=\dmd\windows\bin\link
PATH
リンカが dmd.exe と同じディレクトリに見つからなければ、 環境変数 PATH を探します。 注: 名前だけ同じ link.exe のリンカでは大抵動作しません。 Digital Mars の link.exe が他の link.exe より先に PATH の中に見つかるように注意してください。 明示的にリンカを指定するのに、LINKCMD を使うことも可能です。

sc.ini Initialization File

dmd は初期設定ファイル sc.ini を、 以下のディレクトリから順番に探します:

  1. カレントディレクトリ
  2. HOME 環境変数で指定されたディレクトリ
  3. dmd.exe のあるディレクトリ

sc.ini が見つかった場合、 このファイルで設定された環境変数が既存の設定を上書きします。 他のプログラムの環境変数による設定との衝突を避け、dmd の設定を独立させる簡単な方法となっています。

初期設定ファイルのフォーマット

; で始まる行はコメントとして無視されます。

環境変数は [Environment] セクションのヘッダの後ろに続けて、 NAME=value という組の形で記述します。 NAME は常に大文字扱いとなります。 という組の形で記述します。コメントは行頭の ; から始める行です。例としては:

; sc.ini file for dmd
; Names enclosed by %% are searched for in the existing environment
; and inserted. The special name %@P% is replaced with the path
; to this file.
[Environment]
LIB="%@P%\..\lib";\dm\lib

DFLAGS="-I%@P%\..\src\phobos" "-I%@P%\..\src\druntime\import"
LINKCMD="%@P%\..\..\dm\bin"
DDOCFILE=mysettings.ddoc

sc.ini の位置非依存性

%@P%sc.ini のあるパスに置き換えられます。 従って、sc.ini のフルパスが c:\dmd2\bin\sc.ini ならば、%@P%c:\dmd2\bin になり、上記の sc.ini will be は以下のように解釈されます:

[Environment]
LIB="c:\dmd2\bin\..\lib";\dm\lib

DFLAGS="-Ic:\dmd2\bin\..\src\phobos" "-Ic:\dmd2\bin\..\src\druntime\import"
LINKCMD="c:\dmd2\bin\..\..\dm\bin"
DDOCFILE=mysettings.ddoc

これによって、 sc.ini を毎回編集せずとも dmd の配置を変更することが可能です。

既知のインストール時の問題


Windows版とLinux版の違い


D インターフェイスファイル

Dのソースコード中の import 宣言が処理される際には、 コンパイラは、その import に対応するDのソースファイルを検索し、 見つかったファイルから import に必要な情報を取り出します。 これとは別に、コンパイラは対応する D インターフェイスファイル を探して使うこともできます。 D インターフェイスファイルはそのモジュールの実装全てではなく、 importに必要な情報だけが記述されたファイルです。

Dのソースファイルではなくインターフェイスファイルを import に使用することの利点は:

D インターフェイスファイルは、コンパイラに -H スイッチを指定することで、 D ソースファイルから生成します。D インターフェイスファイルの拡張子は .di> です。 コンパイラが import 宣言を解決する際には、まず .di D インターフェイスファイルを検索し、次に D ソースファイルを探します。

D インターフェイスファイルは、ある意味で C++ のヘッダファイルによく似ています。 しかし、C++のヘッダファイルのような意味で必要になるわけでもなければ、 Dという言語の一部でもありません。 これは、コンパイラの機能の一つで、 ビルド処理の最適化のためだけに使用されます。

実行ファイルのビルド

dmd は、コンパイル対象のソースコードを一度にコマンドラインでまとめて指定する方が、 ずっと高速に実行ファイルを生成できます。

dmd の一度の起動に複数のソースファイルをまとめて渡すもう一つの利点は、 それによって、モジュールを超えたインライン展開などの最適化を dmd が行える可能性があることです。

ライブラリのビルド

ライブラリのビルド方法は3種類あります。例として、 コンパイルするソース foo.dbar.d、 既存のオブジェクトファイル bar.obj、そして既存のライブラリ def.libを全てまとめて、 foo.lib というライブラリをビルドする場合を考えてみましょう:

  1. それぞれを個別にコンパイルし、ライブラリ化コマンドを実行:
    dmd -c foo.d
    dmd -c bar.d
    lib -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib
    del foo.obj bar.obj
    
    この方法は、makefile などを使うことで、 モジュールの余計な再コンパイルを避ける時などに適しています。
  2. 一括でコンパイルを行い、ライブラリ化コマンドを実行:
    dmd -c foo.d bar.d
    lib -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib
    del foo.obj bar.obj
    
  3. dmd で、コンパイルとライブラリ作成を一発で実行:
    dmd -lib foo.d bar.d abc.obj def.lib
    
    オブジェクトファイルがディスクに書き出されることはなく、全ての中間処理はメモリ上で行われます。 -lib のもう一つの利点としては、一つのモジュールが一つのオブジェクトファイルに対応するのではなく、 さらに細かく分割して複数のオブジェクトとして格納されることです。 これによって、モジュールを手で分割することなしに 粒度を上げることができます。

dmd のコンパイル

dmd コンパイラのビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:

cd \dmd2\src\dmd
make -f win32.mak

Phobos のコンパイル

Dのランタイムライブラリである Phobos ビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:

cd \dmd2\src\druntime
make -f win32.mak DMD=\dmd2\windows\bin\dmd
cd ..\phobos
make -f win32.mak DMD=\dmd2\windows\bin\dmd