From 5ca10f35d14b28864a8ec2260dc6b378e0461f19 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sun, 5 Oct 2025 23:36:16 -0400 Subject: [PATCH] Process metadata only in metadata.cpp Improves cache utilization as fewer things are passed via CFLAGS to all files. In the event that no metadata is available, let the cpp file handle warning about default usage. --- pio-scripts/{set_repo.py => set_metadata.py} | 54 +++++++++++++++++--- pio-scripts/set_version.py | 8 --- platformio.ini | 3 +- wled00/ota_update.cpp | 2 +- wled00/wled_metadata.cpp | 29 ++++++++--- wled00/wled_metadata.h | 18 ++----- 6 files changed, 74 insertions(+), 40 deletions(-) rename pio-scripts/{set_repo.py => set_metadata.py} (71%) delete mode 100644 pio-scripts/set_version.py diff --git a/pio-scripts/set_repo.py b/pio-scripts/set_metadata.py similarity index 71% rename from pio-scripts/set_repo.py rename to pio-scripts/set_metadata.py index c204c363..f89b424c 100644 --- a/pio-scripts/set_repo.py +++ b/pio-scripts/set_metadata.py @@ -1,5 +1,6 @@ Import('env') import subprocess +import json import re def get_github_repo(): @@ -42,7 +43,7 @@ def get_github_repo(): # Check if it's a GitHub URL if 'github.com' not in remote_url.lower(): - return 'unknown' + return None # Parse GitHub URL patterns: # https://github.com/owner/repo.git @@ -63,17 +64,56 @@ def get_github_repo(): if ssh_match: return ssh_match.group(1) - return 'unknown' + return None except FileNotFoundError: # Git CLI is not installed or not in PATH - return 'unknown' + return None except subprocess.CalledProcessError: # Git command failed (e.g., not a git repo, no remote, etc.) - return 'unknown' + return None except Exception: # Any other unexpected error - return 'unknown' + return None -repo = get_github_repo() -env.Append(BUILD_FLAGS=[f'-DWLED_REPO=\\"{repo}\\"']) \ No newline at end of file +PACKAGE_FILE = "package.json" + +def get_version(): + with open(PACKAGE_FILE, "r") as package: + return json.load(package)["version"] + return None + + +def has_def(cppdefs, name): + """ Returns true if a given name is set in a CPPDEFINES collection """ + for f in cppdefs: + if isinstance(f, tuple): + f = f[0] + if f == name: + return True + return False + + +def add_wled_metadata_flags(env, node): + cdefs = env["CPPDEFINES"].copy() + + if not has_def(cdefs, "WLED_REPO"): + repo = get_github_repo() + if repo: + cdefs.append(("WLED_REPO", f"\\\"{repo}\\\"")) + + if not has_def(cdefs, "WLED_VERSION"): + version = get_version() + if version: + cdefs.append(("WLED_VERSION", get_version())) + + # This transforms the node in to a Builder; it cannot be modified again + return env.Object( + node, + CPPDEFINES=cdefs + ) + +env.AddBuildMiddleware( + add_wled_metadata_flags, + "*/wled_metadata.cpp" +) diff --git a/pio-scripts/set_version.py b/pio-scripts/set_version.py deleted file mode 100644 index 1d8e076e..00000000 --- a/pio-scripts/set_version.py +++ /dev/null @@ -1,8 +0,0 @@ -Import('env') -import json - -PACKAGE_FILE = "package.json" - -with open(PACKAGE_FILE, "r") as package: - version = json.load(package)["version"] - env.Append(BUILD_FLAGS=[f"-DWLED_VERSION={version}"]) diff --git a/platformio.ini b/platformio.ini index d1b884b0..07760de0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -110,8 +110,7 @@ ldscript_4m1m = eagle.flash.4m1m.ld [scripts_defaults] extra_scripts = - pre:pio-scripts/set_version.py - pre:pio-scripts/set_repo.py + pre:pio-scripts/set_metadata.py post:pio-scripts/output_bins.py post:pio-scripts/strip-floats.py pre:pio-scripts/user_config_copy.py diff --git a/wled00/ota_update.cpp b/wled00/ota_update.cpp index d94b908c..afda59a9 100644 --- a/wled00/ota_update.cpp +++ b/wled00/ota_update.cpp @@ -33,7 +33,7 @@ static bool validateOTA(const uint8_t* binaryData, size_t dataSize, char* errorM } // Try to extract WLED structure directly from binary data - wled_custom_desc_t extractedDesc; + wled_metadata_t extractedDesc; bool hasDesc = findWledMetadata(binaryData, dataSize, &extractedDesc); if (hasDesc) { diff --git a/wled00/wled_metadata.cpp b/wled00/wled_metadata.cpp index 2ff5c62d..13b54b9c 100644 --- a/wled00/wled_metadata.cpp +++ b/wled00/wled_metadata.cpp @@ -1,6 +1,19 @@ #include "ota_update.h" #include "wled.h" +#ifndef WLED_VERSION + #warning WLED_VERSION was not set - using default value of 'dev' + #define WLED_VERSION dev +#endif +#ifndef WLED_RELEASE_NAME + #warning WLED_RELEASE_NAME was not set - using default value of 'Custom' + #define WLED_RELEASE_NAME "Custom" +#endif +#ifndef WLED_REPO + // No warning for this one: integrators are not always on GitHub + #define WLED_REPO "unknown" +#endif + #define WLED_CUSTOM_DESC_MAGIC 0x57535453 // "WSTS" (WLED System Tag Structure) #define WLED_CUSTOM_DESC_VERSION 1 #define WLED_RELEASE_NAME_MAX_LEN 48 @@ -40,7 +53,7 @@ inline uint32_t djb2_hash_runtime(const char* str) { // GLOBAL VARIABLES // ------------------------------------ // Structure instantiation for this build -const wled_custom_desc_t __attribute__((section(BUILD_METADATA_SECTION))) WLED_BUILD_DESCRIPTION = { +const wled_metadata_t __attribute__((section(BUILD_METADATA_SECTION))) WLED_BUILD_DESCRIPTION = { WLED_CUSTOM_DESC_MAGIC, // magic WLED_CUSTOM_DESC_VERSION, // version TOSTRING(WLED_VERSION), @@ -66,20 +79,20 @@ const __FlashStringHelper* brandString = FPSTR(brandString_s); * @param extractedDesc Buffer to store extracted custom description structure * @return true if structure was found and extracted, false otherwise */ -bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_custom_desc_t* extractedDesc) { - if (!binaryData || !extractedDesc || dataSize < sizeof(wled_custom_desc_t)) { +bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_metadata_t* extractedDesc) { + if (!binaryData || !extractedDesc || dataSize < sizeof(wled_metadata_t)) { return false; } - for (size_t offset = 0; offset <= dataSize - sizeof(wled_custom_desc_t); offset++) { - const wled_custom_desc_t* custom_desc = (const wled_custom_desc_t*)(binaryData + offset); + for (size_t offset = 0; offset <= dataSize - sizeof(wled_metadata_t); offset++) { + const wled_metadata_t* custom_desc = (const wled_metadata_t*)(binaryData + offset); // Check for magic number if (custom_desc->magic == WLED_CUSTOM_DESC_MAGIC) { // Found potential match, validate version if (custom_desc->desc_version != WLED_CUSTOM_DESC_VERSION) { DEBUG_PRINTF_P(PSTR("Found WLED structure at offset %u but version mismatch: %u\n"), - offset, custom_desc->version); + offset, custom_desc->desc_version); continue; } @@ -91,7 +104,7 @@ bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_custom_de } // Valid structure found - copy entire structure - memcpy(extractedDesc, custom_desc, sizeof(wled_custom_desc_t)); + memcpy(extractedDesc, custom_desc, sizeof(wled_metadata_t)); DEBUG_PRINTF_P(PSTR("Extracted WLED structure at offset %u: '%s'\n"), offset, extractedDesc->release_name); @@ -113,7 +126,7 @@ bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_custom_de * @return true if OTA should proceed, false if it should be blocked */ -bool shouldAllowOTA(const wled_custom_desc_t& firmwareDescription, char* errorMessage, size_t errorMessageLen) { +bool shouldAllowOTA(const wled_metadata_t& firmwareDescription, char* errorMessage, size_t errorMessageLen) { // Clear error message if (errorMessage && errorMessageLen > 0) { errorMessage[0] = '\0'; diff --git a/wled00/wled_metadata.h b/wled00/wled_metadata.h index d82d75ba..7ab4d099 100644 --- a/wled00/wled_metadata.h +++ b/wled00/wled_metadata.h @@ -11,16 +11,6 @@ #include #include -#ifndef WLED_VERSION - #define WLED_VERSION dev -#endif -#ifndef WLED_RELEASE_NAME - #define WLED_RELEASE_NAME "Custom" -#endif -#ifndef WLED_REPO - #define WLED_REPO "unknown" -#endif - #define WLED_VERSION_MAX_LEN 48 #define WLED_RELEASE_NAME_MAX_LEN 48 @@ -36,11 +26,11 @@ typedef struct { char wled_version[WLED_VERSION_MAX_LEN]; char release_name[WLED_RELEASE_NAME_MAX_LEN]; // Release name (null-terminated) uint32_t hash; // Structure sanity check -} __attribute__((packed)) wled_custom_desc_t; +} __attribute__((packed)) wled_metadata_t; // Global build description -extern const wled_custom_desc_t WLED_BUILD_DESCRIPTION; +extern const wled_metadata_t WLED_BUILD_DESCRIPTION; // Convenient metdata pointers #define versionString (WLED_BUILD_DESCRIPTION.wled_version) // Build version, WLED_VERSION @@ -59,7 +49,7 @@ extern const __FlashStringHelper* brandString ; // Brand * @param extractedDesc Buffer to store extracted custom description structure * @return true if structure was found and extracted, false otherwise */ -bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_custom_desc_t* extractedDesc); +bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_metadata_t* extractedDesc); /** * Check if OTA should be allowed based on release compatibility @@ -68,4 +58,4 @@ bool findWledMetadata(const uint8_t* binaryData, size_t dataSize, wled_custom_de * @param errorMessageLen Maximum length of error message buffer * @return true if OTA should proceed, false if it should be blocked */ -bool shouldAllowOTA(const wled_custom_desc_t& firmwareDescription, char* errorMessage, size_t errorMessageLen); +bool shouldAllowOTA(const wled_metadata_t& firmwareDescription, char* errorMessage, size_t errorMessageLen);