/// <summary>
        /// </summary>
        public override void CleanProjectFiles(DirectoryReference InMasterProjectDirectory, string InMasterProjectName, DirectoryReference InIntermediateProjectFilesDirectory)
        {
            FileReference MasterProjectFile        = FileReference.Combine(InMasterProjectDirectory, InMasterProjectName);
            FileReference MasterProjDeleteFilename = MasterProjectFile + ".sln";

            if (FileReference.Exists(MasterProjDeleteFilename))
            {
                FileReference.Delete(MasterProjDeleteFilename);
            }
            MasterProjDeleteFilename = MasterProjectFile + ".sdf";
            if (FileReference.Exists(MasterProjDeleteFilename))
            {
                FileReference.Delete(MasterProjDeleteFilename);
            }
            MasterProjDeleteFilename = MasterProjectFile + ".suo";
            if (FileReference.Exists(MasterProjDeleteFilename))
            {
                FileReference.Delete(MasterProjDeleteFilename);
            }
            MasterProjDeleteFilename = MasterProjectFile + ".v11.suo";
            if (FileReference.Exists(MasterProjDeleteFilename))
            {
                FileReference.Delete(MasterProjDeleteFilename);
            }
            MasterProjDeleteFilename = MasterProjectFile + ".v12.suo";
            if (FileReference.Exists(MasterProjDeleteFilename))
            {
                FileReference.Delete(MasterProjDeleteFilename);
            }

            // Delete the project files folder
            if (DirectoryReference.Exists(InIntermediateProjectFilesDirectory))
            {
                try
                {
                    DirectoryReference.Delete(InIntermediateProjectFilesDirectory, true);
                }
                catch (Exception Ex)
                {
                    Log.TraceInformation("Error while trying to clean project files path {0}. Ignored.", InIntermediateProjectFilesDirectory);
                    Log.TraceInformation("\t" + Ex.Message);
                }
            }
        }
