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; }