From cb158f119467289db41705373908ed2104a1b2c8 Mon Sep 17 00:00:00 2001 From: Angus Gratton Date: Mon, 27 Aug 2018 11:55:04 +0800 Subject: [PATCH] cmake: Account for missing partition CSV file at cmake runtime Avoid either breaking menuconfig (if cmake fails), or producing bad build output (if cmake succeeds but no flashing offsets, etc. were generated.) --- components/partition_table/CMakeLists.txt | 19 ++++++++++++++++++- .../partition_table/project_include.cmake | 2 ++ tools/cmake/scripts/fail.cmake | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tools/cmake/scripts/fail.cmake diff --git a/components/partition_table/CMakeLists.txt b/components/partition_table/CMakeLists.txt index a97080c4cd..443a5ad6e3 100644 --- a/components/partition_table/CMakeLists.txt +++ b/components/partition_table/CMakeLists.txt @@ -42,7 +42,24 @@ if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES) endif() -add_custom_target(partition_table ALL DEPENDS "${final_partition_bin}") +if(EXISTS ${partition_csv}) + add_custom_target(partition_table ALL DEPENDS "${final_partition_bin}") +else() + # This is a bit of a hack: If the partition input CSV is not found, create a phony partition_table target that + # fails the build. Have it also touch CMakeCache.txt to cause a cmake run next time + # (to pick up a new CSV if one exists, etc.) + # + # This is because partition CSV is required at CMake runtime (to generate metadata files with flashing data, etc) but we can't + # fail the build if it is not found, because the "menuconfig" target may be required to fix the problem. CMAKE_CONFIGURE_DEPENDS + # only works for files which exist at CMake runtime. + add_custom_target(partition_table ALL + COMMAND ${CMAKE_COMMAND} -E echo "Partition table CSV ${partition_csv} does not exist. Either change partition table in menuconfig or create this input file." + COMMAND ${CMAKE_COMMAND} -E touch "${CMAKE_BINARY_DIR}/CMakeCache.txt" + COMMAND ${CMAKE_COMMAND} -P ${IDF_PATH}/tools/cmake/scripts/fail.cmake) +endif() + +add_dependencies(bootloader partition_table) +add_dependencies(app partition_table) # Use global properties ESPTOOL_WRITE_FLASH_ARGS to pass this info to build # the list of esptool write arguments for flashing diff --git a/components/partition_table/project_include.cmake b/components/partition_table/project_include.cmake index 8af1e0ee92..07ba2cce02 100644 --- a/components/partition_table/project_include.cmake +++ b/components/partition_table/project_include.cmake @@ -11,6 +11,8 @@ if(CONFIG_PARTITION_TABLE_CUSTOM) if(NOT EXISTS "${PARTITION_CSV_PATH}") message(WARNING "Partition table CSV file ${PARTITION_CSV_PATH} not found. " "Change custom partition CSV path in menuconfig.") + # Note: partition_table CMakeLists.txt contains some logic to create a dummy + # partition_table target in this case, see comments in that file. endif() else() # Other .csv files are always in the component directory diff --git a/tools/cmake/scripts/fail.cmake b/tools/cmake/scripts/fail.cmake new file mode 100644 index 0000000000..5ceddb3ca6 --- /dev/null +++ b/tools/cmake/scripts/fail.cmake @@ -0,0 +1,4 @@ +# 'cmake -E' doesn't have a way to fail outright, so run this script +# with 'cmake -P' to fail a build. +message(FATAL_ERROR "Failing the build (see errors on lines above)") +