Initial build fix.

This commit is contained in:
Relintai 2024-01-25 12:37:48 +01:00
parent 80ccc7b205
commit aaebd450bb
4 changed files with 19 additions and 305 deletions

View File

@ -13,8 +13,6 @@ from collections import OrderedDict
# Local # Local
import methods import methods
import gles_builders
import scu_builders
from platform_methods import run_in_subprocess from platform_methods import run_in_subprocess
# scan possible build platforms # scan possible build platforms
@ -54,8 +52,6 @@ for x in sorted(glob.glob("platform/*")):
sys.path.remove(tmppath) sys.path.remove(tmppath)
sys.modules.pop("detect") sys.modules.pop("detect")
methods.save_active_platforms(active_platforms, active_platform_ids)
custom_tools = ["default"] custom_tools = ["default"]
platform_arg = ARGUMENTS.get("platform", ARGUMENTS.get("p", False)) platform_arg = ARGUMENTS.get("platform", ARGUMENTS.get("p", False))
@ -121,7 +117,6 @@ opts = Variables(customs, ARGUMENTS)
# Target build options # Target build options
opts.Add("p", "Platform (alias for 'platform')", "") opts.Add("p", "Platform (alias for 'platform')", "")
opts.Add("platform", "Target platform (%s)" % ("|".join(platform_list),), "") opts.Add("platform", "Target platform (%s)" % ("|".join(platform_list),), "")
opts.Add(BoolVariable("tools", "Build the tools (a.k.a. the Pandemonium editor)", True))
opts.Add(EnumVariable("target", "Compilation target", "debug", ("debug", "release_debug", "release"))) opts.Add(EnumVariable("target", "Compilation target", "debug", ("debug", "release_debug", "release")))
opts.Add("arch", "Platform-dependent architecture (arm/arm64/x86/x64/mips/...)", "") opts.Add("arch", "Platform-dependent architecture (arm/arm64/x86/x64/mips/...)", "")
opts.Add(EnumVariable("bits", "Target platform bits", "default", ("default", "32", "64"))) opts.Add(EnumVariable("bits", "Target platform bits", "default", ("default", "32", "64")))
@ -135,8 +130,6 @@ opts.Add(BoolVariable("deprecated", "Enable deprecated features", True))
opts.Add(BoolVariable("minizip", "Enable ZIP archive support using minizip", True)) opts.Add(BoolVariable("minizip", "Enable ZIP archive support using minizip", True))
opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False)) opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False))
opts.Add(BoolVariable("disable_exceptions", "Force disabling exception handling code", True)) opts.Add(BoolVariable("disable_exceptions", "Force disabling exception handling code", True))
opts.Add("custom_modules", "A list of comma-separated directory paths containing custom modules to build.", "")
opts.Add(BoolVariable("custom_modules_recursive", "Detect custom modules recursively for each specified path.", True))
# Advanced options # Advanced options
opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False)) opts.Add(BoolVariable("dev", "If yes, alias for verbose=yes warnings=extra werror=yes", False))
@ -266,55 +259,6 @@ if selected_platform in platform_opts:
opts.Update(env_base) opts.Update(env_base)
env_base["platform"] = selected_platform # Must always be re-set after calling opts.Update(). env_base["platform"] = selected_platform # Must always be re-set after calling opts.Update().
# Detect modules.
modules_detected = OrderedDict()
module_search_paths = [ "modules", methods.convert_custom_modules_path("editor_modules") ] # Built-in path.
# maybe?
#if env_base["tools"]:
# module_search_paths.append(methods.convert_custom_modules_path("editor_modules"))
if env_base["custom_modules"]:
paths = env_base["custom_modules"].split(",")
for p in paths:
try:
module_search_paths.append(methods.convert_custom_modules_path(p))
except ValueError as e:
print(e)
sys.exit(255)
for path in module_search_paths:
if path == "modules":
# Built-in modules don't have nested modules,
# so save the time it takes to parse directories.
modules = methods.detect_modules(path, recursive=False)
else: # Custom.
modules = methods.detect_modules(path, env_base["custom_modules_recursive"])
# Provide default include path for both the custom module search `path`
# and the base directory containing custom modules, as it may be different
# from the built-in "modules" name (e.g. "custom_modules/summator/summator.h"),
# so it can be referenced simply as `#include "summator/summator.h"`
# independently of where a module is located on user's filesystem.
env_base.Prepend(CPPPATH=[path, os.path.dirname(path)])
# Note: custom modules can override built-in ones.
modules_detected.update(modules)
# Add module options
for name, path in modules_detected.items():
enabled = True
sys.path.insert(0, path)
import config
try:
enabled = config.is_enabled()
except AttributeError:
pass
sys.path.remove(path)
sys.modules.pop("config")
opts.Add(BoolVariable("module_" + name + "_enabled", "Enable module '%s'" % (name,), enabled))
methods.write_modules(modules_detected)
# Update the environment again after all the module options are added. # Update the environment again after all the module options are added.
opts.Update(env_base) opts.Update(env_base)
env_base["platform"] = selected_platform # Must always be re-set after calling opts.Update(). env_base["platform"] = selected_platform # Must always be re-set after calling opts.Update().
@ -423,12 +367,6 @@ if selected_platform in platform_list:
env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False) env["debug_symbols"] = methods.get_cmdline_bool("debug_symbols", False)
# LTO "auto" means we handle the preferred option in each platform detect.py. # LTO "auto" means we handle the preferred option in each platform detect.py.
env["lto"] = ARGUMENTS.get("lto", "auto") env["lto"] = ARGUMENTS.get("lto", "auto")
if not env["tools"] and env["target"] == "debug":
print(
"WARNING: Requested `production` build with `tools=no target=debug`, "
"this will give you a full debug template (use `target=release_debug` "
"for an optimized template with debug features)."
)
# Run SCU file generation script if in a SCU build. # Run SCU file generation script if in a SCU build.
if env["scu_build"]: if env["scu_build"]:
@ -561,27 +499,14 @@ if selected_platform in platform_list:
suffix = "." + selected_platform suffix = "." + selected_platform
if env["target"] == "release": if env["target"] == "release":
if env["tools"]:
print("ERROR: The editor can only be built with `target=debug` or `target=release_debug`.")
print(" Use `tools=no target=release` to build a release export template.")
Exit(255)
suffix += ".opt" suffix += ".opt"
elif env["target"] == "release_debug": elif env["target"] == "release_debug":
if env["tools"]: suffix += ".opt.debug"
suffix += ".opt.tools"
else:
suffix += ".opt.debug"
else: else:
if env["tools"]: print(
print( "Note: Building a debug binary (which will run slowly). Use `target=release` to build an optimized release binary."
"Note: Building a debug binary (which will run slowly). Use `target=release_debug` to build an optimized release binary." )
) suffix += ".debug"
suffix += ".tools"
else:
print(
"Note: Building a debug binary (which will run slowly). Use `target=release` to build an optimized release binary."
)
suffix += ".debug"
if env["arch"] != "": if env["arch"] != "":
suffix += "." + env["arch"] suffix += "." + env["arch"]
@ -601,67 +526,9 @@ if selected_platform in platform_list:
env.module_license_files = [] env.module_license_files = []
env.doc_class_path = {} env.doc_class_path = {}
for name, path in modules_detected.items():
if not env["module_" + name + "_enabled"]:
continue
sys.path.insert(0, path)
env.current_module = name
import config
if config.can_build(env, selected_platform):
# Disable it if a required dependency is missing.
if not env.module_check_dependencies(name):
continue
config.configure(env)
# Get doc classes paths (if present)
try:
doc_classes = config.get_doc_classes()
doc_path = config.get_doc_path()
for c in doc_classes:
env.doc_class_path[c] = path + "/" + doc_path
except Exception:
pass
# Get icon paths (if present)
try:
icons_path = config.get_icons_path()
env.module_icons_paths.append(path + "/" + icons_path)
except Exception:
# Default path for module icons
env.module_icons_paths.append(path + "/" + "icons")
# Get license path (if present)
try:
license_file = config.get_license_file()
if not os.path.isabs(path):
env.module_license_files.append("#" + path + "/" + license_file)
else:
env.module_license_files.append(path + "/" + license_file)
except Exception:
pass
modules_enabled[name] = path
else:
env["module_" + name + "_enabled"] = False
sys.path.remove(path)
sys.modules.pop("config")
#TODO hack, the editor should be a module as well
if env["tools"] and not env["module_freetype_enabled"]:
print("The editor (tools=yes) can't be built if freetype is disabled! Stopping.")
sys.exit(255)
env.module_list = modules_enabled env.module_list = modules_enabled
methods.sort_module_list(env) methods.sort_module_list(env)
methods.generate_version_header(env.module_version_string)
env["PROGSUFFIX"] = suffix + env.module_version_string + env["PROGSUFFIX"] env["PROGSUFFIX"] = suffix + env.module_version_string + env["PROGSUFFIX"]
env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"] env["OBJSUFFIX"] = suffix + env["OBJSUFFIX"]
# (SH)LIBSUFFIX will be used for our own built libraries # (SH)LIBSUFFIX will be used for our own built libraries
@ -679,43 +546,13 @@ if selected_platform in platform_list:
if env.use_ptrcall: if env.use_ptrcall:
env.Append(CPPDEFINES=["PTRCALL_ENABLED"]) env.Append(CPPDEFINES=["PTRCALL_ENABLED"])
if env["tools"]:
env.Append(CPPDEFINES=["TOOLS_ENABLED"])
if env["disable_3d"]:
if env["tools"]:
print(
"Build option 'disable_3d=yes' cannot be used with 'tools=yes' (editor), "
"only with 'tools=no' (export template)."
)
sys.exit(255)
else:
env.Append(CPPDEFINES=["_3D_DISABLED"])
if env["disable_advanced_gui"]:
if env["tools"]:
print(
"Build option 'disable_advanced_gui=yes' cannot be used with 'tools=yes' (editor), "
"only with 'tools=no' (export template)."
)
sys.exit(255)
else:
env.Append(CPPDEFINES=["ADVANCED_GUI_DISABLED"])
if env["minizip"]: if env["minizip"]:
env.Append(CPPDEFINES=["MINIZIP_ENABLED"]) env.Append(CPPDEFINES=["MINIZIP_ENABLED"])
if not env["verbose"]: if not env["verbose"]:
methods.no_verbose(sys, env) methods.no_verbose(sys, env)
if not env["platform"] == "server":
env.Append(
BUILDERS={
"GLES2_GLSL": env.Builder(
action=run_in_subprocess(gles_builders.build_gles2_headers), suffix="glsl.gen.h", src_suffix=".glsl"
)
}
)
scons_cache_path = os.environ.get("SCONS_CACHE") scons_cache_path = os.environ.get("SCONS_CACHE")
if scons_cache_path != None: if scons_cache_path != None:
CacheDir(scons_cache_path) CacheDir(scons_cache_path)
@ -742,20 +579,7 @@ if selected_platform in platform_list:
# build subdirs, the build order is dependent on link order. # build subdirs, the build order is dependent on link order.
SConscript("core/SCsub")
SConscript("servers/SCsub")
SConscript("scene/SCsub")
if env["tools"]:
SConscript("editor/SCsub")
SConscript("drivers/SCsub")
SConscript("platform/SCsub") SConscript("platform/SCsub")
SConscript("modules/SCsub")
SConscript("main/SCsub")
SConscript("platform/" + selected_platform + "/SCsub") # build selected platform
# Microsoft Visual Studio Project Generation # Microsoft Visual Studio Project Generation
if env["vsproj"]: if env["vsproj"]:

