Skip to main content
UnrealBuildTool勉強会 
まとめ 
@tempkinder 
もんしょ 
高屋敷哲雄 
馬場俊行 
大橋一勝
本スライドについて 
• このスライドは、2014/11/22 に行ったクローズドな 
勉強会のまとめです。 
• プログラマ5名、約半日でUE4のビルドプロセスの解 
析を行い、分かったことをまとめています。 
• 不正確な内容や、調査途中の内容を含みます。 
• 本勉強会では、UE4.5.1を使用しました。 
• ターゲットプラットフォームはWindows 64bit です。
ソリューション/プロジェクトファイルの生成
GenerateProjectFiles.bat について 
• VisualStudioのソリューション/プロジェクトファイルが生成 
される 
• EngineBuildBatchFilesGenerateProjectFiles.bat を呼び 
出す 
処理のほとんどはそっちに記述されている
GenerateProjectFiles.batの中身 
1. ソースコードや必要なファイルがあるかチェックする 
(厳密にソースをチェックしているわけではなく、Sourceディレクトリ 
があるか、UnrealBuildToolがあるか、などを確認している) 
2. VisualStudioのバージョンの確認(2012 or 2013) 
3. VC++ネイティブオブジェクトのカスタムビューをインス 
トール(後述) 
4. UE4のRoot以下のフォルダをパースし、VisualStudioプロ 
ジェクトファイルやソリューションファイルを生成 
(UnrealBuildTool.exe –ProjectFiles)
(番外編) 
ネイティブオブジェクトのカスタムビューインストール 
• A: VC++ にネイティブオブジェクトのカスタムビューをインストールします。 
• Natvisファイルのコピーです。 
• ExtrasVisualStudioDebuggingUE4.natvisファイルがVC++の指定されたドキュメントにコピーされる。 
• このとき、GetVScomnToolsPath.batというバッチが呼び出されてバージョン確認。 
• コピー先はマイドキュメントVisual Studio 2013Visualizers内部。 
• Natvisとはなんですか? 
• A. VC++のNatvisフレームワークはウォッチやローカル、データヒントなどがどのように見えるかをカスタマイズする 
ものです。 
• http://msdn.microsoft.com/ja-jp/library/jj620914.aspx#BKMK_Why_create_visualizations_ 
• これをインストールするとどのように変わるのですか? 
• TODO 
• VC++はどのようにUE4プロジェクトとして認識するのですか? 
• TODO 
(CopyVisualizer.bat内部で処理)
UnrealBuildTool –ProjectFiles 
• UnrealBuildTool に–ProjectFiles コマンドライン引数を指定 
して実行すると、ソリューション/プロジェクトファイルの生 
成を行う 
• ソースコードのmain()内部でConfigurationの設定 
• bGenerateVCProjectFiles = true; 
• ProjectFileGenerator.bGenerateProjectFiles = true; 
• (注)コマンドライン引数のパースはString.StartWith()で行 
われている 
• batでは-ProjectFiles引数で呼び出し、ソースコード内では- 
ProjectFileと書かれてる。(sが無い)
UnrealBuildTool –ProjectFiles の処理 
• ProjectFileGenerator.cs 内、GenerateProjectFiles()に記述さ 
れている 
1. generateIntelliSenseData 
インテリセンスを作成して、それからプロジェクト作成。インテリセンス作成と使 
い道はまだ見れてない。VSのインテリセンスを直接見れてるわけではない。 
2. AddProjectsForAllModules 
ProgramsFolder.ChildProjects.Add(AddSimpleCSharpProject(“AutomationTool“…など 
をやって、Programsフォルダ内にAutomationToolプロジェクトを入れろとかそういった 
ことを直打ちでやってます。 
3. WhriteProjectFiles 
ここで実際にWrite操作をしていると思われる。今回は中身は調査出来ていない。
コードの自動生成
UnrealHeaderToolについて 
• C++のヘッダファイルを解析して、.generated.h などのコー 
ドを自動生成するツール 
• ファイル単位ではなく、モジュール単位で実行される 
• UnrealHeaderTool自体も、UnrealBuildToolを使って、UE4の 
1つのモジュールとしてビルドされる
UnrealHeaderToolのコマンドライン引数 
UnrealHeaderTool.exe [モジュール名] [manifestファイル] – 
LogCmds “loginit warning, logexit warning, logdatabase error” 
• [モジュール名] 
ビルド対象のモジュール名「CoreUObject」「Slate」「MyProject」等 
• [manifestファイル] 
モジュール毎、ビルド構成毎に生成されるUnrealHeaderTool.manifestという 
ファイルのフルパス。↓の場所に生成される。 
ModuleRootIntermediateBuildWin64MyProjectEditorDebugGameUnrealHeaderTool.ma 
nifest 
• -LogCmds 
未調査
UnrealHeaderTool.manifestについて 
• Json形式 
• プロジェクトのRootパス、参照モジュールリストなど、ビルド 
に必要な各種情報が含まれる 
• UnrealHeaderToolはここに記述された情報を基にコードの自 
動生成を行う
UnrealHeaderToolの処理 
Wmain() [UnrealHeaderToolMain.cpp] 
-> UnrealHeaderTool_Main() [CodeGenerator.cpp] 
-> 参照モジュール毎/フォルダ(Classes/Public/Private)毎に 
-> ヘッダファイルを列挙 
-> ヘッダファイル毎に 
-> 各種情報を収集し、ClassMaps.cppで定義されたグローバル変数に格納 
クラス定義元ファイル,クラス定義行,generatedファイル,モジュールの公開クラス 
型と定義元ヘッダファイルのマップ,etc… 
-> 参照モジュール毎に 
-> FHeaderParser::ParseAllHeadersInside() [HeaderParser.cpp] 
-> FHeaderParser::ParseHeaders() 
モジュール内で定義されたクラス毎に、ベースクラスを辿って再帰 
依存関係のあるクラスを列挙していると思われる 
-> ExportNativeHeaders() 
-> FNativeClassHeaderGenerator() 
-> クラス毎の.generated.h.tmp を出力。このファイルはクラス定義毎に1つ。 
-> [モジュール名]Classes.h.tmp を出力。このファイルはモジュール全体で1つ。 
-> ExportGeneratedCPP() 
-> [モジュール名].generated.cpp.tmp を出力 
-> [モジュール名].generated.dep.h.tmp を出力 
-> [モジュール名].generated.inl/tmp を出力 
-> ExportUpdateHeaders() 
-> 差分をチェックして.tmp を外す 
-> DeleteUnusedGeneratedHeaders() 
-> 過去に生成されて未使用の.generated.h を削除
UnrealBuildToolからUnrealHeaderToolの呼び出し(1) 
ExternalExecution.ExecuteHeaderToolIfNecessary() 
(UnrealBuildTool.cs 1640行目で呼び出し、ExternalExecution.cs 530行目に定義) 
1. UnrealHeaderToolのビルドが必要かをチェック 
2. ヘッダーが最新のものであることを確認 
3. コードのタイムスタンプチェック(AreGenerateCodeFilesOutOfDate関数) 
• アセンブラ専用モードでPCH情報はUBTMakefileからロード 
• gather onlyモードで実行している場合これはすでにキャッシュ済みだろ 
う 
4. UHTManifestのインスタンス作成 
5. UnrealHeaderToolモジュールのビルドが必要な場合はモジュールをビルド 
(別プロセスで先頭から処理が走り、UnrealHeaderToolのヘッダーを作成)
UnrealBuildToolからUnrealHeaderToolの呼び出し(2) 
6. UnrealHeaderToolのPathの有無を確認 
Generate headerが入る先ができているか確認する 
7. マニフェストファイルの作成 
ModuleInfoFileNameの場所にjson形式でファイルを出力 
8. UnrealHeaderToolの実行 
作成したマニフェストファイルをコマンドライン引数に渡す 
9. モジュールディレクトリのタイムスタンプ更新 
(timestampという名前の空のファイルを作り、そのファイルのタイム 
スタンプを参照している)
コードのビルド
UnrealBuildToolについて 
• UE4用のC++コードのビルドを行う 
• VisualStudioからビルドを実行すると、まずこの 
UnrealBuildTool自体がビルドされる 
• UnrealHeaderToolの呼び出しもこの中から 
• C#で記述されている
UnrealBuildToolのコマンドライン引数 
UnrealBuildTool [モジュール名] [プラットフォーム] [ビルド構成] [オプ 
ション] 
• [モジュール名] 
ビルド対象のモジュール名「CoreUObject」「Slate」「MyProject」等 
• [プラットフォーム] 
「Win64」など 
• [ビルド構成] 
「Debug」「Development」など 
• [オプション] 
通常のビルドでは「-Deploy」が使用されている。詳細は未調査。 
「-verbose」を追記すると詳細なログを出力(後述)
UnrealBuildToolの処理(1) 
• エントリーはUnrealBuildToo.cs [588行目から] 
• RegisterAllUBTClasses() [1004行目で呼び出し] 
プラットフォーム,ToolChainなどの初期化[1004行目から] 
※ToolChain:プラットフォーム毎のコンパイル手順がこの名称で呼ばれているらしい。詳細は未調査。 
• プロジェクトファイルを生成する必要があれば、プラット 
フォーム毎のProjectFileGeneratorを生成[1019行目から] 
• RunUBT() [1071行目で呼び出し,関数定義は1270行目] 
• RunUBT()内がこのツールの処理の中核部分。
UnrealBuildToolの処理(2) 
• CrateTarget() [1468行目で呼び出し] 
ターゲットの生成。実装はRulesCompiler.cs 
必要なフォルダを走査して、モジュールやターゲットのルールファイルを列挙 
*.Build.cs がモジュールのビルドルール 
*.Target.cs がターゲットのビルドルール 
プラグインフォルダもここでチェック 
• Target.Build() [1519行目で呼び出し] 
• ビルド前にモジュールとの依存関係をチェック、ビルドが必要かどうかをチェックしてる 
• 依存情報はDependencyCache.binというバイナリに保存されている 
• ここから依存情報をチェックし、更新不要なものをリコンパイルしないようにしてる。これを消す 
と最初からビルドされる。 
EngineIntermediateBuildWin64UE4GameDependencyCache.bin 
• ファイルの内容は、DependencyCache.csのDependencyCacheクラスのシリアライズ結果
UnrealBuildToolの処理(3) 
• 各ソースコードのインクルードファイルはフォルダを指定しなくても内部でフォ 
ルダを検索して解決してくれる 
(モジュールの.Build.cs に記述された、PrivateIncludePaths, PublicIncludePathsがイン 
クルードパスとして参照される) 
CPPHeaders.cs FindIncludedFile()関数内で処理されている 
• CPPEnvironment.CompileFiles()関数がソースコードのコンパイル命令と思わ 
れる 
• ツールチェインから対象プラットフォームのツールチェインを取得し、 
CompileCPPFiles()命令を呼ぶ 
• 引数のCPPFilesがコンパイル対象となるソースコード 
• Module.Core.1_of_6.cppとかがまさにここに入ってる 
• この命令が呼ばれる前に各種cppファイルから前述のcppファイルを生成している 
• UEBuildModule.cs (1396) : Unity.GenerateUnityCPPs()命令がその処理
ソースコードの自動統合について 
• Developmentビルドにおいては、ユーザーの記述したcppファイル 
は直接はコンパイルされない 
• RootIntermediateBuildWin64UE4EditorDevelopment[モ 
ジュール名]Module.[モジュール名].1_of_4.cpp 
のようなファイルが生成され、こちらがコンパイラに渡される。 
• Module.[モジュール名].1_of_4.cpp の中身は、ユーザーが記述し 
たcppファイルをincludeしている。これで、ユーザーが記述した 
cppファイルが間接的にコンパイル対象となる。 
• このプロセスの詳細については、今回は未調査 
※コンパイルが成功すれば、このcppと同フォルダにobjファイルが生成される。MAX_PATH問題でコンパ 
イルに失敗する場合、このcppファイルのフルパスの文字数が問題になるようで、意味不明なビルドエラー 
が出た際には、ここのobjファイルの存在を確認すれば、MAX_PATH問題を切り分けられる。
UnrealBuildToolの処理(4) 
• .exeや.libのバイナリファイルはUEBuildTarget.cs (1513) で 
ビルド処理が走る。前述のコンパイルはこの中で行われる。 
• WindowsのツールチェインはVCToolChain.cs 
• コンパイルオプションやリンカオプションがここで決定されている 
(今回の範囲で実用の可能性が最も高い箇所か?)