// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using EpicGames.Core;
namespace UnrealBuildTool
{
///
/// Global settings for building. Should not contain any target-specific settings.
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Style", "IDE1006:Naming Styles", Justification = "UnrealBuildTool naming style")]
internal sealed class BuildConfiguration
{
///
/// Whether to ignore import library files that are out of date when building targets. Set this to true to improve iteration time.
/// By default, we do not bother re-linking targets if only a dependent .lib has changed, as chances are that
/// the import library was not actually different unless a dependent header file of this target was also changed,
/// in which case the target would automatically be rebuilt.
///
[XmlConfigFile]
public bool bIgnoreOutdatedImportLibraries { get; set; } = true;
///
/// Use existing static libraries for all engine modules in this target.
///
[CommandLine("-UsePrecompiled")]
public bool bUsePrecompiled { get; set; } = false;
///
/// Whether debug info should be written to the console.
///
[XmlConfigFile]
[CommandLine("-PrintDebugInfo", Value = "true")]
public bool bPrintDebugInfo { get; set; } = false;
///
/// Whether the hybrid executor will be used (a remote executor and local executor). No longer supported.
///
[XmlConfigFile(Deprecated = true)]
[Obsolete("HybridExecutor is no longer supported")]
public bool bAllowHybridExecutor { get; set; } = false;
///
/// Priority order for remote executors (XGE, SNDBS, FASTBuild, UBA)
///
[XmlConfigFile]
public string[] RemoteExecutorPriority { get; set; } = ["XGE", "SNDBS", "FASTBuild", "UBA"];
///
/// Whether the UnrealBuildAccelerator executor will be used.
///
[XmlConfigFile]
[CommandLine("-UBA", Value = "true")]
[CommandLine("-NoUBA", Value = "false")]
public bool bAllowUBAExecutor { get; set; } = true;
///
/// Whether the UnrealBuildAccelerator (local only) executor will be used.
///
[XmlConfigFile(Deprecated = true)]
[Obsolete("Replace with bAllowUBAExecutor")]
public bool bAllowUBALocalExecutor
{
get => bAllowUBAExecutor;
set => bAllowUBAExecutor = value;
}
///
/// Whether XGE may be used if available, default is true.
///
[XmlConfigFile]
[CommandLine("-NoXGE", Value = "false")]
public bool bAllowXGE { get; set; } = true;
///
/// Whether FASTBuild may be used if available, default is true.
///
[XmlConfigFile]
[CommandLine("-NoFASTBuild", Value = "false")]
public bool bAllowFASTBuild { get; set; } = true;
///
/// Whether SN-DBS may be used if available, default is true.
///
[XmlConfigFile]
[CommandLine("-NoSNDBS", Value = "false")]
public bool bAllowSNDBS { get; set; } = true;
///
/// Enables support for very fast iterative builds by caching target data. Turning this on causes Unreal Build Tool to emit
/// 'UBT Makefiles' for targets when they are built the first time. Subsequent builds will load these Makefiles and begin
/// outdatedness checking and build invocation very quickly. The caveat is that if source files are added or removed to
/// the project, UBT will need to gather information about those in order for your build to complete successfully. Currently,
/// you must run the project file generator after adding/removing source files to tell UBT to re-gather this information.
///
/// Events that can invalidate the 'UBT Makefile':
/// - Adding/removing .cpp files
/// - Adding/removing .h files with UObjects
/// - Adding new UObject types to a file that did not previously have any
/// - Changing global build settings (most settings in this file qualify)
/// - Changed code that affects how Unreal Header Tool works
///
/// You can force regeneration of the 'UBT Makefile' by passing the '-gather' argument, or simply regenerating project files.
///
/// This also enables the fast include file dependency scanning and caching system that allows Unreal Build Tool to detect out
/// of date dependencies very quickly. When enabled, a deep C++ include graph does not have to be generated, and instead,
/// we only scan and cache indirect includes for after a dependent build product was already found to be out of date. During the
/// next build, we will load those cached indirect includes and check for outdatedness.
///
[XmlConfigFile]
[CommandLine("-NoUBTMakefiles", Value = "false")]
public bool bUseUBTMakefiles { get; set; } = true;
///
/// Number of actions that can be executed in parallel. If 0 then code will pick a default based
/// on the number of cores and memory available. Applies to the ParallelExecutor, HybridExecutor, and LocalExecutor
///
[XmlConfigFile]
[CommandLine("-MaxParallelActions")]
public int MaxParallelActions { get; set; } = 0;
///
/// Consider logical cores when determining how many total cpu cores are available.
///
[XmlConfigFile(Name = "bAllCores")]
[CommandLine("-AllCores")]
public bool bAllCores { get; set; } = false;
///
/// If true, force header regeneration. Intended for the build machine.
///
[CommandLine("-ForceHeaderGeneration")]
[XmlConfigFile(Category = "UEBuildConfiguration")]
public bool bForceHeaderGeneration { get; set; } = false;
///
/// If true, do not build UHT, assume it is already built.
///
[Obsolete]
[XmlConfigFile(Category = "UEBuildConfiguration", Deprecated = true)]
public bool bDoNotBuildUHT { get; set; } = false;
///
/// If true, fail if any of the generated header files is out of date.
///
[CommandLine("-FailIfGeneratedCodeChanges")]
[XmlConfigFile(Category = "UEBuildConfiguration")]
public bool bFailIfGeneratedCodeChanges { get; set; } = false;
///
/// True if hot-reload from IDE is allowed.
///
[CommandLine("-NoHotReloadFromIDE", Value = "false")]
[XmlConfigFile(Category = "UEBuildConfiguration")]
public bool bAllowHotReloadFromIDE { get; set; } = true;
///
/// If true, the Debug version of UnrealHeaderTool will be built and run instead of the Development version.
///
[Obsolete]
[XmlConfigFile(Category = "UEBuildConfiguration", Deprecated = true)]
public bool bForceDebugUnrealHeaderTool { get; set; } = false;
///
/// If true, use C# UHT internal to UBT
///
[Obsolete]
[XmlConfigFile(Category = "UEBuildConfiguration", Deprecated = true)]
public bool bUseBuiltInUnrealHeaderTool { get; set; } = true;
///
/// If true, generate warnings when C++ UHT is used
///
[Obsolete]
[XmlConfigFile(Category = "UEBuildConfiguration", Deprecated = true)]
public bool bWarnOnCppUnrealHeaderTool { get; set; } = true;
///
/// Whether to skip compiling rules assemblies and just assume they are valid
///
[CommandLine("-SkipRulesCompile")]
public bool bSkipRulesCompile { get; set; } = false;
///
/// Whether to force compiling rules assemblies, regardless of whether they are valid
///
[CommandLine("-ForceRulesCompile")]
public bool bForceRulesCompile { get; set; } = false;
///
/// Maximum recommended root path length.
///
[XmlConfigFile(Category = "WindowsPlatform")]
public int MaxRootPathLength { get; set; } = 50;
///
/// Maximum length of a path relative to the root directory. Used on Windows to ensure paths are portable between machines.
///
[XmlConfigFile(Category = "WindowsPlatform")]
public int MaxNestedPathLength { get; set; } = 200;
///
/// When single file targets are specified, via -File=, -SingleFile=, or -FileList=
/// If this option is set, no error will be produced if the source file is not included in the target.
/// Additionally, if any file or file list is specified, the target will not be built if none of the specified files are part of that target,
/// including the case where a file specified via -FileList= is empty.
///
[CommandLine("-IgnoreInvalidFiles")]
public bool bIgnoreInvalidFiles { get; set; } = false;
///
/// Instruct the executor to write compact output e.g. only errors, if supported by the executor.
/// This field is used to hold the value when specified from the command line or XML
///
[XmlConfigFile(Name = "bCompactOutput")]
[CommandLine("-CompactOutput")]
private bool bCompactOutputCommandLine { get; set; } = false;
///
/// If set, artifacts will be read
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-ArtifactReads", Value = "True")]
[CommandLine("-NoArtifactReads", Value = "False")]
public bool bArtifactRead { get; set; } = true;
///
/// If set, artifacts will be written
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-ArtifactWrites", Value = "True")]
[CommandLine("-NoArtifactWrites", Value = "False")]
public bool bArtifactWrites { get; set; } = true;
///
/// If true, log all artifact cache misses as informational messages
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-LogArtifactCacheMisses", Value = "True")]
public bool bLogArtifactCacheMisses { get; set; } = false;
///
/// Location to store the artifacts.
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-ArtifactDirectory=")]
public string ArtifactDirectory { get; set; } = String.Empty;
///
/// Instruct the executor to write compact output e.g. only errors, if supported by the executor,
/// and only if output is not being redirected e.g. during a build from within Visual Studio
///
public bool bCompactOutput => bCompactOutputCommandLine && !Console.IsOutputRedirected;
///
/// Whether to unify C++ code into larger files for faster compilation.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool? bUseUnityBuild { get; set; }
///
/// Whether to force C++ source files to be combined into larger files for faster compilation.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool? bForceUnityBuild { get; set; }
///
/// Intermediate environment. Determines if the intermediates end up in a different folder than normal.
///
public UnrealIntermediateEnvironment? IntermediateEnvironment
{
get
{
if (bForceUnityBuild == true)
{
return UnrealIntermediateEnvironment.Default;
}
else if (bUseUnityBuild == false)
{
return UnrealIntermediateEnvironment.NonUnity;
}
return null;
}
}
}
}