// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Tools.DotNETCommon; namespace UnrealBuildTool { /// /// Encapsulates the environment that is used to link object files. /// class LinkEnvironment { /// /// The platform to be compiled/linked for. /// public readonly CppPlatform 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]; } } /// /// A list of the paths used to find libraries. /// public List LibraryPaths = new List(); /// /// A list of libraries to exclude from linking. /// public List ExcludedLibraries = new List(); /// /// A list of additional libraries to link in. /// public List AdditionalLibraries = 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 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; /// /// True if this is a console application that's being build /// public bool bIsBuildingConsoleApplication = false; /// /// This setting is replaced by UEBuildBinaryConfiguration.bBuildAdditionalConsoleApp. /// [Obsolete("This setting is replaced by UEBuildBinaryConfiguration.bBuildAdditionalConsoleApp. It is explicitly set to true for editor targets, and defaults to false otherwise.")] public bool bBuildAdditionalConsoleApplication { set { } } /// /// If set, overrides the program entry function on Windows platform. This is used by the base UE4 /// 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 to allow the use of ASLR (address space layout randomization) if supported. /// public bool bAllowASLR; /// /// 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 log detailed timing information /// public bool bPrintTimingInfo; /// /// 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(); /// /// A list of dependent static or import libraries that need to be linked. /// public List InputLibraries = 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(CppPlatform 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(); LibraryPaths.AddRange(Other.LibraryPaths); ExcludedLibraries.AddRange(Other.ExcludedLibraries); AdditionalLibraries.AddRange(Other.AdditionalLibraries); 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; bIsBuildingLibrary = Other.bIsBuildingLibrary; bDisableSymbolCache = Other.bDisableSymbolCache; bIsBuildingDLL = Other.bIsBuildingDLL; 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; bAllowASLR = Other.bAllowASLR; bUsePDBFiles = Other.bUsePDBFiles; bUseFastPDBLinking = Other.bUseFastPDBLinking; bPrintTimingInfo = Other.bPrintTimingInfo; BundleVersion = Other.BundleVersion; InstallName = Other.InstallName; InputFiles.AddRange(Other.InputFiles); InputLibraries.AddRange(Other.InputLibraries); DefaultResourceFiles.AddRange(Other.DefaultResourceFiles); CommonResourceFiles.AddRange(Other.CommonResourceFiles); IncludeFunctions.AddRange(Other.IncludeFunctions); ModuleDefinitionFile = Other.ModuleDefinitionFile; AdditionalProperties.AddRange(Other.AdditionalProperties); } } }