diff --git a/CMakeLists.txt b/CMakeLists.txt index fcf70d9aa..362c68984 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,9 @@ idf_get_git_revision() idf_check_config_target() ## get PROJECT_VER -app_get_revision("${CMAKE_SOURCE_DIR}") +if(NOT BOOTLOADER_BUILD) + app_get_revision("${CMAKE_SOURCE_DIR}") +endif() # Add some idf-wide definitions idf_set_global_compile_options() diff --git a/components/app_update/CMakeLists.txt b/components/app_update/CMakeLists.txt index d34462b9a..400e5507a 100644 --- a/components/app_update/CMakeLists.txt +++ b/components/app_update/CMakeLists.txt @@ -10,10 +10,14 @@ register_component() # linker will ignore this structure as it has no other files depending on it. target_link_libraries(${COMPONENT_TARGET} "-u esp_app_desc") +# cut PROJECT_VER and PROJECT_NAME to required 32 characters. +string(SUBSTRING "${PROJECT_VER}" 0 31 PROJECT_VER_CUT) +string(SUBSTRING "${PROJECT_NAME}" 0 31 PROJECT_NAME_CUT) + set_source_files_properties( SOURCE "esp_app_desc.c" PROPERTIES COMPILE_DEFINITIONS - PROJECT_VER=\"${PROJECT_VER}\") + "PROJECT_VER=\"${PROJECT_VER_CUT}\"; PROJECT_NAME=\"${PROJECT_NAME_CUT}\"") # Add custom target for generating empty otadata partition for flashing if(OTADATA_PARTITION_OFFSET AND OTADATA_PARTITION_SIZE) diff --git a/components/app_update/Kconfig.projbuild b/components/app_update/Kconfig.projbuild index 62f8bdec3..6e2c41b16 100644 --- a/components/app_update/Kconfig.projbuild +++ b/components/app_update/Kconfig.projbuild @@ -9,4 +9,18 @@ config APP_COMPILE_TIME_DATE This can be useful for getting the same binary image files made from the same source, but at different times. +config APP_EXCLUDE_PROJECT_VER_VAR + bool "Exclude PROJECT_VER from firmware image" + default n + help + The PROJECT_VER variable from the build system will not affect the firmware image. + This value will not be contained in the esp_app_desc structure. + +config APP_EXCLUDE_PROJECT_NAME_VAR + bool "Exclude PROJECT_NAME from firmware image" + default n + help + The PROJECT_NAME variable from the build system will not affect the firmware image. + This value will not be contained in the esp_app_desc structure. + endmenu # "Application manager" \ No newline at end of file diff --git a/components/app_update/component.mk b/components/app_update/component.mk index 924831e38..4d4097f26 100644 --- a/components/app_update/component.mk +++ b/components/app_update/component.mk @@ -11,11 +11,13 @@ ifndef IS_BOOTLOADER_BUILD GET_PROJECT_VER ?= ifeq ("${PROJECT_VER}", "") ifeq ("$(wildcard ${PROJECT_PATH}/version.txt)","") -GET_PROJECT_VER := $(shell cd ${PROJECT_PATH} && git describe --always --tags --dirty || echo "Not found git repo") -ifeq ("${GET_PROJECT_VER}", "Not found git repo") -$(info Project do not have git repo, it needs to get PROJECT_VER from `git describe` command.) -GET_PROJECT_VER := "" + +GET_PROJECT_VER := $(shell cd ${PROJECT_PATH} && git describe --always --tags --dirty 2> /dev/null) +ifeq ("${GET_PROJECT_VER}", "") +GET_PROJECT_VER := "1" +$(info Project is not inside a git repository, will not use 'git describe' to determine PROJECT_VER.) endif + else # read from version.txt GET_PROJECT_VER := $(shell cat ${PROJECT_PATH}/version.txt) @@ -24,16 +26,21 @@ endif # If ``PROJECT_VER`` variable set in project Makefile file, its value will be used. # Else, if the ``$PROJECT_PATH/version.txt`` exists, its contents will be used as ``PROJECT_VER``. # Else, if the project is located inside a Git repository, the output of git describe will be used. -# Otherwise, ``PROJECT_VER`` will be empty. +# Otherwise, ``PROJECT_VER`` will be "1". ifeq ("${PROJECT_VER}", "") PROJECT_VER:= $(GET_PROJECT_VER) else PROJECT_VER:= $(PROJECT_VER) endif -$(info App "$(PROJECT_NAME)" version: $(PROJECT_VER)) -NEW_DEFINES:= $(PROJECT_VER) $(PROJECT_NAME) $(IDF_VER) +# cut PROJECT_VER and PROJECT_NAME to required 32 characters. +PROJECT_VER_CUT := $(shell echo $(PROJECT_VER) | cut -c 1-31) +PROJECT_NAME_CUT := $(shell echo $(PROJECT_NAME) | cut -c 1-31) + +$(info App "$(PROJECT_NAME_CUT)" version: $(PROJECT_VER_CUT)) + +NEW_DEFINES:= $(PROJECT_VER_CUT) $(PROJECT_NAME_CUT) $(IDF_VER) ifeq ("$(wildcard ${TMP_DEFINES})","") OLD_DEFINES:= else @@ -45,5 +52,5 @@ ifneq ("${NEW_DEFINES}", "${OLD_DEFINES}") $(shell echo $(NEW_DEFINES) > $(TMP_DEFINES); rm -f esp_app_desc.o;) endif -esp_app_desc.o: CPPFLAGS += -D PROJECT_VER=\"$(PROJECT_VER)\" -D PROJECT_NAME=\"$(PROJECT_NAME)\" +esp_app_desc.o: CPPFLAGS += -D PROJECT_VER=\"$(PROJECT_VER_CUT)\" -D PROJECT_NAME=\"$(PROJECT_NAME_CUT)\" endif diff --git a/components/app_update/esp_app_desc.c b/components/app_update/esp_app_desc.c index b120d2c34..20c487c1c 100644 --- a/components/app_update/esp_app_desc.c +++ b/components/app_update/esp_app_desc.c @@ -19,8 +19,17 @@ // Application version info const __attribute__((section(".rodata_desc"))) esp_app_desc_t esp_app_desc = { .magic_word = ESP_APP_DESC_MAGIC_WORD, +#ifdef CONFIG_APP_EXCLUDE_PROJECT_VER_VAR + .version = "", +#else .version = PROJECT_VER, +#endif + +#ifdef CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR + .project_name = "", +#else .project_name = PROJECT_NAME, +#endif .idf_ver = IDF_VER, #ifdef CONFIG_APP_SECURE_VERSION @@ -39,9 +48,13 @@ const __attribute__((section(".rodata_desc"))) esp_app_desc_t esp_app_desc = { }; +#ifndef CONFIG_APP_EXCLUDE_PROJECT_VER_VAR _Static_assert(sizeof(PROJECT_VER) <= sizeof(esp_app_desc.version), "PROJECT_VER is longer than version field in structure"); +#endif _Static_assert(sizeof(IDF_VER) <= sizeof(esp_app_desc.idf_ver), "IDF_VER is longer than idf_ver field in structure"); +#ifndef CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR _Static_assert(sizeof(PROJECT_NAME) <= sizeof(esp_app_desc.project_name), "PROJECT_NAME is longer than project_name field in structure"); +#endif const esp_app_desc_t *esp_ota_get_app_description(void) { diff --git a/components/esp32/cpu_start.c b/components/esp32/cpu_start.c index 739e4188d..7dacf38af 100644 --- a/components/esp32/cpu_start.c +++ b/components/esp32/cpu_start.c @@ -179,8 +179,12 @@ void IRAM_ATTR call_start_cpu0() if (LOG_LOCAL_LEVEL >= ESP_LOG_INFO) { const esp_app_desc_t *app_desc = esp_ota_get_app_description(); ESP_EARLY_LOGI(TAG, "Application information:"); +#ifndef CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR ESP_EARLY_LOGI(TAG, "Project name: %s", app_desc->project_name); +#endif +#ifndef CONFIG_APP_EXCLUDE_PROJECT_VER_VAR ESP_EARLY_LOGI(TAG, "App version: %s", app_desc->version); +#endif #ifdef CONFIG_APP_SECURE_VERSION ESP_EARLY_LOGI(TAG, "Secure version: %x", app_desc->secure_version); #endif diff --git a/docs/en/api-guides/build-system-cmake.rst b/docs/en/api-guides/build-system-cmake.rst index 3d16539e9..ac27d8e3d 100644 --- a/docs/en/api-guides/build-system-cmake.rst +++ b/docs/en/api-guides/build-system-cmake.rst @@ -347,7 +347,7 @@ The following variables are set at the project level, but available for use in c * If ``PROJECT_VER`` variable set in project CMakeLists.txt file, its value will be used. * Else, if the ``$PROJECT_PATH/version.txt`` exists, its contents will be used as ``PROJECT_VER``. * Else, if the project is located inside a Git repository, the output of git describe will be used. -* Otherwise, ``PROJECT_VER`` will be empty. +* Otherwise, ``PROJECT_VER`` will be "1". If you modify any of these variables inside ``CMakeLists.txt`` then this will not prevent other components from building but it may make your component hard to build and/or debug. diff --git a/docs/en/api-guides/build-system.rst b/docs/en/api-guides/build-system.rst index f52143cc8..a489d5e45 100644 --- a/docs/en/api-guides/build-system.rst +++ b/docs/en/api-guides/build-system.rst @@ -192,7 +192,7 @@ The following variables are set at the project level, but exported for use in th * If ``PROJECT_VER`` variable set in project Makefile file, its value will be used. * Else, if the ``$PROJECT_PATH/version.txt`` exists, its contents will be used as ``PROJECT_VER``. * Else, if the project is located inside a Git repository, the output of git describe will be used. -* Otherwise, ``PROJECT_VER`` will be empty. +* Otherwise, ``PROJECT_VER`` will be "1". If you modify any of these variables inside ``component.mk`` then this will not prevent other components from building but it may make your component hard to build and/or debug. diff --git a/tools/ci/test_build_system.sh b/tools/ci/test_build_system.sh index 56daa383c..58b721154 100755 --- a/tools/ci/test_build_system.sh +++ b/tools/ci/test_build_system.sh @@ -247,7 +247,7 @@ function run_tests() assert_rebuilt ${APP_BINS} print_status "Change app version" take_build_snapshot - echo "project-version-2.0" > ${TESTDIR}/template/version.txt + echo "project-version-2.0(012345678901234567890123456789)" > ${TESTDIR}/template/version.txt make assert_rebuilt ${APP_BINS} assert_not_rebuilt ${BOOTLOADER_BINS} esp32/libesp32.a diff --git a/tools/ci/test_build_system_cmake.sh b/tools/ci/test_build_system_cmake.sh index acb8f269c..b19f1f0a3 100755 --- a/tools/ci/test_build_system_cmake.sh +++ b/tools/ci/test_build_system_cmake.sh @@ -103,7 +103,7 @@ function run_tests() idf.py build || failure "Failed to build with app version" print_status "Change app version" take_build_snapshot - echo "project-version-2.0" > ${TESTDIR}/template/version.txt + echo "project-version-2.0(012345678901234567890123456789)" > ${TESTDIR}/template/version.txt idf.py build || failure "Failed to rebuild with changed app version" assert_rebuilt ${APP_BINS} assert_not_rebuilt ${BOOTLOADER_BINS} esp-idf/esp32/libesp32.a diff --git a/tools/cmake/idf_functions.cmake b/tools/cmake/idf_functions.cmake index 0a3af7e03..7b389d342 100644 --- a/tools/cmake/idf_functions.cmake +++ b/tools/cmake/idf_functions.cmake @@ -87,7 +87,6 @@ function(idf_set_global_compile_options) list(APPEND compile_options "${CMAKE_C_FLAGS}") list(APPEND c_compile_options "${CMAKE_C_FLAGS}") list(APPEND cxx_compile_options "${CMAKE_CXX_FLAGS}") - add_definitions(-DPROJECT_NAME=\"${PROJECT_NAME}\") if(CONFIG_OPTIMIZATION_LEVEL_RELEASE) list(APPEND compile_options "-Os") @@ -240,19 +239,24 @@ endfunction() # If PROJECT_VER variable set in project CMakeLists.txt file, its value will be used. # Else, if the _project_path/version.txt exists, its contents will be used as PROJECT_VER. # Else, if the project is located inside a Git repository, the output of git describe will be used. -# Otherwise, PROJECT_VER will be empty. +# Otherwise, PROJECT_VER will be "1". function(app_get_revision _project_path) - git_describe(PROJECT_VER_GIT "${_project_path}") if(NOT DEFINED PROJECT_VER) if(EXISTS "${_project_path}/version.txt") file(STRINGS "${_project_path}/version.txt" PROJECT_VER) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${_project_path}/version.txt") else() - set(PROJECT_VER ${PROJECT_VER_GIT}) + git_describe(PROJECT_VER_GIT "${_project_path}") + if(PROJECT_VER_GIT) + set(PROJECT_VER ${PROJECT_VER_GIT}) + else() + message(STATUS "Project is not inside a git repository, \ + will not use 'git describe' to determine PROJECT_VER.") + set(PROJECT_VER "1") + endif() endif() endif() message(STATUS "Project version: ${PROJECT_VER}") - git_submodule_check("${_project_path}") set(PROJECT_VER ${PROJECT_VER} PARENT_SCOPE) endfunction()