forked from hertog/godot-module-template
		
	
		
			
				
	
	
		
			118 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| from misc.utility.scons_hints import *
 | |
| 
 | |
| import os
 | |
| 
 | |
| import methods
 | |
| 
 | |
| Import("env")
 | |
| 
 | |
| env_modules = env.Clone()
 | |
| 
 | |
| # Allow modules to detect if they are being built as a module.
 | |
| env_modules.Append(CPPDEFINES=["GODOT_MODULE"])
 | |
| 
 | |
| Export("env_modules")
 | |
| 
 | |
| 
 | |
| # Header with MODULE_*_ENABLED defines.
 | |
| def modules_enabled_builder(target, source, env):
 | |
|     modules = sorted(source[0].read())
 | |
|     with methods.generated_wrapper(str(target[0])) as file:
 | |
|         for module in modules:
 | |
|             file.write(f"#define MODULE_{module.upper()}_ENABLED\n")
 | |
| 
 | |
| 
 | |
| modules_enabled = env.CommandNoCache(
 | |
|     "modules_enabled.gen.h", env.Value(env.module_list), env.Run(modules_enabled_builder)
 | |
| )
 | |
| 
 | |
| 
 | |
| def register_module_types_builder(target, source, env):
 | |
|     modules = source[0].read()
 | |
|     mod_inc = "\n".join([f'#include "{value}/register_types.h"' for value in modules.values()])
 | |
|     mod_init = "\n".join(
 | |
|         [
 | |
|             f"""\
 | |
| #ifdef MODULE_{key.upper()}_ENABLED
 | |
| 	initialize_{key}_module(p_level);
 | |
| #endif"""
 | |
|             for key in modules.keys()
 | |
|         ]
 | |
|     )
 | |
|     mod_uninit = "\n".join(
 | |
|         [
 | |
|             f"""\
 | |
| #ifdef MODULE_{key.upper()}_ENABLED
 | |
| 	uninitialize_{key}_module(p_level);
 | |
| #endif"""
 | |
|             for key in modules.keys()
 | |
|         ]
 | |
|     )
 | |
|     with methods.generated_wrapper(str(target[0])) as file:
 | |
|         file.write(
 | |
|             f"""\
 | |
| #include "register_module_types.h"
 | |
| 
 | |
| #include "modules/modules_enabled.gen.h"
 | |
| 
 | |
| {mod_inc}
 | |
| 
 | |
| void initialize_modules(ModuleInitializationLevel p_level) {{
 | |
| {mod_init}
 | |
| }}
 | |
| 
 | |
| void uninitialize_modules(ModuleInitializationLevel p_level) {{
 | |
| {mod_uninit}
 | |
| }}
 | |
| """
 | |
|         )
 | |
| 
 | |
| 
 | |
| register_module_types = env.CommandNoCache(
 | |
|     "register_module_types.gen.cpp",
 | |
|     [env.Value(env.modules_detected), modules_enabled],
 | |
|     env.Run(register_module_types_builder),
 | |
| )
 | |
| 
 | |
| 
 | |
| test_headers = []
 | |
| # libmodule_<name>.a for each active module.
 | |
| for name, path in env.module_list.items():
 | |
|     env.modules_sources = []
 | |
| 
 | |
|     # Name for built-in modules, (absolute) path for custom ones.
 | |
|     base_path = path if os.path.isabs(path) else name
 | |
|     SConscript(base_path + "/SCsub")
 | |
| 
 | |
|     lib = env_modules.add_library("module_%s" % name, env.modules_sources)
 | |
|     env.Prepend(LIBS=[lib])
 | |
| 
 | |
|     if env["tests"]:
 | |
|         # Lookup potential headers in `tests` subfolder.
 | |
|         import glob
 | |
| 
 | |
|         module_tests = sorted(glob.glob(os.path.join(base_path, "tests", "*.h")))
 | |
|         if module_tests != []:
 | |
|             test_headers += module_tests
 | |
| 
 | |
| 
 | |
| # Generate header to be included in `tests/test_main.cpp` to run module-specific tests.
 | |
| if env["tests"]:
 | |
| 
 | |
|     def modules_tests_builder(target, source, env):
 | |
|         headers = sorted([os.path.relpath(src.path, methods.base_folder).replace("\\", "/") for src in source])
 | |
|         with methods.generated_wrapper(str(target[0])) as file:
 | |
|             for header in headers:
 | |
|                 file.write(f'#include "{header}"\n')
 | |
| 
 | |
|     env.CommandNoCache("modules_tests.gen.h", test_headers, env.Run(modules_tests_builder))
 | |
| 
 | |
| # libmodules.a with only register_module_types.
 | |
| # Must be last so that all libmodule_<name>.a libraries are on the right side
 | |
| # in the linker command.
 | |
| env.modules_sources = []
 | |
| env_modules.add_source_files(env.modules_sources, register_module_types)
 | |
| lib = env_modules.add_library("modules", env.modules_sources)
 | |
| env.Prepend(LIBS=[lib])
 | 
