From c6913fa39721993345e908bb1ec89bee1b491de4 Mon Sep 17 00:00:00 2001 From: Arno Moonen Date: Fri, 10 Nov 2023 12:29:40 +0100 Subject: [PATCH 1/2] fix(build): fix build failure if CMAKE_EXECUTABLE_SUFFIX is set From: Arno Moonen Follows original message from Arno Moonen While integrating the ESP-IDF into our existing CMake structure, I've come across quite some hurdles. Most I've been able to fix in our CMake files, however this one I could not. Most of the targets created by the esptool_py component assume that the EXECUTABLE IDF build property (which contains the name of the CMake executable target) always equals the name of the created binary. This is however not always true. For instance, in our setup we use CMAKE_EXECUTABLE_SUFFIX_C and CMAKE_EXECUTABLE_SUFFIX_CXX in our toolchain file (both set to .elf). If we do add_executable(my_app), the target binary file would actually be my_app.elf. In order to fix this, I've updated it to use the TARGET_FILE generated expression. That way we also no longer need the EXECUTABLE_DIR IDF build property here. I've fixed this on v5.0.1 (as that's the ESP-IDF version I'm currently trying to integrate), but I assume it should be easy to apply the same fix to newer versions and the master branch as well. Note that this problem might exist in multiple places where EXECUTABLE is being used. While going through the ESP-IDF code base, I even noticed that a few places actually already seem to use the TARGET_FILE expression. To be honest the property name might be somewhat confusing as well, as it is actually the executable target. Closes https://github.com/espressif/esp-idf/pull/12558 --- components/esptool_py/project_include.cmake | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/components/esptool_py/project_include.cmake b/components/esptool_py/project_include.cmake index 46c12591130..7e0c4d06944 100644 --- a/components/esptool_py/project_include.cmake +++ b/components/esptool_py/project_include.cmake @@ -121,7 +121,6 @@ idf_build_get_property(build_dir BUILD_DIR) idf_build_get_property(elf_name EXECUTABLE_NAME GENERATOR_EXPRESSION) idf_build_get_property(elf EXECUTABLE GENERATOR_EXPRESSION) -idf_build_get_property(elf_dir EXECUTABLE_DIR GENERATOR_EXPRESSION) if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES AND NOT BOOTLOADER_BUILD) set(unsigned_project_binary "${elf_name}-unsigned.bin") @@ -137,10 +136,10 @@ set(PROJECT_BIN "${elf_name}.bin") if(CONFIG_APP_BUILD_GENERATE_BINARIES) add_custom_command(OUTPUT "${build_dir}/.bin_timestamp" COMMAND ${ESPTOOLPY} elf2image ${esptool_elf2image_args} - -o "${build_dir}/${unsigned_project_binary}" "${elf_dir}/${elf}" + -o "${build_dir}/${unsigned_project_binary}" "$>" COMMAND ${CMAKE_COMMAND} -E echo "Generated ${build_dir}/${unsigned_project_binary}" COMMAND ${CMAKE_COMMAND} -E md5sum "${build_dir}/${unsigned_project_binary}" > "${build_dir}/.bin_timestamp" - DEPENDS ${elf} + DEPENDS "$>" VERBATIM WORKING_DIRECTORY ${build_dir} COMMENT "Generating binary image from built executable" @@ -212,7 +211,7 @@ add_custom_target(monitor COMMAND ${CMAKE_COMMAND} -D "IDF_PATH=${idf_path}" -D "SERIAL_TOOL=${ESPMONITOR}" - -D "SERIAL_TOOL_ARGS=--target;${target};${monitor_rev_args};${elf_dir}/${elf}" + -D "SERIAL_TOOL_ARGS=--target;${target};${monitor_rev_args};$>" -D "WORKING_DIRECTORY=${build_dir}" -P run_serial_tool.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} From 4c3beef6564cbef7c5d13723c538365f42d3af8f Mon Sep 17 00:00:00 2001 From: Frantisek Hrbata Date: Wed, 15 Nov 2023 13:19:18 +0100 Subject: [PATCH 2/2] feat(ci): add test for custom cmake CMAKE_EXECUTABLE_SUFFIX Signed-off-by: Frantisek Hrbata --- tools/test_build_system/test_build.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/test_build_system/test_build.py b/tools/test_build_system/test_build.py index 104e0d34f83..c2567dc018b 100644 --- a/tools/test_build_system/test_build.py +++ b/tools/test_build_system/test_build.py @@ -128,3 +128,10 @@ def test_build_with_sdkconfig_build_abspath(idf_py: IdfPyFunc, test_app_copy: Pa build_path = test_app_copy / 'build_tmp' sdkconfig_path = build_path / 'sdkconfig' idf_py('-D', f'SDKCONFIG={sdkconfig_path}', '-B', str(build_path), 'build') + + +def test_build_cmake_executable_suffix(idf_py: IdfPyFunc, test_app_copy: Path) -> None: + logging.info('idf.py can build with CMAKE_EXECUTABLE_SUFFIX set') + append_to_file((test_app_copy / 'CMakeLists.txt'), 'set(CMAKE_EXECUTABLE_SUFFIX_CXX ".ext")') + ret = idf_py('build') + assert 'Project build complete' in ret.stdout, 'Build with CMAKE_EXECUTABLE_SUFFIX set failed'