#!/usr/bin/python3 # # This script generates these config files: # # Integration.uproject # Integration.code-workspace # # Unreal needs "Integration.uproject". This config file tells # UnrealBuildTool what version of the unreal engine to link this game # with. It also specifies a couple of other game-specific configuration # settings. It can't easily be checked into git because it contains # a GUID which is specific to your local machine. # # VSCode needs "Integration.code-workspace," it tells vscode how to # compile this game and how to run it under the debugger. It can't # be checked into git because it contains many hardwired # paths. # # We generate Integration.uproject from scratch. Later, the unreal # editor will inject the engine GUID into the file. # # The UnrealBuildTool which is included with the UnrealEngine can # generate a rough draft of Integration.code-workspace. However, the # file it generates is not well-configured for our luprex-related # needs. # # This python script uses UnrealBuildTool to generate a rough draft, # then it loads Integration.code-workspace into RAM, edits it in RAM, # and writes a new, improved version back out. # import sys, os, json # # These are some directory paths that we will need. # INTEGRATION = os.path.dirname(os.path.abspath(sys.argv[0])) UNREALENGINE = os.environ["HOME"] + "/UnrealEngine" # # This is the template from which Integration.uproject is generated. # UPROJECT_TEMPLATE=""" { "FileVersion": 3, "EngineAssociation": "5.3", "Category": "", "Description": "", "Modules": [ { "Name": "Integration", "Type": "Runtime", "LoadingPhase": "Default", "AdditionalDependencies": [ "Engine", "CoreUObject" ] } ], "Plugins": [ { "Name": "ModelingToolsEditorMode", "Enabled": true, "TargetAllowList": [ "Editor" ] } ] } """ # # Convert the UPROJECT template into json in RAM. # UPROJECT = json.loads(UPROJECT_TEMPLATE) # # Write Integration.uproject # with open("Integration.uproject", "w") as uproj: json.dump(UPROJECT, uproj, indent=4) # # Use UnrealBuildTool to generate a rough draft of Integration.code-workspace. # BUILDPROJECTFILES = f'dotnet Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.dll -projectfiles -project="{INTEGRATION}/Integration.uproject" -game -vscode' os.chdir(UNREALENGINE) print(BUILDPROJECTFILES) os.system(BUILDPROJECTFILES) # # Load the rough draft into RAM, then delete the rough draft. # os.chdir(INTEGRATION) with open("Integration.code-workspace") as original: WORKSPACE=json.load(original) os.remove("Integration.code-workspace") # # Configure the correct build task as the default task. # for task in WORKSPACE["tasks"]["tasks"]: if task["label"] == "IntegrationEditor Linux DebugGame Build": task["group"] = { "kind": "build", "isDefault": "true" } # # Delete all build tasks that aren't relevant. # def goodtask(task): return task["label"].startswith("IntegrationEditor Linux DebugGame") WORKSPACE["tasks"]["tasks"] = [x for x in WORKSPACE["tasks"]["tasks"] if goodtask(x)] # # Convert all launch configurations to lldb. # LLDBINIT=f"command script import {UNREALENGINE}/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py" for config in WORKSPACE["launch"]["configurations"]: config["type"] = "lldb" config["initCommands"] = [ LLDBINIT ] config.pop("visualizerFile", None) config.pop("showDisplayString", None) # # Delete all but the relevant launch configuration. # def goodconf(config): return config["name"] == "Launch IntegrationEditor (DebugGame)" WORKSPACE["launch"]["configurations"] = [x for x in WORKSPACE["launch"]["configurations"] if goodconf(x)] # # Write it all back out. # with open("Integration.code-workspace", "w") as rewritten: json.dump(WORKSPACE, rewritten, indent=4)