Пример #2
0
        /// <summary>
        /// </summary>
        public override void CleanProjectFiles(DirectoryReference InMasterProjectDirectory, string InMasterProjectName, DirectoryReference InIntermediateProjectFilesPath)
        {
            DirectoryReference MasterProjDeleteFilename = DirectoryReference.Combine(InMasterProjectDirectory, InMasterProjectName + ".xcworkspace");

            if (DirectoryReference.Exists(MasterProjDeleteFilename))
            {
                DirectoryReference.Delete(MasterProjDeleteFilename, true);
            }

            // Delete the project files folder
            if (DirectoryReference.Exists(InIntermediateProjectFilesPath))
            {
                try
                {
                    DirectoryReference.Delete(InIntermediateProjectFilesPath, true);
                }
                catch (Exception Ex)
                {
                    Log.TraceInformation("Error while trying to clean project files path {0}. Ignored.", InIntermediateProjectFilesPath);
                    Log.TraceInformation("\t" + Ex.Message);
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Main entry point
        /// </summary>
        /// <param name="Arguments">Command-line arguments</param>
        /// <returns>One of the values of ECompilationResult</returns>
        public override int Execute(CommandLineArguments Arguments)
        {
            Arguments.ApplyTo(this);

            // Create the build configuration object, and read the settings
            BuildConfiguration BuildConfiguration = new BuildConfiguration();

            XmlConfig.ApplyTo(BuildConfiguration);
            Arguments.ApplyTo(BuildConfiguration);

            // Parse all the targets being built
            List <TargetDescriptor> TargetDescriptors = TargetDescriptor.ParseCommandLine(Arguments, BuildConfiguration.bUsePrecompiled, bSkipRulesCompile);

            if (TargetDescriptors.Count == 0)
            {
                throw new BuildException("No targets specified to clean");
            }

            // Also add implicit descriptors for cleaning UnrealBuildTool
            if (!BuildConfiguration.bDoNotBuildUHT)
            {
                const string UnrealHeaderToolTarget = "UnrealHeaderTool";

                // Get a list of project files to clean UHT for
                List <FileReference> ProjectFiles = new List <FileReference>();
                foreach (TargetDescriptor TargetDesc in TargetDescriptors)
                {
                    if (TargetDesc.Name != UnrealHeaderToolTarget && !RemoteMac.HandlesTargetPlatform(TargetDesc.Platform))
                    {
                        if (ProjectFiles.Count == 0)
                        {
                            ProjectFiles.Add(null);
                        }
                        if (TargetDesc.ProjectFile != null && !ProjectFiles.Contains(TargetDesc.ProjectFile))
                        {
                            ProjectFiles.Add(TargetDesc.ProjectFile);
                        }
                    }
                }

                // Add descriptors for cleaning UHT with all these projects
                if (ProjectFiles.Count > 0)
                {
                    UnrealTargetConfiguration Configuration = BuildConfiguration.bForceDebugUnrealHeaderTool ? UnrealTargetConfiguration.Debug : UnrealTargetConfiguration.Development;
                    string Architecture = UEBuildPlatform.GetBuildPlatform(BuildHostPlatform.Current.Platform).GetDefaultArchitecture(null);
                    foreach (FileReference ProjectFile in ProjectFiles)
                    {
                        TargetDescriptors.Add(new TargetDescriptor(ProjectFile, UnrealHeaderToolTarget, BuildHostPlatform.Current.Platform, Configuration, Architecture, null));
                    }
                }
            }

            // Output the list of targets that we're cleaning
            Log.TraceInformation("Cleaning {0} binaries...", StringUtils.FormatList(TargetDescriptors.Select(x => x.Name).Distinct()));

            // Loop through all the targets, and clean them all
            HashSet <FileReference>      FilesToDelete       = new HashSet <FileReference>();
            HashSet <DirectoryReference> DirectoriesToDelete = new HashSet <DirectoryReference>();

            foreach (TargetDescriptor TargetDescriptor in TargetDescriptors)
            {
                // Create the rules assembly
                RulesAssembly RulesAssembly = RulesCompiler.CreateTargetRulesAssembly(TargetDescriptor.ProjectFile, TargetDescriptor.Name, bSkipRulesCompile, BuildConfiguration.bUsePrecompiled, TargetDescriptor.ForeignPlugin);

                // Create the rules object
                ReadOnlyTargetRules Target = new ReadOnlyTargetRules(RulesAssembly.CreateTargetRules(TargetDescriptor.Name, TargetDescriptor.Platform, TargetDescriptor.Configuration, TargetDescriptor.Architecture, TargetDescriptor.ProjectFile, TargetDescriptor.AdditionalArguments));

                // Find the base folders that can contain binaries
                List <DirectoryReference> BaseDirs = new List <DirectoryReference>();
                BaseDirs.Add(UnrealBuildTool.EngineDirectory);
                BaseDirs.Add(UnrealBuildTool.EnterpriseDirectory);
                foreach (FileReference Plugin in Plugins.EnumeratePlugins(Target.ProjectFile))
                {
                    BaseDirs.Add(Plugin.Directory);
                }
                if (Target.ProjectFile != null)
                {
                    BaseDirs.Add(Target.ProjectFile.Directory);
                }

                // If we're running a precompiled build, remove anything under the engine folder
                BaseDirs.RemoveAll(x => RulesAssembly.IsReadOnly(x));

                // Get all the names which can prefix build products
                List <string> NamePrefixes = new List <string>();
                if (Target.Type != TargetType.Program)
                {
                    NamePrefixes.Add(UEBuildTarget.GetAppNameForTargetType(Target.Type));
                }
                NamePrefixes.Add(Target.Name);

                // Get the suffixes for this configuration
                List <string> NameSuffixes = new List <string>();
                if (Target.Configuration == Target.UndecoratedConfiguration)
                {
                    NameSuffixes.Add("");
                }
                NameSuffixes.Add(String.Format("-{0}-{1}", Target.Platform.ToString(), Target.Configuration.ToString()));
                if (!String.IsNullOrEmpty(Target.Architecture))
                {
                    NameSuffixes.AddRange(NameSuffixes.ToArray().Select(x => x + Target.Architecture));
                }

                // Add all the makefiles and caches to be deleted
                FilesToDelete.Add(TargetMakefile.GetLocation(Target.ProjectFile, Target.Name, Target.Platform, Target.Configuration));
                FilesToDelete.UnionWith(SourceFileMetadataCache.GetFilesToClean(Target.ProjectFile));
                FilesToDelete.UnionWith(ActionHistory.GetFilesToClean(Target.ProjectFile, Target.Name, Target.Platform, Target.Type));

                // Add all the intermediate folders to be deleted
                foreach (DirectoryReference BaseDir in BaseDirs)
                {
                    foreach (string NamePrefix in NamePrefixes)
                    {
                        DirectoryReference GeneratedCodeDir = DirectoryReference.Combine(BaseDir, "Intermediate", "Build", Target.Platform.ToString(), NamePrefix, "Inc");
                        if (DirectoryReference.Exists(GeneratedCodeDir))
                        {
                            DirectoriesToDelete.Add(GeneratedCodeDir);
                        }

                        DirectoryReference IntermediateDir = DirectoryReference.Combine(BaseDir, "Intermediate", "Build", Target.Platform.ToString(), NamePrefix, Target.Configuration.ToString());
                        if (DirectoryReference.Exists(IntermediateDir))
                        {
                            DirectoriesToDelete.Add(IntermediateDir);
                        }
                    }
                }

                // List of additional files and directories to clean, specified by the target platform
                List <FileReference>      AdditionalFilesToDelete       = new List <FileReference>();
                List <DirectoryReference> AdditionalDirectoriesToDelete = new List <DirectoryReference>();

                // Add all the build products from this target
                string[] NamePrefixesArray = NamePrefixes.Distinct().ToArray();
                string[] NameSuffixesArray = NameSuffixes.Distinct().ToArray();
                foreach (DirectoryReference BaseDir in BaseDirs)
                {
                    DirectoryReference BinariesDir = DirectoryReference.Combine(BaseDir, "Binaries", Target.Platform.ToString());
                    if (DirectoryReference.Exists(BinariesDir))
                    {
                        UEBuildPlatform.GetBuildPlatform(Target.Platform).FindBuildProductsToClean(BinariesDir, NamePrefixesArray, NameSuffixesArray, AdditionalFilesToDelete, AdditionalDirectoriesToDelete);
                    }
                }

                // Get all the additional intermediate folders created by this platform
                UEBuildPlatform.GetBuildPlatform(Target.Platform).FindAdditionalBuildProductsToClean(Target, AdditionalFilesToDelete, AdditionalDirectoriesToDelete);

                // Add the platform's files and directories to the main list
                FilesToDelete.UnionWith(AdditionalFilesToDelete);
                DirectoriesToDelete.UnionWith(AdditionalDirectoriesToDelete);
            }

            // Delete all the directories, then all the files. By sorting the list of directories before we delete them, we avoid spamming the log if a parent directory is deleted first.
            foreach (DirectoryReference DirectoryToDelete in DirectoriesToDelete.OrderBy(x => x.FullName))
            {
                if (DirectoryReference.Exists(DirectoryToDelete))
                {
                    Log.TraceVerbose("    Deleting {0}{1}...", DirectoryToDelete, Path.DirectorySeparatorChar);
                    try
                    {
                        DirectoryReference.Delete(DirectoryToDelete, true);
                    }
                    catch (Exception Ex)
                    {
                        throw new BuildException(Ex, "Unable to delete {0} ({1})", DirectoryToDelete, Ex.Message.TrimEnd());
                    }
                }
            }

            foreach (FileReference FileToDelete in FilesToDelete.OrderBy(x => x.FullName))
            {
                if (FileReference.Exists(FileToDelete))
                {
                    Log.TraceVerbose("    Deleting " + FileToDelete);
                    try
                    {
                        FileReference.Delete(FileToDelete);
                    }
                    catch (Exception Ex)
                    {
                        throw new BuildException(Ex, "Unable to delete {0} ({1})", FileToDelete, Ex.Message.TrimEnd());
                    }
                }
            }

            // Also clean all the remote targets
            for (int Idx = 0; Idx < TargetDescriptors.Count; Idx++)
            {
                TargetDescriptor TargetDescriptor = TargetDescriptors[Idx];
                if (RemoteMac.HandlesTargetPlatform(TargetDescriptor.Platform))
                {
                    RemoteMac RemoteMac = new RemoteMac(TargetDescriptor.ProjectFile);
                    RemoteMac.Clean(TargetDescriptor);
                }
            }

            return(0);
        }
Пример #4
0
        public override bool ExecuteActions(List <Action> Actions, bool bLogDetailedActionStats)
        {
            if (Actions.Count == 0)
            {
                return(true);
            }

            // Clean the intermediate directory in case there are any leftovers from previous builds
            if (DirectoryReference.Exists(IntermediateDir))
            {
                DirectoryReference.Delete(IntermediateDir, true);
            }

            DirectoryReference.CreateDirectory(IntermediateDir);
            if (!DirectoryReference.Exists(IntermediateDir))
            {
                throw new BuildException($"Failed to create directory \"{IntermediateDir}\".");
            }

            // Build the json script file to describe all the actions and their dependencies
            var ActionIds = Actions.ToDictionary(a => a, a => Guid.NewGuid().ToString());

            File.WriteAllText(ScriptFile.FullName, Json.Serialize(new Dictionary <string, object>()
            {
                ["jobs"] = Actions.ToDictionary(a => ActionIds[a], a =>
                {
                    var Job = new Dictionary <string, object>()
                    {
                        ["title"]             = a.StatusDescription,
                        ["command"]           = $"\"{a.CommandPath}\" {a.CommandArguments}",
                        ["working_directory"] = a.WorkingDirectory.FullName,
                        ["dependencies"]      = a.PrerequisiteActions.Select(p => ActionIds[p]).ToArray(),
                        ["run_locally"]       = !(a.bCanExecuteRemotely && a.bCanExecuteRemotelyWithSNDBS)
                    };

                    if (a.PrerequisiteItems.Count > 0)
                    {
                        Job["explicit_input_files"] = a.PrerequisiteItems.Select(i => new Dictionary <string, object>()
                        {
                            ["filename"] = i.AbsolutePath
                        }).ToList();
                    }

                    if (EnableEcho)
                    {
                        var EchoString = string.Join(" ", string.IsNullOrWhiteSpace(a.CommandDescription) ? string.Empty : $"[{a.CommandDescription}]", a.StatusDescription);
                        if (!string.IsNullOrWhiteSpace(EchoString))
                        {
                            Job["echo"] = EchoString;
                        }
                    }

                    return(Job);
                })
            }));

            PrepareToolTemplates();
            bool bHasRewrites = GenerateSNDBSIncludeRewriteRules();

            var LocalProcess = new Process();

            LocalProcess.StartInfo           = new ProcessStartInfo(SNDBSExecutable, $"-q -p \"Unreal Engine Tasks\" -s \"{ScriptFile}\" -templates \"{IntermediateDir}\"{(bHasRewrites ? $" --include-rewrite-rules \"{IncludeRewriteRulesFile}\"" : "")}");
            LocalProcess.OutputDataReceived += (Sender, Args) => Log.TraceInformation("{0}", Args.Data);
            LocalProcess.ErrorDataReceived  += (Sender, Args) => Log.TraceInformation("{0}", Args.Data);
            return(Utils.RunLocalProcess(LocalProcess) == 0);
        }
Пример #5
0
 public override void CleanProjectFiles(DirectoryReference InMasterProjectDirectory, string InMasterProjectName,
                                        DirectoryReference InIntermediateProjectFilesDirectory)
 {
     DirectoryReference.Delete(InMasterProjectDirectory);
 }