SCons: Add explicit dependencies on thirdparty code in cloned env

Since we clone the environments to build thirdparty code, we don't get an
explicit dependency on the build objects produced by that environment.

So when we update thirdparty code, Godot code using it is not necessarily
rebuilt (I think it is for changed headers, but not for changed .c/.cpp files),
which can lead to an invalid compilation output (linking old Godot .o files
with a newer, potentially ABI breaking version of thirdparty code).

This was only seen as really problematic with bullet updates (leading to
crashes when rebuilding Godot after a bullet update without cleaning .o files),
but it's safer to fix it everywhere, even if it's a LOT of hacky boilerplate.

(cherry picked from commit c7b53c03ae)
This commit is contained in:
Rémi Verschelde 2020-12-17 16:01:36 +01:00
parent 0c14d10522
commit e94161dada
No known key found for this signature in database
GPG Key ID: C3336907360768E1
36 changed files with 475 additions and 106 deletions

View File

@ -40,6 +40,9 @@ with open("script_encryption_key.gen.cpp", "w") as f:
# Add required thirdparty code. # Add required thirdparty code.
thirdparty_obj = []
env_thirdparty = env.Clone() env_thirdparty = env.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
@ -57,7 +60,7 @@ thirdparty_misc_sources = [
"clipper.cpp", "clipper.cpp",
] ]
thirdparty_misc_sources = [thirdparty_misc_dir + file for file in thirdparty_misc_sources] thirdparty_misc_sources = [thirdparty_misc_dir + file for file in thirdparty_misc_sources]
env_thirdparty.add_source_files(env.core_sources, thirdparty_misc_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_misc_sources)
# Zlib library, can be unbundled # Zlib library, can be unbundled
if env["builtin_zlib"]: if env["builtin_zlib"]:
@ -83,7 +86,7 @@ if env["builtin_zlib"]:
if env["target"] == "debug": if env["target"] == "debug":
env_thirdparty.Append(CPPDEFINES=["ZLIB_DEBUG"]) env_thirdparty.Append(CPPDEFINES=["ZLIB_DEBUG"])
env_thirdparty.add_source_files(env.core_sources, thirdparty_zlib_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_zlib_sources)
# Minizip library, could be unbundled in theory # Minizip library, could be unbundled in theory
# However, our version has some custom modifications, so it won't compile with the system one # However, our version has some custom modifications, so it won't compile with the system one
@ -94,7 +97,7 @@ thirdparty_minizip_sources = [
"zip.c", "zip.c",
] ]
thirdparty_minizip_sources = [thirdparty_minizip_dir + file for file in thirdparty_minizip_sources] thirdparty_minizip_sources = [thirdparty_minizip_dir + file for file in thirdparty_minizip_sources]
env_thirdparty.add_source_files(env.core_sources, thirdparty_minizip_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_minizip_sources)
# Zstd library, can be unbundled in theory # Zstd library, can be unbundled in theory
# though we currently use some private symbols # though we currently use some private symbols
@ -136,10 +139,14 @@ if env["builtin_zstd"]:
# Also needed in main env includes will trigger warnings # Also needed in main env includes will trigger warnings
env.Append(CPPDEFINES=["ZSTD_STATIC_LINKING_ONLY"]) env.Append(CPPDEFINES=["ZSTD_STATIC_LINKING_ONLY"])
env_thirdparty.add_source_files(env.core_sources, thirdparty_zstd_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_zstd_sources)
# Godot's own sources env.core_sources += thirdparty_obj
# Godot source files
env.add_source_files(env.core_sources, "*.cpp") env.add_source_files(env.core_sources, "*.cpp")
# Certificates # Certificates
@ -185,3 +192,6 @@ SConscript("bind/SCsub")
# Build it all as a library # Build it all as a library
lib = env.add_library("core", env.core_sources) lib = env.add_library("core", env.core_sources)
env.Prepend(LIBS=[lib]) env.Prepend(LIBS=[lib])
# Needed to force rebuilding the core files when the thirdparty code is updated.
env.Depends(lib, thirdparty_obj)

