Example #1
0
        /// <summary>
        /// Sets up the environment for linking this module.
        /// </summary>
        public virtual void SetupPrivateLinkEnvironment(
            UEBuildBinary SourceBinary,
            LinkEnvironment LinkEnvironment,
            List <UEBuildBinary> BinaryDependencies,
            HashSet <UEBuildModule> VisitedModules,
            DirectoryReference ExeDir
            )
        {
            // Add the private rpaths
            LinkEnvironment.RuntimeLibraryPaths.AddRange(ExpandPathVariables(Rules.PrivateRuntimeLibraryPaths, SourceBinary.OutputDir, ExeDir));

            // Allow the module's public dependencies to add library paths and additional libraries to the link environment.
            SetupPublicLinkEnvironment(SourceBinary, LinkEnvironment.LibraryPaths, LinkEnvironment.AdditionalLibraries, LinkEnvironment.RuntimeLibraryPaths, LinkEnvironment.Frameworks, LinkEnvironment.WeakFrameworks,
                                       LinkEnvironment.AdditionalFrameworks, LinkEnvironment.AdditionalShadowFiles, LinkEnvironment.AdditionalBundleResources, LinkEnvironment.DelayLoadDLLs, BinaryDependencies, VisitedModules, ExeDir);

            // Also allow the module's public and private dependencies to modify the link environment.
            List <UEBuildModule> AllDependencyModules = new List <UEBuildModule>();

            AllDependencyModules.AddRange(PrivateDependencyModules);
            AllDependencyModules.AddRange(PublicDependencyModules);

            foreach (UEBuildModule DependencyModule in AllDependencyModules)
            {
                DependencyModule.SetupPublicLinkEnvironment(SourceBinary, LinkEnvironment.LibraryPaths, LinkEnvironment.AdditionalLibraries, LinkEnvironment.RuntimeLibraryPaths, LinkEnvironment.Frameworks, LinkEnvironment.WeakFrameworks,
                                                            LinkEnvironment.AdditionalFrameworks, LinkEnvironment.AdditionalShadowFiles, LinkEnvironment.AdditionalBundleResources, LinkEnvironment.DelayLoadDLLs, BinaryDependencies, VisitedModules, ExeDir);
            }
        }
        /// <summary>
        /// Sets up the environment for linking this module.
        /// </summary>
        public virtual void SetupPrivateLinkEnvironment(
            UEBuildBinary SourceBinary,
            LinkEnvironment LinkEnvironment,
            List <UEBuildBinary> BinaryDependencies,
            HashSet <UEBuildModule> VisitedModules,
            DirectoryReference ExeDir
            )
        {
            // Add the private rpaths
            LinkEnvironment.RuntimeLibraryPaths.AddRange(ExpandPathVariables(Rules.PrivateRuntimeLibraryPaths, SourceBinary.OutputDir, ExeDir));

            // Allow the module's public dependencies to add library paths and additional libraries to the link environment.
            SetupPublicLinkEnvironment(SourceBinary, LinkEnvironment.LibraryPaths, LinkEnvironment.AdditionalLibraries, LinkEnvironment.RuntimeLibraryPaths, LinkEnvironment.Frameworks, LinkEnvironment.WeakFrameworks,
                                       LinkEnvironment.AdditionalFrameworks, LinkEnvironment.AdditionalBundleResources, LinkEnvironment.DelayLoadDLLs, BinaryDependencies, VisitedModules, ExeDir);

            // Also allow the module's public and private dependencies to modify the link environment.
            List <UEBuildModule> AllDependencyModules = new List <UEBuildModule>();

            AllDependencyModules.AddRange(PrivateDependencyModules);
            AllDependencyModules.AddRange(PublicDependencyModules);

            foreach (UEBuildModule DependencyModule in AllDependencyModules)
            {
                DependencyModule.SetupPublicLinkEnvironment(SourceBinary, LinkEnvironment.LibraryPaths, LinkEnvironment.AdditionalLibraries, LinkEnvironment.RuntimeLibraryPaths, LinkEnvironment.Frameworks, LinkEnvironment.WeakFrameworks,
                                                            LinkEnvironment.AdditionalFrameworks, LinkEnvironment.AdditionalBundleResources, LinkEnvironment.DelayLoadDLLs, BinaryDependencies, VisitedModules, ExeDir);
            }

            // Add all the additional properties
            LinkEnvironment.AdditionalProperties.AddRange(Rules.AdditionalPropertiesForReceipt.Inner);

            // this is a link-time property that needs to be accumulated (if any modules contributing to this module is ignoring, all are ignoring)
            LinkEnvironment.bIgnoreUnresolvedSymbols |= Rules.bIgnoreUnresolvedSymbols;
        }
