dmd - Windows D Compiler
- dmd Linux 版
- dmd OSX 版
- dmd FreeBSD 版
- 必要なもの
- ファイルリスト
- インストール
- 例
- コンパイラの引数とスイッチ
- リンク
- 環境変数
- sc.ini 初期設定ファイル
- 既知のインストール時の問題
- Windows版とLinux版の違い
- D インターフェースファイル
- ライブラリのビルド
- dmd のコンパイル
- Phobos のコンパイル
必要なもの
- Dコンパイラのダウンロード
- 32 bit Windows (Win32) OS (Windows XP など)
- Win32用 dmc.zip (リンカとユーティリティ) のダウンロード (2.025から必要ではなくなりましたが、いくつかの追加ツールはこちらに含まれています)
ファイルリスト
- \dmd\src\phobos\
- D ランタイムライブラリのソース。
- \dmd\src\dmd\
- D コンパイラフロントエンドのソース。GPL もしくは Artistic License のデュアルライセンスです。
- \dmd\html\d\
- ドキュメント
- \dmd\samples\d\
- サンプル
- \dmd\windows\bin\dmd.exe
- Dコンパイラ実行ファイル
- \dmd\windows\bin\shell.exe
- 簡単なコマンド型シェル
- \dmd\windows\bin\sc.ini
- コンパイラの設定ファイル
- \dmd\windows\lib\phobos.lib
- Dランタイムライブラリ
インストール
まず、コンソールウインドウを開きます。(Windows XP なら、 [スタート][コマンドプロンプト] をクリックしてください)。 配布されているツールは全てコマンドラインツールなので、 コンソールから操作する必要があります。 ルートディレクトリに移動し、 ファイルをルートディレクトリにunzipで展開します。 dmd.zip を展開すると、 \dmd ディレクトリが作られその中に全てのファイルが含まれています。 dmc.zip を展開すると、 \dm ディレクトリが作られその中に全てのファイルが含まれています。
おおよそこんな感じになるでしょう:
C:\Documents and Settings\Your Name>cd \ C:\>unzip dmd.zip C:\>unzip dmc.zip
例
\dmd\samples\d ディレクトリで以下を実行して下さい:
\dmd\bin\shell all.sh
小さなサンプルが幾つか実行されます。
コンパイラの引数とスイッチ
- dmd files... -switches...
- files...
-
拡張子/th> ファイルの種類 なし D言語のソース .d D言語のソース .dd Ddoc のソース .di D インターフェイスファイル .obj リンクしたいオブジェクトファイル .lib 検索対象にするオブジェクトコードライブラリ .exe 出力する実行ファイルの名前 .def 実行モジュール定義ファイル .res リソースファイル - @cmdfile
- cmdfile が環境変数の名前であれば、 その環境変数から、 コンパイラへの引数とスイッチを読み込みます。 それ以外の場合、 テキストファイル cmdfile から引数とスイッチを読み込みます。
- -c
- コンパイルのみ。リンクはしません
- -cov
- コードカバレッジ解析 を有効にする
- -D
- ソースからドキュメントを生成
- -Dddocdir
- ドキュメントファイルを docdir ディレクトリに出力
- -Dffilename
- ドキュメントファイルを filename に出力
- -d
- 非推奨(deprecated)な機能を有効化
- -debug
- デバッグ用にコンパイル
- -debug=level
- 指定したデバッグレベル以下のコードを全てコンパイル
- -debug=ident
- デバッグ識別子を指定してコンパイル
- -debuglib=libname
- デバッグ情報つきのコンパイル時に、phobos.lib の代わりに libname をデフォルトライブラリとしてリンクします
- -defaultlib=libname
- デバッグ情報なしのコンパイル時に、phobos.lib の代わりに libname をデフォルトライブラリとしてリンクします
- -deps=filename
- モジュールの依存関係をテキストで filename に書き込みます
- -g
- Ddbg 等のデバッガ向けに Codeview 4 シンボル情報を D extensions として付加。
- -gc
- \dmd\bin\windbg 等のデバッガ向けに CodeView 4 シンボル情報を付加。
- -H
- Dインターフェイスファイルの生成
- -Hddir
- Dインターフェイスファイルの出力ディレクトリ dir の指定
- -Hffilename
- Dインターフェイスファイルのファイル名 filename の指定
- --help
- ヘルプメッセージを出力
- -inline
- 関数のインライン展開を有効にします。 これによってパフォーマンスは向上しますが、 デバッグが難しくなります。
- -ignore
- 非対応pragmaを無視します
- -Ipath
- import されたモジュールを検索するパスの指定。 path は ; で分かち書きしたパスのリストとします。 複数回 -I を使うことも可能で、 その場合は -I と同じ順でモジュールが検索されます。
- -Jpath
- ImportExpression で指定したファイルを探すパス。このスイッチは ImportExpression を使う際に必須となります。 path には ; で区切ったパスのリストを指定します。 複数の -J スイッチを指定することも可能で、 パスは指定された順番に検索されます。
- -Llinkerflag
- linkerflag をリンカへ渡します。 例えば、 /ma/li
- -lib
- オブジェクトファイルの代わりにライブラリファイルを出力します。 コンパイルされたソースファイルおよび、 引数で指定されたオブジェクトファイルやライブラリが、 まとめて出力ライブラリに格納されます。 粒度を上げるために、コンパイルされたソースモジュールはライブラリ内で 別々のオブジェクトへと分割して格納されることがあります。 ライブラリの名前は、最初に渡されたソースファイルの名前から取られます。 これは、 -of スイッチによる上書きが可能です。
- -m32
- 32bit実行ファイルにコンパイルします。これがデフォルトです。
- -man
- このページをデフォルトのブラウザで開きます
- -nofloat
- 浮動小数点演算コードが存在する場合であっても、オブジェクトファイルから __fltused への参照を除去します。ライブラリコードに対して有用です。 (Windows専用)
- -O
- 生成コードを最適化。 最高速の出力を得るには、-O -release -inline を使用してください
- -o-
- オブジェクトファイルを生成させないようにします。 -D や -H フラグと同時に使うと便利です。
- -odobjdir
- オブジェクトファイルをカレントではなく objdir からの相対で出力
- -offilename
- 出力ファイル名を filename に設定。出力ファイルは、 他のスイッチに応じてオブジェクトファイル、実行ファイル、 あるはライブラリファイルのいずれかになります。
- -op
- オブジェクトファイルの名前を決める際、通常は ソースファイル名のディレクトリ名部分を削りますが、 -op はこれを残します。
- -profile
- 生成したコードの実行パフォーマンスを測定する Profiling 用の情報を追加
- -quiet
- 重要でないコンパイラのメッセージを抑制
- -release
- リリース用にコンパイル。 つまり、契約、assert、配列の境界チェックのコードを入れずにコンパイルします。
- -run srcfile args...
- ソース srcfile のコンパイル、リンクを行い、 生成されたプログラムに残りのコマンドライン引数 args... を渡して起動します。 .obj や .exe ファイルを後に残すことはありません。
- -unittest
- 単体テスト用コードをコンパイルし、assertを有効にします。 また、unittestバージョン識別子を有効にします。
- -v
- メッセージを冗長に出力
- -version=level
- 指定したバージョン番号以上のコードを全てコンパイル
- -version=ident
- バージョン識別子を指定してコンパイル
- -w
- 警告を有効にします
- -wi
- 情報表示のみの警告 (つまり、 警告が出てもコンパイル・リンクは継続する) を有効にします
空のスイッチ、つまり "" は無視されます。
リンク
リンク処理は dmd コンパイラによって、 コンパイルが成功した後自動的に実行されます。これを禁止するには、 -c スイッチを使用します。
プログラムは、Dのランタイムライブラリ phobos.lib と、 それに続けて Cのランタイムライブラリ snn.lib とリンクしなければなりません。この動作は、ライブラリが環境変数 LIB の指すパスに存在すれば自動的に実行されます。LIB を設定する方法は、例えば次のようになります:
set LIB=\dmd\lib;\dm\lib
dmd コマンドをコンパイルと実行ファイルへのリンクの両方に使う場合、 Windows の実行ファイルにのみ有効なある種の最適化が行われます。 出力された .obj ファイルを DLL に使うことはできません。 exe と DLL の両方で使える .obj ファイルにコンパイルするには、 -c オプションでコンパイルします。
リンクは optlink リンカで行われます。
環境変数
Dコンパイラ dmd は以下の環境変数を使用します:
- DFLAGS
- dmd.exe は、コマンドラインの最後に DFLAGS の内容が追加されたかのように動作します。
- LIB
- リンカが、ライブラリファイルを探すために環境変数LIBを用います。
Dでは通常は、次のように指定されます:
set LIB=\dmd\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 初期設定ファイル
dmd は初期設定ファイル sc.ini を、 以下のディレクトリから順番に探します:
- カレントディレクトリ
- HOME 環境変数で指定されたディレクトリ
- dmd.exe のあるディレクトリ
sc.ini が見つかった場合、 このファイルで設定された環境変数が既存の設定を上書きします。 他のプログラムの環境変数による設定との衝突を避け、 dmd の設定を独立させる簡単な方法となっています。
初期設定ファイルのフォーマット
; で始まる行はコメントとして無視されます。
環境変数は [Environment] セクションのヘッダの後ろに続けて、 NAME=value NAME は常に大文字扱いとなります。 という組の形で記述します。コメントは行頭の ; から始める行です。例としては:
; sc.ini file for dmd ; %% で囲まれた部分はすでに設定された環境変数の名前とみなして ; その場に展開されます。特殊記法 %@P% は、 ; sc.iniファイルが存在するパスへと置き換えられます。 [Environment] LIB="%@P%\..\lib";\dm\lib DFLAGS="-I%@P%\..\src\phobos" LINKCMD="%@P%\..\..\dm\bin" DDOCFILE=mysettings.ddoc
sc.ini の位置非依存性
%@P% は sc.ini のあるパスに置き換えられます。 従って、sc.ini のフルパスが c:\dmd\bin\sc.ini ならば、%@P% は c:\dmd\bin になり、上記の sc.ini は以下のように解釈されます:
[Environment] LIB="c:\dmd\bin\..\lib";\dm\lib DFLAGS="-Ic:\dmd\bin\..\src\phobos" LINKCMD="c:\dmd\bin\..\..\dm\bin" DDOCFILE=mysettings.ddoc
これによって、sc.ini を毎回編集せずとも dmd の配置を変更することが可能です。
既知のインストール時の問題
- Cygwin の unzip を使うと問題が発生するようです。
- Cygwin のコマンドシェルからコンパイラを起動する際にも、 問題が起きることが報告されています。Cygwinでの動作を試す前に、 Windowsの通常のシェル cmd.exe を試してみてください。
- dmd と dmc をスペースを含む名前のディレクトリ・パスに置くと、 問題が発生します。
Windows版とLinux版の違い
- Linux版では、 文字列リテラルは読取専用です。 書き込もうとするとセグメント違反が発生します。
D インターフェイスファイル
Dのソースコード中の import 宣言が処理される際には、 コンパイラは、その import に対応するDのソースファイルを検索し、 見つかったファイルから import に必要な情報を取り出します。 これとは別に、コンパイラは対応する D インターフェイスファイル を探して使うこともできます。 D インターフェイスファイルはそのモジュールの実装全てではなく、 importに必要な情報だけが記述されたファイルです。
Dのソースファイルではなくインターフェイスファイルを import に使用することの利点は:
- D インターフェイスファイルは多くの場合、対応するD ソースファイルより ずっと小さく、高速に処理できます。
- ソースコードの隠蔽にも使用できます。例えば、 ソースコードの代わりに、コンパイル済みのオブジェクトコードと Dインターフェイスファイルをリリースします。
D インターフェイスファイルは、コンパイラに -H スイッチを指定することで、 D ソースファイルから生成します。 D インターフェイスファイルの拡張子は .di です。 コンパイラが import 宣言を解決する際には、まず .di D インターフェイスファイルを検索し、次に D ソースファイルを探します。
D インターフェイスファイルは、ある意味で C++ のヘッダファイルによく似ています。 しかし、C++のヘッダファイルのような意味で必要になるわけでもなければ、 Dという言語の一部でもありません。 これは、コンパイラの機能の一つで、 ビルド処理の最適化のためだけに使用されます。
実行ファイルのビルド
dmd は、コンパイル対象のソースコードを一度にコマンドラインでまとめて指定する方が、 ずっと高速に実行ファイルを生成できます。
dmd の一度の起動に複数のソースファイルをまとめて渡すもう一つの利点は、 それによって、モジュールを超えたインライン展開などの最適化を dmd が行える可能性があることです。
ライブラリのビルド
ライブラリのビルド方法は3種類あります。例として、 コンパイルするソース foo.d と bar.d、 既存のオブジェクトファイル bar.obj、 そして既存のライブラリ def.lib を全てまとめて、foo.lib というライブラリをビルドする場合を考えてみましょう:
- それぞれを個別にコンパイルし、ライブラリ化コマンドを実行:
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 などを使うことで、 モジュールの余計な再コンパイルを避ける時などに適しています。 - 一括でコンパイルを行い、ライブラリ化コマンドを実行:
dmd -c foo.d bar.d lib -c -p32 foo.lib foo.obj bar.obj abc.obj def.lib del foo.obj bar.obj
- dmd で、コンパイルとライブラリ作成を一発で実行:
dmd -lib foo.d bar.d abc.obj def.lib
オブジェクトファイルがディスクに書き出されることはなく、全ての中間処理はメモリ上で行われます。 -lib のもう一つの利点としては、一つのモジュールが一つのオブジェクトファイルに対応するのではなく、 さらに細かく分割して複数のオブジェクトとして格納されることです。 これによって、モジュールを手で分割することなしに 粒度を上げることができます。
dmd のコンパイル
dmd コンパイラのビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:
cd \dmd\src\dmd make -f win32.mak
Phobos のコンパイル
Dのランタイムライブラリである Phobos ビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:
cd \dmd\src\phobos make -f win32.mak DMD=\dmd\\bin\dmd