protected static bool DoProjectSettingsMatchDefault(UnrealTargetPlatform Platform, DirectoryReference ProjectDirectoryName, string Section, string[] BoolKeys, string[] IntKeys, string[] StringKeys) { ConfigHierarchy ProjIni = ConfigCache.ReadHierarchy(ConfigHierarchyType.Engine, ProjectDirectoryName, Platform); ConfigHierarchy DefaultIni = ConfigCache.ReadHierarchy(ConfigHierarchyType.Engine, (DirectoryReference)null, Platform); // look at all bool values if (BoolKeys != null) { foreach (string Key in BoolKeys) { bool Default = false, Project = false; DefaultIni.GetBool(Section, Key, out Default); ProjIni.GetBool(Section, Key, out Project); if (Default != Project) { Log.TraceInformationOnce(Key + " is not set to default. (" + Default + " vs. " + Project + ")"); return(false); } } } // look at all int values if (IntKeys != null) { foreach (string Key in IntKeys) { int Default = 0, Project = 0; DefaultIni.GetInt32(Section, Key, out Default); ProjIni.GetInt32(Section, Key, out Project); if (Default != Project) { Log.TraceInformationOnce(Key + " is not set to default. (" + Default + " vs. " + Project + ")"); return(false); } } } // look for all string values if (StringKeys != null) { foreach (string Key in StringKeys) { string Default = "", Project = ""; DefaultIni.GetString(Section, Key, out Default); ProjIni.GetString(Section, Key, out Project); if (Default != Project) { Log.TraceInformationOnce(Key + " is not set to default. (" + Default + " vs. " + Project + ")"); return(false); } } } // if we get here, we match all important settings return(true); }
/// <summary> /// /// </summary> /// <returns></returns> public static int HeapSize(ConfigHierarchy ConfigCache, string BuildType) { // defaults for this script int ConfigHeapSize = BuildType == "Development" ? 1024 : 512; // values set by editor bool bGotHeapSize = ConfigCache.GetInt32("/Script/HTML5PlatformEditor.HTML5TargetSettings", "HeapSize" + BuildType, out ConfigHeapSize); Log.TraceInformation("Setting Heap size to {0} Mb ", ConfigHeapSize); return(ConfigHeapSize); }
/// <summary> /// /// </summary> /// <returns></returns> public static int HeapSize(ConfigHierarchy ConfigCache, string BuildType) { int ConfigHeapSize = 0; // Valuer set by Editor UI var bGotHeapSize = ConfigCache.GetInt32("/Script/HTML5PlatformEditor.HTML5TargetSettings", "HeapSize" + BuildType, out ConfigHeapSize); // Fallback if the previous method failed if (!bGotHeapSize && !ConfigCache.GetInt32("/Script/BuildSettings.BuildSettings", "HeapSize" + BuildType, out ConfigHeapSize)) { // we couldn't find a per config heap size, look for a common one. if (!ConfigCache.GetInt32("/Script/BuildSettings.BuildSettings", "HeapSize", out ConfigHeapSize)) { ConfigHeapSize = BuildType == "Development" ? 1024 : 512; Log.TraceInformation("Could not find Heap Size setting in .ini for Client config {0}", BuildType); } } Log.TraceInformation("Setting Heap size to {0} Mb ", ConfigHeapSize); return(ConfigHeapSize); }
public string GenerateManifest(string ProjectName, bool bForDistribution, string Architecture) { ConfigHierarchy GameIni = GetConfigCacheIni(ConfigHierarchyType.Game); string ProjectVersion = string.Empty; GameIni.GetString("/Script/EngineSettings.GeneralProjectSettings", "ProjectVersion", out ProjectVersion); if (string.IsNullOrEmpty(ProjectVersion)) { ProjectVersion = "1.0.0.0"; } ConfigHierarchy EngineIni = GetConfigCacheIni(ConfigHierarchyType.Engine); Int32 VersionCode; EngineIni.GetInt32("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "VersionCode", out VersionCode); string SDKVersion = GetMLSDKVersion(EngineIni); string PackageName = GetPackageName(ProjectName); string ApplicationDisplayName = GetApplicationDisplayName(ProjectName); string MinimumAPILevel = GetMinimumAPILevelRequired(); string TargetExecutableName = "bin/" + ProjectName; PackageManifest.version_name = ProjectVersion; PackageManifest.package = PackageName; PackageManifest.version_code = Convert.ToUInt64(VersionCode); PackageManifest.application = new manifestApplication { sdk_version = SDKVersion, min_api_level = MinimumAPILevel, visible_name = ApplicationDisplayName }; List <string> AppPrivileges; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "AppPrivileges", out AppPrivileges); List <string> ExtraComponentElements; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraComponentElements", out ExtraComponentElements); // We start with 1 since there will always be a 'root' <component> int Size = 1; Size += (AppPrivileges != null) ? AppPrivileges.Count : 0; Size += (ExtraComponentElements != null) ? ExtraComponentElements.Count : 0; // Increment Size here if more elements are required in the <application> node. // Index used for sibling elements (app privileges, root component and any extra components) int CurrentIndex = 0; PackageManifest.application.Items = new object[Size]; // Remove all invalid strings from the list of strings AppPrivileges.RemoveAll(item => item == "Invalid"); // Privileges get added first for (int Index = 0; Index < AppPrivileges.Count(); ++Index) { string TrimmedPrivilege = AppPrivileges[Index].Trim(' '); if (TrimmedPrivilege != "") { PackageManifest.application.Items[CurrentIndex] = new manifestApplicationUsesprivilege { name = TrimmedPrivilege, }; CurrentIndex++; } } // Then our root component, this is important as `mldb launch` will use the first component in the manifest PackageManifest.application.Items[CurrentIndex] = new manifestApplicationComponent(); manifestApplicationComponent RootComponent = (manifestApplicationComponent)PackageManifest.application.Items[CurrentIndex]; RootComponent.name = ".fullscreen"; RootComponent.visible_name = ApplicationDisplayName; RootComponent.binary_name = TargetExecutableName; RootComponent.type = GetApplicationType(); // Sub-elements under root <component> List <string> ExtraComponentSubElements; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraComponentSubElements", out ExtraComponentSubElements); List <string> LocalizedAppNames; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "LocalizedAppNames", out LocalizedAppNames); // We start with 1 since there will always be an icon element int NumElementsInRootComponent = 1; NumElementsInRootComponent += (ExtraComponentSubElements != null) ? ExtraComponentSubElements.Count : 0; // If localized app names have been specified, add count of 1 for the <locale> tag. NumElementsInRootComponent += (LocalizedAppNames != null) ? 1 : 0; // Increment NumElementsInRootComponent here if more elements are required in the <component> node. RootComponent.Items = new object[NumElementsInRootComponent]; // Root component icon Dictionary <string, manifestApplicationComponentIconTranslation> LocalizedIconsDict = new Dictionary <string, manifestApplicationComponentIconTranslation>(); if (Directory.Exists(IconDirectory + "/Model")) { string[] IconModelSubDirectories = Directory.GetDirectories(IconDirectory + "/Model"); foreach (var IconModelSubDirectory in IconModelSubDirectories) { manifestApplicationComponentIconTranslation LocalizedIcon = new manifestApplicationComponentIconTranslation(); LocalizedIcon.language = Path.GetFileName(IconModelSubDirectory); LocalizedIcon.model_folder = GetIconModelStagingPath() + "/" + LocalizedIcon.language; LocalizedIconsDict.Add(LocalizedIcon.language, LocalizedIcon); } } if (Directory.Exists(IconDirectory + "/Portal")) { string[] IconPortalSubDirectories = Directory.GetDirectories(IconDirectory + "/Portal"); foreach (var IconPortalSubDirectory in IconPortalSubDirectories) { manifestApplicationComponentIconTranslation LocalizedIcon; string language = Path.GetFileName(IconPortalSubDirectory); if (!LocalizedIconsDict.TryGetValue(language, out LocalizedIcon)) { LocalizedIcon = new manifestApplicationComponentIconTranslation(); LocalizedIcon.language = language; LocalizedIconsDict.Add(LocalizedIcon.language, LocalizedIcon); } LocalizedIcon.portal_folder = GetIconPortalStagingPath() + "/" + LocalizedIcon.language; } } manifestApplicationComponentIconTranslation[] LocalizedIcons = new manifestApplicationComponentIconTranslation[LocalizedIconsDict.Count]; int LocalizedIconIndex = 0; foreach (KeyValuePair <string, manifestApplicationComponentIconTranslation> LocalizedIconKVP in LocalizedIconsDict) { LocalizedIcons[LocalizedIconIndex++] = LocalizedIconKVP.Value; } RootComponent.Items[0] = new manifestApplicationComponentIcon(); ((manifestApplicationComponentIcon)RootComponent.Items[0]).locale = LocalizedIcons; ((manifestApplicationComponentIcon)RootComponent.Items[0]).model_folder = GetIconModelStagingPath(); ((manifestApplicationComponentIcon)RootComponent.Items[0]).portal_folder = GetIconPortalStagingPath(); int RootComponentIndex = 1; if (ExtraComponentSubElements != null) { for (int Index = 0; Index < ExtraComponentSubElements.Count(); ++Index) { Dictionary <string, string> NodeContent; if (ConfigHierarchy.TryParse(ExtraComponentSubElements[Index], out NodeContent)) { RootComponent.Items[RootComponentIndex] = GetComponentSubElement(NodeContent["ElementType"], NodeContent["Value"]); RootComponentIndex++; } } } // Localized app names if (LocalizedAppNames != null && LocalizedAppNames.Count > 0) { manifestApplicationComponentLocale LocaleTag = new manifestApplicationComponentLocale(); LocaleTag.Items = new manifestApplicationComponentLocaleTranslation[LocalizedAppNames.Count]; RootComponent.Items[RootComponentIndex] = LocaleTag; RootComponentIndex++; for (int i = 0; i < LocalizedAppNames.Count; ++i) { Dictionary <string, string> NodeContent; if (ConfigHierarchy.TryParse(LocalizedAppNames[i], out NodeContent)) { LocaleTag.Items[i] = new manifestApplicationComponentLocaleTranslation { language = NodeContent["LanguageCode"], visible_name = NodeContent["AppName"] }; } } } // Finally, add additional components CurrentIndex++; if (ExtraComponentElements != null) { for (int Index = 0; Index < ExtraComponentElements.Count(); ++Index) { Dictionary <string, string> ComponentElement; if (ConfigHierarchy.TryParse(ExtraComponentElements[Index], out ComponentElement)) { PackageManifest.application.Items[CurrentIndex] = GetComponentElement(ComponentElement); CurrentIndex++; } } } // Wrap up serialization XmlSerializer PackageManifestSerializer = new XmlSerializer(PackageManifest.GetType()); XmlSerializerNamespaces MLNamespace = new XmlSerializerNamespaces(); MLNamespace.Add("ml", "magicleap"); StringWriter Writer = new StringWriter(); PackageManifestSerializer.Serialize(Writer, PackageManifest, MLNamespace); // allow plugins to modify final manifest HERE XDocument XDoc; try { XDoc = XDocument.Parse(Writer.ToString()); } catch (Exception e) { throw new BuildException("LuminManifest.xml is invalid {0}\n{1}", e, Writer.ToString()); } UPL.ProcessPluginNode(Architecture, "luminManifestUpdates", "", ref XDoc); return(XDoc.ToString()); }
/// <summary> /// Setup the target environment for building /// </summary> /// <param name="Target">Settings for the target being compiled</param> /// <param name="CompileEnvironment">The compile environment for this target</param> /// <param name="LinkEnvironment">The link environment for this target</param> public override void SetUpEnvironment(ReadOnlyTargetRules Target, CppCompileEnvironment CompileEnvironment, LinkEnvironment LinkEnvironment) { CompileEnvironment.Definitions.Add("WIN32=1"); if (WindowsPlatform.bUseWindowsSDK10) { // Windows 8 or higher required CompileEnvironment.Definitions.Add("_WIN32_WINNT=0x0602"); CompileEnvironment.Definitions.Add("WINVER=0x0602"); } else { // Windows 7 or higher required CompileEnvironment.Definitions.Add("_WIN32_WINNT=0x0601"); CompileEnvironment.Definitions.Add("WINVER=0x0601"); } CompileEnvironment.Definitions.Add("PLATFORM_WINDOWS=1"); CompileEnvironment.Definitions.Add("DEPTH_32_BIT_CONVERSION=0"); FileReference MorpheusShaderPath = FileReference.Combine(UnrealBuildTool.EngineDirectory, "Shaders", "PS4", "PostProcessHMDMorpheus.usf"); if (FileReference.Exists(MorpheusShaderPath)) { CompileEnvironment.Definitions.Add("HAS_MORPHEUS=1"); //on PS4 the SDK now handles distortion correction. On PC we will still have to handle it manually, CompileEnvironment.Definitions.Add("MORPHEUS_ENGINE_DISTORTION=1"); } // Add path to Intel math libraries when using ICL based on target platform if (WindowsPlatform.bCompileWithICL) { var Result = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "IntelSWTools", "compilers_and_libraries", "windows", "compiler", "lib", Target.Platform == UnrealTargetPlatform.Win32 ? "ia32" : "intel64"); if (!Directory.Exists(Result)) { throw new BuildException("ICL was selected but the required math libraries were not found. Could not find: " + Result); } LinkEnvironment.LibraryPaths.Add(Result); } // Explicitly exclude the MS C++ runtime libraries we're not using, to ensure other libraries we link with use the same // runtime library as the engine. bool bUseDebugCRT = Target.Configuration == UnrealTargetConfiguration.Debug && Target.bDebugBuildsActuallyUseDebugCRT; if (!Target.bUseStaticCRT || bUseDebugCRT) { LinkEnvironment.ExcludedLibraries.Add("LIBCMT"); LinkEnvironment.ExcludedLibraries.Add("LIBCPMT"); } if (!Target.bUseStaticCRT || !bUseDebugCRT) { LinkEnvironment.ExcludedLibraries.Add("LIBCMTD"); LinkEnvironment.ExcludedLibraries.Add("LIBCPMTD"); } if (Target.bUseStaticCRT || bUseDebugCRT) { LinkEnvironment.ExcludedLibraries.Add("MSVCRT"); LinkEnvironment.ExcludedLibraries.Add("MSVCPRT"); } if (Target.bUseStaticCRT || !bUseDebugCRT) { LinkEnvironment.ExcludedLibraries.Add("MSVCRTD"); LinkEnvironment.ExcludedLibraries.Add("MSVCPRTD"); } LinkEnvironment.ExcludedLibraries.Add("LIBC"); LinkEnvironment.ExcludedLibraries.Add("LIBCP"); LinkEnvironment.ExcludedLibraries.Add("LIBCD"); LinkEnvironment.ExcludedLibraries.Add("LIBCPD"); //@todo ATL: Currently, only VSAccessor requires ATL (which is only used in editor builds) // When compiling games, we do not want to include ATL - and we can't when compiling games // made with Launcher build due to VS 2012 Express not including ATL. // If more modules end up requiring ATL, this should be refactored into a BuildTarget flag (bNeedsATL) // that is set by the modules the target includes to allow for easier tracking. // Alternatively, if VSAccessor is modified to not require ATL than we should always exclude the libraries. if (Target.LinkType == TargetLinkType.Monolithic && (Target.Type == TargetType.Game || Target.Type == TargetType.Client || Target.Type == TargetType.Server)) { LinkEnvironment.ExcludedLibraries.Add("atl"); LinkEnvironment.ExcludedLibraries.Add("atls"); LinkEnvironment.ExcludedLibraries.Add("atlsd"); LinkEnvironment.ExcludedLibraries.Add("atlsn"); LinkEnvironment.ExcludedLibraries.Add("atlsnd"); } // Add the library used for the delayed loading of DLLs. LinkEnvironment.AdditionalLibraries.Add("delayimp.lib"); //@todo - remove once FB implementation uses Http module if (Target.bCompileAgainstEngine) { // link against wininet (used by FBX and Facebook) LinkEnvironment.AdditionalLibraries.Add("wininet.lib"); } // Compile and link with Win32 API libraries. LinkEnvironment.AdditionalLibraries.Add("rpcrt4.lib"); //LinkEnvironment.AdditionalLibraries.Add("wsock32.lib"); LinkEnvironment.AdditionalLibraries.Add("ws2_32.lib"); LinkEnvironment.AdditionalLibraries.Add("dbghelp.lib"); LinkEnvironment.AdditionalLibraries.Add("comctl32.lib"); LinkEnvironment.AdditionalLibraries.Add("Winmm.lib"); LinkEnvironment.AdditionalLibraries.Add("kernel32.lib"); LinkEnvironment.AdditionalLibraries.Add("user32.lib"); LinkEnvironment.AdditionalLibraries.Add("gdi32.lib"); LinkEnvironment.AdditionalLibraries.Add("winspool.lib"); LinkEnvironment.AdditionalLibraries.Add("comdlg32.lib"); LinkEnvironment.AdditionalLibraries.Add("advapi32.lib"); LinkEnvironment.AdditionalLibraries.Add("shell32.lib"); LinkEnvironment.AdditionalLibraries.Add("ole32.lib"); LinkEnvironment.AdditionalLibraries.Add("oleaut32.lib"); LinkEnvironment.AdditionalLibraries.Add("uuid.lib"); LinkEnvironment.AdditionalLibraries.Add("odbc32.lib"); LinkEnvironment.AdditionalLibraries.Add("odbccp32.lib"); LinkEnvironment.AdditionalLibraries.Add("netapi32.lib"); LinkEnvironment.AdditionalLibraries.Add("iphlpapi.lib"); LinkEnvironment.AdditionalLibraries.Add("setupapi.lib"); // Required for access monitor device enumeration // Windows Vista/7 Desktop Windows Manager API for Slate Windows Compliance LinkEnvironment.AdditionalLibraries.Add("dwmapi.lib"); // IME LinkEnvironment.AdditionalLibraries.Add("imm32.lib"); // For 64-bit builds, we'll forcibly ignore a linker warning with DirectInput. This is // Microsoft's recommended solution as they don't have a fixed .lib for us. if (Target.Platform == UnrealTargetPlatform.Win64) { LinkEnvironment.AdditionalArguments += " /ignore:4078"; } if (Target.Type != TargetType.Editor) { if (!string.IsNullOrEmpty(Target.WindowsPlatform.CompanyName)) { CompileEnvironment.Definitions.Add(String.Format("PROJECT_COMPANY_NAME={0}", Target.WindowsPlatform.CompanyName)); } if (!string.IsNullOrEmpty(Target.WindowsPlatform.CopyrightNotice)) { CompileEnvironment.Definitions.Add(String.Format("PROJECT_COPYRIGHT_STRING={0}", Target.WindowsPlatform.CopyrightNotice)); } if (!string.IsNullOrEmpty(Target.WindowsPlatform.ProductName)) { CompileEnvironment.Definitions.Add(String.Format("PROJECT_PRODUCT_NAME={0}", Target.WindowsPlatform.ProductName)); } if (Target.ProjectFile != null) { CompileEnvironment.Definitions.Add(String.Format("PROJECT_PRODUCT_IDENTIFIER={0}", Target.ProjectFile.GetFileNameWithoutExtension())); } } // Set up default stack size ConfigHierarchy EngineIni = ConfigCache.ReadHierarchy(ConfigHierarchyType.Engine, DirectoryReference.FromFile(Target.ProjectFile), UnrealTargetPlatform.Win64); String TargetSettingsIniPath = "/Script/WindowsTargetPlatform.WindowsTargetSettings"; int IniDefaultStackSize = 0; String StackSizeName = Target.Type == TargetType.Editor ? "DefaultStackSizeEditor" : "DefaultStackSize"; if (EngineIni.GetInt32(TargetSettingsIniPath, StackSizeName, out IniDefaultStackSize)) { LinkEnvironment.DefaultStackSize = IniDefaultStackSize; } int IniDefaultStackSizeCommit = 0; String StackSizeCommitName = Target.Type == TargetType.Editor ? "DefaultStackSizeCommitEditor" : "DefaultStackSizeCommit"; if (EngineIni.GetInt32(TargetSettingsIniPath, StackSizeCommitName, out IniDefaultStackSizeCommit)) { LinkEnvironment.DefaultStackSizeCommit = IniDefaultStackSizeCommit; } }
public string GenerateManifest(string ProjectName, bool bForDistribution, string Architecture) { ConfigHierarchy GameIni = GetConfigCacheIni(ConfigHierarchyType.Game); string ProjectVersion = string.Empty; GameIni.GetString("/Script/EngineSettings.GeneralProjectSettings", "ProjectVersion", out ProjectVersion); if (string.IsNullOrEmpty(ProjectVersion)) { ProjectVersion = "1.0.0.0"; } ConfigHierarchy EngineIni = GetConfigCacheIni(ConfigHierarchyType.Engine); int VersionCode; EngineIni.GetInt32("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "VersionCode", out VersionCode); bool bInternetRequired; EngineIni.GetBool("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "bInternetRequired", out bInternetRequired); StringBuilder Text = new StringBuilder(); string PackageName = GetPackageName(ProjectName); string ApplicationDisplayName = GetApplicationDisplayName(ProjectName); string TargetExecutableName = "bin/" + ProjectName; Text.AppendLine(string.Format("<manifest xmlns:ml=\"magicleap\" ml:package=\"{0}\" ml:version_name=\"{1}\" ml:version_code=\"{2}\">", PackageName, ProjectVersion, VersionCode)); // @mltodo: query sdk_version Text.AppendLine(string.Format("\t<application ml:visible_name=\"{0}\" ml:is_debuggable=\"{1}\" ml:sdk_version=\"1.0\" ml:minimum_os=\"mlos_1.0\" ml:internet_required=\"{2}\">", ApplicationDisplayName, bForDistribution ? "false" : "true", bInternetRequired ? "true" : "false")); Text.AppendLine(string.Format("\t\t<component ml:name=\".fullscreen\" ml:visible_name=\"{0}\" ml:binary_name=\"{1}\" ml:type=\"{2}\">", ApplicationDisplayName, TargetExecutableName, GetApplicationType())); List <string> AppPrivileges; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "AppPrivileges", out AppPrivileges); if (AppPrivileges != null) { foreach (string Privilege in AppPrivileges) { string TrimmedPrivilege = Privilege.Trim(' '); if (TrimmedPrivilege != "") { string PrivilegeString = string.Format("\t\t\t<uses-privilege ml:name=\"{0}\"/>", TrimmedPrivilege); if (!Text.ToString().Contains(PrivilegeString)) { Text.AppendLine(PrivilegeString); } } } } string IconTag = string.Format("<icon ml:name=\"fullscreen\" ml:model_folder=\"{0}\" ml:portal_folder=\"{1}\"/>", GetIconModelStagingPath(), GetIconPortalStagingPath()); Text.AppendLine(string.Format("\t\t\t{0}", IconTag)); List <string> ExtraComponentNodes; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraComponentNodes", out ExtraComponentNodes); if (ExtraComponentNodes != null) { foreach (string ComponentNode in ExtraComponentNodes) { Text.AppendLine(string.Format("\t\t\t{0}", ComponentNode)); } } Text.AppendLine("\t\t</component>"); List <string> ExtraApplicationNodes; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraApplicationNodes", out ExtraApplicationNodes); if (ExtraApplicationNodes != null) { foreach (string ApplicationNode in ExtraApplicationNodes) { Text.AppendLine(string.Format("\t\t{0}", ApplicationNode)); } } Text.AppendLine(string.Format("\t\t{0}", IconTag)); Text.AppendLine("\t</application>"); Text.AppendLine("</manifest>"); // allow plugins to modify final manifest HERE XDocument XDoc; try { XDoc = XDocument.Parse(Text.ToString()); } catch (Exception e) { throw new BuildException("LuminManifest.xml is invalid {0}\n{1}", e, Text.ToString()); } UPL.ProcessPluginNode(Architecture, "luminManifestUpdates", "", ref XDoc); return(XDoc.ToString()); }
public string GenerateManifest(string ProjectName, bool bForDistribution, string Architecture) { ConfigHierarchy GameIni = GetConfigCacheIni(ConfigHierarchyType.Game); string ProjectVersion = string.Empty; GameIni.GetString("/Script/EngineSettings.GeneralProjectSettings", "ProjectVersion", out ProjectVersion); if (string.IsNullOrEmpty(ProjectVersion)) { ProjectVersion = "1.0.0.0"; } ConfigHierarchy EngineIni = GetConfigCacheIni(ConfigHierarchyType.Engine); Int32 VersionCode; EngineIni.GetInt32("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "VersionCode", out VersionCode); string SDKVersion = GetMLSDKVersion(EngineIni); string PackageName = GetPackageName(ProjectName); string ApplicationDisplayName = GetApplicationDisplayName(ProjectName); string MinimumAPILevel = GetMinimumAPILevelRequired(); string TargetExecutableName = "bin/" + ProjectName; PackageManifest.version_name = ProjectVersion; PackageManifest.package = PackageName; PackageManifest.version_code = Convert.ToUInt64(VersionCode); PackageManifest.application = new manifestApplication { sdk_version = SDKVersion, min_api_level = MinimumAPILevel, visible_name = ApplicationDisplayName }; List <string> AppPrivileges; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "AppPrivileges", out AppPrivileges); List <string> ExtraComponentElements; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraComponentElements", out ExtraComponentElements); // We always add an additional item as that will be our 'root' <component> int Size = (ExtraComponentElements == null ? AppPrivileges.Count() : AppPrivileges.Count() + ExtraComponentElements.Count()) + 1; // Index used for sibling elements (app privileges, root component and any extra components) int CurrentIndex = 0; PackageManifest.application.Items = new object[Size]; // Remove all invalid strings from the list of strings AppPrivileges.RemoveAll(item => item == "Invalid"); // Privileges get added first for (int Index = 0; Index < AppPrivileges.Count(); ++Index) { string TrimmedPrivilege = AppPrivileges[Index].Trim(' '); if (TrimmedPrivilege != "") { PackageManifest.application.Items[CurrentIndex] = new manifestApplicationUsesprivilege { name = TrimmedPrivilege, }; CurrentIndex++; } } // Then our root component, this is important as `mldb launch` will use the first component in the manifest PackageManifest.application.Items[CurrentIndex] = new manifestApplicationComponent(); manifestApplicationComponent RootComponent = (manifestApplicationComponent)PackageManifest.application.Items[CurrentIndex]; RootComponent.name = ".fullscreen"; RootComponent.visible_name = ApplicationDisplayName; RootComponent.binary_name = TargetExecutableName; RootComponent.type = GetApplicationType(); // Sub-elements under root <component> List <string> ExtraComponentSubElements; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraComponentSubElements", out ExtraComponentSubElements); RootComponent.Items = (ExtraComponentSubElements == null ? new object[1] : new object[ExtraComponentSubElements.Count() + 1]); // Root component icon RootComponent.Items[0] = new manifestApplicationComponentIcon(); ((manifestApplicationComponentIcon)RootComponent.Items[0]).model_folder = GetIconModelStagingPath(); ((manifestApplicationComponentIcon)RootComponent.Items[0]).portal_folder = GetIconPortalStagingPath(); if (ExtraComponentSubElements != null) { for (int Index = 0; Index < ExtraComponentSubElements.Count(); ++Index) { Dictionary <string, string> NodeContent; if (ConfigHierarchy.TryParse(ExtraComponentSubElements[Index], out NodeContent)) { RootComponent.Items[Index + 1] = GetComponentSubElement(NodeContent["ElementType"], NodeContent["Value"]); } } } // Finally, add additional components CurrentIndex++; if (ExtraComponentElements != null) { for (int Index = 0; Index < ExtraComponentElements.Count(); ++Index) { Dictionary <string, string> ComponentElement; if (ConfigHierarchy.TryParse(ExtraComponentElements[Index], out ComponentElement)) { PackageManifest.application.Items[CurrentIndex] = GetComponentElement(ComponentElement); CurrentIndex++; } } } // Wrap up serialization XmlSerializer PackageManifestSerializer = new XmlSerializer(PackageManifest.GetType()); XmlSerializerNamespaces MLNamespace = new XmlSerializerNamespaces(); MLNamespace.Add("ml", "magicleap"); StringWriter Writer = new StringWriter(); PackageManifestSerializer.Serialize(Writer, PackageManifest, MLNamespace); // allow plugins to modify final manifest HERE XDocument XDoc; try { XDoc = XDocument.Parse(Writer.ToString()); } catch (Exception e) { throw new BuildException("LuminManifest.xml is invalid {0}\n{1}", e, Writer.ToString()); } UPL.ProcessPluginNode(Architecture, "luminManifestUpdates", "", ref XDoc); return(XDoc.ToString()); }
public string GenerateManifest(string ProjectName, bool bForDistribution, string Architecture) { ConfigHierarchy GameIni = GetConfigCacheIni(ConfigHierarchyType.Game); string ProjectVersion = string.Empty; GameIni.GetString("/Script/EngineSettings.GeneralProjectSettings", "ProjectVersion", out ProjectVersion); if (string.IsNullOrEmpty(ProjectVersion)) { ProjectVersion = "1.0.0.0"; } ConfigHierarchy EngineIni = GetConfigCacheIni(ConfigHierarchyType.Engine); int VersionCode; EngineIni.GetInt32("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "VersionCode", out VersionCode); string SDKVersion = GetMLSDKVersion(EngineIni); StringBuilder Text = new StringBuilder(); string PackageName = GetPackageName(ProjectName); string ApplicationDisplayName = GetApplicationDisplayName(ProjectName); string MinimumAPILevel = GetMinimumAPILevelRequired(); string TargetExecutableName = "bin/" + ProjectName; Text.AppendLine(string.Format("<manifest xmlns:ml=\"magicleap\" ml:package=\"{0}\" ml:version_name=\"{1}\" ml:version_code=\"{2}\">", PackageName, ProjectVersion, VersionCode)); Text.AppendLine(string.Format("\t<application ml:visible_name=\"{0}\" ml:sdk_version=\"{1}\" ml:min_api_level=\"{2}\">", ApplicationDisplayName, SDKVersion, MinimumAPILevel)); GetAppPrivileges(EngineIni, Text); Text.AppendLine(string.Format("\t\t<component ml:name=\".fullscreen\" ml:visible_name=\"{0}\" ml:binary_name=\"{1}\" ml:type=\"{2}\">", ApplicationDisplayName, TargetExecutableName, GetApplicationType())); string IconTag = string.Format("<icon ml:model_folder=\"{0}\" ml:portal_folder=\"{1}\"/>", GetIconModelStagingPath(), GetIconPortalStagingPath()); Text.AppendLine(string.Format("\t\t\t{0}", IconTag)); List <string> ExtraComponentNodes; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraComponentNodes", out ExtraComponentNodes); if (ExtraComponentNodes != null) { foreach (string ComponentNode in ExtraComponentNodes) { Text.AppendLine(string.Format("\t\t\t{0}", ComponentNode)); } } Text.AppendLine("\t\t</component>"); List <string> ExtraApplicationNodes; EngineIni.GetArray("/Script/LuminRuntimeSettings.LuminRuntimeSettings", "ExtraApplicationNodes", out ExtraApplicationNodes); if (ExtraApplicationNodes != null) { foreach (string ApplicationNode in ExtraApplicationNodes) { Text.AppendLine(string.Format("\t\t{0}", ApplicationNode)); } } Text.AppendLine("\t</application>"); Text.AppendLine("</manifest>"); // allow plugins to modify final manifest HERE XDocument XDoc; try { XDoc = XDocument.Parse(Text.ToString()); } catch (Exception e) { throw new BuildException("LuminManifest.xml is invalid {0}\n{1}", e, Text.ToString()); } UPL.ProcessPluginNode(Architecture, "luminManifestUpdates", "", ref XDoc); return(XDoc.ToString()); }