diff --git a/Makefile.base b/Makefile.base index fcdd36fadb09743b76a0b7a1118cfe18dd427ef4..fd59c084d1e00f4618f27560d5099bd5f7bbe1f7 100644 --- a/Makefile.base +++ b/Makefile.base @@ -66,7 +66,7 @@ $(OBJCXX): $(BINDIR)$(MODULE)/%.o: %.cpp $(AD)$(CCACHE) $(CXX) \ -DRIOT_FILE_RELATIVE=\"$(patsubst $(RIOTBASE)/%,%,$(abspath $<))\" \ -DRIOT_FILE_NOPATH=\"$(notdir $<)\" \ - $(CXXFLAGS) $(INCLUDES) -MD -MP -c -o $@ $(abspath $<) + $(CXXFLAGS) $(INCLUDES) $(CXXINCLUDES) -MD -MP -c -o $@ $(abspath $<) $(ASMOBJ): $(BINDIR)$(MODULE)/%.o: %.s $(AD)$(AS) $(ASFLAGS) -o $@ $(abspath $<) diff --git a/cpu/Makefile.include.llvm b/cpu/Makefile.include.llvm index f796ec1b290979a3fe8cdceaa107fad061016f28..ead33163e109e6596f5ddfaeb2b8a8373cf67080 100644 --- a/cpu/Makefile.include.llvm +++ b/cpu/Makefile.include.llvm @@ -1,5 +1,12 @@ export GDBPREFIX ?= $(PREFIX) export LLVMPREFIX ?= llvm- +# Apple XCode doesn't prefix its tools with llvm-, but manually installed LLVM +# on OSX might have the llvm- prefix, we can't simply test against uname -s. +# Test if llvm-ar exists +ifeq (,$(shell command -v $(LLVMPREFIX)ar 2>/dev/null)) +# fall back to system tools +export LLVMPREFIX := +endif export CC = clang export CXX = clang++ export LINK = $(CC) @@ -17,7 +24,66 @@ export DBG = $(GDBPREFIX)gdb # LLVM lacks a binutils strip tool as well... #export STRIP = $(LLVMPREFIX)strip +# Clang on Linux uses GCC's C++ headers and libstdc++ (installed with GCC) +# Ubuntu and Debian use /etc/alternatives/gcc-$(TARGET_ARCH)-include/c++/$(GCC_VERSION) +# Arch uses /usr/$(TARGET_ARCH)/include/c++/$(GCC_VERSION) +# Gentoo uses /usr/lib/gcc/$(TARGET_ARCH)/$(GCC_VERSION)/include/g++-v5 +GCC_CXX_INCLUDE_PATTERNS ?= \ + /etc/alternatives/gcc-$(TARGET_ARCH)-include/c++/*/ \ + /usr/$(TARGET_ARCH)/include/c++/*/ \ + /usr/lib/gcc/$(TARGET_ARCH)/*/include/g++-v5 \ + # + +# Try to find the proper multilib directory using GCC, this may fail if a cross- +# GCC is not installed. +ifeq ($(GCC_MULTI_DIR),) + GCC_MULTI_DIR := $(shell $(PREFIX)gcc -print-multi-directory $(CFLAGS) 2>/dev/null) +endif + # Tell clang to cross compile export CFLAGS += -target $(TARGET_ARCH) export CXXFLAGS += -target $(TARGET_ARCH) export LINKFLAGS += -target $(TARGET_ARCH) + +# Use the wildcard Makefile function to search for existing directories matching +# 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) +# We sort the list of found directories and take the last one, it will likely be +# the most recent GCC version. This avoids using old headers left over from +# previous tool chain installations. +GCC_CXX_INCLUDES ?= \ + $(addprefix \ + -isystem $(lastword $(sort \ + $(foreach pat, $(GCC_CXX_INCLUDE_PATTERNS), $(wildcard $(pat))))), \ + /. /$(TARGET_ARCH)/$(GCC_MULTI_DIR) /backward \ + ) + +# 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 (,$(GCC_CXX_INCLUDES)) + GCC_CXX_INCLUDES := $(addprefix -isystem ,$(wildcard $(dir $(shell which $(PREFIX)gcc))../$(TARGET_TRIPLE)/include)) +endif + +# Pass the includes to the C++ compilation rule in Makefile.base +export CXXINCLUDES += $(GCC_CXX_INCLUDES) + +# Some C headers (e.g. limits.h) are located with the GCC libraries +GCC_C_INCLUDE_PATTERNS ?= \ + /usr/lib/gcc/$(TARGET_TRIPLE)/*/ \ + # + +GCC_C_INCLUDES ?= \ + $(addprefix -isystem ,$(wildcard $(addprefix \ + $(lastword $(sort \ + $(foreach pat, $(GCC_C_INCLUDE_PATTERNS), $(wildcard $(pat))))), \ + include include-fixed) \ + )) + +# If nothing was found we will try to fall back to searching for the libgcc used +# by an installed cross-GCC and use its headers. +ifeq (,$(GCC_C_INCLUDES)) + GCC_C_INCLUDES := $(addprefix -isystem ,$(wildcard $(addprefix $(dir $(shell $(PREFIX)gcc -print-libgcc-file-name)), include include-fixed))) +endif + +export INCLUDES += $(GCC_C_INCLUDES) diff --git a/sys/cpp11-compat/include/riot/mutex.hpp b/sys/cpp11-compat/include/riot/mutex.hpp index a7ed42de88543ce07ff1eae1fc8db7968beab9e7..ca808cc9dbc299b51643dc6d31de97df1735f661 100644 --- a/sys/cpp11-compat/include/riot/mutex.hpp +++ b/sys/cpp11-compat/include/riot/mutex.hpp @@ -44,7 +44,7 @@ class mutex { public: using native_handle_type = mutex_t*; - inline constexpr mutex() noexcept : m_mtx{0} {} + inline constexpr mutex() noexcept : m_mtx{{0}} {} ~mutex(); void lock();