SlideShare a Scribd company logo
6
Most read
8
Most read
18
Most read
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 
• コンパイルオプションやリンカオプションがここで決定されている 
(今回の範囲で実用の可能性が最も高い箇所か?)

More Related Content

PPTX
UE4におけるLoadingとGCのProfilingと最適化手法
PDF
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
PDF
猫でも分かるUE4.22から入ったSubsystem
PDF
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
PDF
UE4で作成するUIと最適化手法
PDF
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
PPTX
猫でも分かる UE4のAnimation Blueprintの運用について
PDF
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~
UE4におけるLoadingとGCのProfilingと最適化手法
UE4のローカライズ機能紹介 (UE4 Localization Deep Dive)
猫でも分かるUE4.22から入ったSubsystem
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
UE4で作成するUIと最適化手法
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
猫でも分かる UE4のAnimation Blueprintの運用について
バイキング流UE4活用術 ~BPとお別れするまでの18ヶ月~

What's hot (20)

PDF
「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像
PDF
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
PDF
UE4におけるエフェクトの為のエンジン改造事例
PDF
猫でも分かるUE4のポストプロセスを使った演出・絵作り
PDF
UE4のマテリアルを もっと楽しもう!~マテリアルでぐっと広がるリアルタイムCG表現の幅~
PDF
60fpsアクションを実現する秘訣を伝授 基礎編
PDF
UE4でマルチプレイヤーゲームを作ろう
PDF
UE4のモバイル向け機能や最新情報などを改めて紹介!2019
PPTX
大規模タイトルにおけるエフェクトマテリアル運用 (SQEX大阪: 林武尊様) #UE4DD
PDF
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
PDF
UE4における大規模背景制作事例(コリジョン編)
PDF
UE4 LODs for Optimization -Beginner-
PDF
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
PDF
UE4におけるエフェクトの基本戦略事例 後半
PDF
猫でも分かる UE4の新しいサンプル「Action RPG」について
PPTX
UE4のためのより良いゲーム設計を理解しよう!
PDF
なぜなにFProperty - 対応方法と改善点 -
PDF
非同期ロード画面 Asynchronous Loading Screen
PPTX
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
PPTX
UE4 Saitama 初心者向けハンズオン #5 『アニメーションモンタージュ(Slotアニメーション)でコンボを作る』
「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4におけるエフェクトの為のエンジン改造事例
猫でも分かるUE4のポストプロセスを使った演出・絵作り
UE4のマテリアルを もっと楽しもう!~マテリアルでぐっと広がるリアルタイムCG表現の幅~
60fpsアクションを実現する秘訣を伝授 基礎編
UE4でマルチプレイヤーゲームを作ろう
UE4のモバイル向け機能や最新情報などを改めて紹介!2019
大規模タイトルにおけるエフェクトマテリアル運用 (SQEX大阪: 林武尊様) #UE4DD
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
UE4における大規模背景制作事例(コリジョン編)
UE4 LODs for Optimization -Beginner-
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
UE4におけるエフェクトの基本戦略事例 後半
猫でも分かる UE4の新しいサンプル「Action RPG」について
UE4のためのより良いゲーム設計を理解しよう!
なぜなにFProperty - 対応方法と改善点 -
非同期ロード画面 Asynchronous Loading Screen
マテリアルとマテリアルインスタンスの仕組みと問題点の共有 (Epic Games Japan: 篠山範明) #UE4DD
UE4 Saitama 初心者向けハンズオン #5 『アニメーションモンタージュ(Slotアニメーション)でコンボを作る』
Ad

Similar to UnrealBuildTool勉強会まとめ (20)

PDF
Code igniterでテスト駆動開発 資料作成中
PPT
PHP agile test tips
PDF
Firefoxの開発プロセス
PPTX
【プログラミング教室】テキスト
PDF
MakeGoodで快適なテスト駆動開発を
PDF
Mercurial入門(後半)解説版
PPTX
システムテスト自動化標準ガイド 5章発表資料
KEY
ひのきのぼうだけで全クリ目指す
PDF
Mercurial入門(後半)
PDF
はじめてのCodeIgniter
PDF
PHPUnitTest勉強会スライド
PDF
PHPUnitTest勉強会スライド
PDF
書こう! 使おう! 単体テスト
PDF
Tableau JavaScript API #2 - Real Time Survey Built with Tableau
PDF
ソフトウェア工学2023 14 ビルド
PDF
書こう! 使おう! 単体テスト
PDF
10分でわかるFuelPHP @ 2011/12
PPTX
継続的インテグレーション3分クッキング
PDF
Introduction to Continuous Test Runner MakeGood
PDF
Getting Started with Testing using PHPUnit
Code igniterでテスト駆動開発 資料作成中
PHP agile test tips
Firefoxの開発プロセス
【プログラミング教室】テキスト
MakeGoodで快適なテスト駆動開発を
Mercurial入門(後半)解説版
システムテスト自動化標準ガイド 5章発表資料
ひのきのぼうだけで全クリ目指す
Mercurial入門(後半)
はじめてのCodeIgniter
PHPUnitTest勉強会スライド
PHPUnitTest勉強会スライド
書こう! 使おう! 単体テスト
Tableau JavaScript API #2 - Real Time Survey Built with Tableau
ソフトウェア工学2023 14 ビルド
書こう! 使おう! 単体テスト
10分でわかるFuelPHP @ 2011/12
継続的インテグレーション3分クッキング
Introduction to Continuous Test Runner MakeGood
Getting Started with Testing using PHPUnit
Ad

