2023-02-07 14:15:30 +08:00
|
|
|
# ##############################################################################
|
|
|
|
# cmake/nuttx_add_symtab.cmake
|
|
|
|
#
|
2024-09-09 18:00:35 +08:00
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
#
|
2023-02-07 14:15:30 +08:00
|
|
|
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
|
|
|
# license agreements. See the NOTICE file distributed with this work for
|
|
|
|
# additional information regarding copyright ownership. The ASF licenses this
|
|
|
|
# file to you under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
# use this file except in compliance with the License. You may obtain a copy of
|
|
|
|
# the License at
|
|
|
|
#
|
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
#
|
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
# License for the specific language governing permissions and limitations under
|
|
|
|
# the License.
|
|
|
|
#
|
|
|
|
# ##############################################################################
|
|
|
|
|
2023-07-27 14:50:57 +08:00
|
|
|
# ~~~
|
|
|
|
# nuttx_add_symtab
|
2023-02-07 14:15:30 +08:00
|
|
|
#
|
2023-07-27 14:50:57 +08:00
|
|
|
# Description:
|
|
|
|
# Generates a symbol table of undefined symbols from a set of binaries
|
|
|
|
#
|
|
|
|
# Parameters:
|
|
|
|
# NAME : name of symtab (output will be symtab_${NAME}.c)
|
|
|
|
# BINARIES: list of binary target names to process (dependencies will be added
|
|
|
|
# to these targets)
|
|
|
|
# PREFIX : optional prefix to add to symtab variable name
|
|
|
|
# EXCLUDE : optional list of symbols to exclude (ie: assume they are defined)
|
|
|
|
# ~~~
|
2023-02-07 14:15:30 +08:00
|
|
|
|
|
|
|
function(nuttx_add_symtab)
|
|
|
|
nuttx_parse_function_args(
|
|
|
|
FUNC
|
|
|
|
nuttx_add_symtab
|
|
|
|
ONE_VALUE
|
|
|
|
NAME
|
|
|
|
PREFIX
|
|
|
|
OPTIONS
|
|
|
|
HEADER
|
|
|
|
MULTI_VALUE
|
|
|
|
EXCLUDE
|
|
|
|
BINARIES
|
|
|
|
REQUIRED
|
|
|
|
NAME
|
|
|
|
BINARIES
|
|
|
|
ARGN
|
|
|
|
${ARGN})
|
|
|
|
|
|
|
|
# get path to binaries
|
|
|
|
set(BINARY_PATHS)
|
|
|
|
foreach(binary ${BINARIES})
|
|
|
|
# this way of getting the path will select the actual ELF binary, even when
|
|
|
|
# this was built by means of an intermediate library on non-ELF platforms
|
|
|
|
list(APPEND BINARY_PATHS $<TARGET_PROPERTY:${binary},ELF_BINARY>)
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
if(EXCLUDE)
|
|
|
|
string(REPLACE ";" " " EXCLUDE_STRING ${EXCLUDE})
|
|
|
|
endif()
|
|
|
|
|
|
|
|
# generate list of undefined symbols
|
|
|
|
add_custom_command(
|
|
|
|
OUTPUT symtab_${NAME}.dat
|
|
|
|
COMMAND ${CMAKE_NM} ${BINARY_PATHS} | fgrep ' U ' | sed -e "s/^[ ]*//g" |
|
|
|
|
cut -d' ' -f2 | sort | uniq > symtab_${NAME}.dat
|
|
|
|
COMMAND
|
|
|
|
if [ \"${EXCLUDE}\" != \"\" ]\; then fgrep -v -x ${EXCLUDE_STRING}
|
|
|
|
symtab_${NAME}.dat > symtab_${NAME}.dat2\; mv symtab_${NAME}.dat2
|
|
|
|
symtab_${NAME}.dat\; fi
|
|
|
|
DEPENDS ${BINARIES})
|
|
|
|
|
|
|
|
add_custom_target(symtab_${NAME}_dat DEPENDS symtab_${NAME}.dat)
|
|
|
|
|
|
|
|
# generate declarations for symbols and symtab entries as headers
|
|
|
|
add_custom_command(
|
|
|
|
OUTPUT symtab_${NAME}_declarations.h symtab_${NAME}_entries.h
|
|
|
|
COMMAND sed -E 's|\(.+\)|extern void *\\1\;|g' symtab_${NAME}.dat >
|
|
|
|
symtab_${NAME}_declarations.h
|
|
|
|
COMMAND sed -E 's|\(.+\)|{ \"\\1\", \\&\\1 },|g' symtab_${NAME}.dat >
|
|
|
|
symtab_${NAME}_entries.h
|
|
|
|
DEPENDS symtab_${NAME}_dat)
|
|
|
|
|
|
|
|
# generate code which instantiates the symbol table
|
|
|
|
configure_file(${CMAKE_SOURCE_DIR}/cmake/symtab.c.in symtab_${NAME}.c @ONLY)
|
|
|
|
|
|
|
|
# define an internal library to build the symtab file on its own
|
|
|
|
add_library(symtab_${NAME} OBJECT
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/symtab_${NAME}.c)
|
|
|
|
|
|
|
|
# Make the dependance between .c and .h explicit. This is necessary since
|
|
|
|
# using configure_file() does not seem to allow this to be automatically
|
|
|
|
# guessed by CMake
|
|
|
|
set_property(
|
|
|
|
SOURCE ${CMAKE_CURRENT_BINARY_DIR}/symtab_${NAME}.c
|
|
|
|
APPEND
|
|
|
|
PROPERTY OBJECT_DEPENDS
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/symtab_${NAME}_declarations.h
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/symtab_${NAME}_entries.h)
|
|
|
|
|
|
|
|
nuttx_add_library_internal(symtab_${NAME})
|
|
|
|
|
|
|
|
if(PREFIX)
|
|
|
|
target_compile_definitions(symtab_${NAME} PRIVATE -DSYMTAB_PREFIX=${PREFIX})
|
|
|
|
endif()
|
|
|
|
endfunction()
|