首页 > 其他分享 >UE如何确定不同平台使用的Launch源文件

UE如何确定不同平台使用的Launch源文件

时间:2023-10-30 20:23:18浏览次数:35  
标签:UnrealBuildTool Launch tsecer xr 源文件 -- 2022 UE 1049089

问题

众所周知,UE的启动模块位于Engine\Source\Runtime\Launch文件夹,这个文件夹下包含了所有UE支持的平台类型,但是Launch.Build.cs文件并没有特殊的说明来确定使用哪个子文件夹的内容。

尽管从源代码组织结构上看可以想当然的知道只会选择当前构建平台,但是UE是如何知道具体使用哪个子文件夹中的源文件呢?

tsecer@harry: MINGW64 UnrealEngine/Engine/Source/Runtime/Launch/Private (release)
$ ll
total 216
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 Android/
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 HoloLens/
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 IOS/
-rw-r--r-- 1 tsecer 1049089   5256  6月  1  2022 Launch.cpp
-rw-r--r-- 1 tsecer 1049089 208485  6月  1  2022 LaunchEngineLoop.cpp
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 Linux/
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 Mac/
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 Unix/
drwxr-xr-x 1 tsecer 1049089      0  6月  1  2022 Windows/

Launch

这个模块在Unreal Built Tool的源代码中也有体现,但它只是默认作为一个必须包含的root模块(而不会影响平台文件夹的选取),对于一些对链接顺序由要求的平台(例如linux),或者模块之间加载顺序有依赖的场景,需要把这个模块放在最开始。

///@file: e:\tsecer\Engine\Source\Programs\UnrealBuildTool\Configuration\TargetRules.cs
	/// <summary>
	/// Specifies the name of the launch module. For modular builds, this is the module that is compiled into the target's executable.
	/// </summary>
	public string? LaunchModuleName
	{
		get
		{
			return (LaunchModuleNamePrivate == null && Type != global::UnrealBuildTool.TargetType.Program)? "Launch" : LaunchModuleNamePrivate;
		}
		set
		{
			LaunchModuleNamePrivate = value;
		}
	}

exclude

对于平台文件,并不是通过(最直观的、想当然的)包含指定文件夹,而是通过排除特定文件夹实现的。例如,在Windows下构建的时候,将会排除除了Windows文件夹之外的所有平台(Linux、IOS、Android、HoloLens)文件夹。

///@file: Engine\Source\Programs\UnrealBuildTool\Configuration\UEBuildModuleCPP.cs
	/// <summary>
	/// Finds all the source files that should be built for this module
	/// </summary>
	/// <param name="Platform">The platform the module is being built for</param>
	/// <param name="DirectoryToSourceFiles">Map of directory to source files inside it</param>
	/// <returns>Set of source files that should be built</returns>
	public InputFileCollection FindInputFiles(UnrealTargetPlatform Platform, Dictionary<DirectoryItem, FileItem[]> DirectoryToSourceFiles)
	{
		ReadOnlyHashSet<string> ExcludedNames = UEBuildPlatform.GetBuildPlatform(Platform).GetExcludedFolderNames();

		InputFileCollection InputFiles = new InputFileCollection();

		SourceDirectories = new HashSet<DirectoryReference>();
		foreach (DirectoryReference Dir in ModuleDirectories)
		{
			DirectoryItem ModuleDirectoryItem = DirectoryItem.GetItemByDirectoryReference(Dir);
			FindInputFilesFromDirectoryRecursive(ModuleDirectoryItem, ExcludedNames, SourceDirectories, DirectoryToSourceFiles, InputFiles);
		}

		return InputFiles;
	}

platform

在Engine\Source\Programs\UnrealBuildTool\Platform文件夹下,包含了当前支持的所有平台,每个平台一个文件夹。在UBT启动的时候,会通过csharp的反射机制找到所有平台名称(UEBuildPlatform类的派生类)。例如,在linux平台下,对应的派生类为

	class LinuxPlatform : UEBuildPlatform
	{
		/// <summary>
		/// Linux host architecture (compiler target triplet)
		/// </summary>
		public const string DefaultHostArchitecture = "x86_64-unknown-linux-gnu";

		/// <summary>
		/// SDK in use by the platform
		/// </summary>
		protected LinuxPlatformSDK SDK;
	}

在Engine\Source\Runtime\Sockets\Private文件夹,同样存在不同平台的子文件夹,这是一个通用机制。

