DMD コンパイラ OSX 版
- dmd Windows 版
- dmd Linux 版
- dmd FreeBSD 版
- 必要なもの
- ファイルリスト
- インストール
- コンパイラの引数とスイッチ
- リンク
- 環境変数
- dmd.conf 初期設定ファイル
- Windows版とLinux版の違い
- D インターフェースファイル
- ライブラリのビルド
- dmd のコンパイル
- Phobos のコンパイル
必要なもの
- Dコンパイラのダウンロード
- 32 bit x86 Mac OSX
- Gnu C compiler (gcc)
ファイルリスト
- dmd2/src/phobos/
- D ランタイムライブラリのソース。
- dmd2/src/dmd/
- D コンパイラフロントエンドのソース。GPL もしくは Artistic License のデュアルライセンスです。
- dmd2/html/d/
- ドキュメント
- dmd2/samples/d/
- サンプル
- dmd2/osx/bin/dmd
- Dコンパイラ実行ファイル
- dmd2/osx/bin/dumpobj
- Mach-O ダンプツール
- dmd2/osx/bin/obj2asm
- Mach-O ディスアセンブラ
- dmd2/osx/bin/shell
- 簡単なコマンド型シェル
- dmd2/osx/bin/dmd.conf
- コンパイラの設定ファイル (/etc/dmd.conf にコピーして下さい)
- dmd2/osx/lib/libphobos2.a
- Dランタイムライブラリ (/usr/lib/libphobos2.a にコピーして下さい)
インストール
unzip dmd.VERSION.zip
VERSION にはそのzipファイルのバージョン番号が入ります。
import std.stdio;
void main() {
writeln("hello world!");
}
これを次のようにコンパイルして実行すると
dmd2/osx/bin/dmd hello
./hello
以下が表示されれば成功です:
hello world!
sudo cp dmd2/osx/bin/{dmd,dumpobj,obj2asm,shell,rdmd} /usr/local/bin
sudo cp dmd2/osx/bin/dmdx.conf /usr/local/bin/dmd.conf
sudo cp dmd2/osx/lib/libphobos2.a /usr/lib
コンパイラの引数とスイッチ
- dmd files... -switches...
- files...
-
ファイルの拡張子 拡張子 ファイルの種類 なし D言語のソース .d D言語のソース .dd Ddoc のソース .di D インターフェイスファイル .o リンクしたいオブジェクトファイル .a 検索対象にするオブジェクトコードライブラリ - @cmdfile
- cmdfile が環境変数の名前であれば、 その環境変数から、 コンパイラへの引数とスイッチを読み込みます。 それ以外の場合、 テキストファイル cmdfile から引数とスイッチを読み込みます。
- -c
- コンパイルのみ。リンクはしません
- -cov
- コードカバレッジ解析 を有効にする
- -D
- ソースから ドキュメント を生成
- -Dddocdir
- ドキュメントファイルを docdir ディレクトリに出力。 -op を同時に指定することで、 元の階層構造を保って出力することができます。
- -Dffilename
- ドキュメントファイルを filename に出力
- -d
- 非推奨(deprecated)な機能を有効化
- -debug
- デバッグ 用にコンパイル
- -debug=level
- デバッグレベル <= level でコンパイル
- -debug=ident
- デバッグ識別子 ident を有効にしてコンパイル
- -debuglib=libname
- デバッグ情報つきのコンパイル時に、libname をデフォルトライブラリとして libphobos2.a の代わりにリンク
- -defaultlib=libname
- デバッグ情報なしのコンパイル時に、libname をデフォルトライブラリとして libphobos2.a の代わりにリンク
- -deps=filename
- モジュールの依存関係をテキストで filename に書き込み
- -fPIC
- 位置非依存コード (共有ライブラリのビルドに使われる) を生成。 OSXではこのフラグは常に有効です。
- -g
- D extensions として Dwarf シンボル情報を追加
- -gc
- gdb など向けに C 形式で Dwarf シンボル情報を追加
- -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-M
- -lib
- オブジェクトファイルの代わりにライブラリファイルを出力します。 コンパイルされたソースファイルおよび、 引数で指定されたオブジェクトファイルやライブラリが、 まとめて出力ライブラリに格納されます。 粒度を上げるために、コンパイルされたソースモジュールはライブラリ内で 別々のオブジェクトへと分割して格納されることがあります。 ライブラリの名前は、最初に渡されたソースファイルの名前から取られます。 これは、 -of スイッチによる上書きが可能です。
- -m32
- 32bit実行ファイルにコンパイルします。 これが 32bit dmd ではデフォルトです。
- -m64
- 32bit実行ファイルにコンパイルします。これが 64bit dmd ではデフォルトです。
- -man
- このページを BROWSER 環境変数のブラウザで開きます。BROWSER が未定義なら Safari を使います。
- -map
- .map ファイルを生成
- -noboundscheck
- 全ての配列境界チェックを(safe関数の中でさえも)無効にします。
- -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... を渡して起動します。 .o や実行ファイルを後に残すことはありません。
- -shared
- 共有ライブラリを生成
- -unittest
- unittest 用コードをコンパイルし、assertを有効にします。 また unittest バージョン識別子 を有効にします。
- -v
- メッセージを冗長に出力
- -version=level
- バージョン番号 が level 以上のコードを全てコンパイル
- -version=ident
- バージョン識別子 ident を指定してコンパイル
- -vtls
- スレッドローカル記憶域に割り当てられた変数名をコンパイル時に表示します。 デフォルトsharedへの移行のための利便性のためのスイッチです。
- -w
- 警告 を有効にします
- -wi
- 情報表示だけの警告 (コンパイルはそのまま続く) を有効にします
- -X
- JSON ファイルを生成
- -Xffilename
- JSON ファイルの書き込み先ファイル filename を指定
リンク
リンク処理は dmd コンパイラによって、 コンパイルが成功した後自動的に実行されます。これを止めるには、 -c スイッチを使用します。
リンクは gcc で行います。 これによって gcc でコンパイルされたモジュールとの互換性が保証されます。
環境変数
Dコンパイラ dmd は以下の環境変数を使用します:
- CC
- dmd は、通常はリンカとして gcc
を環境変数 PATH から探します。特定のリンカを指定したい場合は、
CC 環境変数を設定します。例:
set CC=gcc
- BROWSER
- -man スイッチでこのマニュアルページを開く時のブラウザの指定に使用されます。 デフォルトは x-www-browser です。
- DFLAGS
- dmd は、コマンドラインの最後に DFLAGS の内容が追加されたかのように動作します。
dmd.conf 初期設定ファイル
設定ファイル dmd.conf はWindowsでの sc.ini と同じもので、違うのは名前だけです。 WindowsとUnix系システムで同じ設定ファイルを 変更なしで共有することが出来ます。
dmd は初期設定ファイル dmd.conf を、 以下のディレクトリから順番に探します:
- カレントディレクトリ
- HOME 環境変数で指定されたディレクトリ
- dmd のあるディレクトリ
- /etc/
dmd.conf が見つかった場合、 このファイルで設定された環境変数が既存の設定を上書きします。 他のプログラムの環境変数による設定との衝突を避け、dmd の設定を独立させる簡単な方法となっています。
環境変数は [Environment] セクションのヘッダの後ろに続けて、 NAME=value という組の形で記述します。 NAMEは常に大文字扱いになります。 コメントは行頭の ; から始める行です。例としては:
; dmd.conf 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]
DFLAGS=-I%@P%/../src/phobos -I%@P%/../src/druntime/import
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.o、そして既存のライブラリ def.aを全てまとめて、 foo.a というライブラリをビルドする場合を考えてみましょう:
- それぞれを個別にコンパイルし、ライブラリ化コマンドを実行:
dmd -c foo.d dmd -c bar.d rm -f foo.a ar -r foo.a foo.o bar.o abc.o def.a rm foo.o bar.o
この方法は、makefile などを使うことで、 モジュールの余計な再コンパイルを避ける時などに適しています。 - 一括でコンパイルを行い、ライブラリ化コマンドを実行:
dmd -c foo.d bar.d rm -f foo.a ar -r foo.a foo.o bar.o abc.o def.a rm foo.o bar.o
- dmd で、コンパイルとライブラリ作成を一発で実行:
dmd -lib foo.d bar.d abc.o def.a
オブジェクトファイルがディスクに書き出されることはなく、全ての中間処理はメモリ上で行われます。 -lib のもう一つの利点としては、一つのモジュールが一つのオブジェクトファイルに対応するのではなく、 さらに細かく分割して複数のオブジェクトとして格納されることです。 これによって、モジュールを手で分割することなしに 粒度を上げることができます。
dmd のコンパイル
dmd コンパイラのビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:
cd ~/dmd2/src/dmd
make -f osx.mak
Phobos のコンパイル
Dのランタイムライブラリである Phobos ビルドに必要なソースは全て提供されています。 以下の手順でビルドが可能です:
cd ~/dmd2/src/druntime
make -f posix.mak DMD=~/dmd2/osx/bin/dmd
cd ../phobos
make -f osx.mak DMD=~/dmd2/osx/bin/dmd