Selaa lähdekoodia

Merge branch 'bugfix/cmake_issues' into 'master'

CMake bugfixes

See merge request espressif/esp-idf!7605
Angus Gratton 6 vuotta sitten
vanhempi
sitoutus
2f1815f74e

+ 5 - 0
components/esptool_py/project_include.cmake

@@ -226,7 +226,12 @@ $<JOIN:$<TARGET_PROPERTY:encrypted-${target_name},IMAGES>,\n>")
                     CONTENT "${flash_args_content}")
                     CONTENT "${flash_args_content}")
         file(GENERATE OUTPUT "${build_dir}/encrypted_${target_name}_args"
         file(GENERATE OUTPUT "${build_dir}/encrypted_${target_name}_args"
                     INPUT "${CMAKE_CURRENT_BINARY_DIR}/encrypted_${target_name}_args.in")
                     INPUT "${CMAKE_CURRENT_BINARY_DIR}/encrypted_${target_name}_args.in")
+    else()
+        fail_target(encrypted-${target_name} "Error: The target encrypted-${target_name} requires"
+                    "CONFIG_SECURE_FLASH_ENCRYPTION_MODE_DEVELOPMENT to be enabled.")
+
     endif()
     endif()
+
 endfunction()
 endfunction()
 
 
 
 

+ 1 - 1
tools/cmake/scripts/fail.cmake

@@ -1,4 +1,4 @@
 # 'cmake -E' doesn't have a way to fail outright, so run this script
 # 'cmake -E' doesn't have a way to fail outright, so run this script
 # with 'cmake -P' to fail a build.
 # with 'cmake -P' to fail a build.
-message(FATAL_ERROR "Failing the build (see errors on lines above)")
+message(FATAL_ERROR "$ENV{FAIL_MESSAGE}")
 
 

+ 25 - 1
tools/cmake/utilities.cmake

@@ -214,13 +214,37 @@ function(fail_at_build_time target_name message_line0)
     set(filename "${CMAKE_CURRENT_BINARY_DIR}/${filename}.cmake")
     set(filename "${CMAKE_CURRENT_BINARY_DIR}/${filename}.cmake")
     file(WRITE "${filename}" "")
     file(WRITE "${filename}" "")
     include("${filename}")
     include("${filename}")
+    set(fail_message "Failing the build (see errors on lines above)")
     add_custom_target(${target_name} ALL
     add_custom_target(${target_name} ALL
         ${message_lines}
         ${message_lines}
         COMMAND ${CMAKE_COMMAND} -E remove "${filename}"
         COMMAND ${CMAKE_COMMAND} -E remove "${filename}"
-        COMMAND ${CMAKE_COMMAND} -P ${idf_path}/tools/cmake/scripts/fail.cmake
+        COMMAND ${CMAKE_COMMAND} -E env FAIL_MESSAGE=${fail_message}
+                ${CMAKE_COMMAND} -P ${idf_path}/tools/cmake/scripts/fail.cmake
         VERBATIM)
         VERBATIM)
 endfunction()
 endfunction()
 
 
+# fail_target
+#
+# Creates a phony target which fails when invoked. This is used when the necessary conditions
+# for a target are not met, such as configuration. Rather than ommitting the target altogether,
+# we fail execution with a helpful message.
+function(fail_target target_name message_line0)
+    idf_build_get_property(idf_path IDF_PATH)
+    set(message_lines COMMAND ${CMAKE_COMMAND} -E echo "${message_line0}")
+    foreach(message_line ${ARGN})
+        set(message_lines ${message_lines} COMMAND ${CMAKE_COMMAND} -E echo "${message_line}")
+    endforeach()
+    # Generate a timestamp file that gets included. When deleted on build, this forces CMake
+    # to rerun.
+    set(fail_message "Failed executing target (see errors on lines above)")
+    add_custom_target(${target_name}
+        ${message_lines}
+        COMMAND ${CMAKE_COMMAND} -E env FAIL_MESSAGE=${fail_message}
+                ${CMAKE_COMMAND} -P ${idf_path}/tools/cmake/scripts/fail.cmake
+        VERBATIM)
+endfunction()
+
+
 function(check_exclusive_args args prefix)
 function(check_exclusive_args args prefix)
     set(_args ${args})
     set(_args ${args})
     spaces2list(_args)
     spaces2list(_args)

+ 7 - 12
tools/idf_py_actions/serial_ext.py