tsecer@harry MINGW64 UnrealEngine/Engine/Source/Runtime/Sockets/Private (release)
$ ll
total 50
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 Android/
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 BSDSockets/
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 HoloLens/
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 IOS/
-rw-r--r-- 1 tsecer 1049089  1875  6月  1  2022 IPAddress.cpp
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 Mac/
-rw-r--r-- 1 tsecer 1049089   135  6月  1  2022 MultichannelTcpGlobals.cpp
-rw-r--r-- 1 tsecer 1049089  3971  6月  1  2022 NetworkMessage.cpp
-rw-r--r-- 1 tsecer 1049089  2283  6月  1  2022 ServerTOC.cpp
-rw-r--r-- 1 tsecer 1049089  2322  6月  1  2022 Sockets.cpp
-rw-r--r-- 1 tsecer 1049089   170  6月  1  2022 SocketsPrivate.h
-rw-r--r-- 1 tsecer 1049089 26373  6月  1  2022 SocketSubsystem.cpp
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 Unix/
drwxr-xr-x 1 tsecer 1049089     0  6月  1  2022 Windows/

调用链

当然,我不是通过阅读代码分析的,而是通过调试器分析的,下面是调用链(做个备忘):

>	UnrealBuildTool.dll!UnrealBuildTool.UEBuildModuleCPP.FindInputFilesFromDirectory(UnrealBuildBase.DirectoryItem BaseDirectory, UnrealBuildTool.UEBuildModuleCPP.InputFileCollection InputFiles) 行 1543	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildModuleCPP.FindInputFilesFromDirectoryRecursive(UnrealBuildBase.DirectoryItem BaseDirectory, EpicGames.Core.ReadOnlyHashSet<string> ExcludedNames, System.Collections.Generic.HashSet<EpicGames.Core.DirectoryReference> SourceDirectories, System.Collections.Generic.Dictionary<UnrealBuildBase.DirectoryItem, UnrealBuildBase.FileItem[]> DirectoryToSourceFiles, UnrealBuildTool.UEBuildModuleCPP.InputFileCollection InputFiles) 行 1528	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildModuleCPP.FindInputFilesFromDirectoryRecursive(UnrealBuildBase.DirectoryItem BaseDirectory, EpicGames.Core.ReadOnlyHashSet<string> ExcludedNames, System.Collections.Generic.HashSet<EpicGames.Core.DirectoryReference> SourceDirectories, System.Collections.Generic.Dictionary<UnrealBuildBase.DirectoryItem, UnrealBuildBase.FileItem[]> DirectoryToSourceFiles, UnrealBuildTool.UEBuildModuleCPP.InputFileCollection InputFiles) 行 1524	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildModuleCPP.FindInputFilesFromDirectoryRecursive(UnrealBuildBase.DirectoryItem BaseDirectory, EpicGames.Core.ReadOnlyHashSet<string> ExcludedNames, System.Collections.Generic.HashSet<EpicGames.Core.DirectoryReference> SourceDirectories, System.Collections.Generic.Dictionary<UnrealBuildBase.DirectoryItem, UnrealBuildBase.FileItem[]> DirectoryToSourceFiles, UnrealBuildTool.UEBuildModuleCPP.InputFileCollection InputFiles) 行 1524	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildModuleCPP.FindInputFiles(UnrealBuildTool.UnrealTargetPlatform Platform, System.Collections.Generic.Dictionary<UnrealBuildBase.DirectoryItem, UnrealBuildBase.FileItem[]> DirectoryToSourceFiles) 行 1504	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildModuleCPP.Compile(UnrealBuildTool.ReadOnlyTargetRules Target, UnrealBuildTool.UEToolChain ToolChain, UnrealBuildTool.CppCompileEnvironment BinaryCompileEnvironment, System.Collections.Generic.List<EpicGames.Core.FileReference> SpecificFilesToCompile, UnrealBuildTool.ISourceFileWorkingSet WorkingSet, UnrealBuildTool.IActionGraphBuilder Graph) 行 395	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildBinary.SetupBinaryLinkEnvironment(UnrealBuildTool.ReadOnlyTargetRules Target, UnrealBuildTool.UEToolChain ToolChain, UnrealBuildTool.LinkEnvironment LinkEnvironment, UnrealBuildTool.CppCompileEnvironment CompileEnvironment, System.Collections.Generic.List<EpicGames.Core.FileReference> SpecificFilesToCompile, UnrealBuildTool.ISourceFileWorkingSet WorkingSet, EpicGames.Core.DirectoryReference ExeDir, UnrealBuildTool.IActionGraphBuilder Graph) 行 721	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildBinary.Build(UnrealBuildTool.ReadOnlyTargetRules Target, UnrealBuildTool.UEToolChain ToolChain, UnrealBuildTool.CppCompileEnvironment CompileEnvironment, UnrealBuildTool.LinkEnvironment LinkEnvironment, System.Collections.Generic.List<EpicGames.Core.FileReference> SpecificFilesToCompile, UnrealBuildTool.ISourceFileWorkingSet WorkingSet, EpicGames.Core.DirectoryReference ExeDir, UnrealBuildTool.IActionGraphBuilder Graph) 行 187	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UEBuildTarget.Build(UnrealBuildTool.BuildConfiguration BuildConfiguration, UnrealBuildTool.ISourceFileWorkingSet WorkingSet, UnrealBuildTool.TargetDescriptor TargetDescriptor) 行 1844	C#
 	UnrealBuildTool.dll!UnrealBuildTool.BuildMode.CreateMakefile(UnrealBuildTool.BuildConfiguration BuildConfiguration, UnrealBuildTool.TargetDescriptor TargetDescriptor, UnrealBuildTool.ISourceFileWorkingSet WorkingSet) 行 742	C#
 	UnrealBuildTool.dll!UnrealBuildTool.BuildMode.Build(System.Collections.Generic.List<UnrealBuildTool.TargetDescriptor> TargetDescriptors, UnrealBuildTool.BuildConfiguration BuildConfiguration, UnrealBuildTool.ISourceFileWorkingSet WorkingSet, UnrealBuildTool.BuildOptions Options, EpicGames.Core.FileReference WriteOutdatedActionsFile, bool bSkipPreBuildTargets) 行 267	C#
 	UnrealBuildTool.dll!UnrealBuildTool.BuildMode.Execute(EpicGames.Core.CommandLineArguments Arguments) 行 237	C#
 	UnrealBuildTool.dll!UnrealBuildTool.UnrealBuildTool.Main(string[] ArgumentsArray) 行 612	C#

