From 20e866c74f324b30ba2cefb4d74044e2905db58c Mon Sep 17 00:00:00 2001 From: Valerii Koval Date: Fri, 6 May 2022 12:52:39 +0300 Subject: [PATCH] Compile IDF bootloader with optimizations by default By default the size of bootloader is limited to 0x2000 bytes, in debug mode the footprint can be easily grow beyond this limit Issue #793 --- builder/frameworks/espidf.py | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/builder/frameworks/espidf.py b/builder/frameworks/espidf.py index 9b9db48..c1b6787 100644 --- a/builder/frameworks/espidf.py +++ b/builder/frameworks/espidf.py @@ -273,13 +273,15 @@ def load_target_configurations(cmake_codemodel, cmake_api_reply_dir): return configs -def build_library(default_env, lib_config, project_src_dir, prepend_dir=None): +def build_library( + default_env, lib_config, project_src_dir, prepend_dir=None, debug_allowed=True +): lib_name = lib_config["nameOnDisk"] lib_path = lib_config["paths"]["build"] if prepend_dir: lib_path = os.path.join(prepend_dir, lib_path) lib_objects = compile_source_files( - lib_config, default_env, project_src_dir, prepend_dir + lib_config, default_env, project_src_dir, prepend_dir, debug_allowed ) return default_env.Library( target=os.path.join("$BUILD_DIR", lib_path, lib_name), source=lib_objects @@ -553,11 +555,11 @@ def generate_project_ld_script(sdk_config, ignore_targets=None): ) -def prepare_build_envs(config, default_env): +def prepare_build_envs(config, default_env, debug_allowed=True): build_envs = [] target_compile_groups = config.get("compileGroups") - is_build_type_debug = "debug" in env.GetBuildType() + is_build_type_debug = "debug" in env.GetBuildType() and debug_allowed for cg in target_compile_groups: includes = [] sys_includes = [] @@ -587,8 +589,8 @@ def prepare_build_envs(config, default_env): return build_envs -def compile_source_files(config, default_env, project_src_dir, prepend_dir=None): - build_envs = prepare_build_envs(config, default_env) +def compile_source_files(config, default_env, project_src_dir, prepend_dir=None, debug_allowed=True): + build_envs = prepare_build_envs(config, default_env, debug_allowed) objects = [] components_dir = fs.to_unix_path(os.path.join(FRAMEWORK_DIR, "components")) for source in config.get("sources", []): @@ -703,7 +705,7 @@ def find_lib_deps(components_map, elf_config, link_args, ignore_components=None) return result -def build_bootloader(): +def build_bootloader(sdk_config): bootloader_src_dir = os.path.join( FRAMEWORK_DIR, "components", "bootloader", "subproject" ) @@ -743,7 +745,15 @@ def build_bootloader(): target_configs, ["STATIC_LIBRARY", "OBJECT_LIBRARY"] ) - build_components(bootloader_env, components_map, bootloader_src_dir, "bootloader") + # Note: By default the size of bootloader is limited to 0x2000 bytes, + # in debug mode the footprint size can be easily grow beyond this limit + build_components( + bootloader_env, + components_map, + bootloader_src_dir, + "bootloader", + debug_allowed=sdk_config.get("BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG", False), + ) link_args = extract_link_args(elf_config) extra_flags = filter_args(link_args["LINKFLAGS"], ["-T", "-u"]) link_args["LINKFLAGS"] = sorted( @@ -788,10 +798,12 @@ def get_components_map(target_configs, target_types, ignore_components=None): return result -def build_components(env, components_map, project_src_dir, prepend_dir=None): +def build_components( + env, components_map, project_src_dir, prepend_dir=None, debug_allowed=True +): for k, v in components_map.items(): components_map[k]["lib"] = build_library( - env, v["config"], project_src_dir, prepend_dir + env, v["config"], project_src_dir, prepend_dir, debug_allowed ) @@ -1232,7 +1244,7 @@ project_lib_includes = get_project_lib_includes(env) # Compile bootloader # -env.Depends("$BUILD_DIR/$PROGNAME$PROGSUFFIX", build_bootloader()) +env.Depends("$BUILD_DIR/$PROGNAME$PROGSUFFIX", build_bootloader(sdk_config)) # # Target: ESP-IDF menuconfig