[Buildroot] [PATCH 1/1] libcxx: new package

Norbert Lange nolange79 at gmail.com
Wed Jun 13 14:14:54 UTC 2018


provides llvm's libc++ as package,
probably needs some more work to
better fit into buildroots toolchain construction.

It should be build after the host-g++ and C-Library,
but before any other packages and it does install a
small script host/bin/<xa-y-z>-g++-libc++
to allow easy use.

For lowlevel language support ABI, it can be built with
libstdc++ support library or its own libc++-abi.

the parent LLVM software needs to be available,
apparently for a few tools. Its downloaded currently,
as depending on host-llvm means this package has to be
built - which takes forever.

In the future, a option could potentially compile
all C++ Packages with this library.

-   depend on threading library if available?
    (supposedly builds without)
-   proper integration in toolchain step
-   use libc++ for remaining packages

Signed-off-by: Norbert Lange <nolange79 at gmail.com>
---
 package/Config.in                             |   1 +
 package/libcxx/Config.in                      |  29 +++++
 package/libcxx/g++-libc++.in                  |  16 +++
 package/libcxx/libcxx.hash                    |   7 ++
 package/libcxx/libcxx.mk                      | 108 ++++++++++++++++++
 ...i_fix_find_fpath_when_crosscompiling.patch |  27 +++++
 6 files changed, 188 insertions(+)
 create mode 100644 package/libcxx/Config.in
 create mode 100644 package/libcxx/g++-libc++.in
 create mode 100644 package/libcxx/libcxx.hash
 create mode 100644 package/libcxx/libcxx.mk
 create mode 100644 package/libcxx/libcxxabi_fix_find_fpath_when_crosscompiling.patch

diff --git a/package/Config.in b/package/Config.in
index fcabed4fde..cda825612a 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -1565,6 +1565,7 @@ menu "Other"
 	source "package/lightning/Config.in"
 	source "package/linux-pam/Config.in"
 	source "package/llvm/Config.in"
+	source "package/libcxx/Config.in"
 if BR2_PACKAGE_LINUX_PAM
 comment "linux-pam plugins"
 	source "package/libpam-radius-auth/Config.in"
