Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
UnrealBuildTool勉強会 
まとめ 
@tempkinder 
もんしょ 
高屋敷哲雄 
馬場俊行 
大橋一勝
本スライドについて 
• このスライドは、2014/11/22 に行ったクローズドな 
勉強会のまとめです。 
• プログラマ5名、約半日でUE4のビルドプロセスの解 
析を行い、分かったことをまとめています。 
• 不正確な内容や、調査途中の...
ソリューション/プロジェクトファイルの生成
GenerateProjectFiles.bat について 
• VisualStudioのソリューション/プロジェクトファイルが生成 
される 
• EngineBuildBatchFilesGenerateProjectFiles.bat ...
GenerateProjectFiles.batの中身 
1. ソースコードや必要なファイルがあるかチェックする 
(厳密にソースをチェックしているわけではなく、Sourceディレクトリ 
があるか、UnrealBuildToolがあるか、など...
(番外編) 
ネイティブオブジェクトのカスタムビューインストール 
• A: VC++ にネイティブオブジェクトのカスタムビューをインストールします。 
• Natvisファイルのコピーです。 
• ExtrasVisualStudioDebu...
UnrealBuildTool –ProjectFiles 
• UnrealBuildTool に–ProjectFiles コマンドライン引数を指定 
して実行すると、ソリューション/プロジェクトファイルの生 
成を行う 
• ソースコード...
UnrealBuildTool –ProjectFiles の処理 
• ProjectFileGenerator.cs 内、GenerateProjectFiles()に記述さ 
れている 
1. generateIntelliSenseDa...
コードの自動生成
UnrealHeaderToolについて 
• C++のヘッダファイルを解析して、.generated.h などのコー 
ドを自動生成するツール 
• ファイル単位ではなく、モジュール単位で実行される 
• UnrealHeaderTool自体...
UnrealHeaderToolのコマンドライン引数 
UnrealHeaderTool.exe [モジュール名] [manifestファイル] – 
LogCmds “loginit warning, logexit warning, log...
UnrealHeaderTool.manifestについて 
• Json形式 
• プロジェクトのRootパス、参照モジュールリストなど、ビルド 
に必要な各種情報が含まれる 
• UnrealHeaderToolはここに記述された情報を基に...
UnrealHeaderToolの処理 
Wmain() [UnrealHeaderToolMain.cpp] 
-> UnrealHeaderTool_Main() [CodeGenerator.cpp] 
-> 参照モジュール毎/フォルダ(...
UnrealBuildToolからUnrealHeaderToolの呼び出し(1) 
ExternalExecution.ExecuteHeaderToolIfNecessary() 
(UnrealBuildTool.cs 1640行目で呼び...
UnrealBuildToolからUnrealHeaderToolの呼び出し(2) 
6. UnrealHeaderToolのPathの有無を確認 
Generate headerが入る先ができているか確認する 
7. マニフェストファイルの作...
コードのビルド
UnrealBuildToolについて 
• UE4用のC++コードのビルドを行う 
• VisualStudioからビルドを実行すると、まずこの 
UnrealBuildTool自体がビルドされる 
• UnrealHeaderToolの呼び...
UnrealBuildToolのコマンドライン引数 
UnrealBuildTool [モジュール名] [プラットフォーム] [ビルド構成] [オプ 
ション] 
• [モジュール名] 
ビルド対象のモジュール名「CoreUObject」「Sl...
UnrealBuildToolの処理(1) 
• エントリーはUnrealBuildToo.cs [588行目から] 
• RegisterAllUBTClasses() [1004行目で呼び出し] 
プラットフォーム,ToolChainなどの...
UnrealBuildToolの処理(2) 
• CrateTarget() [1468行目で呼び出し] 
ターゲットの生成。実装はRulesCompiler.cs 
必要なフォルダを走査して、モジュールやターゲットのルールファイルを列挙 
*...
UnrealBuildToolの処理(3) 
• 各ソースコードのインクルードファイルはフォルダを指定しなくても内部でフォ 
ルダを検索して解決してくれる 
(モジュールの.Build.cs に記述された、PrivateIncludePaths...
ソースコードの自動統合について 
• Developmentビルドにおいては、ユーザーの記述したcppファイル 
は直接はコンパイルされない 
• RootIntermediateBuildWin64UE4EditorDevelopment[モ...
UnrealBuildToolの処理(4) 
• .exeや.libのバイナリファイルはUEBuildTarget.cs (1513) で 
ビルド処理が走る。前述のコンパイルはこの中で行われる。 
• WindowsのツールチェインはVCTo...
Upcoming SlideShare
Loading in …5
×

UnrealBuildTool勉強会まとめ

6,505 views

Published on

このスライドは、Unreal Engine 4のビルドプロセスの解析のまとめです。
2014/11/22 にクローズドな勉強会としてプログラマ5名、約半日で分かったことをまとめてあります。
不正確な内容や、調査途中の内容を含みます。本勉強会では、UE4.5.1を使用しました。ターゲットプラットフォームはWindows 64bit です。

会場提供: 株式会社ヒストリア

Published in: Software
  • Be the first to comment

UnrealBuildTool勉強会まとめ

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

×