[Buildroot] [PATCH 1/1] libcxx: new package
Romain Naour
romain.naour at gmail.com
Sun Oct 21 11:20:25 UTC 2018
Hi Norbert,
Le 13/06/2018 à 16:14, Norbert Lange a écrit :
> 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.
You should take into account the external toolchain case.
>
> 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.
By now, llvm package is merged and updated to llvm 7.0.
Can you try building libcxx as a standalone package (LIBCXX_STANDALONE_BUILD=ON)
using the llvm package provided by Buildroot ?
Also libcxx and libcxxabi should be packaged separately.
>
> 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
Also you can take a look at the report from the FOSDEM meeting and the final
report from Valentin:
https://elinux.org/Buildroot:DeveloperDaysFOSDEM2018#LLVM.2FClang
http://www.linuxembedded.fr/2018/07/llvmclang-integration-into-buildroot
>
> 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
C++ dependency is not enough for C++11 dependency, you should add a dependency
on gcc >= 4.8 (at least).
Also add a dependency on llvm supported architectures.
> + 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
What's the purpose of this script ?
> 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
Can you try with 7.0.0 version ?
> +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)
Can you try to package libcxx and libcxxabi separately ?
> +
> +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
Please, provide a patch generated with git format-patch with a commit log,
upstream status and you SoB line.
I'll mark you patch "Change Requested" in the patchwork, please send an updated
version.
Best regards,
Romain
> @@ -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
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
>
More information about the buildroot
mailing list