Skip to content

Commit

Permalink
cmake: Toolchain abstraction: Abstraction of binary tool, readelf.
Browse files Browse the repository at this point in the history
This abstracts the interface for generation of the readelf command
line, by naming the desired actions instead of directly setting the
command parameters, which then opens up for other binary tool sets
which may require different arguments to achieve the desired result.

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 Aug 2, 2019
1 parent 0760a53 commit 919df01
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 2 deletions.
13 changes: 11 additions & 2 deletions CMakeLists.txt
Expand Up @@ -1356,14 +1356,23 @@ if(CONFIG_OUTPUT_DISASSEMBLY)
endif() endif()


if(CONFIG_OUTPUT_STAT) if(CONFIG_OUTPUT_STAT)
set(out_stat_cmd "")
set(out_stat_byprod "")
bintools_readelf(
RESULT_CMD_LIST out_stat_cmd
RESULT_BYPROD_LIST out_stat_byprod
HEADERS
FILE_INPUT ${KERNEL_ELF_NAME}
FILE_OUTPUT ${KERNEL_STAT_NAME}
)
list(APPEND list(APPEND
post_build_commands post_build_commands
COMMAND ${out_stat_cmd}
${CMAKE_READELF} -e ${KERNEL_ELF_NAME} > ${KERNEL_STAT_NAME}
) )
list(APPEND list(APPEND
post_build_byproducts post_build_byproducts
${KERNEL_STAT_NAME} ${KERNEL_STAT_NAME}
${out_stat_byprod}
) )
endif() endif()


Expand Down
1 change: 1 addition & 0 deletions cmake/bintools/gnu/target.cmake
Expand Up @@ -17,3 +17,4 @@ find_program(CMAKE_GDB gdb-multiarch PATH ${TOOLCHAIN_HOME}
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_readelf.cmake)
60 changes: 60 additions & 0 deletions cmake/bintools/gnu/target_readelf.cmake
@@ -0,0 +1,60 @@
# SPDX-License-Identifier: Apache-2.0

# Construct a commandline suitable for calling the toolchain binary tools
# version of readelf.
#
# Usage:
# bintools_readelf(
# RESULT_CMD_LIST <List of commands to be executed, usually after build>
# RESULT_BYPROD_LIST <List of command output byproducts>
#
# HEADERS <Display all the headers in the input file>
#
# FILE_INPUT <The input file>
# FILE_OUTPUT <The output file>
# )
function(bintools_readelf)
cmake_parse_arguments(
# Prefix of output variables
BINTOOLS_READELF
# List of argument names without values, hence boolean
"HEADERS"
# List of argument names with one value
"RESULT_CMD_LIST;RESULT_BYPROD_LIST;FILE_INPUT;FILE_OUTPUT"
# List of argument names with multible values
""
# Parser input
${ARGN}
)

# Verify arguments
if(NOT DEFINED BINTOOLS_READELF_RESULT_CMD_LIST OR NOT DEFINED ${BINTOOLS_READELF_RESULT_CMD_LIST})
message(FATAL_ERROR "RESULT_CMD_LIST is required.")
elseif(NOT DEFINED BINTOOLS_READELF_FILE_INPUT)
message(FATAL_ERROR "FILE_INPUT is required.")
endif()

# Handle headers
set(readelf_headers "")
if(${BINTOOLS_READELF_HEADERS})
set(readelf_headers "-e") # --headers
endif()

# Handle output
set(readelf_output "")
if(DEFINED BINTOOLS_READELF_FILE_OUTPUT)
set(readelf_output > ${BINTOOLS_READELF_FILE_OUTPUT})
endif()

# Construct the command
set(readelf_cmd
# Base command
COMMAND ${CMAKE_READELF} ${readelf_headers}
# Input and Output
${BINTOOLS_READELF_FILE_INPUT} ${readelf_output}
)

# Place command in the parent provided variable
set(${BINTOOLS_READELF_RESULT_CMD_LIST} ${readelf_cmd} PARENT_SCOPE)

endfunction(bintools_readelf)
1 change: 1 addition & 0 deletions cmake/bintools/host-gnu/target.cmake
Expand Up @@ -14,3 +14,4 @@ find_program(CMAKE_GDB gdb )
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_readelf.cmake)
1 change: 1 addition & 0 deletions cmake/bintools/llvm/target.cmake
Expand Up @@ -18,3 +18,4 @@ find_program(CMAKE_READELF readelf ${find_program_binutils_args})
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_memusage.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objcopy.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake) include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_objdump.cmake)
include(${ZEPHYR_BASE}/cmake/bintools/gnu/target_readelf.cmake)

0 comments on commit 919df01

Please sign in to comment.