View File

@ -224,47 +224,6 @@ def get_version_info(module_version_string="", silent=False):
return version_info return version_info
def generate_version_header(module_version_string=""):
version_info = get_version_info(module_version_string)
# NOTE: It is safe to generate these files here, since this is still executed serially.
f = open("core/version_generated.gen.h", "w")
f.write(
"""/* THIS FILE IS GENERATED DO NOT EDIT */
#ifndef VERSION_GENERATED_GEN_H
#define VERSION_GENERATED_GEN_H
#define VERSION_SHORT_NAME "{short_name}"
#define VERSION_NAME "{name}"
#define VERSION_MAJOR {major}
#define VERSION_MINOR {minor}
#define VERSION_PATCH {patch}
#define VERSION_STATUS "{status}"
#define VERSION_BUILD "{build}"
#define VERSION_MODULE_CONFIG "{module_config}"
#define VERSION_YEAR {year}
#define VERSION_WEBSITE "{website}"
#define VERSION_DOCS_BRANCH "{docs_branch}"
#define VERSION_DOCS_URL "https://github.com/Relintai/pandemonium_engine_docs/blob/" VERSION_DOCS_BRANCH
#endif // VERSION_GENERATED_GEN_H
""".format(
**version_info
)
)
f.close()
fhash = open("core/version_hash.gen.cpp", "w")
fhash.write(
"""/* THIS FILE IS GENERATED DO NOT EDIT */
#include "core/version.h"
const char *const VERSION_HASH = "{git_hash}";
""".format(
**version_info
)
)
fhash.close()
def parse_cg_file(fname, uniforms, sizes, conditionals): def parse_cg_file(fname, uniforms, sizes, conditionals):
fs = open(fname, "r") fs = open(fname, "r")
@ -381,51 +340,6 @@ def is_module(path):
return False return False
return True return True
def write_modules(modules):
includes_cpp = ""
register_cpp = ""
unregister_cpp = ""
for name, path in modules.items():
try:
with open(os.path.join(path, "register_types.h")):
includes_cpp += '#include "' + path + '/register_types.h"\n'
register_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
register_cpp += "\tregister_" + name + "_types(p_level);\n"
register_cpp += "#endif\n"
unregister_cpp += "#ifdef MODULE_" + name.upper() + "_ENABLED\n"
unregister_cpp += "\tunregister_" + name + "_types(p_level);\n"
unregister_cpp += "#endif\n"
except IOError:
pass
modules_cpp = """// register_module_types.gen.cpp
/* THIS FILE IS GENERATED DO NOT EDIT */
#include "register_module_types.h"
#include "modules/modules_enabled.gen.h"
%s
void register_module_types(ModuleRegistrationLevel p_level) {
%s
}
void unregister_module_types(ModuleRegistrationLevel p_level) {
%s
}
""" % (
includes_cpp,
register_cpp,
unregister_cpp,
)
# NOTE: It is safe to generate this file here, since this is still executed serially
with open("modules/register_module_types.gen.cpp", "w") as f:
f.write(modules_cpp)
def convert_custom_modules_path(path): def convert_custom_modules_path(path):
if not path: if not path:
return path return path
@ -612,34 +526,6 @@ def split_lib(self, libname, src_list=None, env_lib=None):
env["SHLINKCOM"] = str(env["LINKCOM"]).replace("$_LIBFLAGS", "-Wl,--start-group $_LIBFLAGS -Wl,--end-group") env["SHLINKCOM"] = str(env["LINKCOM"]).replace("$_LIBFLAGS", "-Wl,--start-group $_LIBFLAGS -Wl,--end-group")
def save_active_platforms(apnames, ap):
for x in ap:
names = ["logo"]
if os.path.isfile(x + "/run_icon.png"):
names.append("run_icon")
for name in names:
pngf = open(x + "/" + name + ".png", "rb")
b = pngf.read(1)
str = " /* AUTOGENERATED FILE, DO NOT EDIT */ \n"
str += " static const unsigned char _" + x[9:] + "_" + name + "[]={"
while len(b) == 1:
str += hex(ord(b))
b = pngf.read(1)
if len(b) == 1:
str += ","
str += "};\n"
pngf.close()
# NOTE: It is safe to generate this file here, since this is still executed serially
wf = x + "/" + name + ".gen.h"
with open(wf, "w") as pngw:
pngw.write(str)
def no_verbose(sys, env): def no_verbose(sys, env):
colors = {} colors = {}
@ -954,7 +840,6 @@ def generate_vs_project(env, num_jobs):
common_build_prefix = [ common_build_prefix = [
'cmd /V /C set "plat=$(PlatformTarget)"', 'cmd /V /C set "plat=$(PlatformTarget)"',
'(if "$(PlatformTarget)"=="x64" (set "plat=x86_amd64"))', '(if "$(PlatformTarget)"=="x64" (set "plat=x86_amd64"))',
'set "tools=%s"' % env["tools"],
f'(if "{configuration_getter}"=="release" (set "tools=no"))', f'(if "{configuration_getter}"=="release" (set "tools=no"))',
'call "' + batch_file + '" !plat!', 'call "' + batch_file + '" !plat!',
] ]

