// Copyright Epic Games, Inc. All Rights Reserved. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using EpicGames.Core; using UnrealBuildBase; namespace UnrealBuildTool { /// /// Encapsulates the environment that is used to link object files. /// class LinkEnvironment { /// /// The platform to be compiled/linked for. /// public readonly UnrealTargetPlatform Platform; /// /// The configuration to be compiled/linked for. /// public readonly CppConfiguration Configuration; /// /// The architecture that is being compiled/linked (empty string by default) /// public readonly string Architecture; /// /// On Mac, indicates the path to the target's application bundle /// public DirectoryReference? BundleDirectory; /// /// The directory to put the non-executable files in (PDBs, import library, etc) /// public DirectoryReference? OutputDirectory; /// /// Intermediate file directory /// public DirectoryReference? IntermediateDirectory; /// /// The directory to shadow source files in for syncing to remote compile servers /// public DirectoryReference? LocalShadowDirectory = null; /// /// The file path for the executable file that is output by the linker. /// public List OutputFilePaths = new List(); /// /// Returns the OutputFilePath is there is only one entry in OutputFilePaths /// public FileReference OutputFilePath { get { if (OutputFilePaths.Count != 1) { throw new BuildException("Attempted to use LinkEnvironmentConfiguration.OutputFilePath property, but there are multiple (or no) OutputFilePaths. You need to handle multiple in the code that called this (size = {0})", OutputFilePaths.Count); } return OutputFilePaths[0]; } } /// /// List of libraries to link in /// public List Libraries = new List(); /// /// A list of additional libraries to link in (using the list of library search paths) /// public List SystemLibraries = new List(); /// /// A list of the paths used to find libraries. /// public List SystemLibraryPaths = new List(); /// /// A list of libraries to exclude from linking. /// public List ExcludedLibraries = new List(); /// /// Paths to add as search paths for runtime libraries /// public List RuntimeLibraryPaths = new List(); /// /// A list of additional frameworks to link in. /// public List AdditionalFrameworks = new List(); /// /// The iOS/Mac frameworks to link in /// public List Frameworks = new List(); public List WeakFrameworks = new List(); /// /// iOS/Mac resources that should be copied to the app bundle /// public List AdditionalBundleResources = new List(); /// /// A list of the dynamically linked libraries that shouldn't be loaded until they are first called /// into. /// public List DelayLoadDLLs = new List(); /// /// Additional arguments to pass to the linker. /// public string AdditionalArguments = ""; /// /// True if debug info should be created. /// public bool bCreateDebugInfo = true; /// /// 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. /// public bool bGenerateRuntimeSymbolFiles = true; /// /// True if debug symbols that are cached for some platforms should not be created. /// public bool bDisableSymbolCache = false; /// /// True if we're compiling .cpp files that will go into a library (.lib file) /// public bool bIsBuildingLibrary = false; /// /// True if we're compiling a DLL /// public bool bIsBuildingDLL = false; /// /// Whether we should compile using the statically-linked CRT. This is not widely supported for the whole engine, but is required for programs that need to run without dependencies. /// public bool bUseStaticCRT = false; /// /// Whether to use the debug CRT in debug configurations /// public bool bUseDebugCRT = false; /// /// True if this is a console application that's being build /// public bool bIsBuildingConsoleApplication = false; /// /// If set, overrides the program entry function on Windows platform. This is used by the base Unreal /// program so we can link in either command-line mode or windowed mode without having to recompile the Launch module. /// public string WindowsEntryPointOverride = String.Empty; /// /// True if we're building a EXE/DLL target with an import library, and that library is needed by a dependency that /// we're directly dependent on. /// public bool bIsCrossReferenced = false; /// /// True if the application we're linking has any exports, and we should be expecting the linker to /// generate a .lib and/or .exp file along with the target output file /// public bool bHasExports = true; /// /// True if we're building a .NET assembly (e.g. C# project) /// public bool bIsBuildingDotNetAssembly = false; /// /// The default stack memory size allocation /// public int DefaultStackSize = 5000000; /// /// The amount of the default stack size to commit initially. Set to 0 to allow the OS to decide. /// public int DefaultStackSizeCommit = 0; /// /// Whether to optimize for minimal code size /// public bool bOptimizeForSize = false; /// /// Whether to omit frame pointers or not. Disabling is useful for e.g. memory profiling on the PC /// public bool bOmitFramePointers = true; /// /// Whether to support edit and continue. Only works on Microsoft compilers in 32-bit compiles. /// public bool bSupportEditAndContinue; /// /// Whether to use incremental linking or not. /// public bool bUseIncrementalLinking; /// /// Whether to allow the use of LTCG (link time code generation) /// public bool bAllowLTCG; /// /// Whether to enable Profile Guided Optimization (PGO) instrumentation in this build. /// public bool bPGOProfile; /// /// Whether to optimize this build with Profile Guided Optimization (PGO). /// public bool bPGOOptimize; /// /// Platform specific directory where PGO profiling data is stored. /// public string? PGODirectory; /// /// Platform specific filename where PGO profiling data is saved. /// public string? PGOFilenamePrefix; /// /// Whether to request the linker create a map file as part of the build /// public bool bCreateMapFile; /// /// Whether PDB files should be used for Visual C++ builds. /// public bool bUsePDBFiles; /// /// Whether to use the :FASTLINK option when building with /DEBUG to create local PDBs /// public bool bUseFastPDBLinking; /// /// Whether to ignore dangling (i.e. unresolved external) symbols in modules /// public bool bIgnoreUnresolvedSymbols; /// /// Whether to log detailed timing information /// public bool bPrintTimingInfo; /// /// 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 /// public string? PackagePath; /// /// Directory where to put crash report files for platforms that support it /// public string? CrashDiagnosticDirectory; /// /// Bundle version for Mac apps /// public string? BundleVersion; /// /// When building a dynamic library on Apple platforms, specifies the installed name for other binaries that link against it. /// public string? InstallName; /// /// A list of the object files to be linked. /// public List InputFiles = new List(); /// /// The default resource file to link in to every binary if a custom one is not provided /// public List DefaultResourceFiles = new List(); /// /// Resource files which should be compiled into every binary /// public List CommonResourceFiles = new List(); /// /// List of functions that should be exported from this module /// public List IncludeFunctions = new List(); /// /// Provides a Module Definition File (.def) to the linker to describe various attributes of a DLL. /// Necessary when exporting functions by ordinal values instead of by name. /// public string? ModuleDefinitionFile; /// /// All the additional properties from the modules linked into this binary /// public List AdditionalProperties = new List(); /// /// Default constructor. /// public LinkEnvironment(UnrealTargetPlatform Platform, CppConfiguration Configuration, string Architecture) { this.Platform = Platform; this.Configuration = Configuration; this.Architecture = Architecture; } /// /// Copy constructor. /// public LinkEnvironment(LinkEnvironment Other) { Platform = Other.Platform; Configuration = Other.Configuration; Architecture = Other.Architecture; BundleDirectory = Other.BundleDirectory; OutputDirectory = Other.OutputDirectory; IntermediateDirectory = Other.IntermediateDirectory; LocalShadowDirectory = Other.LocalShadowDirectory; OutputFilePaths = Other.OutputFilePaths.ToList(); Libraries.AddRange(Other.Libraries); SystemLibraries.AddRange(Other.SystemLibraries); SystemLibraryPaths.AddRange(Other.SystemLibraryPaths); ExcludedLibraries.AddRange(Other.ExcludedLibraries); RuntimeLibraryPaths.AddRange(Other.RuntimeLibraryPaths); Frameworks.AddRange(Other.Frameworks); AdditionalFrameworks.AddRange(Other.AdditionalFrameworks); WeakFrameworks.AddRange(Other.WeakFrameworks); AdditionalBundleResources.AddRange(Other.AdditionalBundleResources); DelayLoadDLLs.AddRange(Other.DelayLoadDLLs); AdditionalArguments = Other.AdditionalArguments; bCreateDebugInfo = Other.bCreateDebugInfo; bGenerateRuntimeSymbolFiles = Other.bGenerateRuntimeSymbolFiles; bIsBuildingLibrary = Other.bIsBuildingLibrary; bDisableSymbolCache = Other.bDisableSymbolCache; bIsBuildingDLL = Other.bIsBuildingDLL; bUseStaticCRT = Other.bUseStaticCRT; bUseDebugCRT = Other.bUseDebugCRT; bIsBuildingConsoleApplication = Other.bIsBuildingConsoleApplication; WindowsEntryPointOverride = Other.WindowsEntryPointOverride; bIsCrossReferenced = Other.bIsCrossReferenced; bHasExports = Other.bHasExports; bIsBuildingDotNetAssembly = Other.bIsBuildingDotNetAssembly; DefaultStackSize = Other.DefaultStackSize; DefaultStackSizeCommit = Other.DefaultStackSizeCommit; bOptimizeForSize = Other.bOptimizeForSize; bOmitFramePointers = Other.bOmitFramePointers; bSupportEditAndContinue = Other.bSupportEditAndContinue; bUseIncrementalLinking = Other.bUseIncrementalLinking; bAllowLTCG = Other.bAllowLTCG; bPGOOptimize = Other.bPGOOptimize; bPGOProfile = Other.bPGOProfile; PGODirectory = Other.PGODirectory; PGOFilenamePrefix = Other.PGOFilenamePrefix; bCreateMapFile = Other.bCreateMapFile; bUsePDBFiles = Other.bUsePDBFiles; bUseFastPDBLinking = Other.bUseFastPDBLinking; bIgnoreUnresolvedSymbols = Other.bIgnoreUnresolvedSymbols; bPrintTimingInfo = Other.bPrintTimingInfo; PackagePath = Other.PackagePath; CrashDiagnosticDirectory = Other.CrashDiagnosticDirectory; BundleVersion = Other.BundleVersion; InstallName = Other.InstallName; InputFiles.AddRange(Other.InputFiles); DefaultResourceFiles.AddRange(Other.DefaultResourceFiles); CommonResourceFiles.AddRange(Other.CommonResourceFiles); IncludeFunctions.AddRange(Other.IncludeFunctions); ModuleDefinitionFile = Other.ModuleDefinitionFile; AdditionalProperties.AddRange(Other.AdditionalProperties); } } }