diff --git a/Source/Integration/lpx-paths.hpp b/Source/Integration/lpx-paths.hpp index 3cc57b9f..56596918 100644 --- a/Source/Integration/lpx-paths.hpp +++ b/Source/Integration/lpx-paths.hpp @@ -1,2 +1,3 @@ + #define LUPREX_DLL_PATH "/home/jyelon/integration/luprex/build/linux/luprexlib.so" #define LUPREX_ROOT_PATH "/home/jyelon/integration/luprex" diff --git a/make-vscode.py b/make-vscode.py index 52f21795..b670f231 100755 --- a/make-vscode.py +++ b/make-vscode.py @@ -2,34 +2,58 @@ # # This script generates these config files: # +# Saved/UnrealBuildTool/BuildConfiguration.xml # Integration.uproject # Integration.code-workspace +# Makefile +# Source/Integration/lpx-paths.hpp +# +# The BuildConfiguration.xml file specifies that this project will +# use visual studio code (on linux) or visual studio (on windows). +# It can't be checked into git because it differs by platform. # # 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. +# a GUID which is specific to your local machine. We generate +# Integration.uproject from scratch. Later, the unreal +# editor will inject the engine GUID into the file. # # 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. +# needs. This python script uses UnrealBuildTool to generate the rough +# draft, then it loads Integration.code-workspace into RAM, edits it +# in RAM, and writes a new, improved version back out. # -# 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. +# We don't really need a Makefile, since Unreal games are build using +# UnrealBuildTool, not make. But, having a one-liner makefile can at +# least make it obvious what command you're supposed to type to build +# things. UnrealBuildTool creates a Makefile, but we delete that, and +# replace it with a simple one-liner. +# +# The file lpx-paths.hpp contains hardwired absolute paths of the +# Luprex DLL and Luprex root path. Eventually, we're going to write +# C++ code to calculate these dynamically, so that they don't need to +# be hardwired in. But this will do for now. # import sys, os, json +from pathlib import Path + +# +# Some handy utility functions +# + +def writefile(fn, str): + with open(fn, "w") as f: + f.write(str) # # These are some directory paths that we will need. @@ -37,12 +61,48 @@ import sys, os, json INTEGRATION = os.path.dirname(os.path.abspath(sys.argv[0])) UNREALENGINE = os.environ["HOME"] + "/UnrealEngine" +UNREALBUILDTOOL = f"{UNREALENGINE}/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.dll" # -# This is the template from which Integration.uproject is generated. +# Change to the target directory. +# Remove any existing project files. # -UPROJECT_TEMPLATE=""" +os.chdir(INTEGRATION) +Path("Saved/UnrealBuildTool").mkdir(parents=True, exist_ok=True) +Path("Saved/UnrealBuildTool/BuildConfiguration.xml").unlink(missing_ok=True) +Path("Integration.uproject").unlink(missing_ok=True) +Path("Integration.code-workspace").unlink(missing_ok=True) +Path("Makefile").unlink(missing_ok=True) +Path("Source/Integration/lpx-paths.hpp").unlink(missing_ok=True) + +# +# Write BuildConfiguration.xml +# + +writefile("Saved/UnrealBuildTool/Integration.uproject", f""" + + + + VisualStudioCode + + +""") + +# +# Write lpx-paths.hpp. +# + +writefile("Source/Integration/lpx-paths.hpp", f""" +#define LUPREX_DLL_PATH "{INTEGRATION}/luprex/build/linux/luprexlib.so" +#define LUPREX_ROOT_PATH "{INTEGRATION}/luprex" +""") + +# +# Write Integration.uproject. +# + +writefile("Integration.uproject", """ { "FileVersion": 3, "EngineAssociation": "5.3", @@ -69,35 +129,22 @@ UPROJECT_TEMPLATE=""" } ] } -""" +""") -# -# 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) +BUILDPROJECTFILES = f'dotnet {UNREALBUILDTOOL} -projectfiles -project="{INTEGRATION}/Integration.uproject" -game' print(BUILDPROJECTFILES) os.system(BUILDPROJECTFILES) # -# Load the rough draft into RAM, then delete the rough draft. +# Load the rough Integration.code-workspace 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") @@ -119,6 +166,20 @@ def goodtask(task): WORKSPACE["tasks"]["tasks"] = [x for x in WORKSPACE["tasks"]["tasks"] if goodtask(x)] +# +# Add a build task for Luprex +# + +LUPREXBUILDTASK={} +WORKSPACE["tasks"]["tasks"].append(LUPREXBUILDTASK) +LUPREXBUILDTASK["label"] = "Build Luprex" +LUPREXBUILDTASK["group"] = "build" +LUPREXBUILDTASK["command"] = "make" +LUPREXBUILDTASK["problemMatcher"] = "$msCompile" +LUPREXBUILDTASK["type"] = "shell" +LUPREXBUILDTASK["options"] = {} +LUPREXBUILDTASK["options"]["cwd"] = f"{INTEGRATION}/luprex" + # # Convert all launch configurations to lldb. # @@ -141,9 +202,18 @@ def goodconf(config): WORKSPACE["launch"]["configurations"] = [x for x in WORKSPACE["launch"]["configurations"] if goodconf(x)] # -# Write it all back out. +# Write Integration.code-workspace. # with open("Integration.code-workspace", "w") as rewritten: json.dump(WORKSPACE, rewritten, indent=4) +# +# Write the Makefile +# + +writefile("Makefile", f""" +all: + (cd luprex ; make) + dotnet {UNREALBUILDTOOL} Integration Linux DebugGame -project="{INTEGRATION}/Integration.uproject" +""")