@@ -111,6 +111,7 @@ def action_extensions(base_actions, project_path):
         run_tool("idf_monitor", monitor_args, args.project_dir)
         run_tool("idf_monitor", monitor_args, args.project_dir)
 
 
     def flash(action, ctx, args):
     def flash(action, ctx, args):
+        ensure_build_directory(args, ctx.info_name)
         """
         """
         Run esptool to flash the entire project, from an argfile generated by the build system
         Run esptool to flash the entire project, from an argfile generated by the build system
         """
         """
@@ -147,8 +148,7 @@ def action_extensions(base_actions, project_path):
                 "callback": flash,
                 "callback": flash,
                 "help": "Flash the project.",
                 "help": "Flash the project.",
                 "options": global_options + [baud_rate, port],
                 "options": global_options + [baud_rate, port],
-                "dependencies": ["all"],
-                "order_dependencies": ["erase_flash"],
+                "order_dependencies": ["all", "erase_flash"],
             },
             },
             "erase_flash": {
             "erase_flash": {
                 "callback": erase_flash,
                 "callback": erase_flash,
@@ -197,34 +197,29 @@ def action_extensions(base_actions, project_path):
                 "callback": flash,
                 "callback": flash,
                 "help": "Flash partition table only.",
                 "help": "Flash partition table only.",
                 "options": [baud_rate, port],
                 "options": [baud_rate, port],
-                "dependencies": ["partition_table"],
-                "order_dependencies": ["erase_flash"],
+                "order_dependencies": ["partition_table", "erase_flash"],
             },
             },
             "bootloader-flash": {
             "bootloader-flash": {
                 "callback": flash,
                 "callback": flash,
                 "help": "Flash bootloader only.",
                 "help": "Flash bootloader only.",
                 "options": [baud_rate, port],
                 "options": [baud_rate, port],
-                "dependencies": ["bootloader"],
-                "order_dependencies": ["erase_flash"],
+                "order_dependencies": ["bootloader", "erase_flash"],
             },
             },
             "app-flash": {
             "app-flash": {
                 "callback": flash,
                 "callback": flash,
                 "help": "Flash the app only.",
                 "help": "Flash the app only.",
                 "options": [baud_rate, port],
                 "options": [baud_rate, port],
-                "dependencies": ["app"],
-                "order_dependencies": ["erase_flash"],
+                "order_dependencies": ["app", "erase_flash"],
             },
             },
             "encrypted-app-flash": {
             "encrypted-app-flash": {
                 "callback": flash,
                 "callback": flash,
                 "help": "Flash the encrypted app only.",
                 "help": "Flash the encrypted app only.",
-                "dependencies": ["app"],
-                "order_dependencies": ["erase_flash"],
+                "order_dependencies": ["app", "erase_flash"],
             },
             },
             "encrypted-flash": {
             "encrypted-flash": {
                 "callback": flash,
                 "callback": flash,
                 "help": "Flash the encrypted project.",
                 "help": "Flash the encrypted project.",
-                "dependencies": ["all"],
-                "order_dependencies": ["erase_flash"],
+                "order_dependencies": ["all", "erase_flash"],
             },
             },
         },
         },
     }
     }

+ 2 - 2
tools/test_idf_py/test_idf_py.py

@@ -84,7 +84,7 @@ class TestDependencyManagement(unittest.TestCase):
             args=['--dry-run', 'flash'],
             args=['--dry-run', 'flash'],
             standalone_mode=False,
             standalone_mode=False,
         )
         )
-        self.assertEqual(['all', 'flash'], list(result.keys()))
+        self.assertEqual(['flash'], list(result.keys()))
 
 
     def test_order_only_dependencies(self):
     def test_order_only_dependencies(self):
         result = idf.init_cli()(
         result = idf.init_cli()(
@@ -105,7 +105,7 @@ class TestDependencyManagement(unittest.TestCase):
             args=['--dry-run', 'clean', 'monitor', 'clean', 'fullclean', 'flash'],
             args=['--dry-run', 'clean', 'monitor', 'clean', 'fullclean', 'flash'],
             standalone_mode=False,
             standalone_mode=False,
         )
         )
-        self.assertEqual(['fullclean', 'clean', 'all', 'flash', 'monitor'], list(result.keys()))
+        self.assertEqual(['fullclean', 'clean', 'flash', 'monitor'], list(result.keys()))
 
 
     def test_dupplicated_commands_warning(self):
     def test_dupplicated_commands_warning(self):
         capturedOutput = StringIO()
         capturedOutput = StringIO()