mirror of
https://github.com/apache/nuttx.git
synced 2025-01-13 08:38:38 +08:00
104 lines
3.7 KiB
CMake
104 lines
3.7 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 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()
|