英語版
このページの英語版を見る

DMD Compiler for Linux

要件とダウンロード

  1. DMDコンパイラ
  2. 32ビットx86および64ビットx86-64のLinuxオペレーティングシステム (LDC およびGDCは、 さらに多くのアーキテクチャをサポートしている )
  3. GNU C コンパイラ(gcc)または LLVM C コンパイラ(clang)

インストール

ヒント - 公式パッケージでは これらの手順が自動的に実行される。 あるいは、インストールスクリプトを使用して、ユーザーディレクトリにDMDをインストールすることもできる。

ヒント-公式パッケージでは これらの手順は自動的に実行される。 あるいは、インストールスクリプトを使用して、ユーザディレクトリにDMDをインストールすることもできる。

アーカイブをホームディレクトリに解凍する。 これにより、~/dmd ディレクトリが作成され、すべてのファイルが格納される。 すべてのツールはコマンドラインツールであり、 コンソールウィンドウから実行される。 すべてのツールはアーカイブから直接実行できる。
~/dmd/linux/bin64/dmd
dmd をグローバルにインストールするには、~/dmd/linux/bin64 フォルダをPATH に追加する。
export PATH="$HOME/dmd/linux/bin64:$PATH"
または、以下のようにして、dmd をローカルにインストールすることもできる。

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

