Beispiel #1
0
        static void Main(string[] Arguments)
        {
            bool bValidArgs = true;

            bool bCleanMetadata = false;
            bool bCleanXml = false;
            bool bCleanUdn = false;
            bool bCleanHtml = false;
            bool bCleanChm = false;

            bool bBuildMetadata = false;
            bool bBuildXml = false;
            bool bBuildUdn = false;
            bool bBuildHtml = false;
            bool bBuildChm = false;

            string TargetInfoPath = null;
            string EngineDir = null;
            string MetadataDir = null;
            string XmlDir = null;
            string StatsPath = null;

            bool bVerbose = false;
            List<string> Filters = new List<string>();

            // Parse the command line
            foreach (string Argument in Arguments)
            {
                int EqualsIdx = Argument.IndexOf('=');
                string OptionName = (EqualsIdx == -1)? Argument : Argument.Substring(0, EqualsIdx + 1);
                string OptionValue = (EqualsIdx == -1)? null : Argument.Substring(EqualsIdx + 1);

                if (OptionName == "-clean")
                {
                    bCleanMetadata = bCleanXml = bCleanUdn = bCleanHtml = true;
                }
                else if (OptionName == "-build")
                {
                    bBuildMetadata = bBuildXml = bBuildUdn = bBuildHtml = true;
                }
                else if (OptionName == "-rebuild")
                {
                    bCleanMetadata = bCleanXml = bCleanUdn = bCleanHtml = bBuildMetadata = bBuildXml = bBuildUdn = bBuildHtml = true;
                }
                else if (OptionName == "-cleanmeta")
                {
                    bCleanMetadata = true;
                }
                else if (OptionName == "-buildmeta")
                {
                    bBuildMetadata = true;
                }
                else if (OptionName == "-rebuildmeta")
                {
                    bCleanMetadata = bBuildMetadata = true;
                }
                else if (OptionName == "-cleanxml")
                {
                    bCleanXml = true;
                }
                else if (OptionName == "-buildxml")
                {
                    bBuildXml = true;
                }
                else if (OptionName == "-rebuildxml")
                {
                    bCleanXml = bBuildXml = true;
                }
                else if (OptionName == "-cleanudn")
                {
                    bCleanUdn = true;
                }
                else if (OptionName == "-buildudn")
                {
                    bBuildUdn = true;
                }
                else if (OptionName == "-rebuildudn")
                {
                    bCleanUdn = bBuildUdn = true;
                }
                else if (OptionName == "-cleanhtml")
                {
                    bCleanHtml = true;
                }
                else if (OptionName == "-buildhtml")
                {
                    bBuildHtml = true;
                }
                else if (OptionName == "-rebuildhtml")
                {
                    bCleanHtml = bBuildHtml = true;
                }
                else if (OptionName == "-cleanchm")
                {
                    bCleanChm = true;
                }
                else if (OptionName == "-buildchm")
                {
                    bBuildChm = true;
                }
                else if (OptionName == "-rebuildchm")
                {
                    bCleanChm = bBuildChm = true;
                }
                else if (OptionName == "-targetinfo=")
                {
                    TargetInfoPath = Path.GetFullPath(OptionValue);
                }
                else if (OptionName == "-enginedir=")
                {
                    EngineDir = Path.GetFullPath(OptionValue);
                }
                else if (OptionName == "-xmldir=")
                {
                    XmlDir = Path.GetFullPath(OptionValue);
                }
                else if (OptionName == "-metadatadir=")
                {
                    MetadataDir = Path.GetFullPath(OptionValue);
                }
                else if (OptionName == "-stats=")
                {
                    StatsPath = Path.GetFullPath(OptionValue);
                }
                else if (OptionName == "-verbose")
                {
                    bVerbose = true;
                }
                else if (OptionName == "-filter=")
                {
                    Filters.AddRange(OptionValue.Split(',').Select(x => x.Replace('\\', '/').Trim()));
                }
                else
                {
                    Console.WriteLine("Invalid argument: '{0}'", OptionName);
                    bValidArgs = false;
                }
            }

            // Check we have all the required parameters
            if (bBuildXml && TargetInfoPath == null)
            {
                Console.WriteLine("Missing -buildenvironment parameter to be able to build XML");
            }
            else if (bValidArgs && EngineDir != null)
            {
                // If we don't intermediate paths, make them up
                if (XmlDir == null) XmlDir = Path.Combine(EngineDir, "Intermediate\\Documentation\\Default\\Xml");
                if (MetadataDir == null) MetadataDir = Path.Combine(EngineDir, "Intermediate\\Documentation\\Default\\Metadata");

                // Derive all the engine paths we need in one place
                string DoxygenPath = Path.Combine(EngineDir, "Extras\\NoRedist\\Doxygen\\bin\\doxygen.exe");
                string UdnDir = Path.Combine(EngineDir, "Documentation\\Source");
                string HtmlDir = Path.Combine(EngineDir, "Documentation\\HTML");
                string ChmDir = Path.Combine(EngineDir, "Documentation\\CHM");
                string DocToolPath = Path.Combine(EngineDir, "Binaries\\DotNET\\UnrealDocTool.exe");
                string ChmCompilerPath = Path.Combine(EngineDir, "Extras\\NoRedist\\HTML Help Workshop\\hhc.exe");
                string SettingsPath = Path.Combine(EngineDir, "Documentation\\Extras\\API\\API.ini");
                string MetadataPath = Path.Combine(MetadataDir, "metadata.xml");

                // Create all the output directories
                Utility.SafeCreateDirectory(UdnDir);
                Utility.SafeCreateDirectory(HtmlDir);
                Utility.SafeCreateDirectory(ChmDir);

                // Read the settings file
                Settings = IniFile.Read(SettingsPath);
                IgnoredFunctionMacros = new HashSet<string>(Settings.FindValueOrDefault("Input.IgnoredFunctionMacros", "").Split('\n'));
                IncludedSourceFiles = new HashSet<string>(Settings.FindValueOrDefault("Output.IncludedSourceFiles", "").Split('\n'));

                // Clean the output folders
                if (bCleanMetadata)
                {
                    CleanMetadata(MetadataDir);
                }
                if (bCleanXml)
                {
                    CleanXml(XmlDir);
                }
                if (bCleanUdn)
                {
                    CleanUdn(UdnDir);
                }
                if (bCleanHtml)
                {
                    CleanHtml(HtmlDir);
                }
                if (bCleanChm)
                {
                    CleanChm(ChmDir);
                }

                // Build the data
                if (!bBuildMetadata || BuildMetadata(DoxygenPath, EngineDir, MetadataDir, MetadataPath))
                {
                    if (!bBuildXml || BuildXml(EngineDir, TargetInfoPath, DoxygenPath, XmlDir, Filters, bVerbose))
                    {
                        if (!bBuildUdn || BuildUdn(XmlDir, UdnDir, ChmDir, MetadataPath, StatsPath, Filters))
                        {
                            if (!bBuildHtml || BuildHtml(EngineDir, DocToolPath, UdnDir))
                            {
                                if (!bBuildChm || BuildChm(ChmCompilerPath, HtmlDir, ChmDir))
                                {
                                    Console.WriteLine("Complete.");
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                // Write the command line options
                Console.WriteLine("APIDocTool.exe [options] -enginedir=<...>");                                    // <-- 80 character limit to start of comment
                Console.WriteLine();
                Console.WriteLine("Options:");
                Console.WriteLine("    -rebuild:                        Clean and build everything");
                Console.WriteLine("    -rebuild[meta|xml|udn|html|chm]: Clean and build specific files");
                Console.WriteLine("    -clean:                          Clean all files");
                Console.WriteLine("    -clean[meta|xml|udn|html|chm]:   Clean specific files");
                Console.WriteLine("    -build:						    Build everything");
                Console.WriteLine("    -build[meta|xml|udn|html|chm]:   Build specific output files");
                Console.WriteLine("    -targetinfo=<...>:			    Specifies the build info, created by");
                Console.WriteLine("                                     running UBT with -writetargetinfo=<...>");
                Console.WriteLine("    -xmldir=<...>:				    Output directory for xml files");
                Console.WriteLine("    -metadatadir=<...>:			    Output directory for metadata files");
                Console.WriteLine("    -filter=<...>,<...>:             Filter conversion, eg.");
                Console.WriteLine("                                       Folders:  -filter=Core/Containers/...");
                Console.WriteLine("                                       Entities: -filter=Core/TArray");
            }
        }
		static int Main(string[] Arguments)
        {
			List<string> ArgumentList = new List<string>(Arguments);

			// Get the default paths
            string EngineDir = ParseArgumentDirectory(ArgumentList, "-enginedir=", Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "..\\..\\..\\..\\..\\..\\..\\.."));
			string IntermediateDir = ParseArgumentDirectory(ArgumentList, "-intermediatedir=", Path.Combine(EngineDir, "Intermediate\\Documentation"));
			string DocumentationDir = ParseArgumentDirectory(ArgumentList, "-documentationdir=", Path.Combine(EngineDir, "Documentation"));
			string SamplesDir = ParseArgumentDirectory(ArgumentList, "-samplesdir=", Path.Combine(EngineDir, "..\\Samples"));

			// Check if we're just building an index, no actual content
			bool bIndexOnly = ArgumentList.Remove("-indexonly");

			// Check if we're running on a build machine
			bool bBuildMachine = ArgumentList.Remove("-buildmachine");

			// Remove all the filter arguments
			List<string> Filters = new List<string>();
			for (int Idx = 0; Idx < ArgumentList.Count; Idx++)
			{
				const string FilterPrefix = "-filter=";
				if (ArgumentList[Idx].StartsWith(FilterPrefix))
				{
					Filters.AddRange(ArgumentList[Idx].Substring(FilterPrefix.Length).Split(',').Select(x => x.Replace('\\', '/').Trim()));
					ArgumentList.RemoveAt(Idx--);
				}
			}

			// Remove all the arguments for what to build
			BuildActions DefaultActions;
			if(ArgumentList.Count == 0)
			{
				DefaultActions = BuildActions.Clean | BuildActions.Build | BuildActions.Archive;
			}
			else
			{
				DefaultActions = ParseBuildActions(ArgumentList, "");
			}

			BuildActions CodeActions = ParseBuildActions(ArgumentList, "code") | DefaultActions;
			BuildActions CodeSnippetsActions = ParseBuildActions(ArgumentList, "codesnippets") | CodeActions;
			BuildActions CodeTargetActions = ParseBuildActions(ArgumentList, "codetarget") | CodeActions;
			BuildActions CodeMetadataActions = ParseBuildActions(ArgumentList, "codemeta") | CodeActions;
			BuildActions CodeXmlActions = ParseBuildActions(ArgumentList, "codexml") | CodeActions;
			BuildActions CodeUdnActions = ParseBuildActions(ArgumentList, "codeudn") | CodeActions;
			BuildActions CodeHtmlActions = ParseBuildActions(ArgumentList, "codehtml") | CodeActions;
			BuildActions CodeChmActions = ParseBuildActions(ArgumentList, "codechm") | CodeActions;

			BuildActions BlueprintActions = ParseBuildActions(ArgumentList, "blueprint") | DefaultActions;
			BuildActions BlueprintJsonActions = ParseBuildActions(ArgumentList, "blueprintjson") | BlueprintActions;
			BuildActions BlueprintUdnActions = ParseBuildActions(ArgumentList, "blueprintudn") | BlueprintActions;
			BuildActions BlueprintHtmlActions = ParseBuildActions(ArgumentList, "blueprinthtml") | BlueprintActions;
			BuildActions BlueprintChmActions = ParseBuildActions(ArgumentList, "blueprintchm") | BlueprintActions;

			// Print the help message and exit
			if(Arguments.Length == 0 || ArgumentList.Count > 0)
			{
				foreach(string InvalidArgument in ArgumentList)
				{
					Console.WriteLine("Invalid argument: {0}", InvalidArgument);
				}
				Console.WriteLine("APIDocTool.exe [options] -enginedir=<...>");                                    // <-- 80 character limit to start of comment
				Console.WriteLine();
				Console.WriteLine("Options:");
				Console.WriteLine("    -rebuild:                        Clean and build everything");
				Console.WriteLine("    -rebuild<step>:                  Clean and build specific steps");
				Console.WriteLine("    -clean:                          Clean all files"); 
				Console.WriteLine("    -clean<step>:                    Clean specific steps");
				Console.WriteLine("    -build:                          Build everything");
				Console.WriteLine("    -build<step>:                    Build specific output steps");
				Console.WriteLine("    -archive:                        Archive everything");
				Console.WriteLine("    -archive<step>:                  Archive specific output steps");
				Console.WriteLine("    -enginedir=<...>:                Specifies the root engine directory");
				Console.WriteLine("    -intermediatedir=<...>:          Specifies the intermediate directory");
				Console.WriteLine("    -documentationdir=<...>:         Specifies the documentation directory");
                Console.WriteLine("    -samplesdir=<...>:               Specifies the samples directory");
                Console.WriteLine("    -indexonly:                      Just build index pages");
				Console.WriteLine("    -filter=<...>,<...>:             Filter which things to convert, eg.");
				Console.WriteLine("                                     Folders:  -filter=Core/Containers/...");
				Console.WriteLine("                                     Entities: -filter=Core/TArray (without any folders)");
				Console.WriteLine("Valid steps are:");
				Console.WriteLine("   code, codetarget, codemeta, codexml, codeudn, codehtml, codechm, codesnippets");
				Console.WriteLine("   blueprint, blueprintjson, blueprintudn, blueprinthtml, blueprintchm");
				return 1;
			}

			// Derive all the tool paths
			string DoxygenPath = Path.Combine(EngineDir, "Extras\\NotForLicensees\\doxygen-1.8.11\\Doxygen\\Releasex64\\doxygen.exe");
			string EditorPath = Path.Combine(EngineDir, "Binaries\\Win64\\UE4Editor-Cmd.exe");
			string DocToolPath = Path.Combine(EngineDir, "Binaries\\DotNET\\UnrealDocTool.exe");
			string ChmCompilerPath = Path.Combine(EngineDir, "Extras\\NotForLicensees\\HTML Help Workshop\\hhc.exe");

			// Derive all the intermediate paths
			string CodeSitemapDir = Path.Combine(IntermediateDir, "sitemap");
			string BlueprintSitemapDir = Path.Combine(IntermediateDir, "blueprintsitemap");
			string TargetInfoPath = Path.Combine(IntermediateDir, "build\\targetinfo.xml");
			string MetadataDir = Path.Combine(IntermediateDir, "metadata");
			string XmlDir = Path.Combine(IntermediateDir, "doxygen");
			string JsonDir = Path.Combine(IntermediateDir, "json");
			string SnippetsDir = Path.Combine(IntermediateDir, "snippets");
			string MetadataPath = Path.Combine(MetadataDir, "metadata.xml");

			// Derive all the output paths
			string UdnDir = Path.Combine(DocumentationDir, "Source");
			string HtmlDir = Path.Combine(DocumentationDir, "HTML");
			string ChmDir = Path.Combine(DocumentationDir, "CHM");
			string ArchiveDir = Path.Combine(DocumentationDir, "Builds");

			// Read the settings file
			Settings = IniFile.Read(Path.Combine(DocumentationDir, "Extras\\API\\API.ini"));
			IgnoredFunctionMacros = new HashSet<string>(Settings.FindValueOrDefault("Input.IgnoredFunctionMacros", "").Split('\n'));
			IncludedSourceFiles = new HashSet<string>(Settings.FindValueOrDefault("Output.IncludedSourceFiles", "").Split('\n'));

			// Find all the metadata pages
			AddMetadataKeyword(UdnDir, "UCLASS", "Programming/UnrealArchitecture/Reference/Classes#classdeclaration", "Programming/UnrealArchitecture/Reference/Classes/Specifiers");
			AddMetadataKeyword(UdnDir, "UFUNCTION", "Programming/UnrealArchitecture/Reference/Functions", "Programming/UnrealArchitecture/Reference/Functions/Specifiers");
			AddMetadataKeyword(UdnDir, "UPROPERTY", "Programming/UnrealArchitecture/Reference/Properties", "Programming/UnrealArchitecture/Reference/Properties/Specifiers");
			AddMetadataKeyword(UdnDir, "USTRUCT", "Programming/UnrealArchitecture/Reference/Structs", "Programming/UnrealArchitecture/Reference/Structs/Specifiers");

			// Establish snippet directory so we can look things up later
			APISnippets.SetSnippetTextDirectory(SnippetsDir);

            // Build all the code docs
			if (!BuildCodeSnippetsTxt(SamplesDir, CodeSnippetsActions))
			{
				return 1;
			}
			if (!BuildCodeTargetInfo(TargetInfoPath, EngineDir, Path.Combine(ArchiveDir, "CodeAPI-TargetInfo.tgz"), CodeTargetActions))
			{
				return 1;
			}
			if (!BuildCodeMetadata(DoxygenPath, EngineDir, MetadataDir, MetadataPath, Path.Combine(ArchiveDir, "CodeAPI-Metadata.tgz"), CodeMetadataActions))
			{
				return 1;
			}
			if (!BuildCodeXml(EngineDir, TargetInfoPath, DoxygenPath, XmlDir, Path.Combine(ArchiveDir, "CodeAPI-XML.tgz"), Filters, CodeXmlActions))
			{
				return 1;
			}
			if (!BuildCodeUdn(EngineDir, XmlDir, UdnDir, CodeSitemapDir, MetadataPath, Path.Combine(ArchiveDir, "CodeAPI-UDN.tgz"), Path.Combine(ArchiveDir, "CodeAPI-Sitemap.tgz"), Filters, CodeUdnActions))
			{
				return 1;
			}
			if (!BuildHtml(EngineDir, DocToolPath, HtmlDir, "API", Path.Combine(ArchiveDir, "CodeAPI-HTML.tgz"), CodeHtmlActions))
			{
				return 1;
			}
			if (!BuildChm(ChmCompilerPath, Path.Combine(ChmDir, "API.chm"), Path.Combine(CodeSitemapDir, "API.hhc"), Path.Combine(CodeSitemapDir, "API.hhk"), HtmlDir, false, CodeChmActions))
			{
				return 1;
			}

			// Build all the blueprint docs
			if (!BuildBlueprintJson(JsonDir, EngineDir, EditorPath, Path.Combine(ArchiveDir, "BlueprintAPI-JSON.tgz"), bBuildMachine, BlueprintJsonActions))
			{
				return 1;
			}
			if (!BuildBlueprintUdn(JsonDir, UdnDir, BlueprintSitemapDir, Path.Combine(ArchiveDir, "BlueprintAPI-UDN.tgz"), Path.Combine(ArchiveDir, "BlueprintAPI-Sitemap.tgz"), BlueprintUdnActions))
			{
				return 1;
			}
			if (!BuildHtml(EngineDir, DocToolPath, HtmlDir, "BlueprintAPI", Path.Combine(ArchiveDir, "BlueprintAPI-HTML.tgz"), BlueprintHtmlActions))
			{
				return 1;
			}
			if (!BuildChm(ChmCompilerPath, Path.Combine(ChmDir, "BlueprintAPI.chm"), Path.Combine(BlueprintSitemapDir, "BlueprintAPI.hhc"), Path.Combine(BlueprintSitemapDir, "BlueprintAPI.hhk"), HtmlDir, true, BlueprintChmActions))
			{
				return 1;
			}

			// Finished!
			Console.WriteLine("Complete.");
			return 0;
		}