diff --git a/CMakeLists.txt b/CMakeLists.txt index ea31c4e..4e0f5a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,12 +87,13 @@ add_executable(${NL_FW} ${NL_SDK_BOOT_SOURCES} ${NL_FW_SOURCES} ${NL_SDK_OBJECTS set_target_properties(${NL_FW} PROPERTIES SUFFIX ".elf") target_compile_definitions(${NL_FW} PRIVATE NINLIGHT_DEVICE_ID="${NINLIGHT_DEVICE}" - NINLIGHT_FW_VERSION="${NINLIGHT_FW_VERSION}" NINLIGHT_BUILD_DATE="${NINLIGHT_BUILD_DATE}" NINLIGHT_TOKEN_DEFAULT="${NINLIGHT_TOKEN}" NINLIGHT_WIFI_SSID="${NINLIGHT_WIFI_SSID}" NINLIGHT_WIFI_PASSWORD="${NINLIGHT_WIFI_PASSWORD}" NINLIGHT_AP_PASSWORD="${NINLIGHT_AP_PASSWORD}") +target_include_directories(${NL_FW} PRIVATE ${CMAKE_BINARY_DIR}/generated) +add_dependencies(${NL_FW} nl_version) target_link_options(${NL_FW} PRIVATE -static -nostartfiles -T${SDK_DIR}/ld/link_w600_2m.ld -Wl,-Map=${CMAKE_BINARY_DIR}/${NL_FW}.map) @@ -100,4 +101,4 @@ target_link_libraries(${NL_FW} PRIVATE -Wl,--whole-archive ${SDK_DIR}/Lib/GNU/libwlan.a -Wl,--no-whole-archive m) nl_add_images(${NL_FW}) -message(STATUS "ninlight ${NINLIGHT_FW_VERSION} for ${NINLIGHT_DEVICE}") +message(STATUS "ninlight for ${NINLIGHT_DEVICE} (version regenerated at every build, see ${NL_VERSION_HEADER})") diff --git a/cmake/version.cmake b/cmake/version.cmake index f0aa868..1a9917c 100644 --- a/cmake/version.cmake +++ b/cmake/version.cmake @@ -1,12 +1,8 @@ -execute_process( - COMMAND git describe --tags --always --dirty - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE NINLIGHT_FW_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) -if(NOT NINLIGHT_FW_VERSION) - set(NINLIGHT_FW_VERSION "0.0.0-dev") -endif() -string(REGEX REPLACE "^v" "" NINLIGHT_FW_VERSION "${NINLIGHT_FW_VERSION}") -# The OTA trailer reserves 16 bytes incl. terminator for the version. -string(SUBSTRING "${NINLIGHT_FW_VERSION}" 0 15 NINLIGHT_FW_VERSION) +# The version is regenerated on every build so the OTA trailer and system/info match the binary. +set(NL_VERSION_HEADER ${CMAKE_BINARY_DIR}/generated/nl_version.h) +add_custom_target(nl_version ALL + BYPRODUCTS ${NL_VERSION_HEADER} + COMMAND ${CMAKE_COMMAND} -DOUT=${NL_VERSION_HEADER} -DSRC=${CMAKE_SOURCE_DIR} + -P ${CMAKE_SOURCE_DIR}/cmake/write_version.cmake + COMMENT "Updating nl_version.h") string(TIMESTAMP NINLIGHT_BUILD_DATE "%Y-%m-%d") diff --git a/cmake/write_version.cmake b/cmake/write_version.cmake new file mode 100644 index 0000000..3137306 --- /dev/null +++ b/cmake/write_version.cmake @@ -0,0 +1,16 @@ +execute_process(COMMAND git describe --tags --always --dirty WORKING_DIRECTORY ${SRC} + OUTPUT_VARIABLE V OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) +if(NOT V) + set(V "0.0.0-dev") +endif() +string(REGEX REPLACE "^v" "" V "${V}") +string(SUBSTRING "${V}" 0 15 V) +set(CONTENT "#define NINLIGHT_FW_VERSION \"${V}\"\n") +if(EXISTS ${OUT}) + file(READ ${OUT} OLD) +else() + set(OLD "") +endif() +if(NOT OLD STREQUAL CONTENT) + file(WRITE ${OUT} "${CONTENT}") +endif() diff --git a/src/app_main.c b/src/app_main.c index 8392ba9..93db9e6 100644 --- a/src/app_main.c +++ b/src/app_main.c @@ -21,6 +21,8 @@ #include "sys/nl_app_api.h" #include "sys/nl_console.h" +#include "nl_version.h" + #define NL_LIGHT_PRIO 30 #define NL_APP_PRIO 40 diff --git a/src/net/nl_mdns.c b/src/net/nl_mdns.c index 70f8c87..73ae544 100644 --- a/src/net/nl_mdns.c +++ b/src/net/nl_mdns.c @@ -11,6 +11,8 @@ #include "net/nl_names.h" #include "net/nl_wifi.h" +#include "nl_version.h" + #define NL_MDNS_TTL 120 static bool s_inited; diff --git a/src/sys/nl_app_api.c b/src/sys/nl_app_api.c index 08cc389..c761bcc 100644 --- a/src/sys/nl_app_api.c +++ b/src/sys/nl_app_api.c @@ -12,6 +12,8 @@ #include "sys/nl_app.h" #include "sys/nl_app_api.h" +#include "nl_version.h" + static void *json_alloc(size_t n) { return tls_mem_alloc(n); } static void json_free(void *p) { tls_mem_free(p); }