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

@@ -40,17 +40,18 @@ def embed_files(output_file, input_files):
data = inf.read()
var_name = sanitize_name(input_file)
# Extract relative path from 'assets/' onwards if present
if 'assets' in input_file.replace('\\', '/'):
parts = input_file.replace('\\', '/').split('assets/')
if len(parts) > 1:
relative_name = 'assets/' + parts[-1]
else:
relative_name = os.path.basename(input_file)
else:
relative_name = os.path.basename(input_file)
# Extract relative path from build directory
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'/* Embedded asset: {input_file} ({len(data)} bytes) */\n')
f.write(f'/* Embedded file: {relative_name} ({len(data)} bytes) */\n')
f.write(f'static const unsigned char embedded_asset_{idx}_{var_name}[] = {{\n')
for i, byte in enumerate(data):
@@ -78,15 +79,16 @@ def embed_files(output_file, input_files):
f.write('static const EmbeddedAsset embedded_assets[] = {\n')
for idx, input_file in enumerate(input_files):
var_name = sanitize_name(input_file)
# Extract relative path from 'assets/' onwards if present
if 'assets' in input_file.replace('\\', '/'):
parts = input_file.replace('\\', '/').split('assets/')
if len(parts) > 1:
relative_name = 'assets/' + parts[-1]
else:
relative_name = os.path.basename(input_file)
else:
relative_name = os.path.basename(input_file)
# Extract relative path from build directory
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_asset_{idx}_{var_name}, embedded_asset_{idx}_{var_name}_len }},\n')
f.write('};\n\n')