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

More Related Content

What's hot (20)

非同期ロード画面 Asynchronous Loading Screen
非同期ロード画面 Asynchronous Loading Screen非同期ロード画面 Asynchronous Loading Screen
非同期ロード画面 Asynchronous Loading Screen
エピック・ゲームズ・ジャパン Epic Games Japan
 
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
最新UE4タイトルでのローカライズ事例 (UE4 Localization Deep Dive)
エピック・ゲームズ・ジャパン Epic Games Japan
 
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
historia_Inc
 
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
初心者向け UE4 映像制作での シーケンサー と Movie Render Queue の使い方
エピック・ゲームズ・ジャパン Epic Games Japan
 
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
徹底解説!UE4を使ったモバイルゲーム開発におけるコンテンツアップデートの極意!
エピック・ゲームズ・ジャパン Epic Games Japan
 
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめUnreal Engine 4.27 ノンゲーム向け新機能まとめ
Unreal Engine 4.27 ノンゲーム向け新機能まとめ
エピック・ゲームズ・ジャパン 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
 
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介![CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
エピック・ゲームズ・ジャパン Epic Games Japan
 
Unreal Engine最新機能 アニメーション+物理ショーケース!
Unreal Engine最新機能 アニメーション+物理ショーケース!Unreal Engine最新機能 アニメーション+物理ショーケース!
Unreal Engine最新機能 アニメーション+物理ショーケース!
エピック・ゲームズ・ジャパン Epic Games Japan
 
UE4におけるレベル制作事例
UE4におけるレベル制作事例  UE4におけるレベル制作事例
UE4におけるレベル制作事例
エピック・ゲームズ・ジャパン Epic Games Japan
 
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
com044
 
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られたNintendo Switch『OCTOPATH TRAVELER』はこうして作られた
Nintendo Switch『OCTOPATH TRAVELER』はこうして作られた
エピック・ゲームズ・ジャパン Epic Games Japan
 
UE4 MultiPlayer Online Deep Dive 基礎編1 -Getting Started- (historia様ご講演) #UE4DD
UE4 MultiPlayer Online Deep Dive 基礎編1 -Getting Started-  (historia様ご講演) #UE4DDUE4 MultiPlayer Online Deep Dive 基礎編1 -Getting Started-  (historia様ご講演) #UE4DD
UE4 MultiPlayer Online Deep Dive 基礎編1 -Getting Started- (historia様ご講演) #UE4DD
エピック・ゲームズ・ジャパン Epic Games Japan
 
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2
エピック・ゲームズ・ジャパン Epic Games Japan
 
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
[CEDEC2018] UE4で多数のキャラクターを生かすためのテクニック
エピック・ゲームズ・ジャパン Epic Games Japan
 
UE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろうUE4でマルチプレイヤーゲームを作ろう
UE4でマルチプレイヤーゲームを作ろう
エピック・ゲームズ・ジャパン Epic Games Japan
 
【UE4.25 新機能】ロードの高速化機能「IOStore」について
【UE4.25 新機能】ロードの高速化機能「IOStore」について【UE4.25 新機能】ロードの高速化機能「IOStore」について
【UE4.25 新機能】ロードの高速化機能「IOStore」について
エピック・ゲームズ・ジャパン Epic Games Japan
 
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメントヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
historia_Inc
 
出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと
historia_Inc
 
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
historia_Inc
 
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
目指せ脱UE4初心者!?知ってると開発が楽になる便利機能を紹介 - DataAsset, Subsystem, GameplayAbility編 -
historia_Inc
 
徹底解説!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
 
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介![CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
[CEDEC2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!
エピック・ゲームズ・ジャパン Epic Games Japan
 
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
第1回UE4勉強会 in 大阪 - エンジン改造ってどうなの?
com044
 
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメントヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
ヒストリア HelixCore(Perforce) 運用レギュレーションドキュメント
historia_Inc
 
出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと出張ヒストリア ブループリントを書くにあたって大切なこと
出張ヒストリア ブループリントを書くにあたって大切なこと
historia_Inc
 
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
少人数開発でもクオリティを諦めない - エンジニア視点から見る少人数開発の極意 -
historia_Inc
 

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

Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
Takako Miyagawa
 
PHP agile test tips
PHP agile test tipsPHP agile test tips
PHP agile test tips
Tsutomu Chikuba
 
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
 
Mercurial入門(後半)
Mercurial入門(後半)Mercurial入門(後半)
Mercurial入門(後半)
You&I
 
はじめてのCodeIgniter
はじめてのCodeIgniterはじめてのCodeIgniter
はじめてのCodeIgniter
Yuya 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 Tableau
Kenji 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/12
kenjis
 
継続的インテグレーション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 MakeGood
Atsuhiro Kubo
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
Atsuhiro Kubo
 
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
はじめてのCodeIgniter
Yuya 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 Tableau
Kenji 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/12
kenjis
 
継続的インテグレーション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 MakeGood
Atsuhiro Kubo
 
Getting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnitGetting Started with Testing using PHPUnit
Getting Started with Testing using PHPUnit
Atsuhiro Kubo
 
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 • コンパイルオプションやリンカオプションがここで決定されている (今回の範囲で実用の可能性が最も高い箇所か?)