UnrealBuildTool勉強会まとめ

  • 1. UnrealBuildTool勉強会 まとめ @tempkinder もんしょ 高屋敷哲雄 馬場俊行 大橋一勝
  • 2. 本スライドについて • このスライドは、2014/11/22 に行ったクローズドな 勉強会のまとめです。 • プログラマ5名、約半日でUE4のビルドプロセスの解 析を行い、分かったことをまとめています。 • 不正確な内容や、調査途中の内容を含みます。 • 本勉強会では、UE4.5.1を使用しました。 • ターゲットプラットフォームはWindows 64bit です。
  • 4. GenerateProjectFiles.bat について • VisualStudioのソリューション/プロジェクトファイルが生成 される • EngineBuildBatchFilesGenerateProjectFiles.bat を呼び 出す 処理のほとんどはそっちに記述されている
  • 5. GenerateProjectFiles.batの中身 1. ソースコードや必要なファイルがあるかチェックする (厳密にソースをチェックしているわけではなく、Sourceディレクトリ があるか、UnrealBuildToolがあるか、などを確認している) 2. VisualStudioのバージョンの確認(2012 or 2013) 3. VC++ネイティブオブジェクトのカスタムビューをインス トール(後述) 4. UE4のRoot以下のフォルダをパースし、VisualStudioプロ ジェクトファイルやソリューションファイルを生成 (UnrealBuildTool.exe –ProjectFiles)
  • 6. (番外編) ネイティブオブジェクトのカスタムビューインストール • 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内部で処理)
  • 7. UnrealBuildTool –ProjectFiles • UnrealBuildTool に–ProjectFiles コマンドライン引数を指定 して実行すると、ソリューション/プロジェクトファイルの生 成を行う • ソースコードのmain()内部でConfigurationの設定 • bGenerateVCProjectFiles = true; • ProjectFileGenerator.bGenerateProjectFiles = true; • (注)コマンドライン引数のパースはString.StartWith()で行 われている • batでは-ProjectFiles引数で呼び出し、ソースコード内では- ProjectFileと書かれてる。(sが無い)
  • 8. UnrealBuildTool –ProjectFiles の処理 • ProjectFileGenerator.cs 内、GenerateProjectFiles()に記述さ れている 1. generateIntelliSenseData インテリセンスを作成して、それからプロジェクト作成。インテリセンス作成と使 い道はまだ見れてない。VSのインテリセンスを直接見れてるわけではない。 2. AddProjectsForAllModules ProgramsFolder.ChildProjects.Add(AddSimpleCSharpProject(“AutomationTool“…など をやって、Programsフォルダ内にAutomationToolプロジェクトを入れろとかそういった ことを直打ちでやってます。 3. WhriteProjectFiles ここで実際にWrite操作をしていると思われる。今回は中身は調査出来ていない。
  • 10. UnrealHeaderToolについて • C++のヘッダファイルを解析して、.generated.h などのコー ドを自動生成するツール • ファイル単位ではなく、モジュール単位で実行される • UnrealHeaderTool自体も、UnrealBuildToolを使って、UE4の 1つのモジュールとしてビルドされる
  • 11. UnrealHeaderToolのコマンドライン引数 UnrealHeaderTool.exe [モジュール名] [manifestファイル] – LogCmds “loginit warning, logexit warning, logdatabase error” • [モジュール名] ビルド対象のモジュール名「CoreUObject」「Slate」「MyProject」等 • [manifestファイル] モジュール毎、ビルド構成毎に生成されるUnrealHeaderTool.manifestという ファイルのフルパス。↓の場所に生成される。 ModuleRootIntermediateBuildWin64MyProjectEditorDebugGameUnrealHeaderTool.ma nifest • -LogCmds 未調査
  • 12. UnrealHeaderTool.manifestについて • Json形式 • プロジェクトのRootパス、参照モジュールリストなど、ビルド に必要な各種情報が含まれる • UnrealHeaderToolはここに記述された情報を基にコードの自 動生成を行う
  • 13. 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 を削除
  • 14. 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のヘッダーを作成)
  • 15. UnrealBuildToolからUnrealHeaderToolの呼び出し(2) 6. UnrealHeaderToolのPathの有無を確認 Generate headerが入る先ができているか確認する 7. マニフェストファイルの作成 ModuleInfoFileNameの場所にjson形式でファイルを出力 8. UnrealHeaderToolの実行 作成したマニフェストファイルをコマンドライン引数に渡す 9. モジュールディレクトリのタイムスタンプ更新 (timestampという名前の空のファイルを作り、そのファイルのタイム スタンプを参照している)
  • 17. UnrealBuildToolについて • UE4用のC++コードのビルドを行う • VisualStudioからビルドを実行すると、まずこの UnrealBuildTool自体がビルドされる • UnrealHeaderToolの呼び出しもこの中から • C#で記述されている
  • 18. UnrealBuildToolのコマンドライン引数 UnrealBuildTool [モジュール名] [プラットフォーム] [ビルド構成] [オプ ション] • [モジュール名] ビルド対象のモジュール名「CoreUObject」「Slate」「MyProject」等 • [プラットフォーム] 「Win64」など • [ビルド構成] 「Debug」「Development」など • [オプション] 通常のビルドでは「-Deploy」が使用されている。詳細は未調査。 「-verbose」を追記すると詳細なログを出力(後述)
  • 19. UnrealBuildToolの処理(1) • エントリーはUnrealBuildToo.cs [588行目から] • RegisterAllUBTClasses() [1004行目で呼び出し] プラットフォーム,ToolChainなどの初期化[1004行目から] ※ToolChain:プラットフォーム毎のコンパイル手順がこの名称で呼ばれているらしい。詳細は未調査。 • プロジェクトファイルを生成する必要があれば、プラット フォーム毎のProjectFileGeneratorを生成[1019行目から] • RunUBT() [1071行目で呼び出し,関数定義は1270行目] • RunUBT()内がこのツールの処理の中核部分。
  • 20. UnrealBuildToolの処理(2) • CrateTarget() [1468行目で呼び出し] ターゲットの生成。実装はRulesCompiler.cs 必要なフォルダを走査して、モジュールやターゲットのルールファイルを列挙 *.Build.cs がモジュールのビルドルール *.Target.cs がターゲットのビルドルール プラグインフォルダもここでチェック • Target.Build() [1519行目で呼び出し] • ビルド前にモジュールとの依存関係をチェック、ビルドが必要かどうかをチェックしてる • 依存情報はDependencyCache.binというバイナリに保存されている • ここから依存情報をチェックし、更新不要なものをリコンパイルしないようにしてる。これを消す と最初からビルドされる。 EngineIntermediateBuildWin64UE4GameDependencyCache.bin • ファイルの内容は、DependencyCache.csのDependencyCacheクラスのシリアライズ結果
  • 21. 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()命令がその処理
  • 22. ソースコードの自動統合について • Developmentビルドにおいては、ユーザーの記述したcppファイル は直接はコンパイルされない • RootIntermediateBuildWin64UE4EditorDevelopment[モ ジュール名]Module.[モジュール名].1_of_4.cpp のようなファイルが生成され、こちらがコンパイラに渡される。 • Module.[モジュール名].1_of_4.cpp の中身は、ユーザーが記述し たcppファイルをincludeしている。これで、ユーザーが記述した cppファイルが間接的にコンパイル対象となる。 • このプロセスの詳細については、今回は未調査 ※コンパイルが成功すれば、このcppと同フォルダにobjファイルが生成される。MAX_PATH問題でコンパ イルに失敗する場合、このcppファイルのフルパスの文字数が問題になるようで、意味不明なビルドエラー が出た際には、ここのobjファイルの存在を確認すれば、MAX_PATH問題を切り分けられる。
  • 23. UnrealBuildToolの処理(4) • .exeや.libのバイナリファイルはUEBuildTarget.cs (1513) で ビルド処理が走る。前述のコンパイルはこの中で行われる。 • WindowsのツールチェインはVCToolChain.cs • コンパイルオプションやリンカオプションがここで決定されている (今回の範囲で実用の可能性が最も高い箇所か?)