Unreal4源码拆解-UnrealBuildTool功能流程解析
UBT中的构建平台管理工具类UEBuildPlatform
前言
UEBuildPlatform 是一个工具类,静态内容 包含了 所有注册平台的组织和构建平台信息等等 以及 相关处理函数 。同时也是一个基类。 以此作为 基类拓展出了很多子类 ,均在Engine\Source\Programs\UnrealBuildTool
目录下 子类根据平台建立,主要增加保存了 对应平台 的 SDK相关信息 和处理函数
Platform\Android\UEBuildAndroid.cs
的 AndroidPlatform 类Platform\HoloLens\UEBuildHoloLens.cs
的 HoloLens 类Platform\IOS\UEBuildIOS.cs
的 IOSPlatform 类Platform\Linux\UEBuildLinux.cs
的LinuxPlatform 类Platform\Mac\UEBuildMac.cs
的 MacPlatform 类Platform\Windows\UEBuildWindows.cs
的 WindowsPlatform 类
成员变量
静态成员变量
private static Dictionary<UnrealTargetPlatform, UEBuildPlatform> BuildPlatformDictionary = new Dictionary<UnrealTargetPlatform, UEBuildPlatform>();
static Dictionary<UnrealPlatformGroup, List> PlatformGroupDictionary = new Dictionary<UnrealPlatformGroup, List>();
private static string[] CachedPlatformFolderNames
实例成员变量
public readonly UnrealTargetPlatform Platform;
保存当前子类实例对应的 UnrealTargetPlatform (独特字符串和ID)
private ReadOnlyHashSet CachedIncludedFolderNames;
保存当前子类实例对应的 UnrealTargetPlatform 独特字符串和组织字符串
private ReadOnlyHashSet CachedExcludedFolderNames;
保存所有除了当前子类实例对应的 UnrealTargetPlatform 独特字符串和组织字符串
静态成员方法
public static void RegisterPlatformWithGroup(UnrealTargetPlatform InPlatform, UnrealPlatformGroup InGroup)
增加PlatformGroupDictionary ,以组织名称为 Key ,平台名称为 Value 的静态字典对象,一个组织 具体增加逻辑如下:在子类实例注册 SDK 时候 RegisterBuildPlatforms()
中调用此函数
Platform\Android\UEBuildAndroid.cs
RegisterPlatformWithGroup(UnrealTargetPlatform.Android, UnrealPlatformGroup.Android); Platform\HoloLens\UEBuildHoloLens.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.HoloLens, UnrealPlatformGroup.Microsoft); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.HoloLens, UnrealPlatformGroup.HoloLens); Platform\IOS\UEBuildIOS.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.IOS, UnrealPlatformGroup.Apple); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.IOS, UnrealPlatformGroup.IOS); Platform\Linux\UEBuildLinux.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Linux, UnrealPlatformGroup.Linux); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Linux, UnrealPlatformGroup.Unix); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Linux, UnrealPlatformGroup.Desktop); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.LinuxAArch64, UnrealPlatformGroup.Linux); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.LinuxAArch64, UnrealPlatformGroup.Unix); Platform\Mac\UEBuildMac.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Mac, UnrealPlatformGroup.Apple); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Mac, UnrealPlatformGroup.Desktop); Platform\Lumin\UEBuildLumin.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Lumin, UnrealPlatformGroup.Android); Platform\Windows\UEBuildWindows.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Win64, UnrealPlatformGroup.Windows); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Win64, UnrealPlatformGroup.Microsoft); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Win64, UnrealPlatformGroup.Desktop); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Win32, UnrealPlatformGroup.Windows); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Win32, UnrealPlatformGroup.Microsoft); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.Win32, UnrealPlatformGroup.Desktop); Platform\TVOS\UEBuildTVOS.cs
UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.TVOS, UnrealPlatformGroup.Apple); UEBuildPlatform.RegisterPlatformWithGroup(UnrealTargetPlatform.TVOS, UnrealPlatformGroup.IOS);
public static void RegisterPlatforms(bool bIncludeNonInstalledPlatforms, bool bHostPlatformOnly)
注册 目标平台SDK 具体详情见
UnrealBuildTool 的构建平台注册流程-Unreal4源码拆解-UnrealBuildTool功能流程解析
public static string[] GetPlatformFolderNames()
按照顺序缓存了所有 UnrealTargetPlatform 和 UnrealPlatformGroup 缓存到 CachedPlatformFolderNames
public static void RegisterBuildPlatform(UEBuildPlatform InBuildPlatform)
把 UEBuildPlatform 子类实例添加到 BuildPlatformDictionary 中 以 UEBuildPlatform 子类实例 .Platform
为 Key
public static bool IsDefaultBuildProduct(string FileName, string[] NamePrefixes, string[] NameSuffixes)
直接看源代码,如果文件名满足前缀,后缀,拓展名相同且为.target
或者.modules
或者.version
返回True
public static bool IsDefaultBuildProduct ( string FileName, string [ ] NamePrefixes, string [ ] NameSuffixes)
{
return UEBuildPlatform. IsBuildProductName ( FileName, NamePrefixes, NameSuffixes, ".target" )
|| UEBuildPlatform. IsBuildProductName ( FileName, NamePrefixes, NameSuffixes, ".modules" )
|| UEBuildPlatform. IsBuildProductName ( FileName, NamePrefixes, NameSuffixes, ".version" ) ;
}
public static bool IsBuildProductName(string FileName, string[] NamePrefixes, string[] NameSuffixes, string Extension)
调用该函数重载进行拓展名比较,Index 参数设置为 0
public static bool IsBuildProductName(string FileName, int Index, int Count, string[] NamePrefixes, string[] NameSuffixes, string Extension)
判断输入的文件名是否拓展名符合输入的拓展名, 如果是的话则该函数重载比较前缀和后缀规范。 否则返回 True
public static bool IsBuildProductName(string FileName, int Index, int Count, string[] NamePrefixes, string[] NameSuffixes)
判断输入的文件名是否前缀符合 NamePrefixes 并且同时后缀符合 NameSuffixes (不包括扩展名)
public static bool IsPlatformAvailable(UnrealTargetPlatform Platform)
BuildPlatformDictionary 包含输入的 UnrealTargetPlatform 子类实例,且SDK 状态码为 SDKStatus.Valid
public static IEnumerable GetRegisteredPlatforms()
返回所有 BuildPlatformDictionary 的 Key
public static List GetPlatformsInGroup(UnrealPlatformGroup InGroup)
返回所有 PlatformGroupDictionary 的 value
public static IEnumerable GetPlatformGroups(UnrealTargetPlatform Platform)
public static UEBuildPlatform GetBuildPlatform(UnrealTargetPlatform InPlatform, bool bInAllowFailure = false)
通过 key 查找 BuildPlatformDictionary 的 value , 找不到的话根据第二个参数选择执行。
public static void PlatformModifyHostModuleRules(string ModuleName, ModuleRules Rules, ReadOnlyTargetRules Target)
会执行 BuildPlatformDictionary 的所有子类实例的ModifyModuleRulesForOtherPlatform ModifyModuleRulesForOtherPlatform 在子类里会有不同实现。
public static String GetPathVarDelimiter()
如果当前构建的主平台BuildHostPlatform.Current.Platform
为
UnrealTargetPlatform.Linux
UnrealTargetPlatform.Mac
UnrealTargetPlatform.LinuxAArch64
返回冒号:
其他全返回;
public static bool PlatformRequiresMonolithicBuilds(UnrealTargetPlatform InPlatform, UnrealTargetConfiguration InConfiguration)
调用了 GetBuildPlatform 获取到指定 UnrealTargetPlatform 对应的平台BuildPlatform 子类实例 调用了子类实例的BuildPlatform.ShouldCompileMonolithicBinary
判断是否需要全量编译二进制文件
protected static bool DoProjectSettingsMatchDefault(UnrealTargetPlatform Platform, DirectoryReference ProjectDirectoryName, string Section, string[] BoolKeys, string[] IntKeys, string[] StringKeys)
检查给定的工程是否有默认构建配置文件,在 Automation工具 里面有用到 具体位置在 Engine.ini
的[/Script/BuildSettings.BuildSettings]
域下 检查默认构建配置文件和项目构建配置文件的 “bCompileApex ”, “bCompileICU ”,“bCompileRecast ”, “bCompileSpeedTree ”, “bCompileWithPluginSupport ”, “bCompilePhysXVehicle ”, “bCompileFreeType ”,“bCompileForSize ”, “bCompileCEF3 ”, “bCompileCustomSQLitePlatform ” 这些变量是否相等
internal static bool IsPlatformInGroup(UnrealTargetPlatform Platform, UnrealPlatformGroup PlatformGroup)
调用 GetPlatformsInGroup ,返回指定 PlatformGroup 的所有PlatformGroupDictionary 的 value 看看返回的 values 中知否有指定的 Platform
实例成员方法
public ReadOnlyHashSet GetIncludedFolderNames()
获取到 BuildPlatform 子类实例对应的目标平台的独特字符串 加入到 CachedIncludedFolderNames 中 获取到所有包含 BuildPlatform 子类实例对应的目标平台的组织的独特字符串 把 PlatformGroups 加入到 CachedIncludedFolderNames 中
public ReadOnlyHashSet GetExcludedFolderNames()
把所有 UnrealTargetPlatform 和 UnrealPlatformGroup 除了GetIncludedFolderNames() 的其他所有的都找出来
public virtual VCProjectFileFormat GetRequiredVisualStudioVersion()
基类返回 VCProjectFileFormat.Default
enum VCProjectFileFormat
{
Default,
VisualStudio2012,
VisualStudio2013,
VisualStudio2015,
VisualStudio2017,
VisualStudio2019,
VisualStudio2022,
}
public virtual bool CanBuildArchitecturesInSinglePass(IEnumerable InArchitectures)
public virtual string GetDefaultArchitecture(FileReference ProjectFile)
public virtual string GetFolderNameForArchitecture(string Architecture)
public void FindBuildProductsToClean(DirectoryReference BaseDir, string[] NamePrefixes, string[] NameSuffixes, List FilesToClean, List DirectoriesToClean)
主要在CleanMode 中调用。 主要功能: 参数解析:
参数1会依次输入Engine和Enterprise目录和其下所有的插件目录,项目目录+Binaries
+UnrealTargetPlatform
的独特字符串比如Engine\Binaries\Win64
参数2会根据TargetType 做选择,并且追加一个项目名称 public enum TargetType
{
Game,
Editor,
Client,
Server,
Program,
}
case TargetType. Game:
return "UE4" ;
case TargetType. Client:
return "UE4Client" ;
case TargetType. Server:
return "UE4Server" ;
case TargetType. Editor:
return "UE4Editor" ;
参数3是-
+UnrealTargetPlatform的名称
+-
+UnrealTargetConfiguration枚举的字符串化
比如:-Win64-Debug
参数4,5传入空值
public virtual DirectoryReference GetBundleDirectory(ReadOnlyTargetRules Rules, List OutputFiles)
public virtual string GetPlatformName()
public virtual bool CanUseXGE()
public virtual bool CanUseParallelExecutor()
public virtual bool CanUseDistcc()
public virtual bool CanUseFASTBuild()
public virtual bool CanUseSNDBS()
public virtual string GetBinaryExtension(UEBuildBinaryType InBinaryType)
public virtual string[] GetDebugInfoExtensions(ReadOnlyTargetRules InTarget, UEBuildBinaryType InBinaryType)
public virtual bool ShouldCompileMonolithicBinary(UnrealTargetPlatform InPlatform)
public virtual bool RequiresArchitectureSuffix()
public virtual List FinalizeBinaryPaths(FileReference BinaryName, FileReference ProjectFile, ReadOnlyTargetRules Target)
基类直接返回True 装了第一个输入参数的List
public virtual List GetConfigurations(UnrealTargetPlatform InUnrealTargetPlatform, bool bIncludeDebug)
声明了一个List<UnrealTargetConfiguration> Configurations
默认塞入一个UnrealTargetConfiguration.Development
如果第二个参数是True 则在0 位置插入UnrealTargetConfiguration.Debug
返回Configurations
public virtual bool HasDefaultBuildConfig(UnrealTargetPlatform Platform, DirectoryReference ProjectDirectoryName)
检查默认配置文件,如果项目使用默认构建配置文件则返回True
public virtual bool HasDefaultBuildConfig ( UnrealTargetPlatform Platform, DirectoryReference ProjectDirectoryName)
{
string [ ] BoolKeys = new string [ ] {
"bCompileApex" , "bCompileICU" ,
"bCompileRecast" , "bCompileSpeedTree" ,
"bCompileWithPluginSupport" , "bCompilePhysXVehicle" , "bCompileFreeType" ,
"bCompileForSize" , "bCompileCEF3" , "bCompileCustomSQLitePlatform"
} ;
return DoProjectSettingsMatchDefault ( Platform, ProjectDirectoryName, "/Script/BuildSettings.BuildSettings" ,
BoolKeys, null , null ) ;
}
public virtual bool RequiresBuild(UnrealTargetPlatform Platform, DirectoryReference ProjectDirectoryName)
public virtual void SetUpConfigurationEnvironment(ReadOnlyTargetRules Target, CppCompileEnvironment GlobalCompileEnvironment, LinkEnvironment GlobalLinkEnvironment)
public virtual void SetUpConfigurationEnvironment ( ReadOnlyTargetRules Target, CppCompileEnvironment GlobalCompileEnvironment, LinkEnvironment GlobalLinkEnvironment)
{
if ( GlobalCompileEnvironment. bUseDebugCRT)
{
GlobalCompileEnvironment. Definitions. Add ( "_DEBUG=1" ) ;
}
else
{
GlobalCompileEnvironment. Definitions. Add ( "NDEBUG=1" ) ;
}
switch ( Target. Configuration)
{
default :
case UnrealTargetConfiguration. Debug:
GlobalCompileEnvironment. Definitions. Add ( "UE_BUILD_DEBUG=1" ) ;
break ;
case UnrealTargetConfiguration. DebugGame:
case UnrealTargetConfiguration. Development:
GlobalCompileEnvironment. Definitions. Add ( "UE_BUILD_DEVELOPMENT=1" ) ;
break ;
case UnrealTargetConfiguration. Shipping:
GlobalCompileEnvironment. Definitions. Add ( "UE_BUILD_SHIPPING=1" ) ;
break ;
case UnrealTargetConfiguration. Test:
GlobalCompileEnvironment. Definitions. Add ( "UE_BUILD_TEST=1" ) ;
break ;
}
GlobalCompileEnvironment. bCreateDebugInfo =
! Target. bDisableDebugInfo && ShouldCreateDebugInfo ( Target) ;
GlobalLinkEnvironment. bCreateDebugInfo = GlobalCompileEnvironment. bCreateDebugInfo;
}
public string GetExternalBuildMetadata(FileReference ProjectFile)
基类调用GetExternalBuildMetadata(FileReference ProjectFile, StringBuilder Metadata)
子类完全重写该函数,基类为空函数,在此不做解释,
在子类里面会单独拿windows和安卓平台做解析
public virtual void ModifyModuleRulesForOtherPlatform(string ModuleName, ModuleRules Rules, ReadOnlyTargetRules Target)
public abstract bool ShouldCreateDebugInfo(ReadOnlyTargetRules Target);
public abstract UEToolChain CreateToolChain(ReadOnlyTargetRules Target);
public abstract void Deploy(TargetReceipt Receipt);
public virtual void ResetTarget(TargetRules Target)
public virtual void ValidateTarget(TargetRules Target)
public virtual void AddExtraModules(ReadOnlyTargetRules Target, List ExtraModuleNames)
public virtual void ModifyModuleRulesForActivePlatform(string ModuleName, ModuleRules Rules, ReadOnlyTargetRules Target)
public abstract void SetUpEnvironment(ReadOnlyTargetRules Target, CppCompileEnvironment CompileEnvironment, LinkEnvironment LinkEnvironment);
public virtual void GetExternalBuildMetadata(FileReference ProjectFile, StringBuilder Metadata)
public virtual void ModifyBinaryLinkEnvironment( LinkEnvironment BinaryLinkEnvironment, CppCompileEnvironment BinaryCompileEnvironment, ReadOnlyTargetRules Target, UEToolChain ToolChain, IActionGraphBuilder Graph)
public virtual void FindAdditionalBuildProductsToClean(ReadOnlyTargetRules Target, List FilesToDelete, List DirectoriesToDelete)
public abstract bool IsBuildProduct(string FileName, string[] NamePrefixes, string[] NameSuffixes);
public virtual void PostBuildSync(UEBuildTarget Target)
public abstract SDKStatus HasRequiredSDKsInstalled();
public virtual string GetRequiredSDKString()