Skip to content

Commit 77c3e62

Browse files
committed
Make godot-cpp installable via ScCons
This aims to have feature parity with the installation via cmake
1 parent 5f14e45 commit 77c3e62

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

SConstruct

+3
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,7 @@ if scons_cache_path is not None:
4848
cpp_tool.generate(env)
4949
library = env.GodotCPP()
5050

51+
if library:
52+
env.InstallableGodotCPP(library)
53+
5154
Return("env")

tools/godotcpp.py

+83
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,33 @@ def options(opts, env):
338338
opts.Add(BoolVariable("dev_build", "Developer build with dev-only debugging code (DEV_ENABLED)", False))
339339
opts.Add(BoolVariable("verbose", "Enable verbose output for the compilation", False))
340340

341+
# Scons lack a default install prefix, so use CMake's as a default for feature parity
342+
# https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html
343+
opts.Add(
344+
PathVariable(
345+
"install_prefix_dir",
346+
"The directory to install to",
347+
"C:/Program Files/godot-cpp" if default_platform == "windows" else "/usr/local",
348+
PathVariable.PathAccept,
349+
)
350+
)
351+
opts.Add(
352+
PathVariable(
353+
"install_lib_dir",
354+
"The directory to install the library (relative from the prefix)",
355+
"lib",
356+
PathVariable.PathAccept,
357+
)
358+
)
359+
opts.Add(
360+
PathVariable(
361+
"install_include_dir",
362+
"The directory to install the headers (relative from the prefix)",
363+
"include",
364+
PathVariable.PathAccept,
365+
)
366+
)
367+
341368
# Add platform options (custom tools can override platforms)
342369
for pl in sorted(set(platforms + custom_platforms)):
343370
tool = Tool(pl, toolpath=get_platform_tools_paths(env))
@@ -526,6 +553,7 @@ def generate(env):
526553
}
527554
)
528555
env.AddMethod(_godot_cpp, "GodotCPP")
556+
env.AddMethod(_installable, "InstallableGodotCPP")
529557

530558

531559
def _godot_cpp(env):
@@ -571,3 +599,58 @@ def _godot_cpp(env):
571599

572600
env.AppendUnique(LIBS=[env.File("bin/%s" % library_name)])
573601
return library
602+
603+
604+
def _installable(env, library):
605+
import itertools
606+
import json
607+
608+
install_prefix_dir = env["install_prefix_dir"]
609+
full_install_lib_dir = os.path.join(install_prefix_dir, env["install_lib_dir"])
610+
full_install_include_dir = os.path.join(install_prefix_dir, env["install_include_dir"])
611+
612+
# Obtain the gdextension version
613+
extension_dir = normalize_path(env.get("gdextension_dir", env.Dir("gdextension").abspath), env)
614+
api_filename = normalize_path(
615+
env.get("custom_api_file", env.File(extension_dir + "/extension_api.json").abspath),
616+
env,
617+
)
618+
with open(api_filename, "r") as api_json_file:
619+
api_data = json.load(api_json_file)
620+
version_major = api_data["header"]["version_major"]
621+
version_minor = api_data["header"]["version_minor"]
622+
version_patch = api_data["header"]["version_patch"]
623+
gd_version = f"{version_major}.{version_minor}.{version_patch}"
624+
625+
# Configure and install the pkgconfig file
626+
libname = str(library[0])
627+
pkgconfig = env.Substfile(
628+
target="gen/godot-cpp.pc",
629+
source="cmake/godot-cpp.pc.in",
630+
SUBST_DICT={
631+
"@CMAKE_INSTALL_PREFIX@": install_prefix_dir,
632+
"@CMAKE_INSTALL_FULL_INCLUDEDIR@": full_install_include_dir,
633+
"@CMAKE_INSTALL_FULL_LIBDIR@": full_install_lib_dir,
634+
"@GODOT_API_VERSION@": gd_version,
635+
"@GODOTCPP_OUTPUT_NAME@": libname,
636+
},
637+
)
638+
full_install_pkgconfig_dir = os.path.join(full_install_lib_dir, "pkgconfig")
639+
env.Install(full_install_pkgconfig_dir, pkgconfig)
640+
641+
# Install the headers
642+
headers_from = []
643+
headers_to = []
644+
for dir_from, _, file_lst in itertools.chain(os.walk("include/godot_cpp"), os.walk("gen/include/godot_cpp")):
645+
dir_to = os.path.join(full_install_include_dir, dir_from[dir_from.find("/godot_cpp") + 1 :])
646+
headers_from += [os.path.join(dir_from, filename) for filename in file_lst]
647+
headers_to += [os.path.join(dir_to, filename) for filename in file_lst]
648+
env.InstallAs(headers_to, headers_from)
649+
# Install the gdextension files
650+
interface_header = os.path.join(extension_dir, "gdextension_interface.h")
651+
env.Install(full_install_include_dir, interface_header)
652+
653+
# Install the static library
654+
env.Install(full_install_lib_dir, library)
655+
656+
env.Alias("install", env["install_prefix_dir"])

0 commit comments

Comments
 (0)