// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. using System; using System.IO; using System.Collections.Generic; using System.Xml; using System.Reflection; namespace UnrealBuildTool { public class BuildConfiguration { static BuildConfiguration() { if (!UnrealBuildTool.bIsSafeToReferenceConfigurationValues) { throw new BuildException("UEBuildConfiguration was referenced before the XmlConfig files could be loaded."); } } /// /// Whether to unify C++ code into larger files for faster compilation. /// [XmlConfig] public static bool bUseUnityBuild; /// /// Whether to _force_ unify C++ code into larger files for faster compilation. /// [XmlConfig] public static bool bForceUnityBuild; /// /// 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. /// [XmlConfig] public static int MinGameModuleSourceFilesForUnityBuild; /// /// New Monolithic Graphics drivers have optional "fast calls" replacing various D3d functions /// [XmlConfig] public static bool bUseFastMonoCalls; /// /// An approximate number of bytes of C++ code to target for inclusion in a single unified C++ file. /// [XmlConfig] public static int NumIncludedBytesPerUnityCPP; /// /// Whether to stress test the C++ unity build robustness by including all C++ files files in a project from a single unified file. /// [XmlConfig] public static bool bStressTestUnity; /// /// Whether headers in system paths should be checked for modification when determining outdated actions. /// [XmlConfig] public static bool bCheckSystemHeadersForModification; /// /// Whether headers in the Development\External folder should be checked for modification when determining outdated actions. /// [XmlConfig] public static bool bCheckExternalHeadersForModification; /// /// Whether to ignore import library files that are out of date when building targets. Set this to true to improve iteration time. /// [XmlConfig] public static bool bIgnoreOutdatedImportLibraries; /// /// Whether to globally disable debug info generation; see DebugInfoHeuristics.cs for per-config and per-platform options. /// [XmlConfig] public static bool bDisableDebugInfo; /// /// Whether to disable debug info on PC in development builds (for faster developer iteration, as link times are extremely fast with debug info disabled.) /// [XmlConfig] public static bool bOmitPCDebugInfoInDevelopment; /// /// Whether shadow variable warning should be enabled /// [XmlConfig] public static bool bEnableShadowVariableWarning; /// /// Whether PDB files should be used for Visual C++ builds. /// [XmlConfig] public static bool bUsePDBFiles; /// /// Whether PCH files should be used. /// [XmlConfig] public static bool bUsePCHFiles; /// /// Whether to generate command line dependencies for compile actions when requested /// [XmlConfig] public static bool bUseActionHistory; /// /// The minimum number of files that must use a pre-compiled header before it will be created and used. /// [XmlConfig] public static int MinFilesUsingPrecompiledHeader; /// /// 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 /// [XmlConfig] public static bool bForcePrecompiledHeaderForGameModules; /// /// Whether debug info should be written to the console. /// [XmlConfig] public static bool bPrintDebugInfo; /// /// Allows logging to a file /// [XmlConfig] public static string LogFilename; /// /// Prints performance diagnostics about include dependencies and other bits /// [XmlConfig] public static bool bPrintPerformanceInfo; /// /// Whether to log detailed action stats. This forces local execution. /// [XmlConfig] public static bool bLogDetailedActionStats; /// /// Whether to deploy the executable after compilation on platforms that require deployment. /// [XmlConfig] public static bool bDeployAfterCompile; /// /// Whether to clean Builds directory on a remote Mac before building /// [XmlConfig] public static bool bFlushBuildDirOnRemoteMac; /// /// Whether XGE may be used. /// [XmlConfig] public static bool bAllowXGE; /// /// Whether we should just export the XGE XML and pretend it succeeded /// [XmlConfig] public static bool bXGEExport; /// /// Whether to display the XGE build monitor. /// [XmlConfig] public static bool bShowXGEMonitor; /// /// When enabled, XGE will stop compiling targets after a compile error occurs. Recommended, as it saves computing resources for others. /// [XmlConfig] public static bool bStopXGECompilationAfterErrors; /// /// When enabled, allows XGE to compile pre-compiled header files on remote machines. Otherwise, PCHs are always generated locally. /// [XmlConfig] public static bool bAllowRemotelyCompiledPCHs; /// /// Whether SN-DBS may be used. /// [XmlConfig] public static bool bAllowSNDBS; /// /// Whether or not to delete outdated produced items. /// [XmlConfig] public static bool bShouldDeleteAllOutdatedProducedItems; /// /// Whether to use incremental linking or not. /// [XmlConfig] public static bool bUseIncrementalLinking; /// /// Whether to allow the use of LTCG (link time code generation) /// [XmlConfig] public static bool bAllowLTCG; /// /// Whether to support edit and continue. Only works on Microsoft compilers in 32-bit compiles. /// [XmlConfig] public static bool bSupportEditAndContinue; /// /// Whether to omit frame pointers or not. Disabling is useful for e.g. memory profiling on the PC /// [XmlConfig] public static bool bOmitFramePointers; /// /// Processor count multiplier for local execution. Can be below 1 to reserve CPU for other tasks. /// [XmlConfig] public static double ProcessorCountMultiplier; /// /// Maximum processor count for local execution. /// [XmlConfig] public static int MaxProcessorCount; /// /// The intermediate folder - i.e. Intermediate/Build. /// [XmlConfig] public static string BaseIntermediateFolder; /// /// Relative root engine path. /// private static string _RelativeEnginePath = "../../Engine/"; public static string RelativeEnginePath { get { return _RelativeEnginePath; } set { _RelativeEnginePath = value; } } /// /// The path to the intermediate folder, relative to Engine/Source. /// public static string BaseIntermediatePath { get { return RelativeEnginePath + BaseIntermediateFolder; } } /// /// The intermediate folder - i.e. Intermediate/Build/Platform[-Architecture] for the current platform /// private static string _PlatformIntermediateFolder = null; public static string PlatformIntermediateFolder { get { if (_PlatformIntermediateFolder == null) { throw new BuildException("Attempted to use PlatformIntermediateFolder before it was initialized"); } return _PlatformIntermediateFolder; } set { _PlatformIntermediateFolder = value; } } /// /// The path to the platform intermediate folder, relative to Engine/Source. /// public static string PlatformIntermediatePath { get { return RelativeEnginePath + PlatformIntermediateFolder; } } /// /// Whether to generate a dSYM file or not. /// [XmlConfig] public static bool bGeneratedSYMFile; /// /// Whether to strip iOS symbols or not (implied by bGeneratedSYMFile). /// [XmlConfig] public static bool bStripSymbolsOnIOS; /// /// If true, then a stub IPA will be generated when compiling is done (minimal files needed for a valid IPA) /// [XmlConfig] public static bool bCreateStubIPA; /// /// If true, then a stub IPA will be generated when compiling is done (minimal files needed for a valid IPA) /// [XmlConfig] public static bool bCopyAppBundleBackToDevice; /// /// If true, then enable memory profiling in the build (defines USE_MALLOC_PROFILER=1 and forces bOmitFramePointers=false) /// [XmlConfig] public static bool bUseMallocProfiler; /// /// Enables code analysis mode. Currently, this has specific requirements. It only works on Windows /// platform with the MSVC compiler. Also, it requires a version of the compiler that supports the /// /analyze option, such as Visual Studio 2013 /// [XmlConfig] public static bool bEnableCodeAnalysis; /// /// Enables "Shared PCHs", an experimental feature which may significantly speed up compile times by attempting to /// share certain PCH files between modules that UBT detects is including those PCH's header files /// [XmlConfig] public static bool bUseSharedPCHs; /// /// Whether the dependency cache includes pre-resolved include locations so UBT doesn't have to re-resolve each include location just to check the timestamp. /// This is technically not fully correct because the dependency cache is global and each module could have a different set of include paths that could cause headers /// to resolve files differently. In practice this is not the case, and significantly speeds up UBT when nothing is to be done. /// [XmlConfig] public static bool bUseIncludeDependencyResolveCache; /// /// Used to test the dependency resolve cache. This will verify the resolve cache has no conflicts by resolving every time and checking against any previous resolve attempts. /// [XmlConfig] public static bool bTestIncludeDependencyResolveCache; /// /// True if we should compile Debug builds using Debug CRT libs and Debug third party dependencies. Otherwise, we'll actually /// compile against the Release CRT but leave optimizations turned off, so that it is still easy to debug. If you enable this /// setting, actual Debug versions of third party static libraries will be needed when compiling in Debug. /// [XmlConfig] public static bool bDebugBuildsActuallyUseDebugCRT; /// /// Tells the UBT to check if module currently being built is violating EULA. /// [XmlConfig] public static bool bCheckLicenseViolations; /// /// Tells the UBT to break build if module currently being built is violating EULA. /// [XmlConfig] public static bool bBreakBuildOnLicenseViolation; /// /// Enables support for very fast iterative builds by caching target data. Turning this on causes Unreal Build Tool to emit /// 'UBT Makefiles' for targets when they're built the first time. Subsequent builds will load these Makefiles and begin /// outdatedness checking and build invocation very quickly. The caveat is that if source files are added or removed to /// the project, UBT will need to gather information about those in order for your build to complete successfully. Currently, /// you must run the project file generator after adding/removing source files to tell UBT to re-gather this information. /// /// Events that can invalidate the 'UBT Makefile': /// - Adding/removing .cpp files /// - Adding/removing .h files with UObjects /// - Adding new UObject types to a file that didn't previously have any /// - Changing global build settings (most settings in this file qualify.) /// - Changed code that affects how Unreal Header Tool works /// /// You can force regeneration of the 'UBT Makefile' by passing the '-gather' argument, or simply regenerating project files /// /// This also enables the fast include file dependency scanning and caching system that allows Unreal Build Tool to detect out /// of date dependencies very quickly. When enabled, a deep C++ include graph does not have to be generated, and instead /// we only scan and cache indirect includes for after a dependent build product was already found to be out of date. During the /// next build, we'll load those cached indirect includes and check for outdatedness. /// [XmlConfig] public static bool bUseUBTMakefiles; /// /// Whether DMUCS/Distcc may be used. /// [XmlConfig] public static bool bAllowDistcc; /// /// When enabled allows DMUCS/Distcc to fallback to local compilation when remote compiling fails. Defaults to true as separation of pre-process and compile stages can introduce non-fatal errors. /// [XmlConfig] public static bool bAllowDistccLocalFallback; /// /// Path to the Distcc & DMUCS executables. /// [XmlConfig] public static string DistccExecutablesPath; /// /// Run UnrealCodeAnalyzer instead of regular compilation. /// [XmlConfig] public static bool bRunUnrealCodeAnalyzer; /// /// Percentage of cpp files in module where header must be included to get included in PCH. /// [XmlConfig] public static float UCAUsageThreshold; /// /// If specified, UnrealCodeAnalyzer will analyze only specific module. /// [XmlConfig] public static string UCAModuleToAnalyze; /// /// Sets the configuration back to defaults. /// public static void LoadDefaults() { bAllowLTCG = false; bAllowRemotelyCompiledPCHs = false; bAllowXGE = true; bAllowSNDBS = true; // Don't bother to check external (stable) headers for modification. It slows down UBT's dependency checking. bCheckExternalHeadersForModification = false; bCheckSystemHeadersForModification = false; bCopyAppBundleBackToDevice = false; bCreateStubIPA = true; bDeployAfterCompile = false; bDisableDebugInfo = false; bEnableCodeAnalysis = false; bFlushBuildDirOnRemoteMac = false; bGeneratedSYMFile = false; bStripSymbolsOnIOS = bGeneratedSYMFile; // By default we don't bother relinking targets if only a dependent .lib has changed, as chances are that // the import library wasn't actually different unless a dependent header file of this target was also changed, // in which case the target would be rebuilt automatically. bIgnoreOutdatedImportLibraries = true; bLogDetailedActionStats = false; bOmitFramePointers = true; bOmitPCDebugInfoInDevelopment = false; bPrintDebugInfo = false; bPrintPerformanceInfo = false; bShouldDeleteAllOutdatedProducedItems = false; bShowXGEMonitor = false; bStopXGECompilationAfterErrors = true; bStressTestUnity = false; bSupportEditAndContinue = false; bUseActionHistory = true; bEnableShadowVariableWarning = false; // Incremental linking can yield faster iteration times when making small changes // NOTE: We currently don't use incremental linking because it tends to behave a bit buggy on some computers (PDB-related compile errors) bUseIncrementalLinking = false; bUseMallocProfiler = false; bUsePDBFiles = false; bUsePCHFiles = true; // Shared PCHs are necessary to avoid generating tons of private PCH files for every single little module. While // these private PCHs do yield fastest incremental compiles for single files, it causes full rebuilds to // take an inordinate amount of time, and intermediates will use up many gigabytes of disk space. bUseSharedPCHs = true; // Using unity build to coalesce source files allows for much faster full rebuild times. For fastest iteration times on single-file // changes, consider turning this off. In some cases, unity builds can cause linker errors after iterative changes to files, because // the synthesized file names for unity code files may change between builds. bUseUnityBuild = true; bForceUnityBuild = false; // For programmers working on gameplay code, it's convenient to have fast iteration times when changing only single source // files. We've set this default such that smaller gameplay modules will not use the unity build feature, allowing them // the fastest possible iterative compile times at the expense of slower full rebuild times. For larger game modules, unity // build will automatically be activated. MinGameModuleSourceFilesForUnityBuild = 32; // This controls how big unity files are. Use smaller values for faster iterative iteration times at the cost of slower full rebuild times. // This setting can greatly affect how effective parallelized compilation can be. NumIncludedBytesPerUnityCPP = 384 * 1024; // This sets the number of source files (post-unity-combine) in a module before we'll bother to generate a precompiled header // for that module. If you want the fastest iterative builds for non-header changes (at the expense of slower full rebuild times), // set this to value to 1 MinFilesUsingPrecompiledHeader = 6; // We want iterative changes to gameplay modules to be very fast! This makes full rebuilds for small game projects a bit slower, // but changes to individual code files will compile quickly. bForcePrecompiledHeaderForGameModules = true; // When using the local executor (not XGE), run a single action on each CPU core. Note that you can set this to a larger value // to get slightly faster build times in many cases, but your computer's responsiveness during compiling may be much worse. ProcessorCountMultiplier = 1.0; MaxProcessorCount = int.MaxValue; bTestIncludeDependencyResolveCache = false; // if we are testing the resolve cache, we require UBT to use it. bUseIncludeDependencyResolveCache = true; //IMPORTANT THIS IS THE MAIN SWITCH FOR MONO FAST CALLS // if this is set to true, then fast calls will be on by default on Dingo, and if false it will be off by default on Dingo. // This can be overridden by -fastmonocalls or -nofastmonocalls in the NMAKE params. bUseFastMonoCalls = false; // By default we use the Release C++ Runtime (CRT), even when compiling Debug builds. This is because the Debug C++ // Runtime isn't very 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. bDebugBuildsActuallyUseDebugCRT = false; // set up some paths BaseIntermediateFolder = "Intermediate/Build/"; // By default check and stop the build on EULA violation bCheckLicenseViolations = false; bBreakBuildOnLicenseViolation = true; // Enables support for fast include dependency scanning, as well as gathering data for 'UBT Makefiles', then quickly // assembling builds in subsequent runs using data in those cached makefiles // NOTE: This feature is new and has a number of known issues (search the code for '@todo ubtmake') bUseUBTMakefiles = !Utils.IsRunningOnMono; // @todo ubtmake: Needs support for Mac // Distcc requires some setup - so by default disable it so we don't break local or remote building bAllowDistcc = false; bAllowDistccLocalFallback = true; // The normal Posix place to install distcc/dmucs would be /usr/local so start there DistccExecutablesPath = "/usr/local/bin"; // By default compile code instead of analyzing it. bRunUnrealCodeAnalyzer = false; // If header is included in 30% or more cpp files in module it should be included in PCH. UCAUsageThreshold = 0.3f; // The default for normal Mac users should be to use DistCode which installs as an Xcode plugin and provides dynamic host management if (BuildHostPlatform.Current.Platform == UnrealTargetPlatform.Mac) { string UserDir = Environment.GetEnvironmentVariable("HOME"); string MacDistccExecutablesPath = UserDir + "/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Distcc 3.2.xcplugin/Contents/usr/bin"; // But we should use the standard Posix directory when not installed - a build farm would use a static .dmucs hosts file not DistCode. if (System.IO.Directory.Exists (MacDistccExecutablesPath)) { DistccExecutablesPath = MacDistccExecutablesPath; } } } /// /// Validates the configuration. E.g. some options are mutually exclusive whereof some imply others. Also /// some functionality is not available on all platforms. /// @warning: the order of validation is important /// /// Current configuration (e.g. development, debug, ...) /// Current platform (e.g. Win32, PS3, ...) /// True if debug info should be created public static void ValidateConfiguration(CPPTargetConfiguration Configuration, CPPTargetPlatform Platform, bool bCreateDebugInfo) { var BuildPlatform = UEBuildPlatform.GetBuildPlatformForCPPTargetPlatform(Platform); // E&C support. if( bSupportEditAndContinue ) { bUseIncrementalLinking = BuildPlatform.ShouldUseIncrementalLinking(Platform, Configuration); } // Incremental linking. if (bUseIncrementalLinking) { bUsePDBFiles = BuildPlatform.ShouldUsePDBFiles(Platform, Configuration, bCreateDebugInfo); } // Detailed stats if (bLogDetailedActionStats && bAllowXGE) { // Some build machines apparently have this turned on, so if you really want detailed stats, don't run with XGE bLogDetailedActionStats = false; } // PDB if (bUsePDBFiles) { // NOTE: Currently we allow XGE to run, even with PDBs, until we notice an issue with this bool bDisallowXGEWithPDBFiles = false; if (bDisallowXGEWithPDBFiles) { // Force local execution as we have one PDB for all files using the same PCH. This currently doesn't // scale well with XGE due to required networking bandwidth. Xoreax mentioned that this was going to // be fixed in a future version of the software. bAllowXGE = false; } } // Allow for the build platform to perform custom validation here... // NOTE: This CAN modify the static BuildConfiguration settings!!!! BuildPlatform.ValidateBuildConfiguration(Configuration, Platform, bCreateDebugInfo); if (!BuildPlatform.CanUseXGE()) { bAllowXGE = false; } if (!BuildPlatform.CanUseDistcc()) { bAllowDistcc = false; } if (!BuildPlatform.CanUseSNDBS()) { bAllowSNDBS = false; } } } }