// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using EpicGames.Core;
using Microsoft.Extensions.Logging;
using UnrealBuildBase;
namespace UnrealBuildTool
{
///
/// The type of target
///
[Serializable]
public enum TargetType
{
///
/// Cooked monolithic game executable (GameName.exe). Also used for a game-agnostic engine executable (UnrealGame.exe or RocketGame.exe)
///
Game,
///
/// Uncooked modular editor executable and DLLs (UnrealEditor.exe, UnrealEditor*.dll, GameName*.dll)
///
Editor,
///
/// Cooked monolithic game client executable (GameNameClient.exe, but no server code)
///
Client,
///
/// Cooked monolithic game server executable (GameNameServer.exe, but no client code)
///
Server,
///
/// Program (standalone program, e.g. ShaderCompileWorker.exe, can be modular or monolithic depending on the program)
///
Program
}
///
/// Specifies how to link all the modules in this target
///
[Serializable]
public enum TargetLinkType
{
///
/// Use the default link type based on the current target type
///
Default,
///
/// Link all modules into a single binary
///
Monolithic,
///
/// Link modules into individual dynamic libraries
///
Modular,
}
///
/// Specifies whether to share engine binaries and intermediates with other projects, or to create project-specific versions. By default,
/// editor builds always use the shared build environment (and engine binaries are written to Engine/Binaries/Platform), but monolithic builds
/// and programs do not (except in installed builds). Using the shared build environment prevents target-specific modifications to the build
/// environment.
///
[Serializable]
public enum TargetBuildEnvironment
{
///
/// Engine binaries and intermediates are output to the engine folder. Target-specific modifications to the engine build environment will be ignored.
///
Shared,
///
/// Engine binaries and intermediates are specific to this target
///
Unique,
///
/// Will switch to Unique if needed - per-project sdk is enabled, or a property that requires unique is set away from default
///
UniqueIfNeeded,
}
///
/// Specifies how UnrealHeaderTool should enforce member pointer declarations in UCLASSes and USTRUCTs. This should match (by name, not value) the
/// EPointerMemberBehavior enum in BaseParser.h so that it can be interpreted correctly by UnrealHeaderTool.
///
[Serializable]
public enum PointerMemberBehavior
{
///
/// Pointer members of the associated type will be disallowed and result in an error emitted from UnrealHeaderTool.
///
Disallow,
///
/// Pointer members of the associated type will be allowed and not emit any messages to log or screen.
///
AllowSilently,
///
/// Pointer members of the associated type will be allowed but will emit messages to log.
///
AllowAndLog,
}
///
/// Determines which version of the engine to take default build settings from. This allows for backwards compatibility as new options are enabled by default.
///
public enum BuildSettingsVersion
{
///
/// Legacy default build settings for 4.23 and earlier.
///
V1,
///
/// New defaults for 4.24:
/// * ModuleRules.PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs
/// * ModuleRules.bLegacyPublicIncludePaths = false
///
V2,
///
/// New defaults for 5.2:
/// * ModuleRules.bLegacyParentIncludePaths = false
///
V3,
///
/// New defaults for 5.3:
/// * TargetRules.CppStandard = CppStandardVersion.Default has changed from Cpp17 to Cpp20
/// * TargetRules.WindowsPlatform.bStrictConformanceMode = true
///
V4,
///
/// New defaults for 5.4:
/// * TargetRules.bValidateFormatStrings = true
///
V5,
// *** When adding new entries here, be sure to update GameProjectUtils::GetDefaultBuildSettingsVersion() to ensure that new projects are created correctly. ***
///
/// Always use the defaults for the current engine version. Note that this may cause compatibility issues when upgrading.
///
Latest = V5,
}
///
/// What version of include order to use when compiling. This controls which UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_X defines are enabled when compiling the target.
/// The UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_X defines are used when removing implicit includes from Unreal Public headers.
/// Specific versions can be used by licensees to avoid compile errors when integrating new versions of Unreal.
/// Using Latest comes with a high risk of introducing compile errors in your code on newer Unreal versions.
///
public enum EngineIncludeOrderVersion
{
///
/// Include order used in Unreal 5.1
///
[Obsolete("The Unreal 5.1 include order is unsupported.")]
Unreal5_1,
///
/// Include order used in Unreal 5.2
///
[Obsolete("The Unreal 5.2 include order is unsupported.")]
Unreal5_2,
///
/// Include order used in Unreal 5.3
///
[Obsolete("The Unreal 5.3 include order is unsupported.")]
Unreal5_3,
///
/// Include order used in Unreal 5.4
///
[Obsolete("The Unreal 5.4 include order is unsupported.")]
Unreal5_4,
///
/// Include order used in Unreal 5.5
///
[Obsolete("The Unreal 5.5 include order is deprecated and will be unsupported in 5.8.")]
Unreal5_5,
///
/// Include order used in Unreal 5.6
///
Unreal5_6,
///
/// Include order used in Unreal 5.7
///
Unreal5_7,
// *** When adding new entries here, be sure to update EngineIncludeOrderHelper.GetDeprecationDefine to ensure that the correct guard is used. ***
///
/// Always use the latest version of include order. This value is updated every Unreal release, use with caution if you intend to integrate newer Unreal releases.
///
Latest = Unreal5_7,
///
/// Contains the oldest version of include order that the engine supports.
/// Do not delete old enum entries to prevent breaking project generation
///
#pragma warning disable CS0618 // Type or member is obsolete
Oldest = Unreal5_4,
#pragma warning restore CS0618 // Type or member is obsolete
}
///
/// Which static analyzer to use
///
public enum StaticAnalyzer
{
///
/// Do not perform static analysis
///
None,
///
/// Use the default static analyzer for the selected compiler, if it has one. For
/// Visual Studio and Clang, this means using their built-in static analysis tools.
/// Any compiler that doesn't support static analysis will ignore this option.
///
Default,
///
/// Use the built-in Visual C++ static analyzer
///
VisualCpp,
///
/// Use PVS-Studio for static analysis
///
PVSStudio,
///
/// Use clang for static analysis. This forces the compiler to clang.
///
Clang,
}
///
/// Output type for the static analyzer. This currently only works for the Clang static analyzer.
/// The Clang static analyzer can do either Text, which prints the analysis to stdout, or
/// html, where it writes out a navigable HTML page for each issue that it finds, per file.
/// The HTML is output in the same directory as the object file that would otherwise have
/// been generated.
/// All other analyzers default automatically to Text.
///
public enum StaticAnalyzerOutputType
{
///
/// Output the analysis to stdout.
///
Text,
///
/// Output the analysis to an HTML file in the object folder.
///
Html,
}
///
/// Output type for the static analyzer. This currently only works for the Clang static analyzer.
/// The Clang static analyzer can do a shallow quick analysis. However the default deep is recommended.
///
public enum StaticAnalyzerMode
{
///
/// Default deep analysis.
///
Deep,
///
/// Quick analysis. Not recommended.
///
Shallow,
}
///
/// Optimization mode for compiler settings
///
public enum OptimizationMode
{
///
/// Favor speed
///
Speed,
///
/// Favor minimal code size
///
Size,
///
/// Somewhere between Speed and Size
///
SizeAndSpeed
}
///
/// Debug info mode for compiler settings to determine how much debug info is available
///
[Flags]
public enum DebugInfoMode
{
///
/// Disable all debugging info.
/// MSVC: object files will be compiled without /Z7 or /Zi but pdbs will still be created
/// callstacks should be available in this mode but there have been reports with them being incorrect
///
None = 0,
///
/// Enable debug info for engine modules
///
Engine = 1 << 0,
///
/// Enable debug info for engine plugins
///
EnginePlugins = 1 << 1,
///
/// Enable debug info for project modules
///
Project = 1 << 2,
///
/// Enable debug info for project plugins
///
ProjectPlugins = 1 << 3,
///
/// Only include debug info for engine modules and plugins
///
EngineOnly = Engine | EnginePlugins,
///
/// Only include debug info for project modules and project plugins
///
ProjectOnly = Project | ProjectPlugins,
///
/// Include full debugging information for all modules
///
Full = Engine | EnginePlugins | Project | ProjectPlugins,
}
///
/// Floating point math semantics
///
public enum FPSemanticsMode
{
///
/// Use the default semantics for the platform.
///
Default,
///
/// FP math is IEEE-754 compliant, assuming that FP exceptions are disabled and the rounding
/// mode is round-to-nearest-even.
///
Precise,
///
/// FP math isn't IEEE-754 compliant: the compiler is allowed to transform math expressions
/// in a ways that might result in differently rounded results from what IEEE-754 requires.
///
Imprecise,
}
///
/// Determines how the Gameplay Debugger plugin will be activated.
///
public enum GameplayDebuggerOverrideState
{
///
/// Default => Not overriden, default usage behavior.
///
Default,
///
/// Core => WITH_GAMEPLAY_DEBUGGER = 0 and WITH_GAMEPLAY_DEBUGGER_CORE = 1
///
Core,
///
/// Full => WITH_GAMEPLAY_DEBUGGER = 1 and WITH_GAMEPLAY_DEBUGGER_CORE = 1
///
Full
}
///
/// List of supported allocators to select in compile time for target.
/// Can be none for Desktop\Editor targets where allocator can be changed with command line.
///
public enum StaticAllocatorType
{
///
/// Default C allocator
///
Ansi,
///
/// Binned malloc
///
Binned2,
///
/// Newer VM-based binned malloc, 64 bit only
///
Binned3,
///
/// Default for Desktop\Editor targets that allows allocator selection to be overridden with a command line
///
None,
}
///
/// Utility class for EngineIncludeOrderVersion defines
///
public static class EngineIncludeOrderHelper
{
private static string GetDeprecationDefine(EngineIncludeOrderVersion inVersion) => inVersion switch
{
EngineIncludeOrderVersion.Unreal5_7 => "UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_7",
EngineIncludeOrderVersion.Unreal5_6 => "UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_6",
#pragma warning disable CS0618 // Type or member is obsolete
EngineIncludeOrderVersion.Unreal5_5 => "UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_5",
EngineIncludeOrderVersion.Unreal5_4 => "UE_ENABLE_INCLUDE_ORDER_DEPRECATED_IN_5_4",
#pragma warning restore CS0618 // Type or member is obsolete
_ => throw new BuildLogEventException("Unsupported EngineIncludeOrderVersion {Value}", inVersion)
};
private static string GetDeprecationDefine(EngineIncludeOrderVersion inTestVersion, EngineIncludeOrderVersion inVersion) => $"{GetDeprecationDefine(inTestVersion)}={(inVersion < inTestVersion ? "1" : "0")}";
///
/// Returns a list of every deprecation define available.
///
///
public static IEnumerable GetAllDeprecationDefines() => Enum.GetValues()
.Where(x => x >= EngineIncludeOrderVersion.Oldest)
.Select(GetDeprecationDefine)
.Distinct()
.Order();
///
/// Get a list of every deprecation define and their value for the specified engine include order.
///
///
///
public static IEnumerable GetDeprecationDefines(EngineIncludeOrderVersion inVersion) => Enum.GetValues()
.Where(x => x >= EngineIncludeOrderVersion.Oldest)
.Select(x => GetDeprecationDefine(x, inVersion))
.Distinct()
.Order();
///
/// Returns the latest deprecation define.
///
///
public static string GetLatestDeprecationDefine() => GetDeprecationDefine(EngineIncludeOrderVersion.Latest);
}
///
/// Attribute used to mark fields which must match between targets in the shared build environment
///
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
sealed class RequiresUniqueBuildEnvironmentAttribute : Attribute
{
}
///
/// Attribute used to mark configurable sub-objects
///
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
sealed class ConfigSubObjectAttribute : Attribute
{
}
///
/// TargetRules is a data structure that contains the rules for defining a target (application/executable)
///
public abstract partial class TargetRules
{
///
/// Static class wrapping constants aliasing the global TargetType enum.
///
public static class TargetType
{
///
/// Alias for TargetType.Game
///
public const global::UnrealBuildTool.TargetType Game = global::UnrealBuildTool.TargetType.Game;
///
/// Alias for TargetType.Editor
///
public const global::UnrealBuildTool.TargetType Editor = global::UnrealBuildTool.TargetType.Editor;
///
/// Alias for TargetType.Client
///
public const global::UnrealBuildTool.TargetType Client = global::UnrealBuildTool.TargetType.Client;
///
/// Alias for TargetType.Server
///
public const global::UnrealBuildTool.TargetType Server = global::UnrealBuildTool.TargetType.Server;
///
/// Alias for TargetType.Program
///
public const global::UnrealBuildTool.TargetType Program = global::UnrealBuildTool.TargetType.Program;
}
///
/// The name of this target
///
public string Name
{
get => !String.IsNullOrEmpty(NameOverride) ? NameOverride : DefaultName;
set => NameOverride = value;
}
///
/// If the Name of this target has been overriden
///
public bool IsNameOverriden() => !String.IsNullOrEmpty(NameOverride);
///
/// Return the original target name without overrides or adornments
///
public string OriginalName => DefaultName;
///
/// Override the name used for this target
///
[CommandLine("-TargetNameOverride=")]
private string? NameOverride;
private readonly string DefaultName;
///
/// Whether this is a low level tests target.
///
public bool IsTestTarget => bIsTestTargetOverride;
///
/// Override this boolean flag in inheriting classes for low level test targets.
///
protected bool bIsTestTargetOverride { get; set; }
///
/// Whether this is a test target explicitly defined.
/// Explicitley defined test targets always inherit from TestTargetRules and define their own tests.
/// Implicit test targets are created from existing targets when building with -Mode=Test and they include tests from all dependencies.
///
public bool ExplicitTestsTarget => GetType().IsSubclassOf(typeof(TestTargetRules));
///
/// Controls the value of WITH_LOW_LEVEL_TESTS that dictates whether module-specific low level tests are compiled in or not.
///
public bool WithLowLevelTests => (IsTestTarget && !ExplicitTestsTarget) || bWithLowLevelTestsOverride;
///
/// Override the value of WithLowLevelTests by setting this to true in inherited classes.
///
protected bool bWithLowLevelTestsOverride { get; set; }
///
/// File containing the general type for this target (not including platform/group)
///
internal FileReference? File { get; set; }
///
/// File containing the platform/group-specific type for this target
///
internal FileReference? TargetSourceFile { get; set; }
///
/// All target files that could be referenced by this target and will require updating the Makefile if changed
///
internal HashSet? TargetFiles { get; set; }
///
/// Logger for output relating to this target. Set before the constructor is run from
///
public ILogger Logger { get; internal set; }
///
/// Generic nullable object so a user can set additional data in a project's TargetRule and access in a project's ModuleRule without needing to add new properties post-release.
/// For example:
/// * in .Target.cs: AdditionalData = "data";
/// * in .Build.cs: if ((Target.AdditionalData as string) == "data") { ... }
///
public object? AdditionalData { get; set; }
///
/// Platform that this target is being built for.
///
public UnrealTargetPlatform Platform { get; init; }
///
/// The configuration being built.
///
public UnrealTargetConfiguration Configuration { get; init; }
///
/// Architecture that the target is being built for (or an empty string for the default).
///
public UnrealArchitectures Architectures { get; init; }
///
/// Gets the Architecture in the normal case where there is a single Architecture in Architectures
/// (this will throw an exception if there is more than one architecture specified)
///
public UnrealArch Architecture => Architectures.SingleArchitecture;
///
/// Intermediate environment. Determines if the intermediates end up in a different folder than normal.
///
public UnrealIntermediateEnvironment IntermediateEnvironment { get; init; }
///
/// Path to the project file for the project containing this target.
///
public FileReference? ProjectFile { get; init; }
///
/// The current build version
///
public ReadOnlyBuildVersion Version { get; init; }
///
/// The type of target.
///
[RequiresUniqueBuildEnvironment]
public global::UnrealBuildTool.TargetType Type { get; set; } = global::UnrealBuildTool.TargetType.Game;
///
/// Specifies the engine version to maintain backwards-compatible default build settings with (eg. DefaultSettingsVersion.Release_4_23, DefaultSettingsVersion.Release_4_24). Specify DefaultSettingsVersion.Latest to always
/// use defaults for the current engine version, at the risk of introducing build errors while upgrading.
///
public BuildSettingsVersion DefaultBuildSettings
{
get => DefaultBuildSettingsPrivate ?? BuildSettingsVersion.V1;
set => DefaultBuildSettingsPrivate = value;
}
private BuildSettingsVersion? DefaultBuildSettingsPrivate; // Cannot be initialized inline; potentially overridden before the constructor is called.
///
/// Force the include order to a specific version. Overrides any Target and Module rules.
///
[CommandLine("-ForceIncludeOrder=")]
public EngineIncludeOrderVersion? ForcedIncludeOrder { get; set; }
///
/// What version of include order to use when compiling this target. Can be overridden via -ForceIncludeOrder on the command line. ModuleRules.IncludeOrderVersion takes precedence.
///
public EngineIncludeOrderVersion IncludeOrderVersion
{
get => ForcedIncludeOrder ?? IncludeOrderVersionPrivate ?? EngineIncludeOrderVersion.Oldest;
set => IncludeOrderVersionPrivate = value;
}
private EngineIncludeOrderVersion? IncludeOrderVersionPrivate;
///
/// Path to the output file for the main executable, relative to the Engine or project directory.
/// This setting is only typically useful for non-UE programs, since the engine uses paths relative to the executable to find other known folders (eg. Content).
///
public string? OutputFile { get; set; }
///
/// Tracks a list of config values read while constructing this target
///
internal readonly ConfigValueTracker ConfigValueTracker;
///
/// Whether the target uses Steam.
///
[Obsolete("Deprecated in UE5.5 - No longer used in engine.")]
public bool bUsesSteam { get; set; }
///
/// Whether the target uses CEF3.
///
public bool bUsesCEF3 { get; set; }
///
/// Whether the project uses visual Slate UI (as opposed to the low level windowing/messaging, which is always available).
///
public bool bUsesSlate { get; set; } = true;
///
/// Forces linking against the static CRT. This is not fully supported across the engine due to the need for allocator implementations to be shared (for example), and TPS
/// libraries to be consistent with each other, but can be used for utility programs.
///
[RequiresUniqueBuildEnvironment]
public bool bUseStaticCRT { get; set; }
///
/// Enables the debug C++ runtime (CRT) for debug builds. By default we always use the release runtime, since the debug
/// version isn't particularly useful when debugging Unreal Engine projects, and linking against the debug CRT libraries forces
/// our third party library dependencies to also be compiled using the debug CRT (and often perform more slowly). Often
/// it can be inconvenient to require a separate copy of the debug versions of third party static libraries simply
/// so that you can debug your program's code.
///
[RequiresUniqueBuildEnvironment]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bDebugBuildsActuallyUseDebugCRT { get; set; }
///
/// Whether the output from this target can be publicly distributed, even if it has dependencies on modules that are in folders
/// with special restrictions (eg. CarefullyRedist, NotForLicensees, NoRedist).
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bLegalToDistributeBinary { get; set; }
///
/// Specifies the configuration whose binaries do not require a "-Platform-Configuration" suffix.
///
[RequiresUniqueBuildEnvironment]
public UnrealTargetConfiguration UndecoratedConfiguration { get; set; } = UnrealTargetConfiguration.Development;
///
/// Specifies the separator charcter for binary filenames.
///
[RequiresUniqueBuildEnvironment]
public string DecoratedSeparator { get; set; } = "-";
///
/// Whether this target supports hot reload
///
public bool bAllowHotReload
{
get => bAllowHotReloadOverride ?? (Type == TargetType.Editor && LinkType == TargetLinkType.Modular);
set => bAllowHotReloadOverride = value;
}
private bool? bAllowHotReloadOverride;
///
/// Build all the modules that are valid for this target type. Used for CIS and making installed engine builds.
///
[CommandLine("-AllModules")]
public bool bBuildAllModules { get; set; }
///
/// Set this to reference a VSTest run settings file from generated projects.
///
public FileReference? VSTestRunSettingsFile { get; set; }
///
/// Additional plugins that are built for this target type but not enabled.
///
[CommandLine("-BuildPlugin=", ListSeparator = '+')]
public List BuildPlugins = new();
///
/// If this is true, then the BuildPlugins list will be used to populate RuntimeDependencies, rather than EnablePlugins
///
public bool bRuntimeDependenciesComeFromBuildPlugins { get; set; }
///
/// A list of additional plugins which need to be included in this target. This allows referencing non-optional plugin modules
/// which cannot be disabled, and allows building against specific modules in program targets which do not fit the categories
/// in ModuleHostType.
///
[CommandLine("-AdditionalPlugins=", ListSeparator = '+')]
public List AdditionalPlugins = new();
///
/// Additional plugins that should be included for this target.
///
[CommandLine("-EnablePlugin=", ListSeparator = '+')]
public List EnablePlugins = new();
///
/// List of plugins to be disabled for this target. Note that the project file may still reference them, so they should be marked
/// as optional to avoid failing to find them at runtime.
///
[CommandLine("-DisablePlugin=", ListSeparator = '+')]
public List DisablePlugins = new();
///
/// Additional plugins that should be included for this target if they are found.
///
[CommandLine("-OptionalPlugins=", ListSeparator = '+')]
public List OptionalPlugins = new();
///
/// If false, suppress loading "enabled by default" engine plugins not explicitly enabled by the project or target files.
///
public bool bAllowEnginePluginsEnabledByDefault { get; set; } = true;
///
/// How to treat conflicts when a disabled plugin is being enabled by another plugin referencing it
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.DisablePluginsConflictWarningLevel")]
public WarningLevel DisablePluginsConflictWarningLevel
{
get => CppCompileWarningSettings.DisablePluginsConflictWarningLevel;
set => CppCompileWarningSettings.DisablePluginsConflictWarningLevel = value;
}
///
/// A list of Plugin names that are allowed to exist as dependencies without being defined in the uplugin descriptor
///
public List InternalPluginDependencies = new();
///
/// Path to the set of pak signing keys to embed in the executable.
///
public string PakSigningKeysFile { get; set; } = String.Empty;
///
/// Allows a Program Target to specify it's own solution folder path.
///
public string SolutionDirectory { get; set; } = String.Empty;
///
/// Force a Target to be treated as a Program for the purposes of project file generation.
///
public bool bGenerateProgramProject { get; set; }
///
/// If true, GetTargetNameByType will not consider this target, thereby disambiguating -TargetType=X.
///
public bool bExplicitTargetForType { get; set; }
///
/// Whether the target should be included in the default solution build configuration
/// Setting this to false will skip building when running in the IDE
///
public bool? bBuildInSolutionByDefault { get; set; }
///
/// Whether this target should be compiled as a DLL. Requires LinkType to be set to TargetLinkType.Monolithic.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-CompileAsDll")]
public bool bShouldCompileAsDLL { get; set; }
///
/// Extra subdirectory to load config files out of, for making multiple types of builds with the same platform
/// This will get baked into the game executable as CUSTOM_CONFIG and used when staging to filter files and settings
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-CustomConfig")]
public string CustomConfig { get; set; } = String.Empty;
///
/// Subfolder to place executables in, relative to the default location.
///
[RequiresUniqueBuildEnvironment]
public string ExeBinariesSubFolder { get; set; } = String.Empty;
///
/// Allow target module to override UHT code generation version.
///
public EGeneratedCodeVersion GeneratedCodeVersion { get; set; } = EGeneratedCodeVersion.None;
///
/// Whether to enable the mesh editor.
///
[RequiresUniqueBuildEnvironment]
public bool bEnableMeshEditor { get; set; }
///
/// Whether to use the BPVM to run Verse.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-NoUseVerseBPVM", Value = "false")]
[CommandLine("-UseVerseBPVM", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseVerseBPVM { get; set; } = true;
///
/// Whether to use the AutoRTFM Clang compiler.
///
[RequiresUniqueBuildEnvironment]
public bool bUseAutoRTFMCompiler
{
get => bForceNoAutoRTFMCompiler ? false : _bUseAutoRTFMCompilerPrivate;
set => _bUseAutoRTFMCompilerPrivate = value;
}
private bool _bUseAutoRTFMCompilerPrivate = false;
///
/// Whether to use force AutoRTFM Clang compiler off.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-NoUseAutoRTFM", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bForceNoAutoRTFMCompiler { get; set; } = false;
///
/// Whether to enable emitting AutoRTFM verification metadata
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-UseAutoRTFMVerifier", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseAutoRTFMVerifier { get; set; } = false;
///
/// Whether to run LLVM verification after the AutoRTFM compiler pass.
/// This is used by our compiler folks to ensure the pass works with
/// the various code-paths UBT can take us down.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-AutoRTFMVerify", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAutoRTFMVerify { get; set; } = false;
///
/// Whether to link closed function declarations statically.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-AutoRTFMClosedStaticLinkage", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAutoRTFMClosedStaticLinkage { get; set; } = false;
///
/// Whether to compile the Chaos physics plugin.
///
[Obsolete("Deprecated in UE5.1 - No longer used as Chaos is always enabled.")]
public bool bCompileChaos { get; set; }
///
/// Whether to use the Chaos physics interface. This overrides the physx flags to disable APEX and NvCloth
///
[Obsolete("Deprecated in UE5.1 - No longer used as Chaos is always enabled.")]
public bool bUseChaos { get; set; }
///
/// Whether to compile in checked chaos features for debugging
///
[RequiresUniqueBuildEnvironment]
public bool bUseChaosChecked { get; set; }
///
/// Whether to compile in chaos memory tracking features
///
[RequiresUniqueBuildEnvironment]
public bool bUseChaosMemoryTracking { get; set; }
///
/// Whether to compile in Chaos Visual Debugger (CVD) support features to record the state of the physics simulation
///
[XmlConfigFile(Name = "bCompileChaosVisualDebuggerSupport")]
[CommandLine("-CompileChaosVisualDebuggerSupport")]
[RequiresUniqueBuildEnvironment]
public bool bCompileChaosVisualDebuggerSupport { get; set; } = true;
///
/// Whether scene query acceleration is done by UE. The physx scene query structure is still created, but we do not use it.
///
[Obsolete("Deprecated in UE5.1 - No longer used in engine.")]
public bool bCustomSceneQueryStructure { get; set; }
///
/// Whether to include PhysX support.
///
[Obsolete("Deprecated in UE5.1 - No longer used as Chaos is always enabled.")]
public bool bCompilePhysX { get; set; }
///
/// Whether to include PhysX APEX support.
///
[Obsolete("Deprecated in UE5.1 - No longer used as Chaos is always enabled.")]
public bool bCompileAPEX { get; set; }
///
/// Whether to include NvCloth.
///
[Obsolete("Deprecated in UE5.1 - No longer used as Chaos is always enabled.")]
public bool bCompileNvCloth { get; set; }
///
/// Whether to include ICU unicode/i18n support in Core.
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileICU")]
public bool bCompileICU { get; set; } = true;
///
/// Whether to compile CEF3 support.
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileCEF3")]
public bool bCompileCEF3 { get; set; } = true;
///
/// Whether to compile using ISPC.
///
[RequiresUniqueBuildEnvironment]
public bool bCompileISPC { get; set; }
///
/// Whether to compile IntelMetricsDiscovery.
///
[Obsolete("Deprecated in UE5.4 - No longer used.")]
public bool bCompileIntelMetricsDiscovery { get; set; } = false;
///
/// Whether to compile in python support
///
[RequiresUniqueBuildEnvironment]
public bool bCompilePython { get; set; } = true;
///
/// Whether to compile with WITH_GAMEPLAY_DEBUGGER enabled with all Engine's default gameplay debugger categories.
///
[RequiresUniqueBuildEnvironment]
public bool bUseGameplayDebugger
{
get
{
if (UseGameplayDebuggerOverride == GameplayDebuggerOverrideState.Default)
{
return (bBuildDeveloperTools || (Configuration != UnrealTargetConfiguration.Test && Configuration != UnrealTargetConfiguration.Shipping));
}
else
{
return UseGameplayDebuggerOverride == GameplayDebuggerOverrideState.Full;
}
}
set
{
if (value)
{
UseGameplayDebuggerOverride = GameplayDebuggerOverrideState.Full;
}
else if (UseGameplayDebuggerOverride != GameplayDebuggerOverrideState.Core)
{
UseGameplayDebuggerOverride = GameplayDebuggerOverrideState.Default;
}
}
}
///
/// Set to true when bUseGameplayDebugger is false but GameplayDebugger's core parts are required.
///
[RequiresUniqueBuildEnvironment]
public bool bUseGameplayDebuggerCore
{
get => (UseGameplayDebuggerOverride == GameplayDebuggerOverrideState.Core) || bUseGameplayDebugger;
set
{
if (UseGameplayDebuggerOverride != GameplayDebuggerOverrideState.Full)
{
UseGameplayDebuggerOverride = value ? GameplayDebuggerOverrideState.Core : GameplayDebuggerOverrideState.Default;
}
}
}
GameplayDebuggerOverrideState UseGameplayDebuggerOverride;
///
/// Whether to use I/O store on-demand
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-CompileIoStoreOnDemand", Value = "true")]
public bool bCompileIoStoreOnDemand { get; set; } = false;
///
/// Whether to use Iris.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-NoUseIris", Value = "false")]
[CommandLine("-UseIris", Value = "true")]
public bool bUseIris { get; set; } = true;
///
/// Whether to track owner (asset name) of RHI resource for Test configuration.
/// Useful for ListShaderMaps and ListShaderLibraries commands.
///
[RequiresUniqueBuildEnvironment]
public bool bTrackRHIResourceInfoForTest { get; set; } = false;
///
/// Whether we are compiling editor code or not. Prefer the more explicit bCompileAgainstEditor instead.
///
public bool bBuildEditor
{
get => (Type == TargetType.Editor || bCompileAgainstEditor);
[Obsolete("Deprecated, replace with TargetRules.Type")]
set => Logger.LogWarning("Setting {Type}.bBuildEditor is deprecated. Set {Type}.Type instead.", GetType().Name, GetType().Name);
}
///
/// Whether to compile code related to building assets. Consoles generally cannot build assets. Desktop platforms generally can.
///
[RequiresUniqueBuildEnvironment]
public bool bBuildRequiresCookedData
{
get => bBuildRequiresCookedDataOverride ?? (Type == TargetType.Game || Type == TargetType.Client || Type == TargetType.Server);
set => bBuildRequiresCookedDataOverride = value;
}
bool? bBuildRequiresCookedDataOverride;
///
/// Whether to compile WITH_EDITORONLY_DATA disabled. Only Windows will use this, other platforms force this to false.
///
[RequiresUniqueBuildEnvironment]
public bool bBuildWithEditorOnlyData
{
get => bBuildWithEditorOnlyDataOverride ?? (Type == TargetType.Editor || Type == TargetType.Program);
set => bBuildWithEditorOnlyDataOverride = value;
}
private bool? bBuildWithEditorOnlyDataOverride;
///
/// Manually specified value for bBuildDeveloperTools.
///
bool? bBuildDeveloperToolsOverride;
///
/// Whether to compile the developer tools.
///
[RequiresUniqueBuildEnvironment]
public bool bBuildDeveloperTools
{
set => bBuildDeveloperToolsOverride = value;
get => bBuildDeveloperToolsOverride ?? (bCompileAgainstEngine && (Type == TargetType.Editor || Type == TargetType.Program || (Configuration != UnrealTargetConfiguration.Test && Configuration != UnrealTargetConfiguration.Shipping)));
}
///
/// Manually specified value for bBuildTargetDeveloperTools.
///
bool? bBuildTargetDeveloperToolsOverride;
///
/// Whether to compile the developer tools that are for target platforms or connected devices (defaults to bBuildDeveloperTools)
///
[RequiresUniqueBuildEnvironment]
public bool bBuildTargetDeveloperTools
{
set => bBuildTargetDeveloperToolsOverride = value;
get => bBuildTargetDeveloperToolsOverride ?? bBuildDeveloperTools;
}
///
/// Whether to force compiling the target platform modules, even if they wouldn't normally be built.
///
public bool bForceBuildTargetPlatforms { get; set; }
///
/// Whether to force compiling shader format modules, even if they wouldn't normally be built.
///
public bool bForceBuildShaderFormats { get; set; }
///
/// Override for including extra shader formats
///
public bool? bNeedsExtraShaderFormatsOverride { get; set; }
///
/// Whether we should include any extra shader formats. By default this is only enabled for Program and Editor targets.
///
public bool bNeedsExtraShaderFormats
{
set => bNeedsExtraShaderFormatsOverride = value;
get => bNeedsExtraShaderFormatsOverride ?? (bForceBuildShaderFormats || bBuildDeveloperTools) && (Type == TargetType.Editor || Type == TargetType.Program);
}
///
/// Checks the above flags to see if target SDKs are likely to be compiled in
///
private bool bUsesTargetSDKs => bNeedsExtraShaderFormats || bBuildDeveloperTools || bBuildTargetDeveloperTools || bForceBuildShaderFormats || bForceBuildTargetPlatforms;
///
/// Whether we should compile SQLite using the custom "Unreal" platform (true), or using the native platform (false).
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileCustomSQLitePlatform")]
public bool bCompileCustomSQLitePlatform { get; set; } = true;
///
/// Whether to utilize cache freed OS allocs with MallocBinned
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bUseCacheFreedOSAllocs")]
public bool bUseCacheFreedOSAllocs { get; set; } = true;
///
/// Enabled for all builds that include the engine project. Disabled only when building standalone apps that only link with Core.
///
[RequiresUniqueBuildEnvironment]
public virtual bool bCompileAgainstEngine
{
get => bCompileAgainstEnginePrivate;
set => bCompileAgainstEnginePrivate = value;
}
private bool bCompileAgainstEnginePrivate = true;
///
/// Enabled for all builds that include the CoreUObject project. Disabled only when building standalone apps that only link with Core.
///
[RequiresUniqueBuildEnvironment]
public virtual bool bCompileAgainstCoreUObject
{
get => bCompileAgainstCoreUObjectPrivate;
set => bCompileAgainstCoreUObjectPrivate = value;
}
private bool bCompileAgainstCoreUObjectPrivate = true;
///
/// Enabled for builds that need to initialize the ApplicationCore module. Command line utilities do not normally need this.
///
[RequiresUniqueBuildEnvironment]
public virtual bool bCompileAgainstApplicationCore
{
get => bCompileAgainstApplicationCorePrivate;
set => bCompileAgainstApplicationCorePrivate = value;
}
private bool bCompileAgainstApplicationCorePrivate = true;
///
/// Enabled for builds that want to use against the Trace module for profiling and diagnostics.
///
[RequiresUniqueBuildEnvironment]
public virtual bool bEnableTrace
{
get
{
if (bEnableTracePrivate.HasValue)
{
return bEnableTracePrivate.Value;
}
if (Configuration == UnrealTargetConfiguration.Shipping || Type == TargetType.Program)
{
return false;
}
if (UEBuildPlatform.IsPlatformInGroup(Platform, UnrealPlatformGroup.Apple)
|| UEBuildPlatform.IsPlatformInGroup(Platform, UnrealPlatformGroup.Unix)
|| UEBuildPlatform.IsPlatformInGroup(Platform, UnrealPlatformGroup.Android)
|| UEBuildPlatform.IsPlatformInGroup(Platform, UnrealPlatformGroup.Windows))
{
return true;
}
return false;
}
set => bEnableTracePrivate = value;
}
private bool? bEnableTracePrivate;
///
/// Force enable tracing - used to allow testing programs to verify tracing works as intended.
///
[RequiresUniqueBuildEnvironment]
public virtual bool bForceEnableTrace
{
get
{
if (bForceEnableTracePrivate.HasValue)
{
return bForceEnableTracePrivate.Value;
}
return false;
}
set => bForceEnableTracePrivate = value;
}
private bool? bForceEnableTracePrivate;
///
/// Manually specified value for bCompileAgainstEditor.
///
bool? bCompileAgainstEditorOverride;
///
/// Enabled for editor builds (TargetType.Editor). Can be overridden for programs (TargetType.Program) that would need to compile against editor code. Not available for other target types.
/// Mainly drives the value of WITH_EDITOR.
///
[RequiresUniqueBuildEnvironment]
public virtual bool bCompileAgainstEditor
{
set => bCompileAgainstEditorOverride = value;
get => bCompileAgainstEditorOverride ?? (Type == TargetType.Editor);
}
///
/// Whether to compile Recast navmesh generation.
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileRecast")]
public bool bCompileRecast { get; set; } = true;
///
/// Whether to compile with navmesh segment links.
///
[RequiresUniqueBuildEnvironment]
public bool bCompileNavmeshSegmentLinks { get; set; } = true;
///
/// Whether to compile with navmesh cluster links.
///
[RequiresUniqueBuildEnvironment]
public bool bCompileNavmeshClusterLinks { get; set; } = true;
///
/// Whether to compile SpeedTree support.
///
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileSpeedTree")]
bool? bOverrideCompileSpeedTree { get; set; }
///
/// Whether we should compile in support for SpeedTree or not.
///
[RequiresUniqueBuildEnvironment]
public bool bCompileSpeedTree
{
set => bOverrideCompileSpeedTree = value;
get => bOverrideCompileSpeedTree ?? Type == TargetType.Editor;
}
///
/// Enable exceptions for all modules.
///
[RequiresUniqueBuildEnvironment]
public bool bForceEnableExceptions { get; set; }
///
/// Enable inlining for all modules.
///
[RequiresUniqueBuildEnvironment]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseInlining { get; set; } = true;
///
/// Enable exceptions for all modules.
///
[RequiresUniqueBuildEnvironment]
public bool bForceEnableObjCExceptions { get; set; }
///
/// Enable RTTI for all modules.
///
[CommandLine("-rtti")]
[RequiresUniqueBuildEnvironment]
public bool bForceEnableRTTI { get; set; }
///
/// Enable BuildSettings to contain private information about build. Such as machine name, user name and user domain name (exposed in BuildSettings.h)
///
[RequiresUniqueBuildEnvironment]
public bool bEnablePrivateBuildInformation { get; set; }
///
/// Enable Position Independent Executable (PIE). Has an overhead cost
///
[CommandLine("-pie")]
public bool bEnablePIE { get; set; }
///
/// Enable Stack Protection. Has an overhead cost
///
[CommandLine("-stack-protect")]
public bool bEnableStackProtection { get; set; }
///
/// Compile client-only code.
///
[RequiresUniqueBuildEnvironment]
public bool bWithClientCode
{
get => bWithClientCodeOverride ?? (Type != TargetType.Server);
set => bWithClientCodeOverride = value;
}
private bool? bWithClientCodeOverride;
///
/// Compile server-only code.
///
[RequiresUniqueBuildEnvironment]
public bool bWithServerCode
{
get => bWithServerCodeOverride ?? (Type != TargetType.Client);
set => bWithServerCodeOverride = value;
}
private bool? bWithServerCodeOverride;
///
/// Compile with FName storing the number part in the name table.
/// Saves memory when most names are not numbered and those that are are referenced multiple times.
/// The game and engine must ensure they reuse numbered names similarly to name strings to avoid leaking memory.
///
[RequiresUniqueBuildEnvironment]
public bool bFNameOutlineNumber
{
get => bFNameOutlineNumberOverride ?? false;
set => bFNameOutlineNumberOverride = value;
}
private bool? bFNameOutlineNumberOverride;
///
/// When enabled, Push Model Networking support will be compiled in.
/// This can help reduce CPU overhead of networking, at the cost of more memory.
/// Always enabled in editor builds.
///
[RequiresUniqueBuildEnvironment]
public bool bWithPushModel
{
get => bWithPushModelOverride ?? (Type == TargetType.Editor);
set => bWithPushModelOverride = value;
}
private bool? bWithPushModelOverride;
///
/// Whether to include stats support even without the engine.
///
[RequiresUniqueBuildEnvironment]
public bool bCompileWithStatsWithoutEngine { get; set; }
///
/// Whether to include plugin support.
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileWithPluginSupport")]
public bool bCompileWithPluginSupport { get; set; }
///
/// Whether to allow plugins which support all target platforms.
///
[RequiresUniqueBuildEnvironment]
public bool bIncludePluginsForTargetPlatforms
{
get => bIncludePluginsForTargetPlatformsOverride ?? (Type == TargetType.Editor);
set => bIncludePluginsForTargetPlatformsOverride = value;
}
private bool? bIncludePluginsForTargetPlatformsOverride;
///
/// Whether to allow accessibility code in both Slate and the OS layer.
///
[RequiresUniqueBuildEnvironment]
public bool bCompileWithAccessibilitySupport { get; set; } = true;
///
/// Whether to include PerfCounters support.
///
[RequiresUniqueBuildEnvironment]
public bool bWithPerfCounters
{
get => bWithPerfCountersOverride ?? (Type == TargetType.Editor || Type == TargetType.Server);
set => bWithPerfCountersOverride = value;
}
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bWithPerfCounters")]
bool? bWithPerfCountersOverride;
///
/// Whether to enable support for live coding
///
[RequiresUniqueBuildEnvironment]
public bool bWithLiveCoding
{
get => bWithLiveCodingPrivate ?? (Platform == UnrealTargetPlatform.Win64 && Architecture.bIsX64 && Configuration != UnrealTargetConfiguration.Shipping && Configuration != UnrealTargetConfiguration.Test && Type != TargetType.Program);
set => bWithLiveCodingPrivate = value;
}
bool? bWithLiveCodingPrivate;
///
/// Whether to enable support for live coding
///
[RequiresUniqueBuildEnvironment]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseDebugLiveCodingConsole { get; set; }
///
/// Obsolete: whether to enable support for DirectX Math
/// Not compatible with LWC so has been disabled since UE 5.
///
[RequiresUniqueBuildEnvironment]
[Obsolete("Deprecated in UE 5.6 - DirectXMath path was incompatible with LWC and unused since 5.0")]
public bool bWithDirectXMath { get; set; }
///
/// Whether to enable the support for FixedTimeStep in the engine
///
[RequiresUniqueBuildEnvironment]
public bool bWithFixedTimeStepSupport { get; set; } = true;
///
/// Whether to turn on logging for test/shipping builds.
///
[RequiresUniqueBuildEnvironment]
public bool bUseLoggingInShipping { get; set; }
///
/// Whether to turn on console for shipping builds.
///
[RequiresUniqueBuildEnvironment]
public bool bUseConsoleInShipping { get; set; }
///
/// Whether to turn on logging to memory for test/shipping builds.
///
[RequiresUniqueBuildEnvironment]
public bool bLoggingToMemoryEnabled { get; set; }
///
/// Whether to check that the process was launched through an external launcher.
///
public bool bUseLauncherChecks { get; set; }
///
/// Whether to turn on checks (asserts) for test/shipping builds.
///
[RequiresUniqueBuildEnvironment]
public bool bUseChecksInShipping { get; set; }
///
/// Whether to turn on GPU markers for Test builds.
///
[RequiresUniqueBuildEnvironment]
public bool bAllowProfileGPUInTest { get; set; }
///
/// Whether to turn on GPU markers for Shipping builds.
///
[RequiresUniqueBuildEnvironment]
public bool bAllowProfileGPUInShipping { get; set; }
///
/// Whether to turn on UTF-8 mode, mapping TCHAR to UTF8CHAR.
///
[RequiresUniqueBuildEnvironment]
public bool bTCHARIsUTF8 { get; set; }
///
/// Whether to use the EstimatedUtcNow or PlatformUtcNow. EstimatedUtcNow is appropriate in
/// cases where PlatformUtcNow can be slow.
///
[RequiresUniqueBuildEnvironment]
public bool bUseEstimatedUtcNow { get; set; }
///
/// True if we need FreeType support.
///
[RequiresUniqueBuildEnvironment]
[ConfigFile(ConfigHierarchyType.Engine, "/Script/BuildSettings.BuildSettings", "bCompileFreeType")]
public bool bCompileFreeType { get; set; } = true;
///
/// Whether to turn allow exec commands for shipping builds.
///
[RequiresUniqueBuildEnvironment]
public bool bUseExecCommandsInShipping { get; set; } = true;
///
/// True if we want to favor optimizing size over speed.
///
[Obsolete("Deprecated in UE5.1 - Please use OptimizationLevel instead.")]
public bool bCompileForSize { get; set; }
///
/// Allows to fine tune optimizations level for speed and\or code size
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-OptimizationLevel=")]
public OptimizationMode OptimizationLevel { get; set; } = OptimizationMode.Speed;
///
/// Allows setting the FP semantics.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-FPSemantics=")]
public FPSemanticsMode FPSemantics { get; set; } = FPSemanticsMode.Default;
///
/// Whether to compile development automation tests.
///
public bool bForceCompileDevelopmentAutomationTests { get; set; }
///
/// Whether to compile performance automation tests.
///
public bool bForceCompilePerformanceAutomationTests { get; set; }
///
/// Whether to override the defaults for automation tests (Debug/Development configs)
///
public bool bForceDisableAutomationTests { get; set; }
///
/// If true, event driven loader will be used in cooked builds. @todoio This needs to be replaced by a runtime solution after async loading refactor.
///
[RequiresUniqueBuildEnvironment]
public bool bEventDrivenLoader { get; set; }
///
/// Used to override the behavior controlling whether UCLASSes and USTRUCTs are allowed to have native pointer members, if disallowed they will be a UHT error and should be substituted with TObjectPtr members instead.
///
public PointerMemberBehavior? NativePointerMemberBehaviorOverride { get; set; }
///
/// Whether the XGE controller worker and modules should be included in the engine build.
/// These are required for distributed shader compilation using the XGE interception interface.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseXGEController { get; set; } = true;
///
/// Enables "include what you use" by default for modules in this target. Changes the default PCH mode for any module in this project to PCHUsageMode.UseExplicitOrSharedPCHs.
///
public bool bIWYU => IntermediateEnvironment == UnrealIntermediateEnvironment.IWYU;
///
/// Adds header files in included modules to the build.
///
[CommandLine("-IncludeHeaders")]
public bool bIncludeHeaders
{
get => bIncludeHeadersPrivate || bIWYU;
set => bIncludeHeadersPrivate = value;
}
private bool bIncludeHeadersPrivate = false;
///
/// When used with -IncludeHeaders, only header files will be compiled.
///
[CommandLine("-HeadersOnly")]
public bool bHeadersOnly { get; set; }
///
/// Enforce "include what you use" rules; warns if monolithic headers (Engine.h, UnrealEd.h, etc...) are used, and checks that source files include their matching header first.
///
public bool bEnforceIWYU { get; set; } = true;
///
/// Emit a warning when an old-style monolithic header is included while compiling this target.
///
public bool bWarnAboutMonolithicHeadersIncluded { get; set; }
///
/// Whether the final executable should export symbols.
///
public bool bHasExports
{
get => bHasExportsOverride ?? (LinkType == TargetLinkType.Modular);
set => bHasExportsOverride = value;
}
private bool? bHasExportsOverride;
///
/// Make static libraries for all engine modules as intermediates for this target.
///
[CommandLine("-Precompile")]
public bool bPrecompile { get; set; }
///
/// Whether we should compile with support for OS X 10.9 Mavericks. Used for some tools that we need to be compatible with this version of OS X.
///
public bool bEnableOSX109Support { get; set; }
///
/// True if this is a console application that's being built.
///
public bool bIsBuildingConsoleApplication { get; set; }
///
/// If true, creates an additional console application. Hack for Windows, where it's not possible to conditionally inherit a parent's console Window depending on how
/// the application is invoked; you have to link the same executable with a different subsystem setting.
///
public bool bBuildAdditionalConsoleApp
{
get => bBuildAdditionalConsoleAppOverride ?? (Type == TargetType.Editor);
set => bBuildAdditionalConsoleAppOverride = value;
}
private bool? bBuildAdditionalConsoleAppOverride;
///
/// If true, only creates an additional console application. Overrides bBuildAdditionalConsoleApp.
///
public bool bBuildConsoleAppOnly { get; set; } = false;
///
/// True if debug symbols that are cached for some platforms should not be created.
///
public bool bDisableSymbolCache { get; set; } = true;
///
/// Whether to unify C++ code into larger files for faster compilation.
///
public bool bUseUnityBuild
{
get => bUseUnityBuildOverride ?? IntermediateEnvironment.IsUnity() && !bEnableCppModules;
set => bUseUnityBuildOverride = value;
}
///
/// Whether to unify C++ code into larger files for faster compilation.
///
bool? bUseUnityBuildOverride { get; set; }
///
/// Whether to force C++ source files to be combined into larger files for faster compilation.
///
[CommandLine("-ForceUnity")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bForceUnityBuild { get; set; }
///
/// Whether to force generated files to be placed in a unity file even when unity files are otherwise disabled.
/// It is not recommended to disable this unless debugging issues with UHT file generation.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAlwaysUseUnityForGeneratedFiles { get; set; } = true;
///
/// Whether to merge module and generated unity files for faster compilation.
///
[Obsolete("Deprecated in UE5.3; use DisableMergingModuleAndGeneratedFilesInUnityFiles instead")]
public bool bMergeModuleAndGeneratedUnityFiles { get; set; }
///
/// List of modules that disables merging module and generated cpp files in the same unity files.
///
[XmlConfigFile(Category = "ModuleConfiguration", Name = "DisableMergingModuleAndGeneratedFilesInUnityFiles")]
public string[]? DisableMergingModuleAndGeneratedFilesInUnityFiles = null;
///
/// Use a heuristic to determine which files are currently being iterated on and exclude them from unity blobs. This results in faster
/// incremental compile times. For Perforce repositories, the current implementation uses the read-only flag to distinguish the working
/// set, assuming that files will be made writable by the source control system if they are being modified. For Git repositories, the
/// implementation uses the git status command. Source code archives downloaded from Git as .zip files are not supported.
///
[CommandLine("-DisableAdaptiveUnity", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseAdaptiveUnityBuild { get; set; } = true;
///
/// Disable optimization for files that are in the adaptive non-unity working set.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAdaptiveUnityDisablesOptimizations { get; set; }
///
/// Disables force-included PCHs for files that are in the adaptive non-unity working set.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAdaptiveUnityDisablesPCH { get; set; }
///
/// Backing storage for bAdaptiveUnityDisablesProjectPCH.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool? bAdaptiveUnityDisablesProjectPCHForProjectPrivate { get; set; }
///
/// Whether to disable force-included PCHs for project source files in the adaptive non-unity working set. Defaults to bAdaptiveUnityDisablesPCH;
///
public bool bAdaptiveUnityDisablesPCHForProject
{
get => bAdaptiveUnityDisablesProjectPCHForProjectPrivate ?? bAdaptiveUnityDisablesPCH;
set => bAdaptiveUnityDisablesProjectPCHForProjectPrivate = value;
}
///
/// Creates a dedicated PCH for each source file in the working set, allowing faster iteration on cpp-only changes.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAdaptiveUnityCreatesDedicatedPCH { get; set; }
///
/// Creates a dedicated PCH for each source file in the working set, allowing faster iteration on cpp-only changes.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAdaptiveUnityEnablesEditAndContinue { get; set; }
///
/// Creates a dedicated source file for each header file in the working set to detect missing includes in headers.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAdaptiveUnityCompilesHeaderFiles { get; set; }
///
/// The number of source files in a game module before unity build will be activated for that module. This
/// allows small game modules to have faster iterative compile times for single files, at the expense of slower full
/// rebuild times. This setting can be overridden by the bFasterWithoutUnity option in a module's Build.cs file.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public int MinGameModuleSourceFilesForUnityBuild { get; set; } = 32;
///
/// Default treatment of uncategorized warnings
///
[RequiresUniqueBuildEnvironment]
public WarningLevel DefaultWarningLevel
{
get => (DefaultWarningLevelPrivate == WarningLevel.Default) ? (bWarningsAsErrors ? WarningLevel.Error : WarningLevel.Warning) : DefaultWarningLevelPrivate;
set => DefaultWarningLevelPrivate = value;
}
///
[XmlConfigFile(Category = "BuildConfiguration", Name = nameof(DefaultWarningLevel))]
private WarningLevel DefaultWarningLevelPrivate;
///
/// Require TObjectPtr for FReferenceCollector API's. (Needed for compatibility with incremental GC.)
///
[RequiresUniqueBuildEnvironment]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bRequireObjectPtrForAddReferencedObjects
{
get => bRequireObjectPtrForAddReferencedObjectsPrivate ?? true;
set => bRequireObjectPtrForAddReferencedObjectsPrivate = value;
}
private bool? bRequireObjectPtrForAddReferencedObjectsPrivate;
///
/// Emits compilation errors for incorrect UE_LOG format strings.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bValidateFormatStrings
{
get => bValidateFormatStringsPrivate ?? (DefaultBuildSettings >= BuildSettingsVersion.V5);
set => bValidateFormatStringsPrivate = value;
}
private bool? bValidateFormatStringsPrivate;
///
/// Level to report deprecation warnings as errors
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.DeprecationWarningLevel")]
public WarningLevel DeprecationWarningLevel
{
get => CppCompileWarningSettings.DeprecationWarningLevel;
set => CppCompileWarningSettings.DeprecationWarningLevel = value;
}
///
/// C++ Warnings settings object used by the target
///
[ConfigSubObject]
public CppCompileWarnings CppCompileWarningSettings { get; init; }
///
/// Forces shadow variable warnings to be treated as errors on platforms that support it.
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.ShadowVariableWarningLevel")]
public WarningLevel ShadowVariableWarningLevel
{
get => CppCompileWarningSettings.ShadowVariableWarningLevel;
set => CppCompileWarningSettings.ShadowVariableWarningLevel = value;
}
///
/// Whether to enable all warnings as errors. UE enables most warnings as errors already, but disables a few (such as deprecation warnings).
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-WarningsAsErrors")]
[RequiresUniqueBuildEnvironment]
public bool bWarningsAsErrors { get; set; }
///
/// Indicates what warning/error level to treat unsafe type casts as on platforms that support it (e.g., double->float or int64->int32)
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.UnsafeTypeCastWarningLevel")]
public WarningLevel UnsafeTypeCastWarningLevel
{
get => CppCompileWarningSettings.UnsafeTypeCastWarningLevel;
set => CppCompileWarningSettings.UnsafeTypeCastWarningLevel = value;
}
///
/// Forces the use of undefined identifiers in conditional expressions to be treated as errors.
///
[XmlConfigFile(Category = "BuildConfiguration", Deprecated = true)]
[Obsolete("Deprecated in UE5.5 - Replace with TargetRules.UndefinedIdentifierWarningLevel")]
public bool bUndefinedIdentifierErrors { get; set; } = true;
///
/// Indicates what warning/error level to treat undefined identifiers in conditional expressions.
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.UndefinedIdentifierWarningLevel")]
public WarningLevel UndefinedIdentifierWarningLevel
{
get => CppCompileWarningSettings.UndefinedIdentifierWarningLevel;
set => CppCompileWarningSettings.UndefinedIdentifierWarningLevel = value;
}
///
/// Indicates what warning/error level to treat potential PCH performance issues.
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.PCHPerformanceIssueWarningLevel")]
public WarningLevel PCHPerformanceIssueWarningLevel
{
get => CppCompileWarningSettings.PCHPerformanceIssueWarningLevel;
set => CppCompileWarningSettings.PCHPerformanceIssueWarningLevel = value;
}
///
/// How to treat general module include path validation messages
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.ModuleIncludePathWarningLevel")]
public WarningLevel ModuleIncludePathWarningLevel
{
get => CppCompileWarningSettings.ModuleIncludePathWarningLevel;
set => CppCompileWarningSettings.ModuleIncludePathWarningLevel = value;
}
///
/// How to treat private module include path validation messages, where a module is adding an include path that exposes private headers
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.ModuleIncludePrivateWarningLevel")]
public WarningLevel ModuleIncludePrivateWarningLevel
{
get => CppCompileWarningSettings.ModuleIncludePrivateWarningLevel;
set => CppCompileWarningSettings.ModuleIncludePrivateWarningLevel = value;
}
///
/// How to treat unnecessary module sub-directory include path validation messages
///
[Obsolete("Deprecated in UE5.6 - Replace with TargetRules.CppCompileWarningSettings.ModuleIncludeSubdirectoryWarningLevel")]
public WarningLevel ModuleIncludeSubdirectoryWarningLevel
{
get => CppCompileWarningSettings.ModuleIncludeSubdirectoryWarningLevel;
set => CppCompileWarningSettings.ModuleIncludeSubdirectoryWarningLevel = value;
}
///
/// Print out files that are included by each source file
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-ShowIncludes")]
public bool bShowIncludes = false;
///
/// Forces frame pointers to be retained this is usually required when you want reliable callstacks e.g. mallocframeprofiler
///
public bool bRetainFramePointers
{
get =>
// Default to disabled on Linux to maintain legacy behavior
bRetainFramePointersOverride ?? Platform.IsInGroup(UnrealPlatformGroup.Linux) == false;
set => bRetainFramePointersOverride = value;
}
///
/// Forces frame pointers to be retained this is usually required when you want reliable callstacks e.g. mallocframeprofiler
///
[XmlConfigFile(Category = "BuildConfiguration", Name = "bRetainFramePointers")]
[CommandLine("-RetainFramePointers", Value = "true")]
[CommandLine("-NoRetainFramePointers", Value = "false")]
public bool? bRetainFramePointersOverride { get; set; }
///
/// New Monolithic Graphics drivers have optional "fast calls" replacing various D3d functions
///
[CommandLine("-FastMonoCalls", Value = "true")]
[CommandLine("-NoFastMonoCalls", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseFastMonoCalls { get; set; } = true;
///
/// An approximate number of bytes of C++ code to target for inclusion in a single unified C++ file.
///
[CommandLine("-BytesPerUnityCPP")]
[XmlConfigFile(Category = "BuildConfiguration")]
public int NumIncludedBytesPerUnityCPP { get; set; } = 384 * 1024;
///
/// Disables overrides that are set by the module
///
[CommandLine("-DisableModuleNumIncludedBytesPerUnityCPPOverride", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bDisableModuleNumIncludedBytesPerUnityCPPOverride { get; set; }
///
/// Whether to stress test the C++ unity build robustness by including all C++ files files in a project from a single unified file.
///
[CommandLine("-StressTestUnity")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bStressTestUnity { get; set; }
///
/// Whether to add additional information to the unity files, such as '_of_X' in the file name. Not recommended.
///
[XmlConfigFile(Category = "BuildConfiguration")]
[Obsolete("Deprecated in UE5.6")]
public bool bDetailedUnityFiles { get; set; }
///
/// Whether to force debug info to be generated.
///
[CommandLine("-ForceDebugInfo")]
public bool bForceDebugInfo { get; set; }
///
/// Whether to globally disable debug info generation; Obsolete, please use TargetRules.DebugInfoMode instead
///
[XmlConfigFile(Category = "BuildConfiguration", Deprecated = true)]
[Obsolete("Deprecated in UE5.4 - Replace with TargetRules.DebugInfo")]
public bool bDisableDebugInfo
{
get => DebugInfo == DebugInfoMode.None;
set => DebugInfo = value ? DebugInfo = DebugInfoMode.None : DebugInfo = DebugInfoMode.Full;
}
///
/// How much debug info should be generated. See DebugInfoMode enum for more details
///
[CommandLine("-NoDebugInfo", Value = "None")]
[CommandLine("-DebugInfo=")]
[XmlConfigFile(Category = "BuildConfiguration")]
public DebugInfoMode DebugInfo { get; set; } = DebugInfoMode.Full;
///
/// Modules that should have debug info disabled
///
[CommandLine("-DisableDebugInfoModules=", ListSeparator = '+')]
public HashSet DisableDebugInfoModules { get; } = new();
///
/// Plugins that should have debug info disabled
///
[CommandLine("-DisableDebugInfoPlugins=", ListSeparator = '+')]
public HashSet DisableDebugInfoPlugins { get; } = new();
///
/// True if only debug line number tables should be emitted in debug information for compilers that support doing so. Overrides TargetRules.DebugInfo
/// See https://clang.llvm.org/docs/UsersManual.html#cmdoption-gline-tables-only for more information
///
[XmlConfigFile(Category = "BuildConfiguration")]
[CommandLine("-DebugInfoLineTablesOnly=")]
public DebugInfoMode DebugInfoLineTablesOnly { get; set; } = DebugInfoMode.None;
///
/// Modules that should emit line number tables instead of full debug information for compilers that support doing so. Overrides DisableDebugInfoModules
///
[CommandLine("-DebugInfoLineTablesOnlyModules=", ListSeparator = '+')]
public HashSet DebugInfoLineTablesOnlyModules { get; } = new();
///
/// Plugins that should emit line number tables instead of full debug information for compilers that support doing so. Overrides DisableDebugInfoPlugins
///
[CommandLine("-DebugInfoLineTablesOnlyPlugins=", ListSeparator = '+')]
public HashSet DebugInfoLineTablesOnlyPlugins { get; } = new();
///
/// Whether to disable debug info generation for generated files. This improves link times and reduces pdb size for modules that have a lot of generated glue code.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bDisableDebugInfoForGeneratedCode { get; set; }
///
/// Whether to disable debug info on PC/Mac in development builds (for faster developer iteration, as link times are extremely fast with debug info disabled).
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bOmitPCDebugInfoInDevelopment { get; set; }
///
/// Whether PDB files should be used for Visual C++ builds.
///
[CommandLine("-NoPDB", Value = "false")]
[CommandLine("-UsePDB", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUsePDBFiles { get; set; }
///
/// Whether PCH files should be used.
///
[CommandLine("-NoPCH", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUsePCHFiles { get; set; } = true;
///
/// Set flags require for deterministic compiling and linking.
/// Enabling deterministic mode for msvc disables codegen multithreading so compiling will be slower
///
[CommandLine("-Deterministic", Value = "true")]
[CommandLine("-NonDeterministic", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
[RequiresUniqueBuildEnvironment]
public bool bDeterministic
{
get => bDeterministicPrivate ?? (Configuration == UnrealTargetConfiguration.Shipping);
set => bDeterministicPrivate = value;
}
private bool? bDeterministicPrivate;
///
/// Experimental work in progress: Set flags to use toolchain virtual file system support, to generate consistent pathing in outputs
///
[CommandLine("-VFS", Value = "true")]
[CommandLine("-NoVFS", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
[RequiresUniqueBuildEnvironment]
public bool bUseVFS { get; set; }
///
/// Whether PCHs should be chained when compiling with clang.
///
[CommandLine("-NoPCHChain", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bChainPCHs { get; set; } = true;
///
/// Whether PCH headers should be force included for gen.cpp files when PCH is disabled.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bForceIncludePCHHeadersForGenCppFilesWhenPCHIsDisabled { get; set; } = true;
///
/// Whether to just preprocess source files for this target, and skip compilation
///
[CommandLine("-Preprocess")]
public bool bPreprocessOnly { get; set; }
///
/// Generate dependency files by preprocessing. This is only recommended when distributing builds as it adds additional overhead.
///
[CommandLine("-PreprocessDepends")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bPreprocessDepends { get; set; }
///
/// Whether to generate assembly data while compiling this target. Works exclusively on MSVC for now.
///
[CommandLine("-WithAssembly")]
public bool bWithAssembly { get; set; }
///
/// Experimental: Store object (.obj) compressed on disk. Requires UBA to link, currently MSVC only. Toggling this flag will invalidate MSVC actions.
/// Warning, this option is not currently compatitable with PGO or the the cl-clang linker as those are not detoured and linking will fail.
///
[XmlConfigFile(Category = "UnrealBuildAccelerator", Name = "bStoreObjFilesCompressed")]
[CommandLine("-UBAStoreObjFilesCompressed", Value = "true", MarkUsed = false)]
[RequiresUniqueBuildEnvironment]
public bool bAllowUbaCompression { get; set; }
///
/// Whether static code analysis should be enabled.
///
[CommandLine("-StaticAnalyzer")]
[XmlConfigFile(Category = "BuildConfiguration")]
public StaticAnalyzer StaticAnalyzer { get; set; } = StaticAnalyzer.None;
///
/// The output type to use for the static analyzer. This is only supported for Clang.
///
[CommandLine("-StaticAnalyzerOutputType")]
[XmlConfigFile(Category = "BuildConfiguration")]
public StaticAnalyzerOutputType StaticAnalyzerOutputType { get; set; } = StaticAnalyzerOutputType.Text;
///
/// The mode to use for the static analyzer. This is only supported for Clang.
/// Shallow mode completes quicker but is generally not recommended.
///
[CommandLine("-StaticAnalyzerMode")]
[XmlConfigFile(Category = "BuildConfiguration")]
public StaticAnalyzerMode StaticAnalyzerMode { get; set; } = StaticAnalyzerMode.Deep;
///
/// The level of warnings to print when analyzing using PVS-Studio
///
[CommandLine("-StaticAnalyzerPVSPrintLevel")]
[XmlConfigFile(Category = "BuildConfiguration")]
public int StaticAnalyzerPVSPrintLevel { get; set; } = 1;
///
/// Only run static analysis against project modules, skipping engine modules
///
/// PVS-Studio: warnings that are disabled via Engine/Source/Runtime/Core/Public/Microsoft/MicrosoftPlatformCodeAnalysis.h will be reenabled
[CommandLine("-StaticAnalyzerProjectOnly")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bStaticAnalyzerProjectOnly { get; set; } = false;
///
/// When enabled, generated source files will be analyzed
///
[CommandLine("-StaticAnalyzerIncludeGenerated")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bStaticAnalyzerIncludeGenerated { get; set; } = false;
///
/// The minimum number of files that must use a pre-compiled header before it will be created and used.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public int MinFilesUsingPrecompiledHeader { get; set; } = 6;
///
/// When enabled, a precompiled header is always generated for game modules, even if there are only a few source files
/// in the module. This greatly improves compile times for iterative changes on a few files in the project, at the expense of slower
/// full rebuild times for small game projects. This can be overridden by setting MinFilesUsingPrecompiledHeaderOverride in
/// a module's Build.cs file.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bForcePrecompiledHeaderForGameModules { get; set; } = true;
///
/// Whether to use incremental linking or not. Incremental linking can yield faster iteration times when making small changes.
/// Currently disabled by default because it tends to behave a bit buggy on some computers (PDB-related compile errors).
///
[CommandLine("-IncrementalLinking")]
[CommandLine("-NoIncrementalLinking", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseIncrementalLinking { get; set; }
///
/// Whether to allow the use of link time code generation (LTCG).
///
[CommandLine("-LTCG")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAllowLTCG { get; set; }
///
/// When Link Time Code Generation (LTCG) is enabled, whether to
/// prefer using the lighter weight version on supported platforms.
///
[CommandLine("-ThinLTO")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bPreferThinLTO { get; set; }
///
/// Directory where to put the ThinLTO cache on supported platforms.
///
[CommandLine("-ThinLTOCacheDirectory")]
[XmlConfigFile(Category = "BuildConfiguration")]
public string? ThinLTOCacheDirectory { get; set; }
///
/// Arguments that will be applied to prune the ThinLTO cache on supported platforms.
/// Arguments will only be applied if ThinLTOCacheDirectory is set.
///
[CommandLine("-ThinLTOCachePruningArguments")]
[XmlConfigFile(Category = "BuildConfiguration")]
public string? ThinLTOCachePruningArguments { get; set; }
///
/// Whether to enable Profile Guided Optimization (PGO) instrumentation in this build.
///
[CommandLine("-PGOProfile", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bPGOProfile { get; set; }
///
/// Whether to optimize this build with Profile Guided Optimization (PGO).
///
[CommandLine("-PGOOptimize", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bPGOOptimize { get; set; }
///
/// Whether the target requires code coverage compilation and linking.
///
[CommandLine("-CodeCoverage", Value = "true")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bCodeCoverage { get; set; }
///
/// Whether to support edit and continue.
///
[CommandLine("-SupportEditAndContinue")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bSupportEditAndContinue { get; set; }
///
/// Whether to omit frame pointers or not. Disabling is useful for e.g. memory profiling on the PC.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bOmitFramePointers { get; set; } = true;
///
/// If we want to compress the debug files
///
public bool bCompressDebugFile { get; set; } = true;
///
/// Whether to enable support for C++20 modules
///
public bool bEnableCppModules { get; set; }
///
/// Whether to enable support for C++20 coroutines
/// This option is provided to facilitate evaluation of the feature.
/// Expect the name of the option to change. Use of coroutines in with UE is untested and unsupported.
///
public bool bEnableCppCoroutinesForEvaluation { get; set; }
///
/// Whether to enable engine's ability to set process priority on runtime.
/// This option requires some environment setup on Linux, that's why it's disabled by default.
/// Project has to opt-in this feature as it has to guarantee correct setup.
///
public bool bEnableProcessPriorityControl { get; set; }
///
/// If true, then enable memory profiling in the build (defines USE_MALLOC_PROFILER=1 and forces bOmitFramePointers=false).
///
[Obsolete("Deprecated in UE5.3 - No longer used as MallocProfiler is removed in favor of UnrealInsights.")]
public bool bUseMallocProfiler { get; set; }
///
/// If true, then enable Unreal Insights (utrace) profiling in the build for the Shader Compiler Worker (defines USE_SHADER_COMPILER_WORKER_TRACE=1).
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bShaderCompilerWorkerTrace { get; set; }
///
/// Enables "Shared PCHs", a feature which significantly speeds up compile times by attempting to
/// share certain PCH files between modules that UBT detects is including those PCH's header files.
///
[CommandLine("-NoSharedPCH", Value = "false")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseSharedPCHs { get; set; } = true;
///
/// True if Development and Release builds should use the release configuration of PhysX/APEX.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseShippingPhysXLibraries { get; set; }
///
/// True if Development and Release builds should use the checked configuration of PhysX/APEX. if bUseShippingPhysXLibraries is true this is ignored.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bUseCheckedPhysXLibraries { get; set; }
///
/// Tells the UBT to check if module currently being built is violating EULA.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bCheckLicenseViolations { get; set; } = true;
///
/// Tells the UBT to break build if module currently being built is violating EULA.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bBreakBuildOnLicenseViolation { get; set; } = true;
///
/// Whether to use the :FASTLINK option when building with /DEBUG to create local PDBs on Windows. Fast, but currently seems to have problems finding symbols in the debugger.
///
[CommandLine("-FastPDB")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool? bUseFastPDBLinking { get; set; }
///
/// Outputs a map file as part of the build.
///
[CommandLine("-MapFile")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bCreateMapFile { get; set; }
///
/// True if runtime symbols files should be generated as a post build step for some platforms.
/// These files are used by the engine to resolve symbol names of callstack backtraces in logs.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bAllowRuntimeSymbolFiles { get; set; } = true;
///
/// Package full path (directory + filename) where to store input files used at link time
/// Normally used to debug a linker crash for platforms that support it
///
[CommandLine("-PackagePath")]
[XmlConfigFile(Category = "BuildConfiguration")]
public string? PackagePath { get; set; }
///
/// Directory where to put crash report files for platforms that support it
///
[CommandLine("-CrashDiagnosticDirectory")]
[XmlConfigFile(Category = "BuildConfiguration")]
public string? CrashDiagnosticDirectory { get; set; }
///
/// Bundle version for Mac apps.
///
[CommandLine("-BundleVersion")]
public string? BundleVersion { get; set; }
///
/// Whether to deploy the executable after compilation on platforms that require deployment.
///
[CommandLine("-Deploy")]
public bool bDeployAfterCompile { get; set; }
///
/// Whether to force skipping deployment for platforms that require deployment by default.
///
[CommandLine("-SkipDeploy")]
private bool bForceSkipDeploy { get; set; }
///
/// When enabled, allows XGE to compile pre-compiled header files on remote machines. Otherwise, PCHs are always generated locally.
///
public bool bAllowRemotelyCompiledPCHs { get; set; }
///
/// Will replace pch with ifc and use header units instead. This is an experimental and msvc-only feature
///
[CommandLine("-HeaderUnits")]
public bool bUseHeaderUnitsForPch { get; set; }
///
/// Whether headers in system paths should be checked for modification when determining outdated actions.
///
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bCheckSystemHeadersForModification { get; set; }
///
/// Whether to disable linking for this target.
///
[CommandLine("-NoLink")]
public bool bDisableLinking { get; set; }
///
/// Whether to ignore tracking build outputs for this target.
///
public bool bIgnoreBuildOutputs { get; set; }
///
/// Whether to disable UE_DEPRECATED_FORENGINE deprecation warnings in non-engine modules.
/// This should only be used in the short-term as these deprecations will get removed.
///
public bool bDisableEngineDeprecations { get; set; }
///
/// Indicates that this is a formal build, intended for distribution. This flag is automatically set to true when Build.version has a changelist set and is a promoted build.
/// The only behavior currently bound to this flag is to compile the default resource file separately for each binary so that the OriginalFilename field is set correctly.
/// By default, we only compile the resource once to reduce build times.
///
[CommandLine("-Formal")]
public bool bFormalBuild { get; set; }
///
/// Whether to clean Builds directory on a remote Mac before building.
///
[CommandLine("-FlushMac")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bFlushBuildDirOnRemoteMac { get; set; }
///
/// Whether to write detailed timing info from the compiler and linker.
///
[CommandLine("-Timing")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bPrintToolChainTimingInfo { get; set; }
///
/// Whether to parse timing data into a tracing file compatible with chrome://tracing.
///
[CommandLine("-Tracing")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bParseTimingInfoForTracing { get; set; }
///
/// Whether to expose all symbols as public by default on POSIX platforms
///
[CommandLine("-PublicSymbolsByDefault")]
[XmlConfigFile(Category = "BuildConfiguration")]
public bool bPublicSymbolsByDefault { get; set; }
///
/// Disable supports for inlining gen.cpps
///
[Obsolete("Deprecated in UE5.3; the engine code relies on inlining generated cpp files to compile")]
public bool bDisableInliningGenCpps { get; set; }
///
/// Allows overriding the toolchain to be created for this target. This must match the name of a class declared in the UnrealBuildTool assembly.
///
[CommandLine("-ToolChain")]
public string? ToolChainName { get; set; }
///
/// The weight(cpu/memory utilization) of a MSVC compile action
///
[XmlConfigFile(Category = "BuildConfiguration")]
public float MSVCCompileActionWeight { get; set; } = 1.0f;
///
/// The weight(cpu/memory utilization) of a clang compile action
///
[XmlConfigFile(Category = "BuildConfiguration")]
public float ClangCompileActionWeight { get; set; } = 1.0f;
///
/// Whether to allow engine configuration to determine if we can load unverified certificates.
///
public bool bDisableUnverifiedCertificates { get; set; }
///
/// Whether to load generated ini files in cooked build, (GameUserSettings.ini loaded either way)
///
public bool bAllowGeneratedIniWhenCooked { get; set; } = true;
///
/// Whether to load non-ufs ini files in cooked build, (GameUserSettings.ini loaded either way)
///
public bool bAllowNonUFSIniWhenCooked { get; set; } = true;
///
/// Add all the public folders as include paths for the compile environment.
///
public bool bLegacyPublicIncludePaths
{
get => bLegacyPublicIncludePathsPrivate ?? (DefaultBuildSettings < BuildSettingsVersion.V2);
set => bLegacyPublicIncludePathsPrivate = value;
}
private bool? bLegacyPublicIncludePathsPrivate;
///
/// Add all the parent folders as include paths for the compile environment.
///
public bool bLegacyParentIncludePaths
{
get => bLegacyParentIncludePathsPrivate ?? (DefaultBuildSettings < BuildSettingsVersion.V3);
set => bLegacyParentIncludePathsPrivate = value;
}
private bool? bLegacyParentIncludePathsPrivate;
///
/// Which C++ standard to use for compiling this target (for engine modules)
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-CppStdEngine")]
[XmlConfigFile(Category = "BuildConfiguration")]
public CppStandardVersion CppStandardEngine
{
get => CppStandardEnginePrivate ?? CppStandardVersion.EngineDefault;
set => CppStandardEnginePrivate = value;
}
private CppStandardVersion? CppStandardEnginePrivate;
///
/// Which C++ standard to use for compiling this target (for non-engine modules)
///
[CommandLine("-CppStd")]
[XmlConfigFile(Category = "BuildConfiguration")]
public CppStandardVersion CppStandard
{
#pragma warning disable CS0618 // Type or member is obsolete
get => CppStandardPrivate ?? (DefaultBuildSettings < BuildSettingsVersion.V4 ? CppStandardVersion.Cpp17 : CppStandardVersion.Default);
#pragma warning restore CS0618 // Type or member is obsolete
set => CppStandardPrivate = value;
}
private CppStandardVersion? CppStandardPrivate;
///
/// Which C standard to use for compiling this target
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-CStd")]
[XmlConfigFile(Category = "BuildConfiguration")]
public CStandardVersion CStandard { get; set; } = CStandardVersion.Default;
///
/// Direct the compiler to generate AVX instructions wherever SSE or AVX intrinsics are used, on the x64 platforms that support it. Ignored for arm64.
/// Note that by enabling this you are changing the minspec for the target platform, and the resultant executable will crash on machines without AVX support.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-MinCpuArchX64")]
[XmlConfigFile(Category = "BuildConfiguration")]
public MinimumCpuArchitectureX64 MinCpuArchX64 { get; set; } = MinimumCpuArchitectureX64.Default;
///
/// Select a minimum ARM64 target CPU. This will change what ARMv8(9)-A ISA + extension code will be compiled for.
/// Changing it from default will guarantee not to work on all ARM64 CPUs.
/// Currently supported by clang compiler only
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-MinArm64CpuTarget")]
[XmlConfigFile(Category = "BuildConfiguration")]
public Arm64TargetCpuType MinArm64CpuTarget { get; set; } = Arm64TargetCpuType.Default;
///
/// Do not allow manifest changes when building this target. Used to cause earlier errors when building multiple targets with a shared build environment.
///
[CommandLine("-NoManifestChanges")]
internal bool bNoManifestChanges { get; set; }
///
/// The build version string
///
[CommandLine("-BuildVersion")]
public string? BuildVersion { get; set; }
///
/// Specifies how to link modules in this target (monolithic or modular). This is currently protected for backwards compatibility. Call the GetLinkType() accessor
/// until support for the deprecated ShouldCompileMonolithic() override has been removed.
///
public TargetLinkType LinkType
{
get => (LinkTypePrivate != TargetLinkType.Default) ? LinkTypePrivate : ((Type == global::UnrealBuildTool.TargetType.Editor) ? TargetLinkType.Modular : TargetLinkType.Monolithic);
set => LinkTypePrivate = value;
}
///
/// Experimental: Strip unused exports from libraries. Only applies when LinkType is Modular
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-StripExports")]
public bool bStripExports { get; set; }
///
/// Experimental: Merge modular modules into combined libraries. Sets LinkType to Modular and enables bStripExports
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-MergeModules")]
public bool bMergeModules { get; set; }
///
/// Experimental: List of plugins (and their dependencies) to each merge into separate libraries. Requires bMergeModules to be enabled
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-MergePlugins=", ListSeparator = '+')]
public List MergePlugins { get; } = new();
///
/// Experimental: List of plugins (and their dependencies) to ignore when processing merged libraries. Requires bMergeModules to be enabled
/// Ignored plugins will still be compiled, but if they're kept in the base executable, their dependencies will not be forced out of merged library with them.
/// This should be used carefully, for organisational plugins known to have dependencies they don't actually need at runtime.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-MergePluginsIgnored=", ListSeparator = '+')]
public List MergePluginsIgnored { get; } = new();
///
/// Experimental: List of merged plugins to move common dependencies to a shared library, requires MergePlugins. Can be chained
///
public Dictionary> MergePluginsShared { get; } = new();
///
/// Experimental: List of merged plugins to move to the main executable, requires MergePlugins. "Engine" for all shared engine modules and "Common" for shared project modules.
///
public List MergePluginsLaunch { get; } = new();
///
/// Backing storage for the LinkType property.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-Monolithic", Value = "Monolithic")]
[CommandLine("-Modular", Value = "Modular")]
TargetLinkType LinkTypePrivate = TargetLinkType.Default;
///
/// Macros to define globally across the whole target.
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-Define:")]
public List GlobalDefinitions { get; } = new();
///
/// Macros to define across all macros in the project.
///
[CommandLine("-ProjectDefine:")]
public List ProjectDefinitions { get; } = new();
///
/// Specifies the name of the launch module. For modular builds, this is the module that is compiled into the target's executable.
///
public string? LaunchModuleName
{
get => (LaunchModuleNamePrivate == null && Type != global::UnrealBuildTool.TargetType.Program) ? "Launch" : LaunchModuleNamePrivate;
set => LaunchModuleNamePrivate = value;
}
///
/// Backing storage for the LaunchModuleName property.
///
private string? LaunchModuleNamePrivate { get; set; }
///
/// Specifies the path to write a header containing public definitions for this target. Useful when building a DLL to be consumed by external build processes.
///
public string? ExportPublicHeader { get; set; }
///
/// List of additional modules to be compiled into the target.
///
public List ExtraModuleNames { get; } = new();
///
/// Path to a manifest to output for this target
///
[CommandLine("-Manifest")]
public List ManifestFileNames { get; } = new();
///
/// Path to a list of dependencies for this target, when precompiling
///
[CommandLine("-DependencyList")]
public List DependencyListFileNames { get; } = new();
///
/// Backing storage for the BuildEnvironment property
///
[CommandLine("-SharedBuildEnvironment", Value = "Shared")]
[CommandLine("-UniqueBuildEnvironment", Value = "Unique")]
private TargetBuildEnvironment? BuildEnvironmentOverride;
///
/// Specifies the build environment for this target. See TargetBuildEnvironment for more information on the available options.
///
public TargetBuildEnvironment BuildEnvironment
{
get
{
if (BuildEnvironmentOverride.HasValue)
{
if (BuildEnvironmentOverride.Value == TargetBuildEnvironment.UniqueIfNeeded)
{
throw new BuildException($"Target {Name} had BuildEnv set to UniqueIfNeeded when querying, which means UpdateBuildEnvironmentIfNeeded wasn't called in time");
}
return BuildEnvironmentOverride.Value;
}
if (Type == TargetType.Program && ProjectFile != null && File!.IsUnderDirectory(ProjectFile.Directory))
{
return TargetBuildEnvironment.Unique;
}
else if (Unreal.IsEngineInstalled() || LinkType != TargetLinkType.Monolithic)
{
return TargetBuildEnvironment.Shared;
}
else
{
return TargetBuildEnvironment.Unique;
}
}
set => BuildEnvironmentOverride = value;
}
///
/// If this true, a Shared build environment target will allow for any modules that are SDK version sensitive to have
/// a project side module when an SDK is overridden. For instance, if IOSTargetPlatform, which is marked as IOS SDK
/// version relevant, is compiled for a Target with this set to true, and that target overrides the IOS SDK, then
/// this would compile to e.g. MyProject/Binaries/Win64/IOS/MyProject-IOSTargetPlatform.dll
///
public bool bAllowSDKOverrideModulesWithSharedEnvironment { get; protected set; } = false;
///
/// Whether to ignore violations to the shared build environment (eg. editor targets modifying definitions)
///
[CommandLine("-OverrideBuildEnvironment")]
public bool bOverrideBuildEnvironment { get; set; }
///
/// Specifies a list of targets which should be built before this target is built.
///
public List PreBuildTargets { get; } = new();
///
/// Specifies a list of steps which should be executed before this target is built, in the context of the host platform's shell.
/// The following variables will be expanded before execution:
/// $(EngineDir), $(ProjectDir), $(TargetName), $(TargetPlatform), $(TargetConfiguration), $(TargetType), $(ProjectFile).
///
public List PreBuildSteps { get; } = new();
///
/// Specifies a list of steps which should be executed after this target is built, in the context of the host platform's shell.
/// The following variables will be expanded before execution:
/// $(EngineDir), $(ProjectDir), $(TargetName), $(TargetPlatform), $(TargetConfiguration), $(TargetType), $(ProjectFile).
///
public List PostBuildSteps { get; } = new();
///
/// Specifies additional build products produced as part of this target.
///
public List AdditionalBuildProducts { get; } = new();
///
/// Additional arguments to pass to the compiler
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-CompilerArguments=")]
public string? AdditionalCompilerArguments { get; set; }
///
/// Additional arguments to pass to the linker
///
[RequiresUniqueBuildEnvironment]
[CommandLine("-LinkerArguments=")]
public string? AdditionalLinkerArguments { get; set; }
///
/// Max amount of memory that each compile action may require. Used by ParallelExecutor to decide the maximum
/// number of parallel actions to start at one time.
///
public double MemoryPerActionGB { get; set; } = 0.0;
///
/// List of modules to disable unity builds for
///
[XmlConfigFile(Category = "ModuleConfiguration", Name = "DisableUnityBuild")]
public string[]? DisableUnityBuildForModules = null;
///
/// List of modules to enable optimizations for
///
[XmlConfigFile(Category = "ModuleConfiguration", Name = "EnableOptimizeCode")]
public string[]? EnableOptimizeCodeForModules = null;
///
/// List of modules to disable optimizations for
///
[XmlConfigFile(Category = "ModuleConfiguration", Name = "DisableOptimizeCode")]
public string[]? DisableOptimizeCodeForModules = null;
///
/// List of modules to optimize for size. This allows the target to override module optimization level
/// Note that this may disable PCH usage if a private PCH is not provided
///
[XmlConfigFile(Category = "ModuleConfiguration", Name = "OptimizeForSize")]
public string[]? OptimizeForSizeModules = null;
///
/// List of modules to optimize for size and speed. This allows the target to override module optimization level
/// Note that this may disable PCH usage if a private PCH is not provided
///
[XmlConfigFile(Category = "ModuleConfiguration", Name = "OptimizeForSizeAndSpeed")]
public string[]? OptimizeForSizeAndSpeedModules = null;
///
/// When generating project files, specifies the name of the project file to use when there are multiple targets of the same type.
///
public string? GeneratedProjectName { get; set; }
///
/// If this is non-null, then any platforms NOT listed will not be allowed to have modules in their directories be created
///
public UnrealTargetPlatform[]? OptedInModulePlatforms = null;
///
/// Android-specific target settings.
///
[ConfigSubObject]
public AndroidTargetRules AndroidPlatform { get; init; } = new();
///
/// IOS-specific target settings.
///
[ConfigSubObject]
public IOSTargetRules IOSPlatform { get; init; } = new();
///
/// Linux-specific target settings.
///
[ConfigSubObject]
public LinuxTargetRules LinuxPlatform { get; init; } = new();
///
/// Mac-specific target settings.
///
[ConfigSubObject]
public MacTargetRules MacPlatform { get; init; } = new();
///
/// Windows-specific target settings.
///
[ConfigSubObject]
public WindowsTargetRules WindowsPlatform { get; init; } // Requires 'this' parameter; initialized in constructor
///
/// Statically selected allocator to use
///
[RequiresUniqueBuildEnvironment]
public StaticAllocatorType StaticAllocator { get; set; } = StaticAllocatorType.None;
///
/// Checks if the target needs to care about sdk version - if not, we can share the target between projects that are on differnet sdk versions.
/// For instance, ShaderCompileWorker is very tied to, say, console sdk versions, but UnrealPak doesn't have sdk things compiled in
///
///
public bool IsSDKVersionRelevant(UnrealTargetPlatform sdkPlatform)
{
// we always care bout the sdk of the platform we are compiling for (Platform is the platform this target is being built for)
if (Platform == sdkPlatform)
{
return true;
}
// at this point, we are checking against an sdk that we are not compiling for, ie a target platform sdk, so check if the Target has overriden it
if (bAreTargetSDKVersionsRelevantOverride != null)
{
return bAreTargetSDKVersionsRelevantOverride.Value;
}
// developer tools are what pull in sdk versions for other platforms, so Programs that don't use dev tools don't care about versions
if (Type == global::UnrealBuildTool.TargetType.Program || Type == global::UnrealBuildTool.TargetType.Editor)
{
return bUsesTargetSDKs;
}
// games/client/servers are not expected to contain other platform sdk bits in them, so we don't need to care
return false;
}
///
/// Allow a target to override whether or not AreSDKVersionsRelevant uses default logic
///
protected bool? bAreTargetSDKVersionsRelevantOverride { get; set; }
///
/// Checks if the target can use non-standard sdk versions. For instance, the editor is usually compiled as a modular build shared between projects,
/// so if one projet uses sdk version 1, and another uses 2, then the generated engine modules will use the most recently built sdk, which could break
///
///
public bool AllowsPerProjectSDKVersion()
{
// modular target with TargetBuildEnvironment.Shared build type cannot allow per-project SDKs
return LinkType == TargetLinkType.Monolithic || BuildEnvironment == TargetBuildEnvironment.Unique || bAllowSDKOverrideModulesWithSharedEnvironment;
}
///
/// Checks if a plugin should be programmatically allowed in the build
///
/// true if the plugin is allowed
public virtual bool ShouldIgnorePluginDependency(PluginInfo parentInfo, PluginReferenceDescriptor descriptor) => false;
///
/// Checks if a property has been set with the RequiresUniqueBuildEnvironmentAttribute, and is different from it's base
///
/// Assembly containing the target
/// Commandline options that may affect the target creation
/// If the target requires a unique build environment, this will contain the names of the field/property that require unique, mapped to a pair of base and current value
/// If the target requires a unique build environment, this will contain the name of the target this was based on (UnrealGame, UnrealEditor, etc)/property
/// true if a property was set such that it requires a unique build environment
///
public bool RequiresUniqueEnvironment(RulesAssembly rulesAssembly, CommandLineArguments? arguments, Dictionary propNamesThatRequireUnique, [NotNullWhen(true)] out string? baseTargetName)
{
baseTargetName = null;
TargetRules thisRules = this;
// Allow disabling these checks
if (thisRules.bOverrideBuildEnvironment)
{
return false;
}
// Get the name of the target with default settings
switch (thisRules.Type)
{
case TargetType.Game:
baseTargetName = "UnrealGame";
break;
case TargetType.Editor:
baseTargetName = "UnrealEditor";
break;
case TargetType.Client:
baseTargetName = "UnrealClient";
break;
case TargetType.Server:
baseTargetName = "UnrealServer";
break;
default:
return false;
}
// Create the target rules for it
// we need to validate the target, but we don't care about SDK versions at all
TargetRules baseRules = rulesAssembly.CreateTargetRules(baseTargetName, thisRules.Platform, thisRules.Configuration, thisRules.Architectures, null, arguments, Logger, IntermediateEnvironment: thisRules.IntermediateEnvironment, ValidationOptions: TargetRulesValidationOptions.ValidateTargetOnly);
// Get all the configurable objects
object[] baseObjects = baseRules.GetConfigurableObjects().ToArray();
object[] thisObjects = GetConfigurableObjects().ToArray();
if (baseObjects.Length != thisObjects.Length)
{
throw new BuildException("Expected same number of configurable objects from base rules object.");
}
// Iterate through all fields with the [SharedBuildEnvironment] attribute
for (int idx = 0; idx < baseObjects.Length; idx++)
{
Type objectType = baseObjects[idx].GetType();
foreach (FieldInfo field in objectType.GetFields().Where(field => field.GetCustomAttribute() != null))
{
object? thisValue = field.GetValue(thisObjects[idx]);
object? baseValue = field.GetValue(baseObjects[idx]);
if (!CheckValuesMatch(field.FieldType, thisValue, baseValue))
{
propNamesThatRequireUnique.Add(field.Name, (thisValue?.ToString(), baseValue?.ToString()));
}
}
foreach (PropertyInfo property in objectType.GetProperties().Where(property => property.GetCustomAttribute() != null))
{
object? thisValue = property.GetValue(thisObjects[idx]);
object? baseValue = property.GetValue(baseObjects[idx]);
if (!CheckValuesMatch(property.PropertyType, thisValue, baseValue))
{
propNamesThatRequireUnique.Add(property.Name, (thisValue?.ToString(), baseValue?.ToString()));
}
}
}
// Iterate through all fields with the [ApplyWarnings] attribute, which are consumed by the CppCompileWarnings system and inserted into the compile arguments
for (int idx = 0; idx < baseObjects.Length; idx++)
{
Type objectType = baseObjects[idx].GetType();
foreach (FieldInfo field in objectType.GetFields().Where(field => field.GetCustomAttributes().FirstOrDefault() != null))
{
object? thisValue = field.GetValue(thisObjects[idx]);
object? baseValue = field.GetValue(baseObjects[idx]);
if (!CheckValuesMatch(field.FieldType, thisValue, baseValue))
{
propNamesThatRequireUnique.Add(field.Name, (thisValue?.ToString(), baseValue?.ToString()));
}
}
foreach (PropertyInfo property in objectType.GetProperties().Where(property => property.GetCustomAttributes().FirstOrDefault() != null))
{
object? thisValue = property.GetValue(thisObjects[idx]);
object? baseValue = property.GetValue(baseObjects[idx]);
if (!CheckValuesMatch(property.PropertyType, thisValue, baseValue))
{
propNamesThatRequireUnique.Add(property.Name, (thisValue?.ToString(), baseValue?.ToString()));
}
}
}
// if any properties require a unique build environment, return true
return propNamesThatRequireUnique.Count > 0;
}
///
/// For any target that has set BuildEnvironment = TargetBuildEnvironment.Unique, this will change the Environment to either Shared or Unique accordingly
///
/// Assembly containing the target
/// Commandline options that may affect the target creation
/// Logger
public void UpdateBuildEnvironmentIfNeeded(RulesAssembly rulesAssembly, CommandLineArguments? arguments, ILogger logger)
{
// only do anything here when using UniqueIfNeeded
if (!BuildEnvironmentOverride.HasValue || BuildEnvironmentOverride.Value != TargetBuildEnvironment.UniqueIfNeeded)
{
return;
}
if (UEBuildPlatformSDK.bHasAnySDKOverride)
{
// check if any platform needs a unique environment for the sdk check
foreach (UnrealTargetPlatform platform in UnrealTargetPlatform.GetValidPlatforms())
{
if (IsSDKVersionRelevant(platform))
{
UEBuildPlatformSDK? sdk = UEBuildPlatformSDK.GetSDKForPlatform(platform.ToString());
if (sdk != null && sdk.bHasSDKOverride)
{
logger.LogInformation("Setting {Target}'s BuildEnvironment to Unique, because a project overrode the {Platform} sdk version", Name, platform);
BuildEnvironment = TargetBuildEnvironment.Unique;
break;
}
}
}
}
// if we didn't set it above, check the properties
if (BuildEnvironmentOverride.Value == TargetBuildEnvironment.UniqueIfNeeded)
{
Dictionary propNames = new();
string? baseTargetName;
if (RequiresUniqueEnvironment(rulesAssembly, arguments, propNames, out baseTargetName))
{
logger.LogInformation("Setting {Target}'s BuildEnvironment to Unique, because it had changed the values of the propertues [ {Props} ] away from the values specified in {BaseTarget}",
Name, String.Join(", ", propNames.Select(x => $"{x.Key}: {x.Value.Item1} != {x.Value.Item2}")), baseTargetName);
BuildEnvironment = TargetBuildEnvironment.Unique;
}
else
{
BuildEnvironment = TargetBuildEnvironment.Shared;
}
}
}
static bool CheckValuesMatch(Type valueType, object? thisValue, object? baseValue)
{
// Check if the fields match, treating lists of strings (eg. definitions) differently to value types.
bool bFieldsMatch;
if (thisValue == null || baseValue == null)
{
bFieldsMatch = (thisValue == baseValue);
}
else if (typeof(IEnumerable).IsAssignableFrom(valueType))
{
bFieldsMatch = Enumerable.SequenceEqual((IEnumerable)thisValue, (IEnumerable)baseValue);
}
else
{
bFieldsMatch = thisValue.Equals(baseValue);
}
return bFieldsMatch;
}
///
/// Create a TargetRules instance
///
/// Type to create
/// Target info
/// Path to the file for the rules assembly
/// Path to the platform specific rules file
/// Path to all possible rules file
///
/// Logger for the new target rules
/// Target instance
public static TargetRules Create(Type rulesType, TargetInfo targetInfo, FileReference? baseFile, FileReference? platformFile, IEnumerable? targetFiles, BuildSettingsVersion? defaultBuildSettings, ILogger logger)
{
TargetRules rules = (TargetRules)RuntimeHelpers.GetUninitializedObject(rulesType);
if (defaultBuildSettings.HasValue)
{
rules.DefaultBuildSettings = defaultBuildSettings.Value;
}
// The base target file name: this affects where the resulting build product is created so the platform/group is not desired in this case.
rules.File = baseFile;
// The platform/group-specific target file name
rules.TargetSourceFile = platformFile;
// All target files for this target that could cause invalidation
rules.TargetFiles = targetFiles?.ToHashSet() ?? new();
// Initialize the logger
rules.Logger = logger;
// Find the constructor
ConstructorInfo? constructor = rulesType.GetConstructor(new Type[] { typeof(TargetInfo) })
?? throw new CompilationResultException(CompilationResult.RulesError, KnownLogEvents.RulesAssembly, "No constructor found on {TargetName} which takes an argument of type TargetInfo.", rulesType.Name);
// Invoke the regular constructor
try
{
constructor.Invoke(rules, new object[] { targetInfo });
CppCompileWarnings.ApplyTargetDefaults(rules.CppCompileWarningSettings);
}
catch (Exception ex)
{
throw new CompilationResultException(CompilationResult.RulesError, ex, KnownLogEvents.RulesAssembly, "Unable to instantiate instance of '{TargetName}' object type from compiled assembly '{AssemblyPath}'. Unreal Build Tool creates an instance of your module's 'Rules' object in order to find out about your module's requirements. The CLR exception details may provide more information: {ExceptionMessage}",
rulesType.Name, Path.GetFileNameWithoutExtension(rulesType.Assembly?.Location) ?? "Unknown Assembly", ex.ToString());
}
return rules;
}
///
/// Validate the target rules for its current platform when using modular build
///
/// Rules to validate
/// Explicit platform to use
public static void ValidateMergedTarget(TargetRules target, UnrealTargetPlatform platform)
{
UEBuildPlatform BuildPlatform = UEBuildPlatform.GetBuildPlatform(platform);
BuildPlatform.ValidateMergedTarget(target);
}
///
/// Constructor.
///
/// Information about the target being built
protected TargetRules(TargetInfo target)
{
DefaultName = target.Name;
Platform = target.Platform;
Configuration = target.Configuration;
Architectures = target.Architectures;
IntermediateEnvironment = target.IntermediateEnvironment;
ProjectFile = target.ProjectFile;
Version = target.Version;
WindowsPlatform = new WindowsTargetRules(this);
CppCompileWarningSettings = new CppCompileWarnings(this, Logger);
// Make sure the logger was initialized by the caller
if (Logger == null)
{
throw new NotSupportedException("Logger property must be initialized by the caller.");
}
// TODO: Need to get the compression setting from UBA so we can invalidate actions if the compression changes.
// Figure out a better way to do this.
{
UnrealBuildAcceleratorConfig ubaConfig = new();
XmlConfig.ApplyTo(ubaConfig);
bAllowUbaCompression = ubaConfig.bStoreObjFilesCompressed;
}
// Read settings from config files
Dictionary?> configValues = new Dictionary?>();
foreach (object configurableObject in GetConfigurableObjects())
{
ConfigCache.ReadSettings(DirectoryReference.FromFile(ProjectFile), Platform, configurableObject, configValues, target.Arguments);
XmlConfig.ApplyTo(configurableObject);
target.Arguments?.ApplyTo(configurableObject);
}
ConfigValueTracker = new ConfigValueTracker(configValues);
// If we've got a changelist set, set that we're making a formal build
bFormalBuild = bFormalBuild || (Version.Changelist != 0 && Version.IsPromotedBuild);
// Allow the build platform to set defaults for this target
UEBuildPlatform.GetBuildPlatform(Platform).ResetTarget(this);
bDeployAfterCompile = !bForceSkipDeploy && bDeployAfterCompile;
// Determine intermediate environment overrides based on command line flags
if (StaticAnalyzer != StaticAnalyzer.None)
{
// Always override environment for analyzing, regardless of other settings
IntermediateEnvironment = UnrealIntermediateEnvironment.Analyze;
}
else if (IntermediateEnvironment == UnrealIntermediateEnvironment.Default)
{
if (bIWYU)
{
IntermediateEnvironment = UnrealIntermediateEnvironment.IWYU;
}
else if (!bUseUnityBuild)
{
IntermediateEnvironment = UnrealIntermediateEnvironment.NonUnity;
}
}
// Set the default build version
if (String.IsNullOrEmpty(BuildVersion))
{
if (String.IsNullOrEmpty(target.Version.BuildVersionString))
{
BuildVersion = String.Format("{0}-CL-{1}", target.Version.BranchName, target.Version.Changelist);
}
else
{
BuildVersion = target.Version.BuildVersionString;
}
}
// Get the directory to use for crypto settings. We can build engine targets (eg. UHT) with
// a project file, but we can't use that to determine crypto settings without triggering
// constant rebuilds of UHT.
DirectoryReference? cryptoSettingsDir = DirectoryReference.FromFile(ProjectFile);
if (cryptoSettingsDir != null && File != null && !File.IsUnderDirectory(cryptoSettingsDir))
{
cryptoSettingsDir = null;
}
// Setup macros for signing and encryption keys
EncryptionAndSigning.CryptoSettings cryptoSettings = EncryptionAndSigning.ParseCryptoSettings(cryptoSettingsDir, Platform, Logger);
if (cryptoSettings.IsAnyEncryptionEnabled())
{
ProjectDefinitions.Add(String.Format("IMPLEMENT_ENCRYPTION_KEY_REGISTRATION()=UE_REGISTER_ENCRYPTION_KEY({0})", FormatHexBytes(cryptoSettings.EncryptionKey!.Key!)));
}
else
{
ProjectDefinitions.Add("IMPLEMENT_ENCRYPTION_KEY_REGISTRATION()=");
}
if (cryptoSettings.IsPakSigningEnabled())
{
ProjectDefinitions.Add(String.Format("IMPLEMENT_SIGNING_KEY_REGISTRATION()=UE_REGISTER_SIGNING_KEY(UE_LIST_ARGUMENT({0}), UE_LIST_ARGUMENT({1}))", FormatHexBytes(cryptoSettings.SigningKey!.PublicKey.Exponent!), FormatHexBytes(cryptoSettings.SigningKey.PublicKey.Modulus!)));
}
else
{
ProjectDefinitions.Add("IMPLEMENT_SIGNING_KEY_REGISTRATION()=");
}
}
///
/// Formats an array of bytes as a sequence of values
///
/// The data to convert into a string
/// List of hexadecimal bytes
private static string FormatHexBytes(byte[] data)
{
return String.Join(",", data.Select(x => String.Format("0x{0:X2}", x)));
}
///
/// Override any settings required for the selected target type
///
internal void SetOverridesForTargetType()
{
if (Type == global::UnrealBuildTool.TargetType.Game)
{
GlobalDefinitions.Add("UE_GAME=1");
}
else if (Type == global::UnrealBuildTool.TargetType.Client)
{
GlobalDefinitions.Add("UE_GAME=1");
GlobalDefinitions.Add("UE_CLIENT=1");
}
else if (Type == global::UnrealBuildTool.TargetType.Editor)
{
GlobalDefinitions.Add("UE_EDITOR=1");
}
else if (Type == global::UnrealBuildTool.TargetType.Server)
{
GlobalDefinitions.Add("UE_SERVER=1");
GlobalDefinitions.Add("USE_NULL_RHI=1");
}
}
///
/// Override settings that all cooked editor targets will want
///
protected void SetDefaultsForCookedEditor(bool bIsCookedCooker, bool bIsForExternalUse)
{
LinkType = TargetLinkType.Monolithic;
BuildEnvironment = TargetBuildEnvironment.Unique;
if (!bIsCookedCooker)
{
bBuildAdditionalConsoleApp = false;
}
GlobalDefinitions.Add("ASSETREGISTRY_FORCE_PREMADE_REGISTRY_IN_EDITOR=1");
bUseLoggingInShipping = true;
GlobalDefinitions.Add("UE_IS_COOKED_EDITOR=1");
// remove some insecure things external users may not want
if (bIsForExternalUse)
{
bWithServerCode = false;
bBuildTargetDeveloperTools = false;
GlobalDefinitions.Add("AUTOSDKS_ENABLED=0");
}
// this will allow shader compiling to work based on whether or not the shaders directory is present
// to determine if we should allow shader compilation
GlobalDefinitions.Add("UE_ALLOW_SHADER_COMPILING_BASED_ON_SHADER_DIRECTORY_EXISTENCE=1");
// this setting can be used to compile out the shader compiler if that is important
//GlobalDefinitions.Add("UE_ALLOW_SHADER_COMPILING=0");
ConfigHierarchy projectGameIni = ConfigCache.ReadHierarchy(ConfigHierarchyType.Game, ProjectFile?.Directory, Platform);
List? disabledPlugins;
List allDisabledPlugins = new List();
if (projectGameIni.GetArray("CookedEditorSettings", "DisabledPlugins", out disabledPlugins))
{
allDisabledPlugins.AddRange(disabledPlugins);
}
if (projectGameIni.GetArray("CookedEditorSettings" + (bIsCookedCooker ? "_CookedCooker" : "_CookedEditor"), "DisabledPlugins", out disabledPlugins))
{
allDisabledPlugins.AddRange(disabledPlugins);
}
if (Configuration == UnrealTargetConfiguration.Shipping)
{
if (projectGameIni.GetArray("CookedEditorSettings", "DisabledPluginsInShipping", out disabledPlugins))
{
allDisabledPlugins.AddRange(disabledPlugins);
}
if (projectGameIni.GetArray("CookedEditorSettings" + (bIsCookedCooker ? "_CookedCooker" : "_CookedEditor"), "DisabledPluginsInShipping", out disabledPlugins))
{
allDisabledPlugins.AddRange(disabledPlugins);
}
}
// disable them, and remove them from Enabled in case they were there
foreach (string pluginName in allDisabledPlugins)
{
DisablePlugins.Add(pluginName);
EnablePlugins.Remove(pluginName);
OptionalPlugins.Remove(pluginName);
}
}
///
/// Gets a list of platforms that this target supports
///
/// Array of platforms that the target supports
internal UnrealTargetPlatform[] GetSupportedPlatforms()
{
// Take the SupportedPlatformsAttribute from the first type in the inheritance chain that supports it
for (Type? currentType = GetType(); currentType != null; currentType = currentType.BaseType)
{
object[] attributes = currentType.GetCustomAttributes(typeof(SupportedPlatformsAttribute), false);
if (attributes.Length > 0)
{
return attributes.OfType().SelectMany(x => x.Platforms).Distinct().ToArray();
}
}
// Otherwise, get the default for the target type
if (Type == TargetType.Program)
{
return Utils.GetPlatformsInClass(UnrealPlatformClass.Desktop);
}
else if (Type == TargetType.Editor)
{
return Utils.GetPlatformsInClass(UnrealPlatformClass.Editor);
}
else if (Type == TargetType.Server)
{
return Utils.GetPlatformsInClass(UnrealPlatformClass.Server);
}
else
{
return Utils.GetPlatformsInClass(UnrealPlatformClass.All);
}
}
///
/// Gets a list of configurations that this target supports
///
/// Array of configurations that the target supports
internal UnrealTargetConfiguration[] GetSupportedConfigurations()
{
// Otherwise take the SupportedConfigurationsAttribute from the first type in the inheritance chain that supports it
for (Type? currentType = GetType(); currentType != null; currentType = currentType.BaseType)
{
object[] attributes = currentType.GetCustomAttributes(typeof(SupportedConfigurationsAttribute), false);
if (attributes.Length > 0)
{
return attributes.OfType().SelectMany(x => x.Configurations).Distinct().ToArray();
}
}
// Otherwise, get the default for the target type
if (Type == TargetType.Editor)
{
return new[] { UnrealTargetConfiguration.Debug, UnrealTargetConfiguration.DebugGame, UnrealTargetConfiguration.Development };
}
else
{
return ((UnrealTargetConfiguration[])Enum.GetValues(typeof(UnrealTargetConfiguration))).Where(x => x != UnrealTargetConfiguration.Unknown).ToArray();
}
}
///
/// Finds all the subobjects which can be configured by command line options and config files
///
/// Sequence of objects
internal IEnumerable