Merge branch 'bugfix/cmake_issues' into 'master'

CMake bugfixes

See merge request espressif/esp-idf!7605
This commit is contained in:
Angus Gratton 2020-03-06 14:36:59 +08:00
commit 2f1815f74e
5 changed files with 40 additions and 16 deletions

View file

@ -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()

View file

@ -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}")

View file

@ -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)

View file

@ -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": ["all", "erase_flash"],
"order_dependencies": ["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": ["partition_table", "erase_flash"],
"order_dependencies": ["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": ["bootloader", "erase_flash"],
"order_dependencies": ["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": ["app", "erase_flash"],
"order_dependencies": ["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": ["app", "erase_flash"],
"order_dependencies": ["erase_flash"],
}, },
"encrypted-flash": { "encrypted-flash": {
"callback": flash, "callback": flash,
"help": "Flash the encrypted project.", "help": "Flash the encrypted project.",
"dependencies": ["all"], "order_dependencies": ["all", "erase_flash"],
"order_dependencies": ["erase_flash"],
}, },
}, },
} }

View file

@ -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()