View File

@ -6,6 +6,7 @@ env_crypto = env.Clone()
is_builtin = env["builtin_mbedtls"] is_builtin = env["builtin_mbedtls"]
has_module = env["module_mbedtls_enabled"] has_module = env["module_mbedtls_enabled"]
thirdparty_obj = []
if is_builtin or not has_module: if is_builtin or not has_module:
# Use our headers for builtin or if the module is not going to be compiled. # Use our headers for builtin or if the module is not going to be compiled.
@ -35,6 +36,16 @@ if not has_module:
"godot_core_mbedtls_platform.c", "godot_core_mbedtls_platform.c",
] ]
thirdparty_mbedtls_sources = [thirdparty_mbedtls_dir + file for file in thirdparty_mbedtls_sources] thirdparty_mbedtls_sources = [thirdparty_mbedtls_dir + file for file in thirdparty_mbedtls_sources]
env_thirdparty.add_source_files(env.core_sources, thirdparty_mbedtls_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_mbedtls_sources)
env.core_sources += thirdparty_obj
env_crypto.add_source_files(env.core_sources, "*.cpp")
# Godot source files
core_obj = []
env_crypto.add_source_files(core_obj, "*.cpp")
env.core_sources += core_obj
# Needed to force rebuilding the core files when the thirdparty library is updated.
env.Depends(core_obj, thirdparty_obj)

View File

@ -2,6 +2,8 @@
Import("env") Import("env")
thirdparty_obj = []
if env["platform"] in ["haiku", "osx", "windows", "x11"]: if env["platform"] in ["haiku", "osx", "windows", "x11"]:
# Thirdparty source files # Thirdparty source files
thirdparty_dir = "#thirdparty/glad/" thirdparty_dir = "#thirdparty/glad/"
@ -17,7 +19,16 @@ if env["platform"] in ["haiku", "osx", "windows", "x11"]:
env_thirdparty = env.Clone() env_thirdparty = env.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.drivers_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.drivers_sources += thirdparty_obj
# Godot source files # Godot source files
env.add_source_files(env.drivers_sources, "*.cpp")
driver_obj = []
env.add_source_files(driver_obj, "*.cpp")
env.drivers_sources += driver_obj
# Needed to force rebuilding the driver files when the thirdparty code is updated.
env.Depends(driver_obj, thirdparty_obj)

View File

