/// <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); } } } }
/** * 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])); } }