diff --git a/CMakeLists.txt b/CMakeLists.txt index a145738a6c33..b4abd30f0fd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1219,6 +1219,24 @@ if(NOT CONFIG_BUILD_NO_GAP_FILL) set(GAP_FILL "--gap-fill;0xff") endif() +if(CONFIG_OUTPUT_PRINT_MEMORY_USAGE) + # @Intent: Use the toolchain bintools method for printing memory usage + set(memUsageCmd "") + set(memUsageByProd "") + bintools_print_mem_usage( + RESULT_CMD_LIST memUsageCmd + RESULT_BYPROD_LIST memUsageByProd + ) + list(APPEND + post_build_commands + ${memUsageCmd} + ) + list(APPEND + post_build_byproducts + ${memUsageByProd} + ) +endif() + if(CONFIG_BUILD_OUTPUT_HEX) list(APPEND post_build_commands @@ -1358,23 +1376,6 @@ if(HEX_FILES_TO_MERGE) list(APPEND FLASH_DEPS mergehex) endif() -if(CONFIG_OUTPUT_PRINT_MEMORY_USAGE) - # Use --print-memory-usage with the first link. - # - # Don't use this option with the second link because seeing it twice - # could confuse users and using it on the second link would suppress - # it when the first link has a ram/flash-usage issue. - set(option ${LINKERFLAGPREFIX},--print-memory-usage) - string(MAKE_C_IDENTIFIER check${option} check) - - set(SAVED_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) - set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${option}") - zephyr_check_compiler_flag(C "" ${check}) - set(CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS}) - - target_link_libraries_ifdef(${check} ${ZEPHYR_PREBUILT_EXECUTABLE} ${option}) -endif() - if(EMU_PLATFORM) include(${ZEPHYR_BASE}/cmake/emu/${EMU_PLATFORM}.cmake) else() diff --git a/cmake/bintools/gnu/target.cmake b/cmake/bintools/gnu/target.cmake index db4195be2602..7359abcb1875 100644 --- a/cmake/bintools/gnu/target.cmake +++ b/cmake/bintools/gnu/target.cmake @@ -12,3 +12,6 @@ find_program(CMAKE_NM ${CROSS_COMPILE}nm PATH ${TOOLCHAIN_HOME} NO_DEF find_program(CMAKE_GDB ${CROSS_COMPILE}gdb PATH ${TOOLCHAIN_HOME} NO_DEFAULT_PATH) find_program(CMAKE_GDB gdb-multiarch PATH ${TOOLCHAIN_HOME} ) + +# Include bin tool abstraction macros +include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) diff --git a/cmake/bintools/gnu/target_memusage.cmake b/cmake/bintools/gnu/target_memusage.cmake new file mode 100644 index 000000000000..3e3408021a7d --- /dev/null +++ b/cmake/bintools/gnu/target_memusage.cmake @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Add and/or prepare print of memory usage report +# +# Usage: +# bintools_print_mem_usage( +# RESULT_CMD_LIST +# RESULT_BYPROD_LIST +# ) +# +macro(bintools_print_mem_usage) + + # Here we make use of the linkers ability to produce memory usage output + # and thus we have no need for the above provided arguments, but another + # toolchain with a different set of binary tools, most likely will... + # + # Use --print-memory-usage with the first link. + # + # Don't use this option with the second link because seeing it twice + # could confuse users and using it on the second link would suppress + # it when the first link has a ram/flash-usage issue. + set(option ${LINKERFLAGPREFIX},--print-memory-usage) + string(MAKE_C_IDENTIFIER check${option} check) + + set(SAVED_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${option}") + zephyr_check_compiler_flag(C "" ${check}) + set(CMAKE_REQUIRED_FLAGS ${SAVED_CMAKE_REQUIRED_FLAGS}) + + target_link_libraries_ifdef(${check} ${ZEPHYR_PREBUILT_EXECUTABLE} ${option}) + +endmacro(bintools_print_mem_usage) diff --git a/cmake/bintools/host-gnu/target.cmake b/cmake/bintools/host-gnu/target.cmake index 5b79e5b6fc19..9f31b3923162 100644 --- a/cmake/bintools/host-gnu/target.cmake +++ b/cmake/bintools/host-gnu/target.cmake @@ -9,3 +9,6 @@ find_program(CMAKE_RANLILB ranlib ) find_program(CMAKE_READELF readelf) find_program(CMAKE_GDB gdb ) + +# Use the gnu binutil abstraction macros +include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) diff --git a/cmake/bintools/llvm/target.cmake b/cmake/bintools/llvm/target.cmake index d0c81e3b0901..f973a6d02c17 100644 --- a/cmake/bintools/llvm/target.cmake +++ b/cmake/bintools/llvm/target.cmake @@ -13,3 +13,6 @@ find_program(CMAKE_OBJDUMP llvm-objdump ${find_program_clang_args} ) find_program(CMAKE_RANLIB llvm-ranlib ${find_program_clang_args} ) find_program(CMAKE_OBJCOPY objcopy ${find_program_binutils_args}) find_program(CMAKE_READELF readelf ${find_program_binutils_args}) + +# Use the gnu binutil abstraction macros +include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake)