2021アドベントカレンダーの記事です。
#はじめに
UnrealEngineはエディタやアプリケーションの実行ファイルを作るためにC++を用いてビルドを行います。
ビルドは対象のプラットフォームに向けたバイナリを生成できるコンパイラにソースファイルをコンパイルしてもらうことで行われます。このときコンパイラに向けてデバッグ情報の有無や関連するソースファイルやヘッダファイルの指定、最適化オプション、言語に対する指定などを コンパイルオプション として渡していますが、UnrealEngineではUnrealBuildToolがコンパイラに関する操作を包括して制御するため、個々のコンパイルオプションを操作する必要はありません。
が、
「最適化用に設定を変更したんだけど本当に適用されているのかな?」
とか
「謎のリンクエラーがでてしまった。。。リンクされているライブラリがなにかおかしい?」
といった、コンパイラの動作に確信がもてなくて困ったり、環境に依存したビルドエラーなどに遭遇して頭を悩ませることがあります。
本記事ではこれらの確認方法などについて解説したいと思います。
#オプションは一旦ファイルに出力されてコンパイラに渡される
UBTのソースコードの内部でこれらを制御するコードを見つける事ができます。
FileReference ResponseFileName = new FileReference(TargetFile.AbsolutePath + ".response");
FileItem ResponseFileItem = Graph.CreateIntermediateTextFile(ResponseFileName, SharedArguments.Concat(FileArguments).Concat(AdditionalArguments).Select(x => Utils.ExpandVariables(x)));
CompileAction.CommandArguments = " @\"" + ResponseFileName + "\"";
".response"という文字列が見えますね!UBTはコンパイルオプションを配列にまとめたあと、 "[出力ファイル名].response"ファイル に一旦出力し、それをコンパイラに渡しています。
responseファイルは単純なテキストファイルなのでビルドした後にこのファイルを確認することでコンパイラに渡されているオプションを確認することができます。
##ファイルの配置位置
###cppファイル-コンパイルオプション
Intermediateフォルダ以下で、*.cpp.obj.response
ファイルを探します
ターゲットプラットフォームフォルダの下のフォルダは、エディタをビルドする場合はUE4Editorフォルダ、モノシリックビルド(いわゆるパッケージビルド)の場合はプロジェクト名のフォルダに置かれます。
[プロジェクトフォルダ]\Intermediate\Build\[ターゲットプラットフォーム]\[UE4Editor or プロジェクト名]\[コンフィギュレーション]\[モジュール名]\[ソースファイル名].cpp.obj.response
####例
D:\dev\UE427projects\myproject\Intermediate\Build\Win64\myproject\Development\mymodule\hogehoge.cpp.obj.response
最適化オプションやコンパイラから渡すマクロ定義、警告抑制オプション、インクルードパスなどが確認できます
/Zc:inline
/nologo
/Oi
/c
/Gw
/Gy
/Zm1000
/wd4819
/D_CRT_STDIO_LEGACY_WIDE_SPECIFIERS=1
/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1
/D_WINDLL
/D_DISABLE_EXTENDED_ALIGNED_STORAGE
/source-charset:utf-8
/execution-charset:utf-8
/Ob2
/Ox
/Ot
/GF
/errorReport:prompt
/EHsc
/Z7
/MD
/bigobj
/fp:fast
/Zo
/Zp8
/we4456
/we4458
/we4459
/wd4463
/we4668
/wd4244
/wd4838
/I .
/I ..\Intermediate\Build\Win64\UE4Editor\Inc\Engine
/I Runtime
/I Runtime\Engine\Classes
/I Runtime\Engine\Public
以下略
###exeファイル-リンカオプション
Intermediateフォルダ以下で、*.exe.response
ファイルを探します。
[プロジェクトフォルダ]\Intermediate\Build\[ターゲットプラットフォーム]\[UE4Editor or プロジェクト名]\[コンフィギュレーション]\[プロジェクト名].exe.response
####例
D:\dev\UE427projects\myproject\Intermediate\Build\Win64\myproject\Development\myproject.exe.response
#まとめ
コンパイラが変わったりエンジンのバージョンをあげた時に単純なコンパイルエラーではない問題が出た時や、特定の開発環境でのみビルドエラーが起きる場合などに、今回ご紹介した*.responseファイルを調査することで解決につながる可能性があります。
ターゲットのプラットフォームが違ってもおおざっぱに同じ仕組みを使っているので "*.lib.response" , "*.dll.response" , "*.self.response" , "*.nss.response" などの名前で検索してみるとよいかもしれません。