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

DMD コンパイラ OSX 版

必要なもの

  1. Dコンパイラのダウンロード
  2. 32 bit x86 Mac OSX
  3. 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 にコピーして下さい)

インストール

  • dmd の zip ファイルをホームディレクトリに置いて、 unzipで展開します。
    unzip dmd.VERSION.zip
    
    VERSION にはそのzipファイルのバージョン番号が入ります。
  • ~/dmd2 ディレクトリが作られ、 全てのファイルがその中に入っています。 ツールは全てコンソールから利用するコマンドライン用ツールです。
  • 動作を確かめるために、以下の内容で hello.d というファイルをホームディレクトリに作成して下さい:
    import std.stdio;
    
    void main() {
        writeln("hello world!");
    }
    
    これを次のようにコンパイルして実行すると
    dmd2/osx/bin/dmd hello
    ./hello
    
    以下が表示されれば成功です:
    hello world!
    
  • システム全体で使えるようにインストールするには:
  • 実行ファイルを /usr/local/bin:
    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
    
  • 最後に、ライブラリファイルを /usr/lib へコピーします:
    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 を、 以下のディレクトリから順番に探します:

    1. カレントディレクトリ
    2. HOME 環境変数で指定されたディレクトリ
    3. dmd のあるディレクトリ
    4. /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版の違い


    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.o、そして既存のライブラリ def.aを全てまとめて、 foo.a というライブラリをビルドする場合を考えてみましょう:

    1. それぞれを個別にコンパイルし、ライブラリ化コマンドを実行:
      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 などを使うことで、 モジュールの余計な再コンパイルを避ける時などに適しています。
    2. 一括でコンパイルを行い、ライブラリ化コマンドを実行:
      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
      
    3. 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