summaryrefslogtreecommitdiff
path: root/SConstruct
diff options
context:
space:
mode:
Diffstat (limited to 'SConstruct')
-rw-r--r--SConstruct136
1 files changed, 76 insertions, 60 deletions
diff --git a/SConstruct b/SConstruct
index 57fa305a15..17cf779d4a 100644
--- a/SConstruct
+++ b/SConstruct
@@ -2,11 +2,12 @@
EnsureSConsVersion(0, 98, 1)
-import string
-import os
-import os.path
+# System
import glob
+import os
import sys
+
+# Local
import methods
import gles_builders
from platform_methods import run_in_subprocess
@@ -27,7 +28,7 @@ for x in sorted(glob.glob("platform/*")):
continue
tmppath = "./" + x
- sys.path.append(tmppath)
+ sys.path.insert(0, tmppath)
import detect
if (os.path.exists(x + "/export/export.cpp")):
@@ -65,20 +66,6 @@ if 'TERM' in os.environ:
env_base['ENV']['TERM'] = os.environ['TERM']
env_base.AppendENVPath('PATH', os.getenv('PATH'))
env_base.AppendENVPath('PKG_CONFIG_PATH', os.getenv('PKG_CONFIG_PATH'))
-env_base.android_maven_repos = []
-env_base.android_flat_dirs = []
-env_base.android_dependencies = []
-env_base.android_gradle_plugins = []
-env_base.android_gradle_classpath = []
-env_base.android_java_dirs = []
-env_base.android_res_dirs = []
-env_base.android_asset_dirs = []
-env_base.android_aidl_dirs = []
-env_base.android_jni_dirs = []
-env_base.android_default_config = []
-env_base.android_manifest_chunk = ""
-env_base.android_permission_chunk = ""
-env_base.android_appattributes_chunk = ""
env_base.disabled_modules = []
env_base.use_ptrcall = False
env_base.split_drivers = False
@@ -86,27 +73,6 @@ env_base.split_modules = False
env_base.module_version_string = ""
env_base.msvc = False
-# To decide whether to rebuild a file, use the MD5 sum only if the timestamp has changed.
-# http://scons.org/doc/production/HTML/scons-user/ch06.html#idm139837621851792
-env_base.Decider('MD5-timestamp')
-# Use cached implicit dependencies by default. Can be overridden by specifying `--implicit-deps-changed` in the command line.
-# http://scons.org/doc/production/HTML/scons-user/ch06s04.html
-env_base.SetOption('implicit_cache', 1)
-
-env_base.__class__.android_add_maven_repository = methods.android_add_maven_repository
-env_base.__class__.android_add_flat_dir = methods.android_add_flat_dir
-env_base.__class__.android_add_dependency = methods.android_add_dependency
-env_base.__class__.android_add_java_dir = methods.android_add_java_dir
-env_base.__class__.android_add_res_dir = methods.android_add_res_dir
-env_base.__class__.android_add_asset_dir = methods.android_add_asset_dir
-env_base.__class__.android_add_aidl_dir = methods.android_add_aidl_dir
-env_base.__class__.android_add_jni_dir = methods.android_add_jni_dir
-env_base.__class__.android_add_default_config = methods.android_add_default_config
-env_base.__class__.android_add_to_manifest = methods.android_add_to_manifest
-env_base.__class__.android_add_to_permissions = methods.android_add_to_permissions
-env_base.__class__.android_add_to_attributes = methods.android_add_to_attributes
-env_base.__class__.android_add_gradle_plugin = methods.android_add_gradle_plugin
-env_base.__class__.android_add_gradle_classpath = methods.android_add_gradle_classpath
env_base.__class__.disable_module = methods.disable_module
env_base.__class__.add_module_version_string = methods.add_module_version_string
@@ -130,7 +96,6 @@ customs = ['custom.py']
profile = ARGUMENTS.get("profile", False)
if profile:
- import os.path
if os.path.isfile(profile):
customs.append(profile)
elif os.path.isfile(profile + ".py"):
@@ -147,6 +112,7 @@ opts.Add(EnumVariable('target', "Compilation target", 'debug', ('debug', 'releas
opts.Add(EnumVariable('optimize', "Optimization type", 'speed', ('speed', 'size')))
opts.Add(BoolVariable('tools', "Build the tools (a.k.a. the Godot editor)", True))
opts.Add(BoolVariable('use_lto', 'Use link-time optimization', False))
+opts.Add(BoolVariable('use_precise_math_checks', 'Math checks use very precise epsilon (useful to debug the engine)', False))
# Components
opts.Add(BoolVariable('deprecated', "Enable deprecated features", True))
@@ -183,10 +149,9 @@ opts.Add(BoolVariable('builtin_libwebsockets', "Use the built-in libwebsockets l
opts.Add(BoolVariable('builtin_mbedtls', "Use the built-in mbedTLS library", True))
opts.Add(BoolVariable('builtin_miniupnpc', "Use the built-in miniupnpc library", True))
opts.Add(BoolVariable('builtin_opus', "Use the built-in Opus library", True))
-opts.Add(BoolVariable('builtin_pcre2', "Use the built-in PCRE2 library)", True))
+opts.Add(BoolVariable('builtin_pcre2', "Use the built-in PCRE2 library", True))
opts.Add(BoolVariable('builtin_recast', "Use the built-in Recast library", True))
opts.Add(BoolVariable('builtin_squish', "Use the built-in squish library", True))
-opts.Add(BoolVariable('builtin_thekla_atlas', "Use the built-in thekla_altas library", True))
opts.Add(BoolVariable('builtin_xatlas', "Use the built-in xatlas library", True))
opts.Add(BoolVariable('builtin_zlib', "Use the built-in zlib library", True))
opts.Add(BoolVariable('builtin_zstd', "Use the built-in Zstd library", True))
@@ -196,8 +161,8 @@ opts.Add("CXX", "C++ compiler")
opts.Add("CC", "C compiler")
opts.Add("LINK", "Linker")
opts.Add("CCFLAGS", "Custom flags for both the C and C++ compilers")
-opts.Add("CXXFLAGS", "Custom flags for the C++ compiler")
opts.Add("CFLAGS", "Custom flags for the C compiler")
+opts.Add("CXXFLAGS", "Custom flags for the C++ compiler")
opts.Add("LINKFLAGS", "Custom flags for the linker")
# add platform specific options
@@ -210,7 +175,7 @@ for k in platform_opts.keys():
for x in module_list:
module_enabled = True
tmppath = "./modules/" + x
- sys.path.append(tmppath)
+ sys.path.insert(0, tmppath)
import config
enabled_attr = getattr(config, "is_enabled", None)
if (callable(enabled_attr) and not config.is_enabled()):
@@ -224,15 +189,28 @@ Help(opts.GenerateHelpText(env_base)) # generate help
# add default include paths
-env_base.Append(CPPPATH=['#editor', '#'])
+env_base.Prepend(CPPPATH=['#', '#editor'])
# configure ENV for platform
env_base.platform_exporters = platform_exporters
env_base.platform_apis = platform_apis
+if (env_base["use_precise_math_checks"]):
+ env_base.Append(CPPDEFINES=['PRECISE_MATH_CHECKS'])
+
if (env_base['target'] == 'debug'):
env_base.Append(CPPDEFINES=['DEBUG_MEMORY_ALLOC','DISABLE_FORCED_INLINE'])
+ # The two options below speed up incremental builds, but reduce the certainty that all files
+ # will properly be rebuilt. As such, we only enable them for debug (dev) builds, not release.
+
+ # To decide whether to rebuild a file, use the MD5 sum only if the timestamp has changed.
+ # http://scons.org/doc/production/HTML/scons-user/ch06.html#idm139837621851792
+ env_base.Decider('MD5-timestamp')
+ # Use cached implicit dependencies by default. Can be overridden by specifying `--implicit-deps-changed` in the command line.
+ # http://scons.org/doc/production/HTML/scons-user/ch06s04.html
+ env_base.SetOption('implicit_cache', 1)
+
if (env_base['no_editor_splash']):
env_base.Append(CPPDEFINES=['NO_EDITOR_SPLASH'])
@@ -248,10 +226,27 @@ if env_base['platform'] != "":
elif env_base['p'] != "":
selected_platform = env_base['p']
env_base["platform"] = selected_platform
+else:
+ # Missing `platform` argument, try to detect platform automatically
+ if sys.platform.startswith('linux'):
+ selected_platform = 'x11'
+ elif sys.platform == 'darwin':
+ selected_platform = 'osx'
+ elif sys.platform == 'win32':
+ selected_platform = 'windows'
+ else:
+ print("Could not detect platform automatically. Supported platforms:")
+ for x in platform_list:
+ print("\t" + x)
+ print("\nPlease run SCons again and select a valid platform: platform=<string>")
-if selected_platform in platform_list:
+ if selected_platform != "":
+ print("Automatically detected platform: " + selected_platform)
+ env_base["platform"] = selected_platform
- sys.path.append("./platform/" + selected_platform)
+if selected_platform in platform_list:
+ tmppath = "./platform/" + selected_platform
+ sys.path.insert(0, tmppath)
import detect
if "create" in dir(detect):
env = detect.create(env_base)
@@ -293,17 +288,18 @@ if selected_platform in platform_list:
CCFLAGS = env.get('CCFLAGS', '')
env['CCFLAGS'] = ''
-
env.Append(CCFLAGS=str(CCFLAGS).split())
CFLAGS = env.get('CFLAGS', '')
env['CFLAGS'] = ''
-
env.Append(CFLAGS=str(CFLAGS).split())
+ CXXFLAGS = env.get('CXXFLAGS', '')
+ env['CXXFLAGS'] = ''
+ env.Append(CXXFLAGS=str(CXXFLAGS).split())
+
LINKFLAGS = env.get('LINKFLAGS', '')
env['LINKFLAGS'] = ''
-
env.Append(LINKFLAGS=str(LINKFLAGS).split())
flag_list = platform_flags[selected_platform]
@@ -331,13 +327,33 @@ if selected_platform in platform_list:
if (env["werror"]):
env.Append(CCFLAGS=['/WX'])
else: # Rest of the world
- disable_nonessential_warnings = ['-Wno-sign-compare']
+ shadow_local_warning = []
+ all_plus_warnings = ['-Wwrite-strings']
+
+ if methods.using_gcc(env):
+ version = methods.get_compiler_version(env)
+ if version != None and version[0] >= '7':
+ shadow_local_warning = ['-Wshadow-local']
+
if (env["warnings"] == 'extra'):
- env.Append(CCFLAGS=['-Wall', '-Wextra'])
+ # FIXME: enable -Wclobbered once #26351 is fixed
+ # FIXME: enable -Wduplicated-branches once #27594 is merged
+ # Note: enable -Wimplicit-fallthrough for Clang (already part of -Wextra for GCC)
+ # once we switch to C++11 or later (necessary for our FALLTHROUGH macro).
+ env.Append(CCFLAGS=['-Wall', '-Wextra', '-Wno-unused-parameter']
+ + all_plus_warnings + shadow_local_warning)
+ env.Append(CXXFLAGS=['-Wctor-dtor-privacy', '-Wnon-virtual-dtor'])
+ if methods.using_gcc(env):
+ env.Append(CCFLAGS=['-Wno-clobbered', '-Walloc-zero',
+ '-Wduplicated-cond', '-Wstringop-overflow=4', '-Wlogical-op'])
+ env.Append(CXXFLAGS=['-Wnoexcept', '-Wplacement-new=1'])
+ version = methods.get_compiler_version(env)
+ if version != None and version[0] >= '9':
+ env.Append(CCFLAGS=['-Wattribute-alias=2'])
elif (env["warnings"] == 'all'):
- env.Append(CCFLAGS=['-Wall'] + disable_nonessential_warnings)
+ env.Append(CCFLAGS=['-Wall'] + shadow_local_warning)
elif (env["warnings"] == 'moderate'):
- env.Append(CCFLAGS=['-Wall', '-Wno-unused'] + disable_nonessential_warnings)
+ env.Append(CCFLAGS=['-Wall', '-Wno-unused'] + shadow_local_warning)
else: # 'no'
env.Append(CCFLAGS=['-w'])
if (env["werror"]):
@@ -377,7 +393,7 @@ if selected_platform in platform_list:
suffix += env.extra_suffix
- sys.path.remove("./platform/" + selected_platform)
+ sys.path.remove(tmppath)
sys.modules.pop('detect')
env.module_list = []
@@ -387,7 +403,7 @@ if selected_platform in platform_list:
if not env['module_' + x + '_enabled']:
continue
tmppath = "./modules/" + x
- sys.path.append(tmppath)
+ sys.path.insert(0, tmppath)
env.current_module = x
import config
# can_build changed number of arguments between 3.0 (1) and 3.1 (2),
@@ -493,13 +509,13 @@ if selected_platform in platform_list:
if (conf.CheckCHeader(header[0])):
env.AppendUnique(CPPDEFINES=[header[1]])
-else:
+elif selected_platform != "":
- print("No valid target platform selected.")
+ print("Invalid target platform: " + selected_platform)
print("The following platforms were detected:")
for x in platform_list:
print("\t" + x)
- print("\nPlease run SCons again with the argument: platform=<string>")
+ print("\nPlease run SCons again and select a valid platform: platform=<string>")
# The following only makes sense when the env is defined, and assumes it is
if 'env' in locals():
@@ -563,7 +579,7 @@ if 'env' in locals():
# (filename, size, weight).
current_time = time.time()
file_stat = [(x[0], x[1][0], (current_time - x[1][1])) for x in file_stat]
- # Sort by the most resently accessed files (most sensible to keep) first
+ # Sort by the most recently accessed files (most sensible to keep) first
file_stat.sort(key=lambda x: x[2])
# Search for the first entry where the storage limit is
# reached