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

Contenu connexe

Tendances

UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!Masahiko Nakamura
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてcom044
 
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-Tatsuya Iwama
 
わからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なことわからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なことrarihoma
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!エピック・ゲームズ・ジャパン Epic Games Japan
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>エピック・ゲームズ・ジャパン Epic Games Japan
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...エピック・ゲームズ・ジャパン Epic Games Japan
 

Tendances (20)

UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法UE4におけるLoadingとGCのProfilingと最適化手法
UE4におけるLoadingとGCのProfilingと最適化手法
 
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらいCEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
CEDEC2016: Unreal Engine 4 のレンダリングフロー総おさらい
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!
 
Unreal Engine 4を使って地球を衛る方法
Unreal Engine 4を使って地球を衛る方法Unreal Engine 4を使って地球を衛る方法
Unreal Engine 4を使って地球を衛る方法
 
「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像
「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像「Press Button, Drink Coffee」 UE4における ビルドパイプラインとメンテナンスの全体像
「Press Button, Drink Coffee」 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と最適化手法
 
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動についてUE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
 
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
 
わからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なことわからないまま使っている?UE4 の AI の基本的なこと
わからないまま使っている?UE4 の AI の基本的なこと
 
UE4アセットリダクション手法紹介
UE4アセットリダクション手法紹介UE4アセットリダクション手法紹介
UE4アセットリダクション手法紹介
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
 
猫でも分かるUMG
猫でも分かるUMG猫でも分かるUMG
猫でも分かるUMG
 
UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編
 
UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 1 <Shader Compile, PSO Cache編>
 
[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい[CEDEC2018] UE4アニメーションシステム総おさらい
[CEDEC2018] UE4アニメーションシステム総おさらい
 
UE4.25 Update - Unreal Insights -
UE4.25 Update - Unreal Insights -UE4.25 Update - Unreal Insights -
UE4.25 Update - Unreal Insights -
 
UE4のスレッドの流れと Input Latency改善の仕組み
UE4のスレッドの流れとInput Latency改善の仕組みUE4のスレッドの流れとInput Latency改善の仕組み
UE4のスレッドの流れと Input Latency改善の仕組み
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
 
UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 -
UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 -UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 -
UE4のモバイル開発におけるコンテンツアップデートの話 - Chunk IDとの激闘編 -
 

Similaire à 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
 

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