From f3c99a22a1faab26483c713f2172fc28d2c5208a Mon Sep 17 00:00:00 2001 From: bkleiner Date: Wed, 27 Nov 2024 00:47:31 +0100 Subject: [PATCH] hash target files and pass as define --- script/post_script.py | 8 ++++++-- script/pre_script.py | 32 +++++++++++++++++++------------- script/target_inject.py | 13 +++++++++++++ 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/script/post_script.py b/script/post_script.py index 722bd0478..754d9052e 100644 --- a/script/post_script.py +++ b/script/post_script.py @@ -9,10 +9,10 @@ Import("env") try: - from target_inject import process_elf_action, inject_target, copy_hex + from target_inject import target_hash, process_elf_action, inject_target, copy_hex except ImportError: env.Execute("$PYTHONEXE -m pip install pyelftools pyyaml cbor2") - from target_inject import process_elf_action, inject_target, copy_hex + from target_inject import target_hash, process_elf_action, inject_target, copy_hex def before_upload(source, target, env): @@ -30,6 +30,10 @@ def before_upload(source, target, env): while option in env[scope]: env[scope].remove(option) +env.Append( + CPPDEFINES=[("TARGET_HASH", target_hash(env))], +) + objcopy_args = [ "$OBJCOPY", "-S", diff --git a/script/pre_script.py b/script/pre_script.py index 80c6f60ff..1c51996f6 100644 --- a/script/pre_script.py +++ b/script/pre_script.py @@ -1,6 +1,7 @@ # pylint: disable=missing-docstring,redefined-outer-name,unspecified-encoding import os +import threading Import("env") @@ -70,18 +71,23 @@ def touch(fname, times=None): os.utime(fname, times) -target_remote = "https://github.com/BossHobby/Targets.git" -target_dir = os.path.join(env["PROJECT_DIR"], "targets") +def fetch_thread(): + target_remote = "https://github.com/BossHobby/Targets.git" + target_dir = os.path.join(env["PROJECT_DIR"], "targets") -if not os.path.exists(target_dir): - porcelain.clone(target_remote, target=target_dir, branch="targets") - touch(os.path.join(env["PROJECT_DIR"], "platformio.ini")) -else: - target_repo = porcelain.open_repo(target_dir) - target_ref_before = porcelain.describe(target_repo) - porcelain.fetch(target_repo) - porcelain.checkout_branch(target_repo, "targets") - target_ref_after = porcelain.describe(target_repo) - - if target_ref_before != target_ref_after: + if not os.path.exists(target_dir): + porcelain.clone(target_remote, target=target_dir, branch="targets") touch(os.path.join(env["PROJECT_DIR"], "platformio.ini")) + else: + target_repo = porcelain.open_repo(target_dir) + target_ref_before = porcelain.describe(target_repo) + porcelain.fetch(target_repo) + porcelain.checkout_branch(target_repo, "targets") + target_ref_after = porcelain.describe(target_repo) + + if target_ref_before != target_ref_after: + touch(os.path.join(env["PROJECT_DIR"], "platformio.ini")) + + +t = threading.Thread(target=fetch_thread) +t.start() diff --git a/script/target_inject.py b/script/target_inject.py index f952a32cc..a1495ea7d 100644 --- a/script/target_inject.py +++ b/script/target_inject.py @@ -4,6 +4,7 @@ import shutil import cbor2 import yaml +import hashlib from elftools.elf.elffile import ELFFile @@ -71,3 +72,15 @@ def copy_hex(source, target, env): env.subst("$BUILD_DIR/${PROGNAME}.hex"), env.subst(os.path.join("output", hex_name)), ) + + +def target_hash(env): + target_yaml = env.subst("targets/${PIOENV}.yaml") + if not os.path.isfile(target_yaml): + return "" + + md5 = hashlib.md5() + with open(target_yaml, "rb") as f: + for chunk in iter(lambda: f.read(2**20), b""): + md5.update(chunk) + return md5.hexdigest()