SlideShare a Scribd company logo
1 of 23
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

What's hot

UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-com044
 
Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。IndieusGames
 
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る!  | UNREAL FEST EXTREME 2020 WINTERUE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る!  | UNREAL FEST EXTREME 2020 WINTER
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTERエピック・ゲームズ・ジャパン Epic Games Japan
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!Masahiko Nakamura
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!エピック・ゲームズ・ジャパン Epic Games Japan
 
[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...
[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...
[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...エピック・ゲームズ・ジャパン Epic Games Japan
 

What's hot (20)

UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
 
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られたNintendo Switch『OCTOPATH TRAVELER』はこうして作られた
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
 
UE4.25 Update - Unreal Insights -
UE4.25 Update - Unreal Insights -UE4.25 Update - Unreal Insights -
UE4.25 Update - Unreal Insights -
 
UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-UE4 アセットロード周り-アセット参照調査-
UE4 アセットロード周り-アセット参照調査-
 
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
[4.20版] UE4におけるLoadingとGCのProfilingと最適化手法
 
60fpsアクションを実現する秘訣を伝授 基礎編
60fpsアクションを実現する秘訣を伝授 基礎編60fpsアクションを実現する秘訣を伝授 基礎編
60fpsアクションを実現する秘訣を伝授 基礎編
 
UE4におけるレベル制作事例
UE4におけるレベル制作事例  UE4におけるレベル制作事例
UE4におけるレベル制作事例
 
Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。Editor Utility Widgetで色々便利にしてみた。
Editor Utility Widgetで色々便利にしてみた。
 
【UE4.25 新機能】ロードの高速化機能「IOStore」について
【UE4.25 新機能】ロードの高速化機能「IOStore」について【UE4.25 新機能】ロードの高速化機能「IOStore」について
【UE4.25 新機能】ロードの高速化機能「IOStore」について
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
 
UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法
 
なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -なぜなにFProperty - 対応方法と改善点 -
なぜなにFProperty - 対応方法と改善点 -
 
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る!  | UNREAL FEST EXTREME 2020 WINTERUE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る!  | UNREAL FEST EXTREME 2020 WINTER
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!
 
60fpsアクションを実現する秘訣を伝授 解析編
60fpsアクションを実現する秘訣を伝授 解析編60fpsアクションを実現する秘訣を伝授 解析編
60fpsアクションを実現する秘訣を伝授 解析編
 
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
 
UE4のモバイル向け機能や最新情報などを改めて紹介!2019
UE4のモバイル向け機能や最新情報などを改めて紹介!2019UE4のモバイル向け機能や最新情報などを改めて紹介!2019
UE4のモバイル向け機能や最新情報などを改めて紹介!2019
 
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
 
[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...
[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...
[IGF2018] UE4でAndroidアプリを開発する際に知っておきたいパフォーマンス改善テクニック + INDIE GAMES FESTIVAL 2...
 

Similar to UnrealBuildTool勉強会まとめ

Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセスMakoto Kato
 
【プログラミング教室】テキスト
【プログラミング教室】テキスト【プログラミング教室】テキスト
【プログラミング教室】テキストManabu Ikarashi
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をAtsuhiro Kubo
 
Mercurial入門(後半)解説版
Mercurial入門(後半)解説版Mercurial入門(後半)解説版
Mercurial入門(後半)解説版You&I
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料Masatoshi Itoh
 
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指すAromaBlack
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniterYuya Matsushima
 
PHPUnitTest勉強会スライド
PHPUnitTest勉強会スライドPHPUnitTest勉強会スライド
PHPUnitTest勉強会スライドssuser7a9029
 
PHPUnitTest勉強会スライド
PHPUnitTest勉強会スライドPHPUnitTest勉強会スライド
PHPUnitTest勉強会スライドssuser7a9029
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テストryohji ikebe
 
Tableau JavaScript API #2 - Real Time Survey Built with Tableau
Tableau JavaScript API #2 - Real Time Survey Built with TableauTableau JavaScript API #2 - Real Time Survey Built with Tableau
Tableau JavaScript API #2 - Real Time Survey Built with TableauKenji Noguchi
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
書こう! 使おう! 単体テスト
書こう! 使おう! 単体テスト書こう! 使おう! 単体テスト
書こう! 使おう! 単体テストryohji ikebe
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキングTakayuki Kondou
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitAtsuhiro Kubo
 

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

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

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