Esempio n. 1
0
        /// <summary>
        /// Prefetch multiple directories in parallel
        /// </summary>
        /// <param name="Directories">The directories to cache</param>
        private static void PrefetchRulesFiles(IEnumerable <DirectoryReference> Directories)
        {
            ThreadPoolWorkQueue Queue = null;

            try
            {
                foreach (DirectoryReference Directory in Directories)
                {
                    if (!RootFolderToRulesFileCache.ContainsKey(Directory))
                    {
                        RulesFileCache Cache = new RulesFileCache();
                        RootFolderToRulesFileCache[Directory] = Cache;

                        if (Queue == null)
                        {
                            Queue = new ThreadPoolWorkQueue();
                        }

                        DirectoryItem DirectoryItem = DirectoryItem.GetItemByDirectoryReference(Directory);
                        Queue.Enqueue(() => FindAllRulesFilesRecursively(DirectoryItem, Cache, Queue));
                    }
                }
            }
            finally
            {
                if (Queue != null)
                {
                    Queue.Dispose();
                    Queue = null;
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Finds all the rules of the given type under a given directory
        /// </summary>
        /// <param name="Directory">Directory to search</param>
        /// <param name="Type">Type of rules to return</param>
        /// <returns>List of rules files of the given type</returns>
        private static IReadOnlyList <FileReference> FindAllRulesFiles(DirectoryReference Directory, RulesFileType Type)
        {
            // Check to see if we've already cached source files for this folder
            RulesFileCache Cache;

            if (!RootFolderToRulesFileCache.TryGetValue(Directory, out Cache))
            {
                Cache = new RulesFileCache();
                using (ThreadPoolWorkQueue Queue = new ThreadPoolWorkQueue())
                {
                    DirectoryItem BaseDirectory = DirectoryItem.GetItemByDirectoryReference(Directory);
                    Queue.Enqueue(() => FindAllRulesFilesRecursively(BaseDirectory, Cache, Queue));
                }
                RootFolderToRulesFileCache[Directory] = Cache;
            }

            // Get the list of files of the type we're looking for
            if (Type == RulesCompiler.RulesFileType.Module)
            {
                return(Cache.ModuleRules);
            }
            else if (Type == RulesCompiler.RulesFileType.Target)
            {
                return(Cache.TargetRules);
            }
            else if (Type == RulesCompiler.RulesFileType.AutomationModule)
            {
                return(Cache.AutomationModules);
            }
            else
            {
                throw new BuildException("Unhandled rules type: {0}", Type);
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Enqueue a directory tree for prefetching
 /// </summary>
 /// <param name="Directory">Directory to start searching from</param>
 public static void QueueDirectoryTree(DirectoryReference Directory)
 {
     lock (QueuedDirectories)
     {
         if (QueuedDirectories.Add(Directory))
         {
             Enqueue(() => ScanDirectoryTree(DirectoryItem.GetItemByDirectoryReference(Directory)));
         }
     }
 }
Esempio n. 4
0
 /// <summary>
 /// Enqueue a project directory for prefetching
 /// </summary>
 /// <param name="ProjectDirectory">The project directory to prefetch</param>
 public static void QueueProjectDirectory(DirectoryReference ProjectDirectory)
 {
     lock (QueuedDirectories)
     {
         if (QueuedDirectories.Add(ProjectDirectory))
         {
             Enqueue(() => ScanProjectDirectory(DirectoryItem.GetItemByDirectoryReference(ProjectDirectory)));
         }
     }
 }
Esempio n. 5
0
        /// <summary>
        /// Scans a project directory, adding tasks for subdirectories
        /// </summary>
        /// <param name="ProjectDirectory">The project directory to search</param>
        static void ScanProjectDirectory(DirectoryItem ProjectDirectory)
        {
            foreach (DirectoryReference ExtensionDir in UnrealBuildTool.GetExtensionDirs(UnrealBuildTool.EngineDirectory))
            {
                DirectoryItem BaseDirectory = DirectoryItem.GetItemByDirectoryReference(ExtensionDir);
                BaseDirectory.CacheDirectories();

                DirectoryItem BasePluginsDirectory = DirectoryItem.Combine(ProjectDirectory, "Plugins");
                Enqueue(() => ScanPluginFolder(BasePluginsDirectory));

                DirectoryItem BaseSourceDirectory = DirectoryItem.Combine(ProjectDirectory, "Source");
                Enqueue(() => ScanDirectoryTree(BaseSourceDirectory));
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Scans the engine directory, adding tasks for subdirectories
        /// </summary>
        static void ScanEngineDirectory()
        {
            DirectoryItem EngineDirectory = DirectoryItem.GetItemByDirectoryReference(UnrealBuildTool.EngineDirectory);

            EngineDirectory.CacheDirectories();

            DirectoryItem EnginePluginsDirectory = DirectoryItem.Combine(EngineDirectory, "Plugins");

            Enqueue(() => ScanPluginFolder(EnginePluginsDirectory));

            DirectoryItem EngineRuntimeDirectory = DirectoryItem.GetItemByDirectoryReference(UnrealBuildTool.EngineSourceRuntimeDirectory);

            Enqueue(() => ScanDirectoryTree(EngineRuntimeDirectory));

            DirectoryItem EngineDeveloperDirectory = DirectoryItem.GetItemByDirectoryReference(UnrealBuildTool.EngineSourceDeveloperDirectory);

            Enqueue(() => ScanDirectoryTree(EngineDeveloperDirectory));

            DirectoryItem EngineEditorDirectory = DirectoryItem.GetItemByDirectoryReference(UnrealBuildTool.EngineSourceEditorDirectory);

            Enqueue(() => ScanDirectoryTree(EngineEditorDirectory));
        }
Esempio n. 7
0
        /// <summary>
        /// Scans the engine directory, adding tasks for subdirectories
        /// </summary>
        static void ScanEngineDirectory()
        {
            foreach (DirectoryReference ExtensionDir in UnrealBuildTool.GetExtensionDirs(UnrealBuildTool.EngineDirectory))
            {
                DirectoryItem BaseDirectory = DirectoryItem.GetItemByDirectoryReference(ExtensionDir);
                BaseDirectory.CacheDirectories();

                DirectoryItem BasePluginsDirectory = DirectoryItem.Combine(BaseDirectory, "Plugins");
                Enqueue(() => ScanPluginFolder(BasePluginsDirectory));

                DirectoryItem BaseSourceDirectory = DirectoryItem.Combine(BaseDirectory, "Source");
                BaseSourceDirectory.CacheDirectories();

                DirectoryItem BaseSourceRuntimeDirectory = DirectoryItem.Combine(BaseSourceDirectory, "Runtime");
                Enqueue(() => ScanDirectoryTree(BaseSourceRuntimeDirectory));

                DirectoryItem BaseSourceDeveloperDirectory = DirectoryItem.Combine(BaseSourceDirectory, "Developer");
                Enqueue(() => ScanDirectoryTree(BaseSourceDeveloperDirectory));

                DirectoryItem BaseSourceEditorDirectory = DirectoryItem.Combine(BaseSourceDirectory, "Editor");
                Enqueue(() => ScanDirectoryTree(BaseSourceEditorDirectory));
            }
        }
Esempio n. 8
0
        /// <summary>
        /// Find paths to all the plugins under a given parent directory (recursively)
        /// </summary>
        /// <param name="ParentDirectory">Parent directory to look in. Plugins will be found in any *subfolders* of this directory.</param>
        public static IEnumerable <FileReference> EnumeratePlugins(DirectoryReference ParentDirectory)
        {
            List <FileReference> FileNames;

            if (!PluginFileCache.TryGetValue(ParentDirectory, out FileNames))
            {
                FileNames = new List <FileReference>();

                DirectoryItem ParentDirectoryItem = DirectoryItem.GetItemByDirectoryReference(ParentDirectory);
                if (ParentDirectoryItem.Exists)
                {
                    using (ThreadPoolWorkQueue Queue = new ThreadPoolWorkQueue())
                    {
                        EnumeratePluginsInternal(ParentDirectoryItem, FileNames, Queue);
                    }
                }

                // Sort the filenames to ensure that the plugin order is deterministic; otherwise response files will change with each build.
                FileNames = FileNames.OrderBy(x => x.FullName, StringComparer.OrdinalIgnoreCase).ToList();

                PluginFileCache.Add(ParentDirectory, FileNames);
            }
            return(FileNames);
        }
Esempio n. 9
0
 /// <summary>
 /// Gets a new directory item by combining the existing directory item with the given path fragments
 /// </summary>
 /// <param name="BaseDirectory">Base directory to append path fragments to</param>
 /// <param name="Fragments">The path fragments to append</param>
 /// <returns>Directory item corresponding to the combined path</returns>
 public static DirectoryItem Combine(DirectoryItem BaseDirectory, params string[] Fragments)
 {
     return(DirectoryItem.GetItemByDirectoryReference(DirectoryReference.Combine(BaseDirectory.Location, Fragments)));
 }
Esempio n. 10
0
 /// <summary>
 /// Read a directory item from a binary archive
 /// </summary>
 /// <param name="Reader">Reader to serialize data from</param>
 /// <returns>Instance of the serialized directory item</returns>
 public static DirectoryItem ReadDirectoryItem(this BinaryArchiveReader Reader)
 {
     return(Reader.ReadObjectReference <DirectoryItem>(() => DirectoryItem.GetItemByDirectoryReference(Reader.ReadDirectoryReference())));
 }
Esempio n. 11
0
 static public void InvalidateCachedDirectory(DirectoryReference Directory)
 {
     DirectoryItem.GetItemByDirectoryReference(Directory).ResetCachedInfo();
 }
Esempio n. 12
0
 static public IEnumerable <DirectoryReference> EnumerateDirectories(DirectoryReference Directory)
 {
     return(DirectoryItem.GetItemByDirectoryReference(Directory).EnumerateDirectories().Select(x => x.Location));
 }
Esempio n. 13
0
 static public bool DirectoryExists(DirectoryReference Directory)
 {
     return(DirectoryItem.GetItemByDirectoryReference(Directory).Exists);
 }