Skip to content

Commit

Permalink
Add SCons variant_dir support, which allows specifying a target build…
Browse files Browse the repository at this point in the history
… directory.
  • Loading branch information
Cedev authored and Ivorforce committed Jan 12, 2025
1 parent 94a1f4f commit 1345c46
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 21 deletions.
7 changes: 6 additions & 1 deletion SConstruct
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#!/usr/bin/env python

import os
import sys

# Add godot-cpp folder to sys.path, so that we can import local modules.
sys.path.append(Dir(".").srcnode().abspath)


EnsureSConsVersion(4, 0)

Expand All @@ -27,7 +32,7 @@ if profile:
elif os.path.isfile(profile + ".py"):
customs.append(profile + ".py")
opts = Variables(customs, ARGUMENTS)
cpp_tool = Tool("godotcpp", toolpath=["tools"])
cpp_tool = Tool("godotcpp", toolpath=[Dir("tools").srcnode().abspath])
cpp_tool.options(opts, env)
opts.Update(env)

Expand Down
50 changes: 30 additions & 20 deletions tools/godotcpp.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,6 @@
from build_profile import generate_trimmed_api


def add_sources(sources, dir, extension):
for f in os.listdir(dir):
if f.endswith("." + extension):
sources.append(dir + "/" + f)


def get_cmdline_bool(option, default):
"""We use `ARGUMENTS.get()` to check if options were manually overridden on the command line,
and SCons' _text2bool helper to convert them to booleans, otherwise they're handled as strings.
Expand All @@ -32,7 +26,12 @@ def get_cmdline_bool(option, default):


def normalize_path(val, env):
return val if os.path.isabs(val) else os.path.join(env.Dir("#").abspath, val)
"""Normalize a path that was provided by the user on the command line
and is thus either an absolute path, or relative to the top level directory (#)
where the command was run.
"""
# If val is an absolute path, it will not be joined.
return os.path.join(env.Dir("#").abspath, val)


def validate_file(key, val, env):
Expand All @@ -52,9 +51,10 @@ def validate_parent_dir(key, val, env):

def get_platform_tools_paths(env):
path = env.get("custom_tools", None)
tools_path = env.Dir("tools").srcnode().abspath
if path is None:
return ["tools"]
return [normalize_path(path, env), "tools"]
return [tools_path]
return [normalize_path(path, env), tools_path]


def get_custom_platforms(env):
Expand Down Expand Up @@ -250,15 +250,17 @@ def options(opts, env):
help="Path to a custom directory containing GDExtension interface header and API JSON file",
default=env.get("gdextension_dir", None),
validator=validate_dir,
)
),
converter=normalize_path,
)
opts.Add(
PathVariable(
key="custom_api_file",
help="Path to a custom GDExtension API JSON file (takes precedence over `gdextension_dir`)",
default=env.get("custom_api_file", None),
validator=validate_file,
)
),
converter=normalize_path,
)
opts.Add(
BoolVariable(
Expand Down Expand Up @@ -561,8 +563,9 @@ def generate(env):


def _godot_cpp(env):
extension_dir = normalize_path(env.get("gdextension_dir", env.Dir("gdextension").abspath), env)
api_file = normalize_path(env.get("custom_api_file", env.File(extension_dir + "/extension_api.json").abspath), env)
extension_dir = env.get("gdextension_dir", default=env.Dir("gdextension").srcnode().abspath)
api_file = env.get("custom_api_file", default=os.path.join(extension_dir, "extension_api.json"))

bindings = env.GodotCPPBindings(
env.Dir("."),
[
Expand All @@ -577,15 +580,22 @@ def _godot_cpp(env):
env.NoCache(bindings)

# Sources to compile
sources = []
add_sources(sources, "src", "cpp")
add_sources(sources, "src/classes", "cpp")
add_sources(sources, "src/core", "cpp")
add_sources(sources, "src/variant", "cpp")
sources.extend([f for f in bindings if str(f).endswith(".cpp")])
sources = [
*env.Glob("src/*.cpp"),
*env.Glob("src/classes/*.cpp"),
*env.Glob("src/core/*.cpp"),
*env.Glob("src/variant/*.cpp"),
*tuple(f for f in bindings if str(f).endswith(".cpp")),
]

# Includes
env.AppendUnique(CPPPATH=[env.Dir(d) for d in [extension_dir, "include", "gen/include"]])
env.AppendUnique(
CPPPATH=[
env.Dir(extension_dir),
env.Dir("include").srcnode(),
env.Dir("gen/include"),
]
)

library = None
library_name = "libgodot-cpp" + env["suffix"] + env["LIBSUFFIX"]
Expand Down

0 comments on commit 1345c46

Please sign in to comment.