...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

DFLのビルド方法

この記事はD言語 Advent Calendar 2022の6日目の記事です。

 

・はじめに

先日、DFLdmd 2.101.0でビルドできるように修正しました。

とうの昔にPhobosのstd.streamが廃止になっているので、代わりにundeaDライブラリのundead.streamを使いましたが、DFLをビルドするためにundeaDライブラリも必要になってしまいました。

そこでこの記事では、ふと遊んでみたくなった人向けに、DFLのビルド方法を説明します。

なお、今のところDUBには対応していません。

 

コンパイラのインストール

dmddmcは、公式サイトからダウンロードしてインストールしてください。

@outlandkarasuさんが今年も「D言語環境構築」の記事を書かれているので、そちらを参考にしてください。

この記事を書いている時点では2022年版がまだ公開されていないので2020年版のリンクを張っておきます。

qiita.com

自分はWindowsインストーラー(MSI)でインストールしましたが、dmcを追加選択した後は、特に問題なくインストールできて簡単でした。

インストールできたら、dmd.exeにパスが通っているか確認しましょう。

 

Windowsキー+Pauseキーで「詳細情報」を開きます。

右にある関連設定の「システムの詳細設定」をクリックして「システムのプロパティ」を表示し、「環境変数」ボタンをクリックして、環境変数Pathにdmd.exeの場所が登録されているか確認してください。

私の場合は、dmd.exeがc:\d\dmd2\windows\binにインストールされているので下図の設定になっていますが、ここは自分の環境に合わせてください。

 

ついでに、後でDFLをビルドするために必要になる環境変数も追加してしまいましょう。

dmc_pathとして、dmcのbinフォルダの場所を指定します(dmc.exeの場所ではないです)。私の場合はc:\dmc\dmです。

また、dmd_pathとして、dmdのbinフォルダの場所を指定します(dmd.exeの場所ではないです)。私の場合はc:\d\dmd2\windowsです。

 

・undeaDライブラリのビルド

DFLをビルドするために、まずはundeaDライブラリが必要です。

Git for Windowsをインストールしてgitを使ってもいいのですが、ここは簡単に、緑色のCodeボタンをクリックして「Download ZIP」からZIP形式でダウンロードしてきます。

ZIPファイルを展開したら、コマンドプロンプトを開いて、展開したフォルダに移動します。

後でDFL同梱のmakelib.batを使うために、OMF形式のlibファイルにするために-aオプションを付けて、

dub -a=x86_omf

を実行します。

dub.exeはdmd.exeと同じ場所にありますので、ここまでの作業ができていれば実行できるはずです。

うまくいけばundeaDのbinフォルダの中にundead.libができるので、これをdmdをインストールしたフォルダにあるlibフォルダにコピーします。自分の場合は、C:\d\dmd2\windows\libです。

 

dubの-aオプションにx86_omfが指定できることは、@mono_shooさんと@shitsyndromeさんに教えてもらいました。ありがとうざいました。

qiita.com

 

・DFLライブラリのダウンロード

続いて、DFLをダウンロードします。こちらも緑色のCodeボタンから、ZIP形式でダウンロードします。

ZIPファイルを展開したら、次はコンパイラの設定をします。

 

コンパイラの設定

DFLとundeaDのZIPファイルを展開した場所をdmdに知らせます。

dmdのbinフォルダにコンパイラの設定ファイルsc.iniがあるので、[Environment]のDFLAGSの末尾にDFLとundeaDのパスを追記します。

下記は私の環境のパスなので、自分の環境に合わせて修正します。

「 -Ic:\d\gitproj\dfl\win32 -Ic:\d\gitproj\undead\src」

[Environment]
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import" -Ic:\d\gitproj\dfl\win32 -Ic:\d\gitproj\undead\src

これでDFLをビルドするための準備は完了です。

 

・DFLライブラリのビルド

DFLのZIPファイルを展開したフォルダの中にある\win32\dflをエクスプローラーで開き、そこにある"go32omf.bat"をダブルクリックして実行します。

うまくいけば、3つのlibファイル(dfl.lib、dfl_debug.lib、dfl_build.lib)が作成されます。(2022/12/06 14:39 # dfl_build.libは作成されなくなりました。)

途中でキー入力を求められるので、適当なキーを押すと、先ほどのundead.libの移動先と同じフォルダに3つのlibファイルが移動されます。

これで、DFLのビルドができました。

 

・サンプルコードの動作確認

DFLの\win32\examples\hello_dflに、サンプルコードhello_dfl.dを置いてあるので、これを動かしてみます。

やり方は簡単で、build.batをダブルクリックして実行すると、ビルドして実行されます。

shell.batの方は、私のPC環境のパスに設定されているので、必要に応じて修正してください。このフォルダでコマンドプロンプトを表示するためだけのものなので、触らなくても大丈夫です。

 

DFLで作成したアプリケーションのexeを実行したときにコンソールウィンドウが開かないようにするためのdmd.exeのオプションは、こちらの記事を参考にしました。

qiita.com

従来、32bitでコンパイルする場合でGUIツールを作るときには、コマンド画面が出ないよう、dmdに -L/exet:nt/su:windows:4.0 としてリンカオプションを指定する方法が知られている

 

・今後の課題

dmdがCOFF形式のオブジェクトファイルを想定するようになったようで、dmdに-m32omfオブションを付けないとリンクがうまくいきません。

数年前からDFLを64bitで動かしている方々がおられますが、当時自分でやってみてもどうもうまくいかず、自分の環境ではそれっきり試せていません。

implib.exeでdmdやDFLに同梱されているlibファイルをOMF形式からCOFF形式に変換すればいいのかなと思っていましたが、今ならdmdのlibフォルダにCOFF形式のlibファイルが用意されているので、想像しているより簡単にできるのかもしれません。

 

以前から、DFL同梱のmakelib.batを使っていて、今回も慣れている方法でやったので、BUDには対応していません。

 

これまで、度々、最新のdmdでビルドできるようにDFLを更新してきましたが、機能の追加はできていません。

まあ、もう数年放置されているライブラリですし、ユーザーがいないので、ちょっとしたツールを作るとか、おもちゃにして遊ぶくらいでしょう。

 

・おわりに

今回、久しぶりに、DFLを最新のdmdでビルドできようにしました。

DFLには、ドキュメントらしいドキュメントがほとんどなく、私が使っていたときもDFL本体のソースを見ながらGUIアプリケーションを書いていましたが、.NETのWindows Formsの使用感に近いので、C#を使った経験でなんとなく使えていました。

私自身、DFLに実装されているすべての機能を使ってみたことがないので、未知のバグがあるかもしれませんが、必要になって動かしておかしかったときに直したらいいや、という軽い気持ちなので、次のアップデートがいつになるかは神のみぞ知るところです。