nuttx/cmake/nuttx_add_symtab.cmake
2023-07-27 02:32:49 -07:00

110 lines
3.8 KiB
CMake

# ##############################################################################
# cmake/nuttx_add_symtab.cmake
#
# 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.
#
# ##############################################################################
# ~~~
# nuttx_add_symtab
#
# 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)
# ~~~
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()