diff --git a/makefiles/libc/newlib.mk b/makefiles/libc/newlib.mk index 916105657eff..89a515e3cbca 100644 --- a/makefiles/libc/newlib.mk +++ b/makefiles/libc/newlib.mk @@ -28,6 +28,10 @@ export LINKFLAGS += -lc # Search for Newlib include directories +# Function that returns absolute path to directories that contain newlib.h +# It returns the directory without trailing slash +dir_contains_newlib_h = $(realpath $(dir $(wildcard $(addsuffix /newlib.h, $(1))))) + # Try to search for newlib in the standard search path of the compiler for includes ifeq (,$(NEWLIB_INCLUDE_DIR)) COMPILER_INCLUDE_PATHS := $(shell $(PREFIX)gcc -v -x c -E /dev/null 2>&1 | \ @@ -35,7 +39,7 @@ ifeq (,$(NEWLIB_INCLUDE_DIR)) -e '1,/\#include <...> search starts here:/d' \ -e '/End of search list./,$$d' \ -e 's/^ *//') - NEWLIB_INCLUDE_DIR := $(firstword $(realpath $(dir $(wildcard $(addsuffix /newlib.h, $(COMPILER_INCLUDE_PATHS)))))) + NEWLIB_INCLUDE_DIR := $(firstword $(call dir_contains_newlib_h, $(COMPILER_INCLUDE_PATHS))) endif ifeq (,$(NEWLIB_INCLUDE_DIR)) @@ -63,13 +67,14 @@ ifeq (,$(NEWLIB_INCLUDE_DIR)) # the patterns above. We use the -isystem gcc/clang argument to add the include # directories as system include directories, which means they will not be # searched until after all the project specific include directories (-I/path) - NEWLIB_INCLUDE_DIR := $(firstword $(realpath $(dir $(wildcard $(addsuffix /newlib.h, $(NEWLIB_INCLUDE_PATTERNS)))))) + NEWLIB_INCLUDE_DIR := $(firstword $(call dir_contains_newlib_h, $(NEWLIB_INCLUDE_PATTERNS))) endif # If nothing was found we will try to fall back to searching for a cross-gcc in # the current PATH and use a relative path for the includes ifeq (,$(NEWLIB_INCLUDE_DIR)) - NEWLIB_INCLUDE_DIR := $(realpath $(wildcard $(dir $(shell command -v $(PREFIX)gcc 2>/dev/null))/../$(TARGET_ARCH)/include)) + GCC_RELATIVE_INCLUDE_PATH := $(dir $(shell command -v $(PREFIX)gcc 2>/dev/null))/../$(TARGET_ARCH)/include + NEWLIB_INCLUDE_DIR := $(call dir_contains_newlib_h, $(GCC_RELATIVE_INCLUDE_PATH)) endif ifeq ($(TOOLCHAIN),llvm) @@ -78,7 +83,7 @@ ifeq ($(TOOLCHAIN),llvm) # for the system being built. # We also add -nostdinc to avoid including the host system headers by mistake # in case some header is missing from the cross tool chain - NEWLIB_INCLUDES := -isystem $(NEWLIB_INCLUDE_DIR) -nostdinc + NEWLIB_INCLUDES := $(addprefix -isystem ,$(NEWLIB_INCLUDE_DIR)) -nostdinc NEWLIB_INCLUDES += $(addprefix -isystem ,$(realpath $(wildcard $(dir $(NEWLIB_INCLUDE_DIR))/usr/include))) # Newlib includes should go before GCC includes. This is especially important @@ -90,10 +95,10 @@ ifeq ($(TOOLCHAIN),llvm) endif ifeq (1,$(USE_NEWLIB_NANO)) - NEWLIB_NANO_INCLUDE_DIR ?= $(firstword $(wildcard $(NEWLIB_INCLUDE_DIR)/newlib-nano \ - $(NEWLIB_INCLUDE_DIR)/newlib/nano \ - $(NEWLIB_INCLUDE_DIR)/nano)) + NEWLIB_NANO_INCLUDE_PATTERNS ?= $(addprefix $(NEWLIB_INCLUDE_DIR)/, newlib-nano newlib/nano nano) + NEWLIB_NANO_INCLUDE_DIR ?= $(firstword $(call dir_contains_newlib_h, $(NEWLIB_NANO_INCLUDE_PATTERNS))) + # newlib-nano overrides newlib.h and its include dir should therefore go before # the regular system include dirs. - INCLUDES := -isystem $(NEWLIB_NANO_INCLUDE_DIR) $(INCLUDES) + INCLUDES := $(addprefix -isystem ,$(NEWLIB_NANO_INCLUDE_DIR)) $(INCLUDES) endif