Example #3
0
        /// <summary>
        /// Sets up the environment for linking this module.
        /// </summary>
        public virtual void SetupPrivateLinkEnvironment(
            UEBuildBinary SourceBinary,
            LinkEnvironment LinkEnvironment,
            List <UEBuildBinary> BinaryDependencies,
            HashSet <UEBuildModule> VisitedModules
            )
        {
            // Allow the module's public dependencies to add library paths and additional libraries to the link environment.
            SetupPublicLinkEnvironment(SourceBinary, LinkEnvironment.LibraryPaths, LinkEnvironment.AdditionalLibraries, LinkEnvironment.Frameworks, LinkEnvironment.WeakFrameworks,
                                       LinkEnvironment.AdditionalFrameworks, LinkEnvironment.AdditionalShadowFiles, LinkEnvironment.AdditionalBundleResources, LinkEnvironment.DelayLoadDLLs, BinaryDependencies, VisitedModules);

            // Also allow the module's public and private dependencies to modify the link environment.
            List <UEBuildModule> AllDependencyModules = new List <UEBuildModule>();

            AllDependencyModules.AddRange(PrivateDependencyModules);
            AllDependencyModules.AddRange(PublicDependencyModules);

            foreach (UEBuildModule DependencyModule in AllDependencyModules)
            {
                DependencyModule.SetupPublicLinkEnvironment(SourceBinary, LinkEnvironment.LibraryPaths, LinkEnvironment.AdditionalLibraries, LinkEnvironment.Frameworks, LinkEnvironment.WeakFrameworks,
                                                            LinkEnvironment.AdditionalFrameworks, LinkEnvironment.AdditionalShadowFiles, LinkEnvironment.AdditionalBundleResources, LinkEnvironment.DelayLoadDLLs, BinaryDependencies, VisitedModules);
            }
        }
Example #4
0
        /// <summary>
        /// Sets up the environment for linking any module that includes the public interface of this module.
        /// </summary>
        protected virtual void SetupPublicLinkEnvironment(
            UEBuildBinary SourceBinary,
            List <DirectoryReference> LibraryPaths,
            List <string> AdditionalLibraries,
            List <string> RuntimeLibraryPaths,
            List <string> Frameworks,
            List <string> WeakFrameworks,
            List <UEBuildFramework> AdditionalFrameworks,
            List <string> AdditionalShadowFiles,
            List <UEBuildBundleResource> AdditionalBundleResources,
            List <string> DelayLoadDLLs,
            List <UEBuildBinary> BinaryDependencies,
            HashSet <UEBuildModule> VisitedModules,
            DirectoryReference ExeDir
            )
        {
            // There may be circular dependencies in compile dependencies, so we need to avoid reentrance.
            if (VisitedModules.Add(this))
            {
                // Add this module's binary to the binary dependencies.
                if (Binary != null &&
                    Binary != SourceBinary &&
                    !BinaryDependencies.Contains(Binary))
                {
                    BinaryDependencies.Add(Binary);
                }

                // If this module belongs to a static library that we are not currently building, recursively add the link environment settings for all of its dependencies too.
                // Keep doing this until we reach a module that is not part of a static library (or external module, since they have no associated binary).
                // Static libraries do not contain the symbols for their dependencies, so we need to recursively gather them to be linked into other binary types.
                bool bIsBuildingAStaticLibrary     = (SourceBinary != null && SourceBinary.Type == UEBuildBinaryType.StaticLibrary);
                bool bIsModuleBinaryAStaticLibrary = (Binary != null && Binary.Type == UEBuildBinaryType.StaticLibrary);
                if (!bIsBuildingAStaticLibrary && bIsModuleBinaryAStaticLibrary)
                {
                    // Gather all dependencies and recursively call SetupPublicLinkEnvironmnet
                    List <UEBuildModule> AllDependencyModules = new List <UEBuildModule>();
                    AllDependencyModules.AddRange(PrivateDependencyModules);
                    AllDependencyModules.AddRange(PublicDependencyModules);

                    foreach (UEBuildModule DependencyModule in AllDependencyModules)
                    {
                        bool bIsExternalModule  = (DependencyModule as UEBuildModuleExternal != null);
                        bool bIsInStaticLibrary = (DependencyModule.Binary != null && DependencyModule.Binary.Type == UEBuildBinaryType.StaticLibrary);
                        if (bIsExternalModule || bIsInStaticLibrary)
                        {
                            DependencyModule.SetupPublicLinkEnvironment(SourceBinary, LibraryPaths, AdditionalLibraries, RuntimeLibraryPaths, Frameworks, WeakFrameworks,
                                                                        AdditionalFrameworks, AdditionalShadowFiles, AdditionalBundleResources, DelayLoadDLLs, BinaryDependencies, VisitedModules, ExeDir);
                        }
                    }
                }

                // Add this module's public include library paths and additional libraries.
                LibraryPaths.AddRange(PublicLibraryPaths);
                AdditionalLibraries.AddRange(PublicAdditionalLibraries);
                RuntimeLibraryPaths.AddRange(ExpandPathVariables(Rules.PublicRuntimeLibraryPaths, SourceBinary.OutputDir, ExeDir));
                Frameworks.AddRange(PublicFrameworks);
                WeakFrameworks.AddRange(PublicWeakFrameworks);
                AdditionalBundleResources.AddRange(PublicAdditionalBundleResources);
                // Remember the module so we can refer to it when needed
                foreach (UEBuildFramework Framework in PublicAdditionalFrameworks)
                {
                    Framework.OwningModule = this;
                }
                AdditionalFrameworks.AddRange(PublicAdditionalFrameworks);
                AdditionalShadowFiles.AddRange(PublicAdditionalShadowFiles);
                DelayLoadDLLs.AddRange(PublicDelayLoadDLLs);
            }
        }