diff --git a/CMakeLists.txt b/CMakeLists.txt index a7e1d3b..8a4a034 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,13 +31,13 @@ SET(INTERNAL_HW_REV 1) SET(INTERNAL_SW_YEAR 26) SET(INTERNAL_SW_MONTH 9) -SET(INTERNAL_SW_DAY 1) -SET(INTERNAL_SW_REV 1) +SET(INTERNAL_SW_DAY 30) +SET(INTERNAL_SW_REV 14) SET(INTERNAL_MDB_YEAR 26) SET(INTERNAL_MDB_MONTH 9) -SET(INTERNAL_MDB_DAY 1) -SET(INTERNAL_MDB_REV 1) +SET(INTERNAL_MDB_DAY 30) +SET(INTERNAL_MDB_REV 14) SET(FINGER_MODULE 0x01) SET(FINGER_YEAR 0x26) @@ -59,15 +59,15 @@ ADD_DEFINITIONS(-DINTERNAL_HW_MONTH=${INTERNAL_HW_MONTH}) ADD_DEFINITIONS(-DINTERNAL_HW_DAY=${INTERNAL_HW_DAY}) ADD_DEFINITIONS(-DINTERNAL_HW_REV=${INTERNAL_HW_REV}) -ADD_DEFINITIONS(-DINTERNAL_SW_YEAR=${INTERNAL_SW_YEAR}) -ADD_DEFINITIONS(-DINTERNAL_SW_MONTH=${INTERNAL_SW_MONTH}) -ADD_DEFINITIONS(-DINTERNAL_SW_DAY=${INTERNAL_SW_DAY}) -ADD_DEFINITIONS(-DINTERNAL_SW_REV=${INTERNAL_SW_REV}) +#ADD_DEFINITIONS(-DINTERNAL_SW_YEAR=${INTERNAL_SW_YEAR}) +#ADD_DEFINITIONS(-DINTERNAL_SW_MONTH=${INTERNAL_SW_MONTH}) +#ADD_DEFINITIONS(-DINTERNAL_SW_DAY=${INTERNAL_SW_DAY}) +#ADD_DEFINITIONS(-DINTERNAL_SW_REV=${INTERNAL_SW_REV}) -ADD_DEFINITIONS(-DINTERNAL_MDB_YEAR=${INTERNAL_MDB_YEAR}) -ADD_DEFINITIONS(-DINTERNAL_MDB_MONTH=${INTERNAL_MDB_MONTH}) -ADD_DEFINITIONS(-DINTERNAL_MDB_DAY=${INTERNAL_MDB_DAY}) -ADD_DEFINITIONS(-DINTERNAL_MDB_REV=${INTERNAL_MDB_REV}) +#ADD_DEFINITIONS(-DINTERNAL_MDB_YEAR=${INTERNAL_MDB_YEAR}) +#ADD_DEFINITIONS(-DINTERNAL_MDB_MONTH=${INTERNAL_MDB_MONTH}) +#ADD_DEFINITIONS(-DINTERNAL_MDB_DAY=${INTERNAL_MDB_DAY}) +#ADD_DEFINITIONS(-DINTERNAL_MDB_REV=${INTERNAL_MDB_REV}) ADD_DEFINITIONS(-DFINGER_MODULE=${FINGER_MODULE}) ADD_DEFINITIONS(-DFINGER_YEAR=${FINGER_YEAR}) @@ -132,18 +132,66 @@ SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T ${LDSCRIPT} -Wl,-Map=${ #-- Random BuildId Generation ------------------------------------------------------------ SET(RANDOM_BUILD_ID_GEN_FILE ${CMAKE_SOURCE_DIR}/MODULES/CmakeConfig_RandomBuildIdGenerator/version.cmake) +SET(RANDOM_BUILD_ID_GEN_VERSION ${CMAKE_SOURCE_DIR}/MODULES/CmakeConfig_RandomBuildIdGenerator/generate_version.cmake) + + add_custom_target(GEN_RANDOM_BUILD_ID) ADD_CUSTOM_COMMAND(TARGET GEN_RANDOM_BUILD_ID POST_BUILD COMMAND ${CMAKE_COMMAND} -P ${RANDOM_BUILD_ID_GEN_FILE}) +set(SCRIPT_DIR ${CMAKE_SOURCE_DIR}/MODULES/CmakeConfig_RandomBuildIdGenerator) +set(VERSION_H ${SCRIPT_DIR}/Version.h) +set(VERSION_FILE ${SCRIPT_DIR}/.version) + +add_custom_target(GEN_RANDOM_BUILD_ID_VERSION) +ADD_CUSTOM_COMMAND(TARGET GEN_RANDOM_BUILD_ID_VERSION POST_BUILD + COMMAND ${CMAKE_COMMAND} + "-DOUT=${VERSION_H}" + "-DVERSION_FILE=${VERSION_FILE}" + -P ${RANDOM_BUILD_ID_GEN_VERSION} + BYPRODUCTS ${VERSION_H} + COMMENT "Generating VersionRandID.h before compilation" + VERBATIM) + #-- Project linking ------------------------------------------------------------ ADD_EXECUTABLE(${PROJECT_NAME}.elf ${SOURCES}) TARGET_LINK_LIBRARIES(${PROJECT_NAME}.elf m) add_dependencies(${PROJECT_NAME}.elf GEN_RANDOM_BUILD_ID) - +add_dependencies(${PROJECT_NAME}.elf GEN_RANDOM_BUILD_ID_VERSION) #-- Custom commands ------------------------------------------------------------ + +#ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME}.elf PRE_LINK +# COMMAND ${CMAKE_SOURCE_DIR}/generate_version.sh) + + + + +# Файл, который сгенерирует скрипт +SET(VERSION_HEADER ${CMAKE_BINARY_DIR}/generated/version.h) + +# Цель, которая гарантированно обновит version.h до компиляции +ADD_CUSTOM_TARGET(GenerateVersion + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/generated + COMMAND ${CMAKE_SOURCE_DIR}/generate_version.sh ${VERSION_HEADER} + BYPRODUCTS ${VERSION_HEADER} + COMMENT "Generating version.h before compilation" + VERBATIM) + +# Подключаем сгенерированную папку +TARGET_INCLUDE_DIRECTORIES(${PROJECT_NAME}.elf PRIVATE ${CMAKE_BINARY_DIR}/generated) + +# Каждый .obj в таргете ждёт GenerateVersion +ADD_DEPENDENCIES(${PROJECT_NAME}.elf GenerateVersion) + + + + + + ADD_CUSTOM_COMMAND(TARGET ${PROJECT_NAME}.elf POST_BUILD +# COMMAND ${CMAKE_SOURCE_DIR}/generate_version.sh + COMMAND ${CMAKE_OBJCOPY} "-Oihex" ${PROJECT_NAME}.elf ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.hex COMMAND ${CMAKE_OBJCOPY} "-Obinary" ${PROJECT_NAME}.elf ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.bin # COMMAND ${CMAKE_OBJDUMP} "-DS" ${PROJECT_NAME}.elf > ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.dasm - COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf) \ No newline at end of file + COMMAND ${CMAKE_SIZE} ${PROJECT_NAME}.elf) diff --git a/MODULES/CmakeConfig_RandomBuildIdGenerator/generate_version.cmake b/MODULES/CmakeConfig_RandomBuildIdGenerator/generate_version.cmake new file mode 100644 index 0000000..d9a9e24 --- /dev/null +++ b/MODULES/CmakeConfig_RandomBuildIdGenerator/generate_version.cmake @@ -0,0 +1,71 @@ +# generate_version.cmake +# Запуск: cmake -DOUT= +# -DVERSION_FILE= +# -P generate_version.cmake + +if(NOT DEFINED OUT) + message(FATAL_ERROR "OUT is not defined") +endif() +if(NOT DEFINED VERSION_FILE) + message(FATAL_ERROR "VERSION_FILE is not defined") +endif() + +# --- Дата без ведущих нулей (26, 9, 29) --- +string(TIMESTAMP CURRENT_YEAR "%y") # 26 +string(TIMESTAMP CURRENT_MONTH "%m") # 09 +string(TIMESTAMP CURRENT_DAY "%d") # 29 + +string(REGEX REPLACE "^0" "" CURRENT_MONTH "${CURRENT_MONTH}") # 9 +string(REGEX REPLACE "^0" "" CURRENT_DAY "${CURRENT_DAY}") # 29 + +# --- Ключ дня для .version (с ведущими нулями — совместимость) --- +string(TIMESTAMP DATE_KEY "%y%m%d") + +# --- Читаем .version --- +set(saved_key "") +set(saved_rev 0) +if(EXISTS "${VERSION_FILE}") + file(READ "${VERSION_FILE}" content) + + string(REGEX MATCH "DATE_KEY=([0-9]+)" _ "${content}") + if(CMAKE_MATCH_1) + set(saved_key "${CMAKE_MATCH_1}") + endif() + + string(REGEX MATCH "REV=([0-9]+)" _ "${content}") + if(CMAKE_MATCH_1) + set(saved_rev "${CMAKE_MATCH_1}") + endif() +endif() + +# --- Считаем ревизию --- +if("${saved_key}" STREQUAL "${DATE_KEY}") + math(EXPR new_rev "${saved_rev} + 1") +else() + set(new_rev 1) +endif() + +file(WRITE "${VERSION_FILE}" "DATE_KEY=${DATE_KEY}\nREV=${new_rev}\n") + +# --- Пишем заголовок --- +file(WRITE "${OUT}" + "#pragma once + +#define INTERNAL_SW_YEAR ${CURRENT_YEAR} +#define INTERNAL_SW_MONTH ${CURRENT_MONTH} +#define INTERNAL_SW_DAY ${CURRENT_DAY} +#define INTERNAL_SW_REV ${new_rev} + +#define INTERNAL_MDB_YEAR ${CURRENT_YEAR} +#define INTERNAL_MDB_MONTH ${CURRENT_MONTH} +#define INTERNAL_MDB_DAY ${CURRENT_DAY} +#define INTERNAL_MDB_REV ${new_rev} + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) +#define INTERNAL_SW_VERSION_STR \\ + STR(INTERNAL_SW_YEAR) \".\" STR(INTERNAL_SW_MONTH) \".\" \\ + STR(INTERNAL_SW_DAY) \"-\" STR(INTERNAL_SW_REV) +") + +message(STATUS "Version: ${CURRENT_YEAR}.${CURRENT_MONTH}.${CURRENT_DAY}-${new_rev}") \ No newline at end of file diff --git a/MODULES/FirmwareMetadataSection/FirmwareMetadataSection.c b/MODULES/FirmwareMetadataSection/FirmwareMetadataSection.c index f78dce8..21f1f28 100644 --- a/MODULES/FirmwareMetadataSection/FirmwareMetadataSection.c +++ b/MODULES/FirmwareMetadataSection/FirmwareMetadataSection.c @@ -5,6 +5,7 @@ #include "FirmwareMetadataSection.h" #include "VersionRandID.h" +#include "Version.h" #define DEF_INTERNAL_HW_YEAR INTERNAL_HW_YEAR #define DEF_INTERNAL_HW_MONTH INTERNAL_HW_MONTH