Skip to content
Permalink
Browse files

cmake: Toolchain abstraction: Abstraction of print memory usage.

The method for getting a memory usage report printed during build, is
based on a GNU linker (ld) option flag, and thus is not necessarily
supported by other toolchain binary tools.
The introduced cmake macro allows for a given toolchain to specify how
the memory usage report is to be generated, and whether the command for
generation, if any, is to be added to the post_build_commands and the
post_build_byproducts lists of the top level CMakeLists.txt

The intent here is to abstract Zephyr's dependence on toolchains,
thus allowing for easier porting to other, perhaps commercial,
toolchains and/or usecases.

No functional change expected.

Signed-off-by: Danny Oerndrup <daor@demant.com>
  • Loading branch information...
daor-oti authored and aescolar committed Jul 18, 2019
1 parent aed9ea7 commit c41e712c6ff7c312d7034556a4e3c1f5a0bd8804
@@ -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()
@@ -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)
@@ -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 <List of commands to be executed, usually after build>
# RESULT_BYPROD_LIST <List of command output byproducts>
# )
#
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)
@@ -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)
@@ -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)

0 comments on commit c41e712

Please sign in to comment.
You can’t perform that action at this time.