# SPDX-License-Identifier: Apache-2.0 zephyr_library() zephyr_library_sources(libc-hooks.c) # Do not allow LTO when compiling libc-hooks.c file set_source_files_properties(libc-hooks.c PROPERTIES COMPILE_OPTIONS $) # Zephyr normally uses -ffreestanding, which with current GNU toolchains # means that the flag macros used by newlib 3.x to signal # support for PRI.64 macros are not present. To make them available we # need to hook into the include path before the system files and # explicitly include the newlib header that provides those macros. zephyr_include_directories(include) # LIBC_LIBRARY_DIR may or may not have been set by the toolchain. E.g. when # using ZEPHYR_TOOLCHAIN_VARIANT=cross-compile it will be either up to the # toolchain to know where it's libc implementation is, or if it is # unable to, it will be up to the user to specify LIBC_LIBRARY_DIR vars to # point to a newlib implementation. if(LIBC_LIBRARY_DIR) set(LIBC_LIBRARY_DIR_FLAG -L${LIBC_LIBRARY_DIR}) endif() # Define _ANSI_SOURCE in order to prevent Newlib from defining POSIX primitives # in its headers when GNU dialect is used (-std=gnu*). Newlib features.h # defines _DEFAULT_SOURCE when __STRICT_ANSI__ is not defined by GCC (i.e. when # -std=gnu*), which leads to various POSIX definitions being provided by the # Newlib headers and conflicts with the POSIX definitions provided by Zephyr. zephyr_compile_definitions(_ANSI_SOURCE) # define __LINUX_ERRNO_EXTENSIONS__ so we get errno defines like -ESHUTDOWN # used by the network stack zephyr_compile_definitions(__LINUX_ERRNO_EXTENSIONS__) if(CMAKE_C_COMPILER_ID STREQUAL "GNU") zephyr_link_libraries( ${LIBC_LIBRARY_DIR_FLAG} # NB: Optional $<$:-u_printf_float> $<$:-u_scanf_float> ) endif() if(CONFIG_NEWLIB_LIBC_NANO) zephyr_link_libraries( -specs=nano.specs ) zephyr_compile_options( -specs=nano.specs ) endif()