diff --git a/package/libcxx/Config.in b/package/libcxx/Config.in
new file mode 100644
index 0000000000..f5ff911b6d
--- /dev/null
+++ b/package/libcxx/Config.in
@@ -0,0 +1,29 @@
+config BR2_PACKAGE_LIBCXX
+	bool "libc++"
+	depends on BR2_INSTALL_LIBSTDCPP
+	help
+	  libc++ is a new implementation of the C++ standard library,
+	  targeting C++11 (and newer). Part of the LLVM Project.
+
+	  The LLVM Project is a collection of modular and reusable
+	  compiler and toolchain technologies.
+
+if BR2_PACKAGE_LIBCXX
+choice
+	prompt "libc++ abi support"
+	default BR2_PACKAGE_LIBCXX_ABI_SUPCXX
+	help
+	  Select the c++ abi support: libsupc++ (from gcc toolchain)
+	  or libc++-abi (from llvm).
+
+config BR2_PACKAGE_LIBCXX_ABI_SUPCXX
+	bool "libsupc++"
+
+config BR2_PACKAGE_LIBCXX_ABI_CXXABI
+	bool "libc++-abi"
+
+endchoice
+endif
+
+comment "libc++ needs a toolchain w/ C++"
+	depends on !BR2_INSTALL_LIBSTDCPP
diff --git a/package/libcxx/g++-libc++.in b/package/libcxx/g++-libc++.in
new file mode 100644
index 0000000000..db6d050a7c
--- /dev/null
+++ b/package/libcxx/g++-libc++.in
@@ -0,0 +1,16 @@
+#!/bin/sh
+SCRIPTPATH=$(readlink -f "$(dirname "$0")")
+cxx_libs="-lc++ @link_abi@"
+c_libs="-lc @link_comrt@"
+pthread_libs="-lpthread $c_libs"
+
+libs="$cxx_libs $c_libs"
+
+for i; do
+    if test x"$i" = x"-pthread"; then
+        libs="$libs $pthread_libs"
+        break
+    fi
+done
+
+exec "$SCRIPTPATH"/@TARGET_CROSS at g++ -nodefaultlibs -nostdinc++ $libs -isystem"$SCRIPTPATH"/../../staging/usr/include/c++/v1 "$@"
diff --git a/package/libcxx/libcxx.hash b/package/libcxx/libcxx.hash
new file mode 100644
index 0000000000..7d384365b6
--- /dev/null
+++ b/package/libcxx/libcxx.hash
@@ -0,0 +1,7 @@
+# locally calculated
+sha256  1ff53c915b4e761ef400b803f07261ade637b0c269d99569f18040f3dcee4408  llvm-6.0.0.src.tar.xz
+sha256  70931a87bde9d358af6cb7869e7535ec6b015f7e6df64def6d2ecdd954040dd9  libcxx-6.0.0.src.tar.xz
+sha256  91c6d9c5426306ce28d0627d6a4448e7d164d6a3f64b01cb1d196003b16d641b  libcxxabi-6.0.0.src.tar.xz
+
+
+sha256  c1938c0e9e90639d1e8f5a7f6bebaab83a3642e0ee44295a4c69934686d0bda8  LICENSE.TXT
diff --git a/package/libcxx/libcxx.mk b/package/libcxx/libcxx.mk
new file mode 100644
index 0000000000..9d9efc90b0
--- /dev/null
+++ b/package/libcxx/libcxx.mk
@@ -0,0 +1,108 @@
+################################################################################
+#
+# libc++
+#
+################################################################################
+
+LIBCXX_VERSION = 6.0.0
+LIBCXX_SITE = http://llvm.org/releases/$(LIBCXX_VERSION)
+LIBCXX_SOURCE = llvm-$(LIBCXX_VERSION).src.tar.xz
+LIBCXX_LICENSE = MIT
+#LIBCXX_LICENSE_FILES = COPYRIGHT
+LIBCXX_SUPPORTS_IN_SOURCE_BUILD = NO
+LIBCXX_INSTALL_STAGING = YES
+
+LIBCXX_EXTRA_DOWNLOADS = $(patsubst %,$(LIBCXX_SITE)/%-$(LIBCXX_VERSION).src.tar.xz,libcxx libcxxabi)
+
+define LIBCXX_EXTRA_EXTRACT
+	$(foreach arch,$(LIBCXX_EXTRA_DOWNLOADS), \
+		TDIR=projects/$(patsubst $(LIBCXX_SITE)/%-$(LIBCXX_VERSION).src.tar.xz,%,$(arch)); \
+		mkdir -p $(@D)/$$TDIR && \
+		$(call suitable-extractor,$(notdir $(arch))) $(LIBCXX_DL_DIR)/$(notdir $(arch)) | \
+		$(TAR) --strip-components=1 -C $(@D)/$$TDIR $(TAR_OPTIONS) -
+	)
+endef
+
+LIBCXX_POST_EXTRACT_HOOKS += LIBCXX_EXTRA_EXTRACT
+
+# Before libcxx is configured, we must have the first stage
+# cross-compiler and the clibrary
+LIBCXX_DEPENDENCIES = host-gcc-initial
+
+ifeq ($(BR2_PACKAGE_LIBCXX_ABI_CXXABI),y)
+_LIBCXX_ABI_TARGET = cxxabi
+endif
+
+_LIBCXX_ABI-$(BR2_PACKAGE_LIBCXX_ABI_CXXABI) = libcxxabi
+_LIBCXX_ABI-$(BR2_PACKAGE_LIBCXX_ABI_SUPCXX) = libsupc++
+
+_LIBCXX_ABI_LINK-$(BR2_PACKAGE_LIBCXX_ABI_CXXABI) = c++abi
+_LIBCXX_ABI_LINK-$(BR2_PACKAGE_LIBCXX_ABI_SUPCXX) = supc++
+
+LIBCXX_MAKE_OPTS = $(_LIBCXX_ABI_TARGET) cxx
+
+LIBCXX_INSTALL_STAGING_OPTS = DESTDIR=$(STAGING_DIR) $(addprefix install-,$(_LIBCXX_ABI_TARGET) cxx)
+
+LIBCXX_INSTALL_TARGET_OPTS = DESTDIR=$(TARGET_DIR) $(addprefix install-,$(_LIBCXX_ABI_TARGET) cxx)
+
+
+#LIBCXXABI_SYSROOT LIBCXX_SYSROOT
+# TODO: potentially depend on threading library?
+# allow using gccs libsupc++
+# consider whether its better to statically link libc++-abi
+# USe this library to build the remaining C++ packages?
+
+# llvm does not recommend using this
+LIBCXX_CONF_OPTS += -DBUILD_SHARED_LIBS:BOOL=OFF
+
+LIBCXX_CONF_OPTS += -DLIBCXXABI_INCLUDE_TESTS=OFF -DLIBCXXABI_ENABLE_ASSERTIONS=OFF -DLIBCXXABI_ENABLE_NEW_DELETE_DEFINITIONS=OFF -DLIBCXX_ENABLE_NEW_DELETE_DEFINITIONS=ON
+
+ifeq ($(BR2_TOOLCHAIN_USES_MUSL),y)
+LIBCXX_CONF_OPTS += -DLIBCXX_HAS_MUSL_LIBC:BOOL=ON
+endif
+
+ifeq ($(BR2_SHARED_LIBS)$(BR2_SHARED_STATIC_LIBS),y)
+LIBCXX_CONF_OPTS += -DLIBCXXABI_ENABLE_SHARED:BOOL=ON -DLIBCXX_ENABLE_SHARED:BOOL=ON
+else
+LIBCXX_CONF_OPTS += -DLIBCXXABI_ENABLE_SHARED:BOOL=OFF -DLIBCXX_ENABLE_SHARED:BOOL=OFF
+endif
+
+ifeq ($(BR2_STATIC_LIBS)$(BR2_SHARED_STATIC_LIBS),y)
+LIBCXX_CONF_OPTS += -DLIBCXXABI_ENABLE_STATIC:BOOL=ON -DLIBCXX_ENABLE_STATIC:BOOL=ON
+else
+LIBCXX_CONF_OPTS += -DLIBCXXABI_ENABLE_STATIC:BOOL=OFF -DLIBCXX_ENABLE_STATIC:BOOL=OFF
+endif
+
+LIBCXX_CONF_OPTS += -DLIBCXX_ENABLE_ABI_LINKER_SCRIPT=ON
+
+#LIBCXX_CONF_OPTS += -DLLVM_PATH:PATH=$(@D)/llvm
+
+#LIBCXX_CONF_OPTS += -DLIBCXX_CXX_ABI:STRING=default
+
+# libc++ needs to be massaged to pick header and libs
+LIBCXX_CONF_OPTS += -DLIBCXX_CXX_ABI:STRING=$(_LIBCXX_ABI-y)
+
+ifneq ($(_LIBCXX_ABI_TARGET),)
+LIBCXX_CONF_OPTS += -DLIBCXX_CXX_ABI_INCLUDE_PATHS:PATH=$(@D)/projects/libcxxabi/include \
+					-DLIBCXX_CXX_ABI_LIBRARY_PATH:PATH=../../../lib
+endif
+
+
+#LIBCXX_CONF_OPTS += -DLIBCXX_INCLUDE_BENCHMARKS:BOOL=OFF
+#LIBCXX_CONF_OPTS += -DLIBCXX_INCLUDE_DOCS:BOOL=OFF
+#LIBCXX_CONF_OPTS += -DLIBCXX_INCLUDE_TESTS:BOOL=OFF
+
+cxx_libs="-lc++ @link_abi@"
+c_libs="-lc @link_comrt@"
+
+# Create a g++ wrapper to add the necessary aguments for building with libc++
+define LIBCXX_CREATE_GXXWRAPPER_TARGET
+	sed -e 's, at TARGET_CROSS@,$(notdir $(TARGET_CROSS)),g' \
+	  -e 's, at link_abi@,$(addprefix -l,$(_LIBCXX_ABI_LINK-y)),g' \
+	  -e 's, at link_comrt@,-lgcc_s,g' \
+	  $(LIBCXX_PKGDIR)g++-libc++.in > $(LIBCXX_BUILDDIR)gxxwrap.tmp
+	install -D -m755 $(LIBCXX_BUILDDIR)gxxwrap.tmp $(TARGET_CROSS)g++-libc++
+endef
+LIBCXX_POST_INSTALL_TARGET_HOOKS = LIBCXX_CREATE_GXXWRAPPER_TARGET
+
+$(eval $(cmake-package))
diff --git a/package/libcxx/libcxxabi_fix_find_fpath_when_crosscompiling.patch b/package/libcxx/libcxxabi_fix_find_fpath_when_crosscompiling.patch
new file mode 100644
index 0000000000..2fd95178f7
--- /dev/null
+++ b/package/libcxx/libcxxabi_fix_find_fpath_when_crosscompiling.patch
@@ -0,0 +1,27 @@
+diff -burN libcxx-6.0.0.org/projects/libcxxabi/CMakeLists.txt libcxx-6.0.0/projects/libcxxabi/CMakeLists.txt
+--- libcxx-6.0.0.org/projects/libcxxabi/CMakeLists.txt	2018-06-12 14:26:05.184675501 +0200
++++ libcxx-6.0.0/projects/libcxxabi/CMakeLists.txt	2018-06-12 14:27:05.553370290 +0200
+@@ -115,6 +115,7 @@
+         ${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES}
+         ${LIBCXXABI_LIBCXX_INCLUDE_DIRS}
+         ${LLVM_INCLUDE_DIR}/c++/v1
++  NO_CMAKE_FIND_ROOT_PATH
+   )
+
+ set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE PATH
+@@ -127,6 +128,7 @@
+         ${LIBCXXABI_LIBCXX_INCLUDES}/../
+         ${LIBCXXABI_LIBCXX_SRC_DIRS}
+   NO_DEFAULT_PATH
++  NO_CMAKE_FIND_ROOT_PATH
+   )
+
+ if (LIBCXXABI_LIBCXX_PATH STREQUAL "LIBCXXABI_LIBCXX_PATH-NOTFOUND")
+@@ -425,6 +427,7 @@
+           ${LLVM_MAIN_SRC_DIR}/projects/libunwind/include
+           ${LLVM_MAIN_SRC_DIR}/runtimes/libunwind/include
+     NO_DEFAULT_PATH
++    NO_CMAKE_FIND_ROOT_PATH
+   )
+
+   if (LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL STREQUAL "LIBCXXABI_LIBUNWIND_INCLUDES_INTERNAL-NOTFOUND")
--
2.17.1



More information about the buildroot mailing list