View File

@ -1597,7 +1597,7 @@ template class MutexImpl<std::mutex>;
void check_lockless_atomics() { void check_lockless_atomics() {
// Doing the check for the types we actually care about // Doing the check for the types we actually care about
if (!std::atomic<uint32_t>{}.is_lock_free() || !std::atomic<uint64_t>{}.is_lock_free() || !std::atomic_bool{}.is_lock_free()) { if (!std::atomic<uint32_t>{}.is_lock_free() || !std::atomic<uint64_t>{}.is_lock_free() || !std::atomic_bool{}.is_lock_free()) {
WARN_PRINT("Your compiler doesn't seem to support lockless atomics. Performance will be degraded. Please consider upgrading to a different or newer compiler."); LOG_WARN("Your compiler doesn't seem to support lockless atomics. Performance will be degraded. Please consider upgrading to a different or newer compiler.");
} }
} }
@ -7773,7 +7773,7 @@ static double built_in_strtod(
if (exp > maxExponent) { if (exp > maxExponent) {
exp = maxExponent; exp = maxExponent;
//WARN_PRINT("Exponent too high"); //LOG_WARN("Exponent too high");
} }
dblExp = 1.0; dblExp = 1.0;
for (d = powersOf10; exp != 0; exp >>= 1, ++d) { for (d = powersOf10; exp != 0; exp >>= 1, ++d) {
@ -8421,13 +8421,13 @@ void StringName::cleanup() {
} }
} }
print_line("\nStringName reference ranking (from most to least referenced):\n"); LOG_MSG("\nStringName reference ranking (from most to least referenced):\n");
data.sort_custom<DebugSortReferences>(); data.sort_custom<DebugSortReferences>();
int unreferenced_stringnames = 0; int unreferenced_stringnames = 0;
int rarely_referenced_stringnames = 0; int rarely_referenced_stringnames = 0;
for (int i = 0; i < data.size(); i++) { for (int i = 0; i < data.size(); i++) {
print_line(itos(i + 1) + ": " + data[i]->get_name() + " - " + itos(data[i]->debug_references)); LOG_MSG(itos(i + 1) + ": " + data[i]->get_name() + " - " + itos(data[i]->debug_references));
if (data[i]->debug_references == 0) { if (data[i]->debug_references == 0) {
unreferenced_stringnames += 1; unreferenced_stringnames += 1;
} else if (data[i]->debug_references < 5) { } else if (data[i]->debug_references < 5) {
@ -8435,8 +8435,8 @@ void StringName::cleanup() {
} }
} }
print_line(vformat("\nOut of %d StringNames, %d StringNames were never referenced during this run (0 times) (%.2f%%).", data.size(), unreferenced_stringnames, unreferenced_stringnames / float(data.size()) * 100)); LOG_MSG(vformat("\nOut of %d StringNames, %d StringNames were never referenced during this run (0 times) (%.2f%%).", data.size(), unreferenced_stringnames, unreferenced_stringnames / float(data.size()) * 100));
print_line(vformat("Out of %d StringNames, %d StringNames were rarely referenced during this run (1-4 times) (%.2f%%).", data.size(), rarely_referenced_stringnames, rarely_referenced_stringnames / float(data.size()) * 100)); LOG_MSG(vformat("Out of %d StringNames, %d StringNames were rarely referenced during this run (1-4 times) (%.2f%%).", data.size(), rarely_referenced_stringnames, rarely_referenced_stringnames / float(data.size()) * 100));
} }
#endif #endif
@ -8450,9 +8450,9 @@ void StringName::cleanup() {
lost_strings++; lost_strings++;
if (OS::get_singleton()->is_stdout_verbose()) { if (OS::get_singleton()->is_stdout_verbose()) {
if (d->cname) { if (d->cname) {
print_line("Orphan StringName: " + String(d->cname)); LOG_MSG("Orphan StringName: " + String(d->cname));
} else { } else {
print_line("Orphan StringName: " + String(d->name)); LOG_MSG("Orphan StringName: " + String(d->name));
} }
} }
} }
@ -9663,7 +9663,7 @@ Error FileAccess::_open(const String &p_path, int p_mode_flags) {
if (fname != String()) { if (fname != String()) {
String base_file = path.get_file(); String base_file = path.get_file();
if (base_file != fname && base_file.findn(fname) == 0) { if (base_file != fname && base_file.findn(fname) == 0) {
WARN_PRINT("Case mismatch opening requested file '" + base_file + "', stored as '" + fname + "' in the filesystem. This file will not open when exported to other case-sensitive platforms."); LOG_WARN("Case mismatch opening requested file '" + base_file + "', stored as '" + fname + "' in the filesystem. This file will not open when exported to other case-sensitive platforms.");
} }
} }

5
platform/sfwl_compat.h Normal file
View File

@ -0,0 +1,5 @@
#ifndef SFWL_COMPAT_H
#define SFWL_COMPAT_H
#endif