dmd ファイル...-スイッチ...
ファイル...
ファイル拡張子
拡張子 ファイルの種類
なし Dソースファイル
.c Cソースファイル
.d Dソースファイル
.dd Ddocソースファイル
.di D インターフェースファイル
.i プリプロセスされたCソースファイル
.o リンクするオブジェクトファイル
.a 検索するオブジェクトコードライブラリ
@cmdfile
cmdfileが環境変数である場合、 コンパイラの引数とスイッチをその変数の値から読み取る。 そうでない場合は、コンパイラの引数とスイッチを テキストファイルcmdfile から読み取る。 このファイルには、ハッシュ記号で始まる1行のコメントが含まれている場合がある (# )。
-allinst
すべてのテンプレート実装用のコードを生成する
-betterC
コンパイラを調整して、Dをより優れたCとして実装する:
  • D_BetterC バージョンを事前定義する。
  • 式が失敗した場合、 Dランタイム内の関数ではなく、Cランタイムライブラリのassert失敗関数を呼び出す。
  • 配列のオーバーフローは、 Dランタイムの関数ではなく、Cランタイムライブラリのassert失敗関数を呼び出す。
  • 最終的なスイッチエラーは、 Dランタイムの関数ではなく、Cランタイムライブラリのエラー関数を呼び出す。
  • phobosランタイムライブラリと自動的にリンクしない。
  • 完全なアンワインディング情報を持つDwarfeh_frame を生成しない。つまり、例外テーブルはeh_frame に挿入されない。
  • モジュールのコンストラクタとデストラクタが生成されないため、 静的および 共有静的コンストラクタ デストラクタは 呼び出されない。
  • ModuleInfo 生成されない。
  • TypeInfo 構造体にはインスタンスが生成されない。
-boundscheck=[on|safeonly|off ]
境界チェックが有効かどうかを制御する。
  • on: すべてのコードで境界チェックが有効になる。これがデフォルト。
  • safeonly: 境界チェックは、@safe のコードでのみ有効になる。 これは、ビルド時のデフォルト設定である -release
  • off: 境界チェックは完全に無効になる(@safeコードでも)。 このオプションは慎重に使用すべきであり、 パフォーマンスを向上させるための最終手段として使用すべきである。@safe 境界チェックを無効にすることが有益であるかどうかは、ベンチマークで確認すること。
-c
コンパイルのみを行い、リンクはしない
-check=[assert|bounds|in|invariant|out|switch][= [on|off]]
特定のチェックを有効または無効にするには、デフォルト、-boundscheck、-release、-unittestオプションを上書きする。
  • assert:アサーションのチェック
  • bounds: 配列の境界
  • in: 契約内
  • invariant: クラス/構造体の不変条件
  • out: 契約の出力
  • switch:final switch 失敗のチェック
  • on または指定されていない場合:指定チェックが有効。
  • off: 指定されたチェックは無効である。
=[h|help|? ]
-check=[h|help|? ]
利用可能なすべてのチェックの情報を表示する
-checkaction=[D|C|halt|context ]
アサートまたは配列境界チェックが失敗した場合、 またはfinal switch エラーが発生した場合の動作を設定する。
  • D: デフォルトの動作。回復不可能なAssertError をスローする。
  • CCランタイムライブラリのassert失敗関数を呼び出す。
  • halt:halt命令を実行し、プログラムを終了する。
  • context: 復旧不可能なAssertError の一部としてエラーコンテキストを表示する。
-checkaction=[h|help|? ]
利用可能なすべてのチェックアクションの情報を表示する
-color
色付きコンソール出力を有効にする
-color=[on|off|auto ]
色付きのコンソール出力を表示する。デフォルトはターミナルの機能に依存する。
  • autottyが検出された場合は色付き出力を使用する(デフォルト)
  • on:常に色付き出力を使用する。
  • off: カラー出力は使用しない。
=filename
-conf=filename
ファイル名で指定された 設定ファイルを使用する
-cov
コードカバレッジ解析を行う
-cov=ctfe
CTFE中に実行されたコードをカバレッジレポートに含める
-cov=nnn
コードカバレッジ解析を実行し、.lst ファイルにレポートを生成する。
dmd -cov -unittest myprog.d
-cpp=filename
通常、関連するCコンパイラで使用されるCプリプロセッサが ImportCファイルの前処理に使用されるが、 これは-cpp スイッチによって無効化される。
-D

ソースからドキュメントを生成する。

注釈:セキュリティ上の考慮事項に注意すること。

-Ddディレクトリ
ドキュメントファイルをディレクトリに書き込む。 -op 元のパッケージ階層を保持する必要がある場合は、これを使用できる
-Dfファイル名
ドキュメントファイルをfilename に書き込む
-d
非推奨の機能非推奨の属性を持つシンボルの使用を黙認する 。
-de
非推奨の機能やシンボルが使用された場合、エラーを発行する(コンパイルを中断する)
-dw
非推奨の機能やシンボルが使用された場合にメッセージを表示する(デフォルト)
-debug
デバッグコードをコンパイルする
-debug=level
デバッグレベルでコンパイルする<level>
-debug=ident
デバッグ用 識別子をコンパイルident
-debuglib=name
シンボリックデバッグ用にコンパイルする際に、デフォルトライブラリとしてlibnameをリンクする。libphobos2.a の代わりに使用する。 libnameが指定されていない場合は、デフォルトライブラリはリンクされない。
-defaultlib=name
シンボリックデバッグ用にコンパイルしていない場合、libphobos2.a の代わりにデフォルトライブラリとしてlibname をリンクする。 libnameが指定されていない場合は、デフォルトライブラリはリンクされない。
-deps
モジュール依存関係を表示 (インポート/ファイル/バージョン/デバッグ/ライブラリ)
-deps=filename
filename 指定しない場合、モジュールの依存関係 (imports/file/version/debug/lib)を表示する。 filename を指定した場合、モジュールの依存関係をテキストとしてfilename に書き出す (imports のみ)。
-dllimport=value
ルートモジュールで定義されていない場合に、dllimportによって暗黙的にインポートするグローバル変数
  • none: なし
  • defaultLibsOnly: druntime/Phobos のシンボルのみ
  • all: すべて
=standard
-extern-std=標準
サポートされている標準規格は以下の通り:
  • c++98: C++98 の名前のマングリングを使用、__traits(getTargetInfo, "cppStd")199711
  • c++11(デフォルト):C++11の名前マングリングを使用する。__traits(getTargetInfo, "cppStd")201103
  • c++14: C++14 の名前の短縮化を使用する。__traits(getTargetInfo, "cppStd")201402
  • c++17: C++17の名前の短縮形を使用する、__traits(getTargetInfo, "cppStd")201703
  • c++20: C++20 の名前の短縮形を使用する、__traits(getTargetInfo, "cppStd")202002
-extern-std=[h|help|? ]
サポートされているすべての規格をリストアップする
-fIBT
間接分岐追跡コードを生成
-fPIC
位置非依存コードを生成
-fPIE
位置非依存実行ファイルを生成
-g
DWARF形式のシンボリックデバッグ情報を追加 デバッガ用 gdb
-gdwarf=version
version の 値は 3、4、5のいずれかであり 、デフォルトは 3 である。
-gf
コンパイルされたコードが参照するすべての型について、シンボリックデバッグ情報が生成される。 定義が現在コンパイルされていないインポートされたファイルにある場合でも同様である。
-gs
常にスタックフレームを出力する
-gx
関数終了時にスタックフレームのメモリを上書きするスタックストンプコードを追加する。
-H
Dインターフェースファイルを生成
-Hd=directory
Dインターフェースファイルをディレクトリに書き込む。 -op 元のパッケージ階層を保持する必要がある場合は、これを使用できる。
-Hf=filename
「ヘッダー」ファイルをfilename に 書き込む
-HC[=[?|h|help|silent|verbose ]]
C++の「ヘッダー」相当をstdoutに書き込む。設定は:",
?|h|help
C++の「ヘッダー」ファイル生成で利用可能なオプションの一覧
silent
のみ extern(C[++])宣言をリストする(デフォルト)
詳細
無視された宣言(extern(D)など)にもコメントを追加する
-HCd=directory
C++の「ヘッダー」ファイルをディレクトリに書き込む。-HCf= が指定されていない場合は無視される
-HCf=filename
C++の「ヘッダー」ファイルをstdoutではなくfilenameに 書き込む
--help
ヘルプを表示して終了
-I=directory
インポートもディレクトリ で探す
-i[=pattern ]

「インクルードインポート」モードを有効にし、コンパイラがインポートされたモジュールを コマンドラインで指定されたかのようにコンパイルに含める。デフォルトでは、 このオプションが有効になっている場合、druntime/phobos以外のすべてのインポートされたモジュールが含まれる。 この動作は、-i=<pattern> 経由でパターンを指定することで上書きできる。-i=<package> の形式のパターンは「包括的パターン」であり、 の形式のパターンは「 -i=-<package> の形式のパターンは「除外パターン」である。 包括パターンは パターンに一致する名前のすべてのモジュールを含めるが、除外パターンはそれらを除外する。 例えば、foo.bar のパッケージ内のすべてのモジュールは、-i=foo.bar を使用して含めることができ、-i=-foo.bar を使用して除外できる 。 完全修飾名の各コンポーネントは、パターンに完全に一致しなければならないことに注意 。したがって、foo.bar というパターンは、foo.barx という名前のモジュールには一致しない。

druntime/phobos を除外するデフォルトの動作は、内部的に 標準の除外セットを追加することで実現されている。すなわち、-i=-std -i=-core -i=-etc -i=-object である。 これらは-i=std -i=core -i=etc -i=object で上書きできることに注意。

モジュールが複数のパターンに一致する場合、一致はコンポーネントの長さによって優先順位が付けられ、 より多くのコンポーネントに一致するものが優先される(すなわち、foo.bar.baz というパターンはfoo.bar よりも優先される)。

デフォルトでは、どのパターンにも一致しないモジュールはすべて含まれる。しかし、 少なくとも1つの包括的なパターンが指定されている場合、どのパターンにも一致しないモジュールは 除外される。この動作は、-i=. を使用してデフォルトで含めるか、-i=-. を使用して デフォルトで除外するように上書きできる。

-i=... オプションを複数指定することができ、それぞれにパターンを追加できることに注意。

-identifiers=table
非ASCII値に使用する識別子テーブル を設定する。
  • UAX31: UAX31
  • c99: C99
  • c11: C11
  • all: すべて、最も制限のないセットであり、他のすべてを含む(デフォルト)
-identifiers-importc=table
非ASCIIの値に使用する識別子テーブル を設定する。
  • UAX31: UAX31
  • c99: C99
  • c11: C11 (デフォルト)
  • all: すべて、最も制限の少ないセットで、他のすべてを含む
-ignore
非推奨フラグ、現在ではサポートされていないプラグマは常に無視される
-inline
インライン関数はコンパイラの判断で使用される。 これはパフォーマンスを向上させるが、 デバッガの使用が難しくなるという代償を伴う。
-J=directory
ImportExpressions のファイルを検索する場所 。 ImportExpressionsを使用するには、このスイッチが必要である。 pathは ; で区切られた パスのリストである。-J を複数回使用でき、パスは 同じ順序で検索される。
-L=linkerflag
リンカーにリンカーフラグを渡す。 例えば、ld
-lib
オブジェクトファイルではなくライブラリファイルを出力として生成する。 コンパイルされたすべてのソースファイル、およびコマンドラインで指定されたオブジェクトファイルとライブラリ ファイルは、出力ライブラリに挿入される。 コンパイルされたソースモジュールは、粒度を向上させるために複数のオブジェクトモジュールに分割される場合がある 。 ライブラリ名は、最初にコンパイルされたソースモジュール名から取得される。この名前は、 スイッチで -of
-lowmem
コンパイラのガベージコレクタを有効にすると、 コンパイラのメモリ要件は減少するが、コンパイル時間は増加する。
-m32
32ビットの実行ファイルをコンパイルする。これは32ビットのdmdのデフォルトである。
-m64
64ビットの実行ファイルをコンパイルする。これは64ビットのdmdのデフォルトである。
-main
コンパイル時にデフォルトのmain() 関数を追加する。これは、 ライブラリの単体テストを行う際に有用である。 手動でエントリーポイント関数を定義することなく、ライブラリ内の単体テストを実行できる
-makedeps[=filename
Makefile互換形式で依存関係を表示する。 filenameが省略された場合は、stdoutに出力される。 出力されるターゲットは、コンパイルされた成果物(実行ファイル、オブジェクトファイル、ライブラリ)である
出力される依存関係は、インポートされたモジュールとインポートされた文字列ファイル(-J スイッチ経由)である。 依存関係またはターゲットのファイル名に特殊文字が含まれる場合は、GNU Make の方式に従ってエスケープされる。
-man
このページでBROWSER環境変数で指定されたブラウザを開く。BROWSER が 未定義の場合、x-www-browser が想定される。
-map
.map ファイルを生成する
-mcpu=id
コード生成のターゲットアーキテクチャを設定する。 ここで
helplist alternatives
baselinethe
ターゲットプラットフォームの
最小
アーキテクチャ(デフォルト)
avx
ベクトルおよび浮動小数点演算用の SSE命令の代わりにAVX命令を 生成する
OSX32以外の32ビットメモリモデルでは使用できない
nativeuse
コンパイラが実行されている
アーキテクチャ
-mcpu=[h|help|? ] すべての
アーキテクチャオプション
を表示
-mixin=filename
ミックスインを
filename
で指定したファイルに展開して保存する
-mv
=package.module=
path/filenameを package.module のソースファイルとして使用する
これは、ソースファイルのパスと名前が パッケージおよびモジュール階層と同じでない場合に使用する
path/filename package.moduleの最も右側のコンポーネントは、 同じであれば省略できる。
-noboundscheck
配列境界のチェックをすべて無効にする。安全な関数に対しても同様である。非推奨 (代わりに-boundscheck=off を使用)。
-nothrow
例外スタック巻き戻しコードの生成を無効にし、 RAII オブジェクト用のより効率的なコードを有効にする。
-O
生成されたコードを最適化する。最速の実行ファイルを作成するには、-O -release -inline -boundscheck=off スイッチを一緒に使用してコンパイルする。
-o-
オブジェクトファイルの生成を抑制する。 -D または-H フラグと併用すると便利である
-od=directory
オブジェクトファイルをカレントディレクトリではなく、objdir ディレクトリに 相対的に書き込む。-op を使用すると、元のパッケージ階層
を保持できる
-of=filename
出力ディレクトリ内のファイル名を filename に設定する。 出力ファイルは、 他のスイッチに応じて、オブジェクトファイル、実行可能ファイル、ライブラリファイルのいずれかになる 。
-op
通常、オブジェクト、インターフェース、またはDdocファイル名を生成する際には、.d ソースファイルのパスは削除される 。-op はパスを残す
-os=os
ターゲットのオペレーティングシステムをホスト以外のものに設定する
    host:
  • ホストのオペレーティングシステム
  • をターゲットとする
  • (デフォルト
)。
  • dragonflybsd: DragonFlyBSD
  • freebsd: FreeBSD
  • linux: Linux openbsd: OpenBSD osx: OSX solaris: Solaris windows: Windows
-P
=preprocessorflag プリプロセッサフラグを cpp
-preview=name
idで識別される今後の言語変更を
プレビューする
-preview=[h|help|? ]
今後の言語変更を
すべてリストする
-profile
生成されたコードを調整し、生成されたプログラムが実行された際に、実行時のパフォーマンスデータが収集されるようにする。 生成されたプログラムが完了すると、trace.logtrace.defというファイルが生成される。trace.log には2つのセクションがあり、
  1. それぞれプロファイルされた関数の
  2. ファンイン
  3. とファンアウトである。関数の名前は左揃えで表示され、 その直前に表示されるのは、その関数を呼び出す他の関数(ファンイン)と、その関数が呼び出される回数である 。 その直後に続く関数は、呼び出される関数(ファンアウト)と、 その関数が呼び出される回数である。 関数自体には、3つの数値が追加されている。ファンインの合計回数、 その関数で使用されるツリー時間(その関数時間と、その関数が呼び出すすべての関数のツリー時間の合計)、
ファンアウトで使用された時間を
  1. 除いた時間
  1. 各関数の
  2. タイミングデータは
  3. 、使用頻度の高い順にソートされている
trace.def ファイルには、密接に関連する関数を関連付けるリンカコマンドが含まれており、 その結果、生成された実行可能ファイルでは隣接して表示される。 詳細については、プロファイルを参照のこと
-profile =gc
  • gcGCメモリ割り当てへの呼び出しをインストルメント化し、 プログラム終了時にprofilegc.log にレポートを書き込む。 注釈: インストルメント化された呼び出しのみが 記録される。これには以下が含まれる。
    • メモリを割り当てる言語構造
    • GCメモリを割り当てるPhobos関数
    • core.memory.GC 経由の GC 割り当て
    その他の手段による割り当ては記録されない。 GCのC APIへの直接呼び出しなどである。
-release
コンパイルリリース版
、つまり、実行時の 契約およびアサートに対するチェックは行われない。配列の境界チェックは システムおよび信頼された関数に対しては行われず、アサートエラーは 未定義の動作となる
-revert=name
idで識別される言語の変更を元に戻す
-revert=[h|help|? ]
元に戻せる言語の変更をすべてリストする
-run
srcfile プログラム srcfileを、 残りの コマンドライン、args...プログラムの引数として指定する。 .oファイルや実行可能ファイルは残らない。
-shared
共有ライブラリを生成する
-target=triple
arch はアーキテクチャ:x86x64x86_64x32 のいずれか、 vendorは常に無視されるが、相互運用性を高めるためにサポートされている、 osはオペレーティングシステム
これは末尾にバージョン番号が付く場合がある: freestanding はオペレーティングシステムなし、 darwin またはosx は MacOS、dragonfly またはdragonflybsd は DragonflyBSD、 freebsdopenbsdlinuxsolariswindows はそれぞれのオペレーティングシステム
cenv はC ランタイム環境であり、オプションである。musl-libc の場合はmusl 、 MSVC ランタイムの場合はmsvc (このオプションを指定すると、Windows のデフォルトとなる)、 Android libc の場合はbionic 、Windows 用のDigital Mars ランタイムの場合はdigital_mars GCC C ランタイムの場合はgnu またはglibc 、それぞれの C ランタイムの場合はnewlib またはuclibc ($ I cppenv)は C++ランタイム環境である。LLVM C++ ランタイムの場合はclanggccmsvc は Microsoft の MSVC C++ ランタイム(このスイッチを指定した場合は Windows のデフォルト)、 sun は Sun の C++ ランタイム、digital_mars は Windows のDigital Mars C++ ランタイムである
-transition =name
id で識別された言語変更に関する追加情報を
表示する
-transition=[h|help|? ]
すべての言語変更
を表示する
-unittest
unittest コードをコンパイルし、アサートを有効にしunittest バージョン識別子を設定する
-v
各コンパイラパスの詳細な出力を有効にする
-vasm
各関数で生成されたアセンブリ言語をリストする
-vcolumns
診断結果に
文字(列)番号
を表示する
-verror-style =[digitalmars|gnu ]
コンパイラメッセージのファイル/行番号注釈のスタイルを設定する。 ここで
digitalmars
'file(line[,column]): message'. これがデフォルトである
gnu'file:line[:column]: message'
gcc および clang で使用される GNU 標準に準拠する
-verror-supplements=num
各エラーに対する補足メッセージの数を
制限する
(0 は無制限を
意味する
)
-verrors=num
エラー/非推奨メッセージの数を制限する (0 は無制限を意味する)
-verrors =context
エラーが発生したソースコード行のコンテキストとともにエラーメッセージを表示する
-verrors =spec
__traits(compiles,...) のような推測コンパイルからのエラーを表示する
--version
コンパイラのバージョンを表示して終了する
-version=level
バージョンレベル≧レベル
コンパイルする
-version
=ident
バージョン識別子identでコンパイルする
-vgc
隠されたものも含めて、すべてのGC割り当てをリストする
-visibility =value
  • デフォルト: -shared オプションを指定しない Windows ターゲットでは非表示、それ以外では公開
  • hidden: 「export」マークのついたシンボルのみをエクスポートする
  • public: すべてのシンボルをエクスポートする
-vtls
スレッドローカルストレージに入るすべての変数をリストアップする
-vtemplates=[list-instances
]
オプション引数で追加の診断を決定する。 場所:
list-instances
各テンプレートのすべてのインスタンス化コンテキスト
も表示する
-w
警告を有効にする
-wi
情報警告を有効にする(すなわち、 コンパイルは通常通り進行する
-wo
問題となる可能性のある廃止された機能の使用に関する警告を有効にする(コンパイルは 通常通り実行される)
-X
JSONファイルを生成する
-Xf
=filename JSONファイルをfilenameに書き込む
-Xcc
=driverflag driverflagをリンカードライバー($CC またはcc )に渡す

ファイル

dmd2/src/phobos/
D ランタイムライブラリのソース
dmd2/src/dmd/
D コンパイラフロントエンドのソースコード(GPLとArtisticのデュアルライセンス)
dmd2/html/d/
ドキュメント
dmd2/samples/d/
サンプルDプログラム
dmd2/linux/bin/ddemangle
D シンボルデマンジャー
dmd2/linux/bin/dman
D マニュアル検索ツール
dmd2/linux/bin/dmd
Dコンパイラ実行ファイル
dmd2/linux/bin/dmd.conf
グローバルコンパイラ設定(/etc/dmd.conf にコピー
)
dmd2/linux/bin/dub
Dのパッケージマネージャー
dmd2/linux/bin/dumpobj
ELFファイルダンプツール
dmd2/linux/bin/dustmite
D ソースコードの最小化ツール
dmd2/linux/bin/obj2asm
ELFファイル逆アセンブラ
dmd2/linux/bin/rdmd
D ビルドツール(スクリプトのようなDコード実行用
)
dmd2/linux/lib/libphobos2.a
D ランタイムライブラリ(/usr/lib/libphobos2.a にコピー
)

リンク

リンキングは、コンパイルが成功した後、dmd コンパイラによって直接実行される。dmd がリンカーを実行しないようにするには、 -cスイッチを使用する。

実際のリンクは、gcc を実行することで行われる。 これにより、gcc でコンパイルされたモジュールとの互換性が確保される。

環境変数

Dコンパイラdmdは、以下の環境変数を使用する。

通常は、xml-ph-0000@deepl.internal を xml-ph-0001@deepl.internal に沿って探し、リンカーを実行する。特定のリンカーを使用する場合は、設定する。
CC
dmd 通常は、PATH に沿ってgccを探し、リンカを実行する。 特定のリンカを使用する場合は、 CC 環境変数をその値に設定する。例えば:
set CC=gcc
BROWSER
これは、マニュアルページを開く際に使用するブラウザを -man スイッチとともに設定する。デフォルトはx-www-browser である
DFLAGS
DFLAGS の値は、dmd へのコマンドラインに追加されたかのように扱われる。

dmd.conf 初期化ファイル

dmdファイルdmd.conf は、Windows用のsc.iniと同じである。 ただ、ファイル名が異なるだけだ。 これにより、Windowsとこのシステムの両方に共通する設定を、 ファイルを再編集することなく作成できる。

dmd 初期化ファイル を以下のディレクトリの順序で探す :dmd.conf

  1. 現在の作業ディレクトリ
  2. HOME 環境変数で指定されたディレクトリ
  3. HOME 環境変数で指定されたディレクトリ内の.dmd.conf
  4. dmd が存在するディレクトリ
  5. /etc/

見つかった場合、 ファイル内の環境変数の設定が既存の設定を上書きする。 これは、dmd を環境変数の使用が競合するプログラムから独立させるのに便利である。

環境変数は、xml-ph-0000@deepl.internalセクションの見出しに続き、 NAME=valueの形式で記載する。 NAMEは大文字として扱われる。 コメントは、;で始まる行である。

環境変数は、[Environment] セクションの見出しに続き、 NAME=値のペアで記載する。 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ソースファイルでインポート宣言が処理されると、 コンパイラはインポートに対応するDソースファイルを検索し、 そのソースファイルを処理して必要な情報を抽出する。 あるいは、コンパイラは

Dソースファイルでインポート宣言が処理されると、 コンパイラはインポートに対応するDソースファイルを検索し、 そのソースファイルを処理して必要な情報を抽出する。 あるいは、コンパイラは代わりに 対応するDインターフェイスファイルを検索することもできる。 Dインターフェイスファイルには、 モジュールのインポートに必要なものだけが含まれ、 そのモジュールの実装全体ではなく、

DソースファイルではなくDインターフェイスファイルをインポートに使用する利点は、 以下の通りである。

D インターフェースファイルは、コンパイラに D ソースファイルを指定することで作成できる。 -Hコンパイラへのスイッチを使用して D インターフェースファイルを作成することができる。 D インターフェースファイルの拡張子は.di である。 コンパイラがインポート宣言を解決する際には、まず .di D インターフェースファイルを探し、次に D ソースファイルを探す 。

Dインターフェイスファイルは、C++ヘッダーファイルと類似した部分がある。 しかし、C++ヘッダーファイルのように必須というわけではなく、 D言語の一部でもない。 Dインターフェイスファイルはコンパイラの機能であり、ビルドプロセスの最適化のみを目的としている。

実行ファイルのビルド

dmd できるだけ多くのソースファイルをコマンドラインに指定すると、実行ファイルをより高速にビルドできる。

また、複数のソースファイルを同じxml-ph-0000@deepl.internalの呼び出しに置くことのもう一つの利点は、xml-ph-0001@deepl.internalがいくつかのレベルで実行できることである。

同じdmd の呼び出しに複数のソースファイルを置くことのもう一つの利点は、dmd が ある程度のモジュール間の最適化を行うことができることである。 例えば、モジュール間の関数インライン化などである。

-i フラグを使用すると、インポートされたモジュールを自動的にコンパイルすることができる

ライブラリの構築

ライブラリを構築するには3つの方法がある。例えば、foo.dbar.d をコンパイルし、 オブジェクトファイルabc.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 を使用して、ライブラリのコンパイルとビルドを1回の操作で実行する:
    dmd -lib foo.d bar.d abc.o def.a
    
    オブジェクトファイルはディスクに書き込まれず、すべてメモリ内で処理される。 また、 -libまた、モジュールを 1つずつではなく、複数のオブジェクトファイルにコンパイルできるという利点もある。 これにより、モジュールを分割することなくライブラリの粒度を向上させることができる。

dmdのコンパイル

コンパイラをビルドするには、完全なソースコードが提供されている。 以下の手順に従う。

cd ~/dmd2/src/dmd
make -f posix.mak

Phobosのコンパイル

DランタイムライブラリであるPhobosをビルドするための完全なソースコードが提供されている。 以下の手順に従う。

cd ../phobos
make -f posix.mak