标签:UnrealBuildTool,Launch,tsecer,xr,源文件,--,2022,UE,1049089
From: https://www.cnblogs.com/tsecer/p/17798685.html

相关文章

  • .NET 反序列化 GetterSettingsPropertyValue 攻击链
    0x01 链路1 SettingsPropertyValueSettingsPropertyValue位于命名空间 System.Configuration,用于应用程序存储和检索设置的值,此类具有Name、IsDirty、Deserialized、PropertyValue、SerializedValue等多个公共成员,其中SerializedValue属性用于获取或者设置序列化的值,便于持久......
  • cf353D. Queue(整体考虑转移)
    D.Queuef[i]表示第i个F需要多少时间才能让所有的M都移到她后面,那么我们考虑转移,分为两种情况。第i个F和第i-1个F挨着,那么显然f[i]=f[i-1]+1假如中间隔着一些M,可以分为两种情况,假如i可以在i-1完成之前追上它,那么就是f[i-1]+1,否则就说明i一直在进行交换,时间为在i之前的M的个数......
  • [Vue学习]使用Vue-cli脚手架快速搭建项目
    安装vue-cli3npminstall-g@vue/cli验证vue版本vue--version 使用vuecreate项目名创建(需要cd进具体的目录)npmrundev(运行)npmrunbuild(编译)(也可以使用vue ui界面图形化方式进行创建) ==================================================可以直接使用下面方式创建项......
  • Docker_报错:Host key for 47.116.79.175 has changed and you have requested strict
    Hostkeyfor47.116.79.175haschangedandyouhaverequestedstrictchecking.Hostkeyverificationfailed. 问题原因用OpenSSH的人都知ssh会把你每个你访问过计算机的公钥(publickey)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公......
  • 34-Vue脚手架-组件的自定义事件(使用自定义事件优化Todo-List案例)
    组件的自定义事件1.一种组件间通信的方式,适用于子组件===>父组件(这里也可以使用props传递数据进行实现)2.使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)3.绑定自定义事件:1)第一种方式,在父组件中<!--通过父组件给子组件绑定一个......
  • vue关于render函数如何渲染v-html
    render函数如何渲染v-html,两种方式(适用于搜索关键字高亮) 例子:“互联网数据”搜索关键字"网"==>row.htmlStr:互联<spanclass="search-text">网</span>数据render:(h,{row})=>{//模板组件方式returnh({template:"<span>"+row.htmlStr+"&l......
  • UE全屏问题
    命令行内:-fullscreen-r.SetRes=800x600w游戏内命令行fullscreenr.setres800x600f蓝图命令r.setres800x600蓝图节点SetFullScreenMode不知为啥不好使UE设置全屏的插件1.下载商城的免费插件2.在开始时调用,我这里是在gamemode中插件中GetPrimaryMonitorResolut......
  • Vue 3中toRaw和markRaw的使用
    文章目录Vue3的响应性系统使用`toRaw`使用`markRaw`使用场景1.与第三方库交互2.提高性能3.避免无限循环总结......
  • vuex
    一、概念:1.为什么要用vuex?传统:每个页面都要去重新请求后台得到将数据存到session、cookie中作用:专门为vue.js设计的集中式状态管理架构.数据仓库,主要管理状态(共用的属性或数据).把数据进行共享,每个页面想用,都可以来调用.......
  • UE5 怎么快速查找 UI 是哪个蓝图?
    通过“工具”->"调试"->"控件反射器"官方文档:https://docs.unrealengine.com/5.1/zh-CN/using-the-slate-widget-reflector-in-unreal-engine/......