#!/usr/bin/env python3 import glob, os, shutil, sys from os.path import basename, dirname, exists, join # Logs a message to stderr def log(message): print(message, file=sys.stderr) sys.stderr.flush() # Extracts the files and directories for the specified component and moves them to a separate output directory def extractComponent(inputDir, outputDir, component, description, items): # Print progress output log("\nExtracting {}...".format(description)) # Create the output directory for the component if it doesn't already exist componentDir = join(outputDir, component) os.makedirs(outputDir, exist_ok=True) # Move each file and directory for the component to the output directory for item in items: # Verify that the item exists if not exists(item): log("Skipping non-existent item: {}".format(item)) continue # Print progress output log("Moving: {}".format(item)) # Ensure the parent directory for the item exists in the output directory parent = dirname(item).replace(inputDir, componentDir) os.makedirs(parent, exist_ok=True) # Perform the move shutil.move(item, join(parent, basename(item))) # Retrieve the path to the root directory of the Installed Build rootDir = sys.argv[1] # Retrieve the path to the root output directory for extracted components and ensure it exists outputDir = sys.argv[2] os.makedirs(outputDir, exist_ok=True) # Extract the DDC ddc = [join(rootDir, "Engine", "DerivedDataCache", "Compressed.ddp")] extractComponent(rootDir, outputDir, "DDC", "Derived Data Cache (DDC)", ddc) # Extract debug symbols symbolFiles = glob.glob(join(rootDir, "**", "*.debug"), recursive=True) + glob.glob( join(rootDir, "**", "*.sym"), recursive=True ) extractComponent(rootDir, outputDir, "DebugSymbols", "debug symbols", symbolFiles) # Extract template projects and samples subdirs = [join(rootDir, subdir) for subdir in ["FeaturePacks", "Samples", "Templates"]] extractComponent( rootDir, outputDir, "TemplatesAndSamples", "template projects and samples", subdirs ) # Extract the larger non-optional subdirectories of the Engine directory for subdir in ["Binaries", "Content", "Extras", "Intermediate", "Plugins", "Source"]: extractComponent( rootDir, outputDir, subdir, f"{subdir} subdirectory", [join(rootDir, "Engine", subdir)], )