@ -5,6 +5,9 @@ Import("env")
env_png = env.Clone() env_png = env.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_libpng"]: if env["builtin_libpng"]:
thirdparty_dir = "#thirdparty/libpng/" thirdparty_dir = "#thirdparty/libpng/"
thirdparty_sources = [ thirdparty_sources = [
@ -41,7 +44,7 @@ if env["builtin_libpng"]:
env_thirdparty = env_png.Clone() env_thirdparty = env_png.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.drivers_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
if use_neon: if use_neon:
env_neon = env_thirdparty.Clone() env_neon = env_thirdparty.Clone()
@ -52,9 +55,17 @@ if env["builtin_libpng"]:
neon_sources.append(env_neon.Object(thirdparty_dir + "/arm/filter_neon_intrinsics.c")) neon_sources.append(env_neon.Object(thirdparty_dir + "/arm/filter_neon_intrinsics.c"))
neon_sources.append(env_neon.Object(thirdparty_dir + "/arm/filter_neon.S")) neon_sources.append(env_neon.Object(thirdparty_dir + "/arm/filter_neon.S"))
neon_sources.append(env_neon.Object(thirdparty_dir + "/arm/palette_neon_intrinsics.c")) neon_sources.append(env_neon.Object(thirdparty_dir + "/arm/palette_neon_intrinsics.c"))
env.drivers_sources += neon_sources thirdparty_obj += neon_sources
env.drivers_sources += thirdparty_obj
# Godot source files # Godot source files
env_png.add_source_files(env.drivers_sources, "*.cpp")
Export("env") driver_obj = []
env_png.add_source_files(driver_obj, "*.cpp")
env.drivers_sources += driver_obj
# Needed to force rebuilding the driver files when the thirdparty library is updated.
env.Depends(driver_obj, thirdparty_obj)

View File

@ -7,6 +7,8 @@ env_bullet = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_bullet"]: if env["builtin_bullet"]:
# Build only version 2 for now (as of 2.89) # Build only version 2 for now (as of 2.89)
# Sync file list with relevant upstream CMakeLists.txt for each folder. # Sync file list with relevant upstream CMakeLists.txt for each folder.
@ -207,8 +209,16 @@ if env["builtin_bullet"]:
env_thirdparty = env_bullet.Clone() env_thirdparty = env_bullet.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_bullet.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_bullet.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_cvtt = env_modules.Clone() env_cvtt = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_dir = "#thirdparty/cvtt/" thirdparty_dir = "#thirdparty/cvtt/"
thirdparty_sources = ["ConvectionKernels.cpp"] thirdparty_sources = ["ConvectionKernels.cpp"]
@ -15,7 +18,15 @@ env_cvtt.Prepend(CPPPATH=[thirdparty_dir])
env_thirdparty = env_cvtt.Clone() env_thirdparty = env_cvtt.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_cvtt.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_cvtt.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -8,6 +8,9 @@ Import("env_modules")
env_oidn = env_modules.Clone() env_oidn = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_dir = "#thirdparty/oidn/" thirdparty_dir = "#thirdparty/oidn/"
thirdparty_sources = [ thirdparty_sources = [
"core/api.cpp", "core/api.cpp",
@ -106,7 +109,8 @@ env_oidn.Append(
env_thirdparty = env_oidn.Clone() env_thirdparty = env_oidn.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
if env["platform"] == "windows" and not env.msvc: if env["platform"] == "windows" and not env.msvc:
env_thirdparty.Append(CPPFLAGS=["-mstackrealign"]) env_thirdparty.Append(CPPFLAGS=["-mstackrealign"])
@ -117,5 +121,13 @@ weights_out_path = thirdparty_dir + "weights/rtlightmap_hdr.gen.cpp"
env_thirdparty.Depends(weights_out_path, weights_in_path) env_thirdparty.Depends(weights_out_path, weights_in_path)
env_thirdparty.CommandNoCache(weights_out_path, weights_in_path, resource_to_cpp.tza_to_cpp) env_thirdparty.CommandNoCache(weights_out_path, weights_in_path, resource_to_cpp.tza_to_cpp)
env_oidn.add_source_files(env.modules_sources, "denoise_wrapper.cpp") # Godot source files
env_modules.add_source_files(env.modules_sources, ["register_types.cpp", "lightmap_denoiser.cpp"])
module_obj = []
env_oidn.add_source_files(module_obj, "denoise_wrapper.cpp")
env_modules.add_source_files(module_obj, ["register_types.cpp", "lightmap_denoiser.cpp"])
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -7,6 +7,8 @@ env_enet = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_enet"]: if env["builtin_enet"]:
thirdparty_dir = "#thirdparty/enet/" thirdparty_dir = "#thirdparty/enet/"
thirdparty_sources = [ thirdparty_sources = [
@ -26,6 +28,16 @@ if env["builtin_enet"]:
env_thirdparty = env_enet.Clone() env_thirdparty = env_enet.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
env_enet.add_source_files(env.modules_sources, "*.cpp")
# Godot source files
module_obj = []
env_enet.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_etc = env_modules.Clone() env_etc = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
# Not unbundled so far since not widespread as shared library # Not unbundled so far since not widespread as shared library
thirdparty_dir = "#thirdparty/etc2comp/" thirdparty_dir = "#thirdparty/etc2comp/"
thirdparty_sources = [ thirdparty_sources = [
@ -31,7 +34,15 @@ env_etc.Prepend(CPPPATH=[thirdparty_dir])
env_thirdparty = env_etc.Clone() env_thirdparty = env_etc.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_etc.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_etc.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -8,6 +8,9 @@ from compat import isbasestring
env_freetype = env_modules.Clone() env_freetype = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_freetype"]: if env["builtin_freetype"]:
thirdparty_dir = "#thirdparty/freetype/" thirdparty_dir = "#thirdparty/freetype/"
thirdparty_sources = [ thirdparty_sources = [
@ -86,6 +89,7 @@ if env["builtin_freetype"]:
env_thirdparty = env_freetype.Clone() env_thirdparty = env_freetype.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
lib = env_thirdparty.add_library("freetype_builtin", thirdparty_sources) lib = env_thirdparty.add_library("freetype_builtin", thirdparty_sources)
thirdparty_obj += lib
# Needs to be appended to arrive after libscene in the linker call, # Needs to be appended to arrive after libscene in the linker call,
# but we don't want it to arrive *after* system libs, so manual hack # but we don't want it to arrive *after* system libs, so manual hack
@ -100,7 +104,16 @@ if env["builtin_freetype"]:
if not inserted: if not inserted:
env.Append(LIBS=[lib]) env.Append(LIBS=[lib])
# Godot source files # Godot source files
env_freetype.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_freetype.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Used in scene/, needs to be in main env # Used in scene/, needs to be in main env
env.Append(CPPDEFINES=["FREETYPE_ENABLED"]) env.Append(CPPDEFINES=["FREETYPE_ENABLED"])
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_jpg = env_modules.Clone() env_jpg = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
# Not unbundled for now as they are not commonly available as shared library # Not unbundled for now as they are not commonly available as shared library
thirdparty_dir = "#thirdparty/jpeg-compressor/" thirdparty_dir = "#thirdparty/jpeg-compressor/"
thirdparty_sources = [ thirdparty_sources = [
@ -17,7 +20,15 @@ env_jpg.Prepend(CPPPATH=[thirdparty_dir])
env_thirdparty = env_jpg.Clone() env_thirdparty = env_jpg.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot's own source files # Godot source files
env_jpg.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_jpg.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -5,8 +5,11 @@ Import("env_modules")
env_mbed_tls = env_modules.Clone() env_mbed_tls = env_modules.Clone()
# Thirdparty source files
thirdparty_obj = []
if env["builtin_mbedtls"]: if env["builtin_mbedtls"]:
# Thirdparty source files
thirdparty_sources = [ thirdparty_sources = [
"aes.c", "aes.c",
"aesni.c", "aesni.c",
@ -96,7 +99,17 @@ if env["builtin_mbedtls"]:
env_thirdparty = env_mbed_tls.Clone() env_thirdparty = env_mbed_tls.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Module sources
env_mbed_tls.add_source_files(env.modules_sources, "*.cpp") # Godot source files
module_obj = []
env_mbed_tls.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -9,6 +9,9 @@ Import("env_modules")
env_ogg = env_modules.Clone() env_ogg = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_libogg"]: if env["builtin_libogg"]:
thirdparty_dir = "#thirdparty/libogg/" thirdparty_dir = "#thirdparty/libogg/"
thirdparty_sources = [ thirdparty_sources = [
@ -21,7 +24,16 @@ if env["builtin_libogg"]:
env_thirdparty = env_ogg.Clone() env_thirdparty = env_ogg.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_ogg.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_ogg.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_opensimplex = env_modules.Clone() env_opensimplex = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_dir = "#thirdparty/misc/" thirdparty_dir = "#thirdparty/misc/"
thirdparty_sources = [ thirdparty_sources = [
"open-simplex-noise.c", "open-simplex-noise.c",
@ -16,7 +19,15 @@ env_opensimplex.Prepend(CPPPATH=[thirdparty_dir])
env_thirdparty = env_opensimplex.Clone() env_thirdparty = env_opensimplex.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot's own source files # Godot source files
env_opensimplex.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_opensimplex.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -9,6 +9,10 @@ Import("env_modules")
env_opus = env_modules.Clone() env_opus = env_modules.Clone()
# Thirdparty source files
thirdparty_obj = []
# Thirdparty source files # Thirdparty source files
if env["builtin_opus"]: if env["builtin_opus"]:
thirdparty_dir = "#thirdparty/opus/" thirdparty_dir = "#thirdparty/opus/"
@ -233,7 +237,16 @@ if env["builtin_opus"]:
env_thirdparty = env_opus.Clone() env_thirdparty = env_opus.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Module files
env_opus.add_source_files(env.modules_sources, "register_types.cpp") # Godot source files
module_obj = []
env_opus.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_pvr = env_modules.Clone() env_pvr = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
# Not unbundled so far since not widespread as shared library # Not unbundled so far since not widespread as shared library
thirdparty_dir = "#thirdparty/pvrtccompressor/" thirdparty_dir = "#thirdparty/pvrtccompressor/"
thirdparty_sources = [ thirdparty_sources = [
@ -21,7 +24,15 @@ env_pvr.Prepend(CPPPATH=[thirdparty_dir])
env_thirdparty = env_pvr.Clone() env_thirdparty = env_pvr.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_pvr.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_pvr.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -7,6 +7,8 @@ env_raycast = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_embree"]: if env["builtin_embree"]:
thirdparty_dir = "#thirdparty/embree/" thirdparty_dir = "#thirdparty/embree/"
@ -92,8 +94,16 @@ if env["builtin_embree"]:
env_thirdparty = env_raycast.Clone() env_thirdparty = env_raycast.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_raycast.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_raycast.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_recast = env_modules.Clone() env_recast = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_recast"]: if env["builtin_recast"]:
thirdparty_dir = "#thirdparty/recastnavigation/Recast/" thirdparty_dir = "#thirdparty/recastnavigation/Recast/"
thirdparty_sources = [ thirdparty_sources = [
@ -27,7 +30,15 @@ if env["builtin_recast"]:
env_thirdparty = env_recast.Clone() env_thirdparty = env_recast.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_recast.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_recast.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -5,6 +5,10 @@ Import("env_modules")
env_regex = env_modules.Clone() env_regex = env_modules.Clone()
# Thirdparty source files
thirdparty_obj = []
if env["builtin_pcre2"]: if env["builtin_pcre2"]:
thirdparty_dir = "#thirdparty/pcre2/src/" thirdparty_dir = "#thirdparty/pcre2/src/"
thirdparty_flags = ["PCRE2_STATIC", "HAVE_CONFIG_H", "SUPPORT_UNICODE"] thirdparty_flags = ["PCRE2_STATIC", "HAVE_CONFIG_H", "SUPPORT_UNICODE"]
@ -52,11 +56,21 @@ if env["builtin_pcre2"]:
env_pcre2 = env_regex.Clone() env_pcre2 = env_regex.Clone()
env_pcre2.disable_warnings() env_pcre2.disable_warnings()
env_pcre2["OBJSUFFIX"] = "_" + width + env_pcre2["OBJSUFFIX"] env_pcre2["OBJSUFFIX"] = "_" + width + env_pcre2["OBJSUFFIX"]
env_pcre2.add_source_files(env.modules_sources, thirdparty_sources)
env_pcre2.Append(CPPDEFINES=[("PCRE2_CODE_UNIT_WIDTH", width)]) env_pcre2.Append(CPPDEFINES=[("PCRE2_CODE_UNIT_WIDTH", width)])
env_pcre2.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
pcre2_builtin("16") pcre2_builtin("16")
pcre2_builtin("32") pcre2_builtin("32")
# Godot source files
module_obj = []
env_regex.Append(CPPDEFINES=[("PCRE2_CODE_UNIT_WIDTH", 0)]) env_regex.Append(CPPDEFINES=[("PCRE2_CODE_UNIT_WIDTH", 0)])
env_regex.add_source_files(env.modules_sources, "*.cpp") env_regex.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_squish = env_modules.Clone() env_squish = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_squish"]: if env["builtin_squish"]:
thirdparty_dir = "#thirdparty/squish/" thirdparty_dir = "#thirdparty/squish/"
thirdparty_sources = [ thirdparty_sources = [
@ -26,7 +29,16 @@ if env["builtin_squish"]:
env_thirdparty = env_squish.Clone() env_thirdparty = env_squish.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_squish.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_squish.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,11 +6,22 @@ Import("env_modules")
env_stb_vorbis = env_modules.Clone() env_stb_vorbis = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_sources = ["#thirdparty/misc/stb_vorbis.c"] thirdparty_sources = ["#thirdparty/misc/stb_vorbis.c"]
env_thirdparty = env_stb_vorbis.Clone() env_thirdparty = env_stb_vorbis.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot's own source files # Godot source files
env_stb_vorbis.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_stb_vorbis.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_svg = env_modules.Clone() env_svg = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_dir = "#thirdparty/nanosvg/" thirdparty_dir = "#thirdparty/nanosvg/"
thirdparty_sources = ["nanosvg.cc"] thirdparty_sources = ["nanosvg.cc"]
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
@ -18,7 +21,15 @@ env.Append(CPPDEFINES=["SVG_ENABLED"])
env_thirdparty = env_svg.Clone() env_thirdparty = env_svg.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot's own source files # Godot source files
env_svg.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_svg.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_theora = env_modules.Clone() env_theora = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_libtheora"]: if env["builtin_libtheora"]:
thirdparty_dir = "#thirdparty/libtheora/" thirdparty_dir = "#thirdparty/libtheora/"
thirdparty_sources = [ thirdparty_sources = [
@ -80,7 +83,16 @@ if env["builtin_libtheora"]:
env_thirdparty = env_theora.Clone() env_thirdparty = env_theora.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_theora.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_theora.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -7,6 +7,8 @@ env_upnp = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_miniupnpc"]: if env["builtin_miniupnpc"]:
thirdparty_dir = "#thirdparty/miniupnpc/" thirdparty_dir = "#thirdparty/miniupnpc/"
thirdparty_sources = [ thirdparty_sources = [
@ -32,7 +34,16 @@ if env["builtin_miniupnpc"]:
env_thirdparty = env_upnp.Clone() env_thirdparty = env_upnp.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_upnp.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_upnp.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -7,6 +7,8 @@ env_vhacd = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_dir = "#thirdparty/vhacd/" thirdparty_dir = "#thirdparty/vhacd/"
thirdparty_sources = [ thirdparty_sources = [
@ -24,10 +26,19 @@ thirdparty_sources = [
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
env_vhacd.Prepend(CPPPATH=[thirdparty_dir + "/inc"]) env_vhacd.Prepend(CPPPATH=[thirdparty_dir + "inc"])
env_thirdparty = env_vhacd.Clone() env_thirdparty = env_vhacd.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
env_vhacd.add_source_files(env.modules_sources, "*.cpp") # Godot source files
module_obj = []
env_vhacd.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -8,9 +8,10 @@ Import("env_modules")
env_vorbis = env_modules.Clone() env_vorbis = env_modules.Clone()
stub = True
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_libvorbis"]: if env["builtin_libvorbis"]:
thirdparty_dir = "#thirdparty/libvorbis/" thirdparty_dir = "#thirdparty/libvorbis/"
thirdparty_sources = [ thirdparty_sources = [
@ -51,7 +52,16 @@ if env["builtin_libvorbis"]:
env_thirdparty = env_vorbis.Clone() env_thirdparty = env_vorbis.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Module files
env_vorbis.add_source_files(env.modules_sources, "register_types.cpp") # Godot source files
module_obj = []
env_vorbis.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_webm = env_modules.Clone() env_webm = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
thirdparty_dir = "#thirdparty/libsimplewebm/" thirdparty_dir = "#thirdparty/libsimplewebm/"
thirdparty_sources = [ thirdparty_sources = [
"libwebm/mkvparser/mkvparser.cc", "libwebm/mkvparser/mkvparser.cc",
@ -31,7 +34,15 @@ if env["builtin_libvpx"]:
env_thirdparty = env_webm.Clone() env_thirdparty = env_webm.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_webm.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_webm.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_webp = env_modules.Clone() env_webp = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_libwebp"]: if env["builtin_libwebp"]:
thirdparty_dir = "#thirdparty/libwebp/" thirdparty_dir = "#thirdparty/libwebp/"
thirdparty_sources = [ thirdparty_sources = [
@ -130,7 +133,16 @@ if env["builtin_libwebp"]:
env_thirdparty = env_webp.Clone() env_thirdparty = env_webp.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_webp.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_webp.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -3,8 +3,6 @@
Import("env") Import("env")
Import("env_modules") Import("env_modules")
# Thirdparty source files
env_webrtc = env_modules.Clone() env_webrtc = env_modules.Clone()
use_gdnative = env_webrtc["module_gdnative_enabled"] use_gdnative = env_webrtc["module_gdnative_enabled"]

View File

@ -5,28 +5,44 @@ Import("env_modules")
env_ws = env_modules.Clone() env_ws = env_modules.Clone()
thirdparty_obj = []
if env["platform"] == "javascript": if env["platform"] == "javascript":
# Our JavaScript/C++ interface. # Our JavaScript/C++ interface.
env.AddJSLibraries(["library_godot_websocket.js"]) env.AddJSLibraries(["library_godot_websocket.js"])
elif env["builtin_wslay"]: elif env["builtin_wslay"]:
# Thirdparty source files # Thirdparty source files
wslay_dir = "#thirdparty/wslay/" thirdparty_dir = "#thirdparty/wslay/"
wslay_sources = [ thirdparty_sources = [
"wslay_net.c", "wslay_net.c",
"wslay_event.c", "wslay_event.c",
"wslay_queue.c", "wslay_queue.c",
"wslay_stack.c", "wslay_stack.c",
"wslay_frame.c", "wslay_frame.c",
] ]
wslay_sources = [wslay_dir + s for s in wslay_sources] thirdparty_sources = [thirdparty_dir + s for s in thirdparty_sources]
env_ws.Prepend(CPPPATH=[wslay_dir + "includes/"])
env_ws.Prepend(CPPPATH=[thirdparty_dir + "includes/"])
env_ws.Append(CPPDEFINES=["HAVE_CONFIG_H"]) env_ws.Append(CPPDEFINES=["HAVE_CONFIG_H"])
if env["platform"] == "windows" or env["platform"] == "uwp": if env["platform"] == "windows" or env["platform"] == "uwp":
env_ws.Append(CPPDEFINES=["HAVE_WINSOCK2_H"]) env_ws.Append(CPPDEFINES=["HAVE_WINSOCK2_H"])
else: else:
env_ws.Append(CPPDEFINES=["HAVE_NETINET_IN_H"]) env_ws.Append(CPPDEFINES=["HAVE_NETINET_IN_H"])
env_wslay = env_ws.Clone()
env_wslay.disable_warnings()
env_wslay.add_source_files(env.modules_sources, wslay_sources)
env_ws.add_source_files(env.modules_sources, "*.cpp") env_thirdparty = env_ws.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files
module_obj = []
env_ws.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -6,6 +6,9 @@ Import("env_modules")
env_xatlas_unwrap = env_modules.Clone() env_xatlas_unwrap = env_modules.Clone()
# Thirdparty source files # Thirdparty source files
thirdparty_obj = []
if env["builtin_xatlas"]: if env["builtin_xatlas"]:
thirdparty_dir = "#thirdparty/xatlas/" thirdparty_dir = "#thirdparty/xatlas/"
thirdparty_sources = [ thirdparty_sources = [
@ -17,7 +20,16 @@ if env["builtin_xatlas"]:
env_thirdparty = env_xatlas_unwrap.Clone() env_thirdparty = env_xatlas_unwrap.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.modules_sources, thirdparty_sources) env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.modules_sources += thirdparty_obj
# Godot source files # Godot source files
env_xatlas_unwrap.add_source_files(env.modules_sources, "*.cpp")
module_obj = []
env_xatlas_unwrap.add_source_files(module_obj, "*.cpp")
env.modules_sources += module_obj
# Needed to force rebuilding the module files when the thirdparty library is updated.
env.Depends(module_obj, thirdparty_obj)

View File

@ -28,10 +28,14 @@ for x in android_files:
env_thirdparty = env_android.Clone() env_thirdparty = env_android.Clone()
env_thirdparty.disable_warnings() env_thirdparty.disable_warnings()
android_objects.append(env_thirdparty.SharedObject("#thirdparty/misc/ifaddrs-android.cc")) thirdparty_obj = env_thirdparty.SharedObject("#thirdparty/misc/ifaddrs-android.cc")
android_objects.append(thirdparty_obj)
lib = env_android.add_shared_library("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"]) lib = env_android.add_shared_library("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"])
# Needed to force rebuilding the platform files when the thirdparty code is updated.
env.Depends(lib, thirdparty_obj)
lib_arch_dir = "" lib_arch_dir = ""
if env["android_arch"] == "armv7": if env["android_arch"] == "armv7":
lib_arch_dir = "armeabi-v7a" lib_arch_dir = "armeabi-v7a"

View File

@ -4,24 +4,9 @@ Import("env")
env.scene_sources = [] env.scene_sources = []
# Thirdparty code # Godot source files
thirdparty_dir = "#thirdparty/misc/"
thirdparty_sources = [
# C++ sources
"easing_equations.cpp",
# C sources
"mikktspace.c",
]
thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources]
env_thirdparty = env.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(env.scene_sources, thirdparty_sources)
# Godot's own sources
env.add_source_files(env.scene_sources, "*.cpp") env.add_source_files(env.scene_sources, "*.cpp")
# Chain load SCsubs # Chain load SCsubs
SConscript("main/SCsub") SConscript("main/SCsub")
SConscript("gui/SCsub") SConscript("gui/SCsub")
@ -32,7 +17,6 @@ SConscript("audio/SCsub")
SConscript("resources/SCsub") SConscript("resources/SCsub")
SConscript("debugger/SCsub") SConscript("debugger/SCsub")
# Build it all as a library # Build it all as a library
lib = env.add_library("scene", env.scene_sources) lib = env.add_library("scene", env.scene_sources)
env.Prepend(LIBS=[lib]) env.Prepend(LIBS=[lib])

View File

@ -2,4 +2,23 @@
Import("env") Import("env")
env.add_source_files(env.scene_sources, "*.cpp") # Thirdparty code
thirdparty_obj = []
thirdparty_sources = "#thirdparty/misc/easing_equations.cpp"
env_thirdparty = env.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.scene_sources += thirdparty_obj
# Godot source files
scene_obj = []
env.add_source_files(scene_obj, "*.cpp")
env.scene_sources += scene_obj
# Needed to force rebuilding the scene files when the thirdparty code is updated.
env.Depends(scene_obj, thirdparty_obj)

View File

@ -2,6 +2,25 @@
Import("env") Import("env")
env.add_source_files(env.scene_sources, "*.cpp") # Thirdparty code
thirdparty_obj = []
thirdparty_sources = "#thirdparty/misc/mikktspace.c"
env_thirdparty = env.Clone()
env_thirdparty.disable_warnings()
env_thirdparty.add_source_files(thirdparty_obj, thirdparty_sources)
env.scene_sources += thirdparty_obj
# Godot source files
scene_obj = []
env.add_source_files(scene_obj, "*.cpp")
env.scene_sources += scene_obj
# Needed to force rebuilding the scene files when the thirdparty code is updated.
env.Depends(scene_obj, thirdparty_obj)
SConscript("default_theme/SCsub") SConscript("default_theme/SCsub")

View File

@ -3,5 +3,3 @@
Import("env") Import("env")
env.add_source_files(env.servers_sources, "*.cpp") env.add_source_files(env.servers_sources, "*.cpp")
Export("env")