In order to compile with C++ exception handling for xtensa, the libgcc location needs to be known. This change uses the same logic from gcc's target.cmake to query the compiler for libgcc location and add the lib to the include list. Signed-off-by: Mark Inderhees <markind@meta.com>
72 lines
2.6 KiB
CMake
72 lines
2.6 KiB
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
set_ifndef(C++ g++)
|
|
|
|
# Configures CMake for using GCC, this script is re-used by several
|
|
# GCC-based toolchains
|
|
|
|
find_program(CMAKE_C_COMPILER ${CROSS_COMPILE}${CC} PATHS ${TOOLCHAIN_HOME} NO_DEFAULT_PATH)
|
|
|
|
if(CONFIG_CPP)
|
|
set(cplusplus_compiler ${CROSS_COMPILE}${C++})
|
|
else()
|
|
if(EXISTS ${CROSS_COMPILE}${C++})
|
|
set(cplusplus_compiler ${CROSS_COMPILE}${C++})
|
|
else()
|
|
# When the toolchain doesn't support C++, and we aren't building
|
|
# with C++ support just set it to something so CMake doesn't
|
|
# crash, it won't actually be called
|
|
set(cplusplus_compiler ${CMAKE_C_COMPILER})
|
|
endif()
|
|
endif()
|
|
find_program(CMAKE_CXX_COMPILER ${cplusplus_compiler} PATHS ${TOOLCHAIN_HOME} NO_DEFAULT_PATH)
|
|
|
|
set(NOSTDINC "")
|
|
|
|
# Note that NOSYSDEF_CFLAG may be an empty string, and
|
|
# set_ifndef() does not work with empty string.
|
|
if(NOT DEFINED NOSYSDEF_CFLAG)
|
|
set(NOSYSDEF_CFLAG -undef)
|
|
endif()
|
|
|
|
foreach(file_name include/stddef.h include-fixed/limits.h)
|
|
execute_process(
|
|
COMMAND ${CMAKE_C_COMPILER} --print-file-name=${file_name}
|
|
OUTPUT_VARIABLE _OUTPUT
|
|
)
|
|
get_filename_component(_OUTPUT "${_OUTPUT}" DIRECTORY)
|
|
string(REGEX REPLACE "\n" "" _OUTPUT "${_OUTPUT}")
|
|
|
|
list(APPEND NOSTDINC ${_OUTPUT})
|
|
endforeach()
|
|
|
|
# This libgcc code is partially duplicated in compiler/*/target.cmake
|
|
execute_process(
|
|
COMMAND ${CMAKE_C_COMPILER} ${TOOLCHAIN_C_FLAGS} --print-libgcc-file-name
|
|
OUTPUT_VARIABLE LIBGCC_FILE_NAME
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
)
|
|
|
|
get_filename_component(LIBGCC_DIR ${LIBGCC_FILE_NAME} DIRECTORY)
|
|
|
|
list(APPEND LIB_INCLUDE_DIR "-L\"${LIBGCC_DIR}\"")
|
|
|
|
# For CMake to be able to test if a compiler flag is supported by the
|
|
# toolchain we need to give CMake the necessary flags to compile and
|
|
# link a dummy C file.
|
|
#
|
|
# CMake checks compiler flags with check_c_compiler_flag() (Which we
|
|
# wrap with target_cc_option() in extensions.cmake)
|
|
foreach(isystem_include_dir ${NOSTDINC})
|
|
list(APPEND isystem_include_flags -isystem "\"${isystem_include_dir}\"")
|
|
endforeach()
|
|
# The CMAKE_REQUIRED_FLAGS variable is used by check_c_compiler_flag()
|
|
# (and other commands which end up calling check_c_source_compiles())
|
|
# to add additional compiler flags used during checking. These flags
|
|
# are unused during "real" builds of Zephyr source files linked into
|
|
# the final executable.
|
|
#
|
|
# Appending onto any existing values lets users specify
|
|
# toolchain-specific flags at generation time.
|
|
list(APPEND CMAKE_REQUIRED_FLAGS -nostartfiles -nostdlib ${isystem_include_flags} -Wl,--unresolved-symbols=ignore-in-object-files)
|
|
string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|