DFLのビルド方法(DUB編)
この記事はD言語 Advent Calendar 2022の10日目の記事です。
・はじめに
前々回、前回と、DFLのビルド方法について書いてきましたが、今回が完結編となりそうです。
OMF形式に次いで、COFF 32bit、64bit形式のオブジェクトファイルを作成する方法を書きましたが、バッチファイルを実行するなんて今風ではありませんね。
大分苦戦しましたが、DUBでビルドできるようにしましたので、そちらの方法を説明します。
なお、DUBの標準的なフォルダ構成に合わせたことにより、sc.iniを修正する必要がありますので、ご注意ください。
・dmdコンパイラのインストール
前回までの記事でインストールされていたら特にすることはありません。
DUBではなくバッチファイルを使う場合は、dmdのインストーラーの途中で出てくる選択肢で、
Install VC**** redistributables to use it with MinGW Platform libraries
を選択して、
にuser32.libなどのインポートライブラリがインストールされていることを前提にしていました。
DUBを使う場合は、./dfl/lib以下のLIBファイルを見に行くようにしたので、上記の前提はなくなります。
でも上記の選択肢を選んでおいた方が何かと都合がいいでしょう。
元々、DFL同梱のバッチファイルを使ったときに作成されるdfl.libとdfl_debug.lib(以下、「dfl.lib等」という。)は、オリジナルのDFLがそうだったように、user32.libなどのWINSDKのインポートライブラリが結合されており、dfl.lib等だけをアプリケーションにリンクすればDFLを使えるようになっていました。
最近の更新で、undead.libのリンクも必要になったので、dfl.lib等にはundead.libも結合されるようになっています。
一方、DUBを使う場合は、多数のLIBファイルを1つにまとめないで、最後に実行可能ファイルを作成するときにまとめてリンクする仕組みになっていることに則り、user32.libやundead.libが含まれないdfl_dub.libを作成します。
また、従来のDFLにはWINSDKの一部のLIBファイルをDFL用にしたものが同梱されていましたが、不要になったので削除しました。
・Visual Studioのインストール
DUBを使うならMicrosoft 製のlib.exeを使わないので、VSのインストールは不要です。
(不要ですよね・・・?)
・undeaDライブラリのビルド
DUBでアプリケーションをビルドするときに、DUBが依存関係を辿って勝手にダウンロード、ビルドしてくれるので、作業は不要です。
・DFLライブラリのダウンロード
DUBに対応させたDFLを公開していますので、最新版をダウンロードしてください。
前回同様にZIPファイル形式(dfl-master.zip)でダウンロードします。
DFLはDUBの公式パッケージに登録されていないので、DUBのローカルパッケージとしての登録が必要です。
ただし、この後に説明するサンプルコードをビルドしてみるだけであれば、dub.jsonで相対パスを指定してあるので、登録しなくても大丈夫です。
ZIPファイルを展開して好きな場所に置いて、そのフォルダに移動し、
> cd dfl-master
> dub add-local .
登録できたか確認しましょう。
> dub list
Packages present in the system and known to dub:
dfl ~master: c:\your\path\dfl\
c:\your\path\dflは、各自の環境により異なります。
次の記事を参考にしました。
・コンパイラの設定
DFLをDUBに対応させるためにフォルダ構成を変更したので、dmdのbinフォルダにあるsc.iniの設定を修正します。
なお、DFLを使うGUIアプリケーションもDUBでしかビルドしないなら、DFLとundeaDのパス設定が不要になりますので、sc.iniの追記は削除しても大丈夫です。
DUBを使わない方法でも使えるようにしておくには以下のようにします。
前々回の記事で、
[Environment]
DFLAGS="-I%@P%\..\..\src\phobos" "-I%@P%\..\..\src\druntime\import" -Ic:\d\gitproj\dfl\win32 -Ic:\d\gitproj\undead\src
のように追記されていると思います。
c:\d\gitproj\dfl\win32
のところを
c:\d\gitproj\dfl\source
に修正します。
・サンプルコードの動作確認
.\dfl\example\hello_dflにあるサンプルコードもDUBに対応させましたので、これを実行してみます。
私のPCはCPUが64bitなので、特に指定しなければ64bitの実行ファイルが作成されます。
現状、64bit環境ではコンパイル時に警告がいくつか出ますが、
> cd examples\hello_dfl
> bud
これだけでビルドから実行までしてくれます。
なお、DUBでビルドするときには、dfl.lib等を明示的にリンクする必要がありません。
そのため、hello_dfl.dでは、ソースコード冒頭で以下のように条件分岐しています。
Have_dflは、DUBでビルドされたときに定義されるversion識別子です。
version(Have_dfl) // For DUB.
{
}
else
{
pragma(lib, "dfl.lib");
}
・おわりに
だいぶ手こずりましたが、今回はDFLをDUBに対応させました。
これで、前々回の記事の「今後の課題」で述べたことのうち、機能の追加以外は済みました。
できる気がしませんが、何か1つくらいコモンコントロールの追加をしてみたいですね。
今回の一連の記事を書いたついでに、README.mdを書いたので、https://github.com/Rayerd/dfl の見た目がちょっとはマシになったでしょうか。
気が向いたら遊んでみてください。
・謝辞
DUBの挙動についてお二人に色々教えていただきました。
ありがとうございました。
以上、D言語 Advent Calendar 2022の10日目の記事でした。