コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        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());
        }
コード例 #5
0
        /// <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;
            }
        }
コード例 #6
0
        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());
        }
コード例 #7
0
        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());
        }
コード例 #8
0
        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());
        }