Add flexible module loading and complete file embedding

- Support any folder structure (no hard-coded folders)
 - Embed all file types recursively from any folder
 - Fix require() dot-to-slash conversion for embedded modules
 - Clean build folder for fresh builds every time
 - Generate empty headers for Lua-only projects

 Backward compatible with existing projects.
This commit is contained in:
2025-11-10 01:58:00 +05:30
parent 8c9367f368
commit d9d1a8a51e
9 changed files with 283 additions and 206 deletions

View File

@@ -27,7 +27,17 @@ def embed_files(output_file, input_files):
data = inf.read()
var_name = sanitize_name(input_file)
f.write(f'/* Embedded file: {input_file} */\n')
# Get relative path for better module loading
# Try to extract path relative to common directories
relative_name = input_file
for prefix in ['build/', 'build\\']:
if prefix in input_file:
parts = input_file.split(prefix, 1)
if len(parts) > 1:
relative_name = parts[1]
break
f.write(f'/* Embedded file: {relative_name} */\n')
f.write(f'static const unsigned char embedded_lua_{idx}_{var_name}[] = {{\n')
for i, byte in enumerate(data):
@@ -55,18 +65,32 @@ def embed_files(output_file, input_files):
f.write('static const EmbeddedLuaFile embedded_lua_files[] = {\n')
for idx, input_file in enumerate(input_files):
var_name = sanitize_name(input_file)
# Store both original filename and basename for require compatibility
basename = os.path.basename(input_file)
f.write(f' {{ "{basename}", embedded_lua_{idx}_{var_name}, embedded_lua_{idx}_{var_name}_len }},\n')
# Store relative path for proper require() support
relative_name = input_file
for prefix in ['build/', 'build\\']:
if prefix in input_file:
parts = input_file.split(prefix, 1)
if len(parts) > 1:
relative_name = parts[1]
break
# Normalize path separators
relative_name = relative_name.replace('\\', '/')
f.write(f' {{ "{relative_name}", embedded_lua_{idx}_{var_name}, embedded_lua_{idx}_{var_name}_len }},\n')
f.write('};\n\n')
f.write(f'static const int embedded_lua_file_count = {len(input_files)};\n\n')
# Main entry point (first file)
var_name = sanitize_name(input_files[0])
# Main entry point (first file with 'main.lua' in name, or first file)
main_idx = 0
for idx, input_file in enumerate(input_files):
if 'main.lua' in input_file.lower():
main_idx = idx
break
var_name = sanitize_name(input_files[main_idx])
f.write('/* Main entry point */\n')
f.write(f'#define embedded_main_lua embedded_lua_0_{var_name}\n')
f.write(f'#define embedded_main_lua_len embedded_lua_0_{var_name}_len\n\n')
f.write(f'#define embedded_main_lua embedded_lua_{main_idx}_{var_name}\n')
f.write(f'#define embedded_main_lua_len embedded_lua_{main_idx}_{var_name}_len\n\n')
f.write('#endif /* EMBEDDED_MAIN_H */\n')