Skip to content
Snippets Groups Projects
Commit d71a6cf8 authored by rahix's avatar rahix
Browse files

fix(build): Fix module changes not getting picked up


Previously, we left out the dependency of the QSTR header on
`modules.h`.  This was done to prevent rebuilds of the entire
MicroPython sources whenever a Pycardium module is changed. This
leads to issues where QSTRs got out of sync and weird errors like
the following could happen:

    import foo_module

    Exception: No module `abc_def` (a different string than expected)

Attempt to fix this by only updating the QSTR header when the
module-header actually changes.  For this, a few workarounds are needed:

- Replace symlinks with actual copied files so timestamps change on
  updates.
- Add a hack so meson picks up on the dependency of the file in genhdr/
- Rename the outer file so older meson versions don't complain about
  multiple targets with the same name.

Co-authored-by: default avatardx <dequis@dequis.org>
Signed-off-by: default avatarRahix <rahix@rahix.de>
parent b4641dde
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,8 @@
import sys
import os
import tempfile
import shutil
def main():
......@@ -16,23 +18,41 @@ def main():
modules |= makemoduledefs.find_module_registrations(source)
stdout = sys.stdout
with open(sys.argv[2], "w") as f:
sys.stdout = f
with tempfile.TemporaryFile("w+") as temp:
sys.stdout = temp
makemoduledefs.generate_module_table_header(sorted(modules))
sys.stdout = stdout
sys.stdout = stdout
# Read contents of existing file and compare
try:
with open(sys.argv[2], "r") as f:
old_content = f.read()
except FileNotFoundError:
old_content = ""
temp.seek(0)
new_content = temp.read()
if new_content == old_content:
# If both file contain the same content, exit early
sys.exit(0)
try:
os.mkdir(os.path.dirname(sys.argv[2]) + "/genhdr")
except FileExistsError:
pass
linkname = os.path.dirname(sys.argv[2]) + "/genhdr/" + os.path.basename(sys.argv[2])
if os.path.exists(linkname):
os.unlink(linkname)
os.symlink(
"../" + os.path.basename(sys.argv[2]),
linkname,
)
with open(sys.argv[2], "w") as f:
f.write(new_content)
try:
os.mkdir(os.path.dirname(sys.argv[2]) + "/genhdr")
except FileExistsError:
pass
linkname = (
os.path.dirname(sys.argv[2]) + "/genhdr/" + os.path.basename(sys.argv[2])
)
if os.path.exists(linkname):
os.unlink(linkname)
shutil.copy(sys.argv[2], linkname)
sys.stdout = stdout
if __name__ == "__main__":
......
......@@ -11,8 +11,6 @@ shift 5
OUTPUT_DIR="$(dirname "$OUTPUT")"
mkdir -p "$OUTPUT_DIR/genhdr"
ln -sf "$(realpath --relative-to="$OUTPUT_DIR/genhdr" "$OUTPUT")" "$OUTPUT_DIR/genhdr/$(basename "$OUTPUT")"
# call gcc -E to generate qstr.i.last
gcc -E -DNO_QSTR -I"$SOURCE_DIR/micropython" -I"$PROJECT_SRC" -I"$OUTPUT_DIR" "$@" >"$OUTPUT_DIR/qstr.i.last"
......
qstr_genhdr_h = custom_target(
'genhdr-qstrdefs.generated.h',
output: 'qstrdefs.generated.h',
input: qstr_h,
command: ['cp', '@INPUT@', '@OUTPUT@'],
)
......@@ -43,6 +43,7 @@ qstr_h = custom_target(
input: [
'modules/qstrdefs.h',
'mpconfigport.h',
modules_h,
micropython_sources,
micropython_extmod_sources,
],
......@@ -50,7 +51,9 @@ qstr_h = custom_target(
command: [micropython_gen_qstr, meson.current_source_dir(), '@OUTPUT@', '@INPUT@'],
)
mp_headers = [version_h, modules_h, qstr_h]
subdir('./genhdr')
mp_headers = [version_h, modules_h, qstr_h, qstr_genhdr_h]
#################################
# Python Frozen Modules #
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment