示例#1
0
        /// <summary>
        /// Checks whether the binary output paths are appropriate for the distribution
        /// level of its direct module dependencies
        /// </summary>
        public void CheckOutputDistributionLevelAgainstDependencies(Dictionary <UEBuildModule, UEBuildModuleDistribution> ModuleDistributionCache)
        {
            // Find maximum distribution level of its direct dependencies
            UEBuildModuleDistribution DistributionLevel = UEBuildModuleDistribution.Public;
            List <UEBuildModule>      DependantModules  = GetAllDependencyModules(false, false);

            List <string>[] DependantModuleNames = new List <string> [Enum.GetNames(typeof(UEBuildModuleDistribution)).Length];
            foreach (UEBuildModule Module in DependantModules)
            {
                UEBuildModuleDistribution ModuleDistributionLevel;
                if (!ModuleDistributionCache.TryGetValue(Module, out ModuleDistributionLevel))
                {
                    ModuleDistributionLevel = Module.DetermineDistributionLevel();
                    ModuleDistributionCache.Add(Module, ModuleDistributionLevel);
                }
                if (ModuleDistributionLevel != UEBuildModuleDistribution.Public)
                {
                    // Make a list of non-public dependant modules so that exception
                    // message can be more helpful
                    int DistributionIndex = (int)ModuleDistributionLevel;
                    if (DependantModuleNames[DistributionIndex] == null)
                    {
                        DependantModuleNames[DistributionIndex] = new List <string>();
                    }
                    DependantModuleNames[DistributionIndex].Add(Module.Name);

                    DistributionLevel = Utils.Max(DistributionLevel, ModuleDistributionLevel);
                }
            }

            // Check Output Paths if dependencies shouldn't be distributed to everyone
            if (DistributionLevel != UEBuildModuleDistribution.Public)
            {
                foreach (FileReference OutputFilePath in Config.OutputFilePaths)
                {
                    UEBuildModuleDistribution OutputDistributionLevel = UEBuildModule.GetModuleDistributionLevelBasedOnLocation(OutputFilePath.FullName);

                    // Throw exception if output path is not appropriate
                    if (OutputDistributionLevel < DistributionLevel)
                    {
                        string JoinedModuleNames = String.Join(",", DependantModuleNames[(int)DistributionLevel]);
                        throw new BuildException("Output file \"{0}\" has distribution level of \"{1}\" but has direct dependencies on modules with distribution level of \"{2}\" ({3}).\nEither change to dynamic dependencies, set BinariesSubFolder/ExeBinariesSubFolder to \"{2}\" or set bOutputPubliclyDistributable to true in the target.cs or build.cs file.",
                                                 OutputFilePath, OutputDistributionLevel.ToString(), DistributionLevel.ToString(), JoinedModuleNames);
                    }
                }
            }
        }
示例#2
0
        /**
         * Determines the distribution level of a module based on its directory and includes.
         */
        private void SetupModuleDistributionLevel()
        {
            List<string> PathsToCheck = new List<string>();
            PathsToCheck.Add(ModuleDirectory);
            PathsToCheck.AddRange(PublicIncludePaths);
            PathsToCheck.AddRange(PrivateIncludePaths);
            // Not sure if these two are necessary as paths will usually be in basic includes too
            PathsToCheck.AddRange(PublicSystemIncludePaths);
            PathsToCheck.AddRange(PublicLibraryPaths);

            DistributionLevel = UEBuildModuleDistribution.Public;

            // Keep checking as long as we haven't reached the maximum level
            for (int PathIndex = 0; PathIndex < PathsToCheck.Count && DistributionLevel != UEBuildModuleDistribution.NoRedist; ++PathIndex)
            {
                DistributionLevel = Utils.Max(DistributionLevel, UEBuildModule.GetModuleDistributionLevelBasedOnLocation(PathsToCheck[PathIndex]));
            }
        }