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: dx's avatardx <dequis@dequis.org>
Signed-off-by: Rahix's avatarRahix <rahix@rahix.de>
parent b4641dde
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
import sys import sys
import os import os
import tempfile
import shutil
def main(): def main():
...@@ -16,23 +18,41 @@ def main(): ...@@ -16,23 +18,41 @@ def main():
modules |= makemoduledefs.find_module_registrations(source) modules |= makemoduledefs.find_module_registrations(source)
stdout = sys.stdout stdout = sys.stdout
with open(sys.argv[2], "w") as f: with tempfile.TemporaryFile("w+") as temp:
sys.stdout = f sys.stdout = temp
makemoduledefs.generate_module_table_header(sorted(modules)) 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)
with open(sys.argv[2], "w") as f:
f.write(new_content)
try: try:
os.mkdir(os.path.dirname(sys.argv[2]) + "/genhdr") os.mkdir(os.path.dirname(sys.argv[2]) + "/genhdr")
except FileExistsError: except FileExistsError:
pass pass
linkname = os.path.dirname(sys.argv[2]) + "/genhdr/" + os.path.basename(sys.argv[2]) linkname = (
os.path.dirname(sys.argv[2]) + "/genhdr/" + os.path.basename(sys.argv[2])
)
if os.path.exists(linkname): if os.path.exists(linkname):
os.unlink(linkname) os.unlink(linkname)
os.symlink( shutil.copy(sys.argv[2], linkname)
"../" + os.path.basename(sys.argv[2]),
linkname, sys.stdout = stdout
)
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -11,8 +11,6 @@ shift 5 ...@@ -11,8 +11,6 @@ shift 5
OUTPUT_DIR="$(dirname "$OUTPUT")" 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 # 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" 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( ...@@ -43,6 +43,7 @@ qstr_h = custom_target(
input: [ input: [
'modules/qstrdefs.h', 'modules/qstrdefs.h',
'mpconfigport.h', 'mpconfigport.h',
modules_h,
micropython_sources, micropython_sources,
micropython_extmod_sources, micropython_extmod_sources,
], ],
...@@ -50,7 +51,9 @@ qstr_h = custom_target( ...@@ -50,7 +51,9 @@ qstr_h = custom_target(
command: [micropython_gen_qstr, meson.current_source_dir(), '@OUTPUT@', '@INPUT@'], 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 # # Python Frozen Modules #
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment