diff --git a/SConstruct b/SConstruct index fb6a7e6ffb29..4a56a5ea3c8b 100644 --- a/SConstruct +++ b/SConstruct @@ -52,6 +52,7 @@ _helper_module("version", "version.py") _helper_module("core.core_builders", "core/core_builders.py") _helper_module("main.main_builders", "main/main_builders.py") _helper_module("misc.utility.color", "misc/utility/color.py") +_helper_module("misc.utility.compatibility", "misc/utility/compatibility.py") # Local import gles3_builders diff --git a/drivers/apple_embedded/SCsub b/drivers/apple_embedded/SCsub index 7a4b82bd9e08..46460139e655 100644 --- a/drivers/apple_embedded/SCsub +++ b/drivers/apple_embedded/SCsub @@ -6,6 +6,7 @@ Import("env") env_apple_embedded = env.Clone() # Enable module support +# Need a functional export template here, so not using `try_use_cxx20_module`. env_apple_embedded.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) # Use bundled Vulkan headers diff --git a/drivers/metal/SCsub b/drivers/metal/SCsub index a4c1c65b8297..ab4a6bcb4aa3 100644 --- a/drivers/metal/SCsub +++ b/drivers/metal/SCsub @@ -1,6 +1,8 @@ #!/usr/bin/env python from misc.utility.scons_hints import * +from misc.utility.compatibility import try_use_cxx20_module + Import("env") env_metal = env.Clone() @@ -40,7 +42,10 @@ if "-std=gnu++17" in env_metal["CXXFLAGS"]: env_metal.Append(CXXFLAGS=["-std=c++20"]) # Enable module support -env_metal.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) +if env["platform"] == "macos": + try_use_cxx20_module(env_metal) +else: + env_metal.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) # Driver source files diff --git a/misc/utility/compatibility.py b/misc/utility/compatibility.py new file mode 100644 index 000000000000..c66fb2925a41 --- /dev/null +++ b/misc/utility/compatibility.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +from methods import is_apple_clang + +is_able_to_use_module_cache = None + + +def try_use_cxx20_module(env): + """ + Use C++20's `module` if current compiler supports that. + Referencing https://en.cppreference.com/w/cpp/compiler_support/20. + """ + global is_able_to_use_module_cache + + if is_able_to_use_module_cache is not None: + return is_able_to_use_module_cache + else: + is_able_to_use_module_cache = True + + # Apple clang supports module. + if is_apple_clang(env): + env.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) + else: + is_able_to_use_module_cache = False diff --git a/platform/ios/SCsub b/platform/ios/SCsub index a313442e2ae3..91fd36a38111 100644 --- a/platform/ios/SCsub +++ b/platform/ios/SCsub @@ -3,6 +3,7 @@ from misc.utility.scons_hints import * from platform_ios_builders import generate_bundle +from misc.utility.compatibility import try_use_cxx20_module from platform_methods import combine_libs_apple_embedded Import("env") @@ -20,7 +21,8 @@ env_ios = env.Clone() ios_lib = env_ios.add_library("ios", ios_lib) # (iOS) Enable module support -env_ios.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) +# env_ios.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) +try_use_cxx20_module(env_ios) combine_command = env_ios.CommandNoCache( "#bin/libgodot" + env_ios["LIBSUFFIX"], [ios_lib] + env_ios["LIBS"], env.Run(combine_libs_apple_embedded) diff --git a/platform/visionos/SCsub b/platform/visionos/SCsub index d3da9bb04a4a..6911ff29faf1 100644 --- a/platform/visionos/SCsub +++ b/platform/visionos/SCsub @@ -3,6 +3,7 @@ from misc.utility.scons_hints import * from platform_visionos_builders import generate_bundle +from misc.utility.compatibility import try_use_cxx20_module from platform_methods import combine_libs_apple_embedded Import("env") @@ -19,7 +20,8 @@ env_visionos = env.Clone() visionos_lib = env_visionos.add_library("visionos", visionos_lib) # Enable module support -env_visionos.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) +# env_visionos.Append(CCFLAGS=["-fmodules", "-fcxx-modules"]) +try_use_cxx20_module(env_visionos) combine_command = env_visionos.Command( "#bin/libgodot" + env_visionos["LIBSUFFIX"], [visionos_lib] + env_visionos["LIBS"], combine_libs_apple_embedded