Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SCons variant_dir support #1669

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion SConstruct
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
#!/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)
from binding_generator import scons_generate_bindings, scons_emit_files


EnsureSConsVersion(4, 0)

Expand All @@ -27,7 +33,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 @@ -13,12 +13,6 @@
from binding_generator import scons_emit_files, scons_generate_bindings


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 @@ -31,7 +25,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 @@ -51,9 +50,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 @@ -218,15 +218,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 @@ -529,8 +531,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 @@ -545,15 +548,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").srcnode(),
]
)

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