From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 792271584F2 for ; Mon, 17 Mar 2025 06:22:46 +0000 (UTC) Received: from lists.gentoo.org (bobolink.gentoo.org [140.211.166.189]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: relay-lists.gentoo.org@gentoo.org) by smtp.gentoo.org (Postfix) with ESMTPSA id 5C95934307B for ; Mon, 17 Mar 2025 06:22:46 +0000 (UTC) Received: from bobolink.gentoo.org (localhost [127.0.0.1]) by bobolink.gentoo.org (Postfix) with ESMTP id 505B011037F; Mon, 17 Mar 2025 06:22:45 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by bobolink.gentoo.org (Postfix) with ESMTPS id 3FD0011037F for ; Mon, 17 Mar 2025 06:22:45 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id DC15E343082 for ; Mon, 17 Mar 2025 06:22:44 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 34FFD22B0 for ; Mon, 17 Mar 2025 06:22:43 +0000 (UTC) From: "Michał Górny" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Michał Górny" Message-ID: <1742192496.4b9aa358421f60057eb35ba5ab5c73945d7fca8b.mgorny@gentoo> Subject: [gentoo-commits] repo/gentoo:master commit in: llvm-runtimes/libcxx/ X-VCS-Repository: repo/gentoo X-VCS-Files: llvm-runtimes/libcxx/libcxx-19.1.7-r1.ebuild llvm-runtimes/libcxx/libcxx-20.1.0.ebuild llvm-runtimes/libcxx/libcxx-21.0.0.9999.ebuild X-VCS-Directories: llvm-runtimes/libcxx/ X-VCS-Committer: mgorny X-VCS-Committer-Name: Michał Górny X-VCS-Revision: 4b9aa358421f60057eb35ba5ab5c73945d7fca8b X-VCS-Branch: master Date: Mon, 17 Mar 2025 06:22:43 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: ce9a0dcc-5376-44d9-8f77-f689958ffdd4 X-Archives-Hash: ec9b91554578bcba8bfaf6617f7dda97 commit: 4b9aa358421f60057eb35ba5ab5c73945d7fca8b Author: Michal Rostecki protonmail com> AuthorDate: Mon Dec 2 14:04:51 2024 +0000 Commit: Michał Górny gentoo org> CommitDate: Mon Mar 17 06:21:36 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=4b9aa358 sys-libs/libcxx: Support cross build Inherit the `crossdev` eclass and use a cross sysroot when a custom target is specified. That allows to bootstrap libcxx with crossdev. Extend the compiler test with the case when the (cross) toolchain has a runtime, but doesn't have stdlib yet (because it's about to be built). In such case, a build with default arguments fails, but a build with `-nostdlib` succeeds. libc++ doesn't need stdlib to build, so that's fine. Signed-off-by: Michal Rostecki protonmail.com> Signed-off-by: Michał Górny gentoo.org> ...ibcxx-20.1.0.ebuild => libcxx-19.1.7-r1.ebuild} | 59 ++++++++++++++-------- llvm-runtimes/libcxx/libcxx-20.1.0.ebuild | 50 +++++++++++++----- llvm-runtimes/libcxx/libcxx-21.0.0.9999.ebuild | 50 +++++++++++++----- 3 files changed, 112 insertions(+), 47 deletions(-) diff --git a/llvm-runtimes/libcxx/libcxx-20.1.0.ebuild b/llvm-runtimes/libcxx/libcxx-19.1.7-r1.ebuild similarity index 74% copy from llvm-runtimes/libcxx/libcxx-20.1.0.ebuild copy to llvm-runtimes/libcxx/libcxx-19.1.7-r1.ebuild index 75a626f221f8..08e54cd9b566 100644 --- a/llvm-runtimes/libcxx/libcxx-20.1.0.ebuild +++ b/llvm-runtimes/libcxx/libcxx-19.1.7-r1.ebuild @@ -4,8 +4,8 @@ EAPI=8 PYTHON_COMPAT=( python3_{10..13} ) -inherit cmake-multilib flag-o-matic llvm.org llvm-utils python-any-r1 -inherit toolchain-funcs +inherit cmake-multilib crossdev flag-o-matic llvm.org llvm-utils +inherit python-any-r1 toolchain-funcs DESCRIPTION="New implementation of the C++ standard library, targeting C++11" HOMEPAGE="https://libcxx.llvm.org/" @@ -40,9 +40,7 @@ BDEPEND=" ) " -LLVM_COMPONENTS=( - runtimes libcxx{,abi} libc llvm/{cmake,utils/llvm-lit} cmake -) +LLVM_COMPONENTS=( runtimes libcxx{,abi} llvm/{cmake,utils/llvm-lit} cmake ) llvm.org_set_globals python_check_deps() { @@ -69,12 +67,15 @@ test_compiler() { src_configure() { llvm_prepend_path "${LLVM_MAJOR}" + local install_prefix=${EPREFIX} + target_is_not_host && install_prefix+=/usr/${CTARGET} + # note: we need to do this before multilib kicks in since it will # alter the CHOST local cxxabi cxxabi_incs if use libcxxabi; then cxxabi=system-libcxxabi - cxxabi_incs="${EPREFIX}/usr/include/c++/v1" + cxxabi_incs="${install_prefix}/usr/include/c++/v1" else local gcc_inc="${EPREFIX}/usr/lib/gcc/${CHOST}/$(gcc-fullversion)/include/g++-v$(gcc-major-version)" cxxabi=libsupc++ @@ -86,8 +87,8 @@ src_configure() { multilib_src_configure() { if use clang; then - local -x CC=${CHOST}-clang - local -x CXX=${CHOST}-clang++ + local -x CC=${CTARGET}-clang + local -x CXX=${CTARGET}-clang++ strip-unsupported-flags fi @@ -95,18 +96,29 @@ multilib_src_configure() { local use_compiler_rt=OFF [[ $(tc-get-c-rtlib) == compiler-rt ]] && use_compiler_rt=ON - # bootstrap: cmake is unhappy if compiler can't link to stdlib - local nolib_flags=( -nodefaultlibs -lc ) - if ! test_compiler; then - if test_compiler "${nolib_flags[@]}"; then - local -x LDFLAGS="${LDFLAGS} ${nolib_flags[*]}" - ewarn "${CXX} seems to lack runtime, trying with ${nolib_flags[*]}" + # Scenarios to consider: + # + # 1. Compiler test works with the default flags. + # 2. There is a runtime library, but no stdlib. In that case, leave the + # LDFLAGS untouched, since there is no self-dependency in libc++. + # 3. There is no runtime library nor stdlib. In that case, overwrite the + # LDFLAGS. + local nostdlib_flags=( -nostdlib --rtlib=compiler-rt -lc ) + local nort_flags=( -nodefaultlibs -lc ) + if ! test_compiler && ! test_compiler "${nostdlib_flags[@]}"; then + if test_compiler "${nort_flags[@]}"; then + local -x LDFLAGS="${LDFLAGS} ${nort_flags[*]}" + ewarn "${CXX} seems to lack runtime, trying with ${nort_flags[*]}" fi fi + local install_prefix=${EPREFIX} + target_is_not_host && install_prefix+=/usr/${CTARGET} + local libdir=$(get_libdir) local mycmakeargs=( - -DCMAKE_CXX_COMPILER_TARGET="${CHOST}" + -DCMAKE_CXX_COMPILER_TARGET="${CTARGET}" + -DCMAKE_INSTALL_PREFIX="${install_prefix}/usr" -DPython3_EXECUTABLE="${PYTHON}" -DLLVM_ENABLE_RUNTIMES=libcxx -DLLVM_INCLUDE_TESTS=OFF @@ -126,7 +138,16 @@ multilib_src_configure() { # this is broken with standalone builds, and also meaningless -DLIBCXXABI_USE_LLVM_UNWINDER=OFF ) - + if is_crosspkg; then + # Needed to target built libc headers + local -x CFLAGS="${CFLAGS} -isystem ${ESYSROOT}/usr/${CTARGET}/usr/include" + mycmakeargs+=( + # Without this, the compiler will compile a test program + # and fail due to no builtins. + -DCMAKE_C_COMPILER_WORKS=1 + -DCMAKE_CXX_COMPILER_WORKS=1 + ) + fi if use test; then mycmakeargs+=( -DLLVM_EXTERNAL_LIT="${EPREFIX}/usr/bin/lit" @@ -147,11 +168,6 @@ multilib_src_compile() { multilib_src_test() { local -x LIT_PRESERVES_TMP=1 - cmake_build install-cxx-test-suite-prefix - cp "${BUILD_DIR}"/{lib,libcxx/test-suite-install/$(get_libdir)}/libc++_shared.so || die - if use static-libs; then - cp "${BUILD_DIR}"/{lib,libcxx/test-suite-install/$(get_libdir)}/libc++_static.a || die - fi cmake_build check-cxx } @@ -160,6 +176,7 @@ multilib_src_install() { # since we've replaced libc++.{a,so} with ldscripts, now we have to # install the extra symlinks if [[ ${CHOST} != *-darwin* ]] ; then + target_is_not_host && into /usr/${CTARGET} dolib.so lib/libc++_shared.so use static-libs && dolib.a lib/libc++_static.a fi diff --git a/llvm-runtimes/libcxx/libcxx-20.1.0.ebuild b/llvm-runtimes/libcxx/libcxx-20.1.0.ebuild index 75a626f221f8..3b7c0a5e8bfb 100644 --- a/llvm-runtimes/libcxx/libcxx-20.1.0.ebuild +++ b/llvm-runtimes/libcxx/libcxx-20.1.0.ebuild @@ -4,8 +4,8 @@ EAPI=8 PYTHON_COMPAT=( python3_{10..13} ) -inherit cmake-multilib flag-o-matic llvm.org llvm-utils python-any-r1 -inherit toolchain-funcs +inherit cmake-multilib crossdev flag-o-matic llvm.org llvm-utils +inherit python-any-r1 toolchain-funcs DESCRIPTION="New implementation of the C++ standard library, targeting C++11" HOMEPAGE="https://libcxx.llvm.org/" @@ -69,12 +69,15 @@ test_compiler() { src_configure() { llvm_prepend_path "${LLVM_MAJOR}" + local install_prefix=${EPREFIX} + target_is_not_host && install_prefix+=/usr/${CTARGET} + # note: we need to do this before multilib kicks in since it will # alter the CHOST local cxxabi cxxabi_incs if use libcxxabi; then cxxabi=system-libcxxabi - cxxabi_incs="${EPREFIX}/usr/include/c++/v1" + cxxabi_incs="${install_prefix}/usr/include/c++/v1" else local gcc_inc="${EPREFIX}/usr/lib/gcc/${CHOST}/$(gcc-fullversion)/include/g++-v$(gcc-major-version)" cxxabi=libsupc++ @@ -86,8 +89,8 @@ src_configure() { multilib_src_configure() { if use clang; then - local -x CC=${CHOST}-clang - local -x CXX=${CHOST}-clang++ + local -x CC=${CTARGET}-clang + local -x CXX=${CTARGET}-clang++ strip-unsupported-flags fi @@ -95,18 +98,29 @@ multilib_src_configure() { local use_compiler_rt=OFF [[ $(tc-get-c-rtlib) == compiler-rt ]] && use_compiler_rt=ON - # bootstrap: cmake is unhappy if compiler can't link to stdlib - local nolib_flags=( -nodefaultlibs -lc ) - if ! test_compiler; then - if test_compiler "${nolib_flags[@]}"; then - local -x LDFLAGS="${LDFLAGS} ${nolib_flags[*]}" - ewarn "${CXX} seems to lack runtime, trying with ${nolib_flags[*]}" + # Scenarios to consider: + # + # 1. Compiler test works with the default flags. + # 2. There is a runtime library, but no stdlib. In that case, leave the + # LDFLAGS untouched, since there is no self-dependency in libc++. + # 3. There is no runtime library nor stdlib. In that case, overwrite the + # LDFLAGS. + local nostdlib_flags=( -nostdlib --rtlib=compiler-rt -lc ) + local nort_flags=( -nodefaultlibs -lc ) + if ! test_compiler && ! test_compiler "${nostdlib_flags[@]}"; then + if test_compiler "${nort_flags[@]}"; then + local -x LDFLAGS="${LDFLAGS} ${nort_flags[*]}" + ewarn "${CXX} seems to lack runtime, trying with ${nort_flags[*]}" fi fi + local install_prefix=${EPREFIX} + target_is_not_host && install_prefix+=/usr/${CTARGET} + local libdir=$(get_libdir) local mycmakeargs=( - -DCMAKE_CXX_COMPILER_TARGET="${CHOST}" + -DCMAKE_CXX_COMPILER_TARGET="${CTARGET}" + -DCMAKE_INSTALL_PREFIX="${install_prefix}/usr" -DPython3_EXECUTABLE="${PYTHON}" -DLLVM_ENABLE_RUNTIMES=libcxx -DLLVM_INCLUDE_TESTS=OFF @@ -126,7 +140,16 @@ multilib_src_configure() { # this is broken with standalone builds, and also meaningless -DLIBCXXABI_USE_LLVM_UNWINDER=OFF ) - + if is_crosspkg; then + # Needed to target built libc headers + local -x CFLAGS="${CFLAGS} -isystem ${ESYSROOT}/usr/${CTARGET}/usr/include" + mycmakeargs+=( + # Without this, the compiler will compile a test program + # and fail due to no builtins. + -DCMAKE_C_COMPILER_WORKS=1 + -DCMAKE_CXX_COMPILER_WORKS=1 + ) + fi if use test; then mycmakeargs+=( -DLLVM_EXTERNAL_LIT="${EPREFIX}/usr/bin/lit" @@ -160,6 +183,7 @@ multilib_src_install() { # since we've replaced libc++.{a,so} with ldscripts, now we have to # install the extra symlinks if [[ ${CHOST} != *-darwin* ]] ; then + target_is_not_host && into /usr/${CTARGET} dolib.so lib/libc++_shared.so use static-libs && dolib.a lib/libc++_static.a fi diff --git a/llvm-runtimes/libcxx/libcxx-21.0.0.9999.ebuild b/llvm-runtimes/libcxx/libcxx-21.0.0.9999.ebuild index f6f57e2287bd..d3a183fb38cc 100644 --- a/llvm-runtimes/libcxx/libcxx-21.0.0.9999.ebuild +++ b/llvm-runtimes/libcxx/libcxx-21.0.0.9999.ebuild @@ -4,8 +4,8 @@ EAPI=8 PYTHON_COMPAT=( python3_{10..13} ) -inherit cmake-multilib flag-o-matic llvm.org llvm-utils python-any-r1 -inherit toolchain-funcs +inherit cmake-multilib crossdev flag-o-matic llvm.org llvm-utils +inherit python-any-r1 toolchain-funcs DESCRIPTION="New implementation of the C++ standard library, targeting C++11" HOMEPAGE="https://libcxx.llvm.org/" @@ -68,12 +68,15 @@ test_compiler() { src_configure() { llvm_prepend_path "${LLVM_MAJOR}" + local install_prefix=${EPREFIX} + target_is_not_host && install_prefix+=/usr/${CTARGET} + # note: we need to do this before multilib kicks in since it will # alter the CHOST local cxxabi cxxabi_incs if use libcxxabi; then cxxabi=system-libcxxabi - cxxabi_incs="${EPREFIX}/usr/include/c++/v1" + cxxabi_incs="${install_prefix}/usr/include/c++/v1" else local gcc_inc="${EPREFIX}/usr/lib/gcc/${CHOST}/$(gcc-fullversion)/include/g++-v$(gcc-major-version)" cxxabi=libsupc++ @@ -85,8 +88,8 @@ src_configure() { multilib_src_configure() { if use clang; then - local -x CC=${CHOST}-clang - local -x CXX=${CHOST}-clang++ + local -x CC=${CTARGET}-clang + local -x CXX=${CTARGET}-clang++ strip-unsupported-flags fi @@ -94,18 +97,29 @@ multilib_src_configure() { local use_compiler_rt=OFF [[ $(tc-get-c-rtlib) == compiler-rt ]] && use_compiler_rt=ON - # bootstrap: cmake is unhappy if compiler can't link to stdlib - local nolib_flags=( -nodefaultlibs -lc ) - if ! test_compiler; then - if test_compiler "${nolib_flags[@]}"; then - local -x LDFLAGS="${LDFLAGS} ${nolib_flags[*]}" - ewarn "${CXX} seems to lack runtime, trying with ${nolib_flags[*]}" + # Scenarios to consider: + # + # 1. Compiler test works with the default flags. + # 2. There is a runtime library, but no stdlib. In that case, leave the + # LDFLAGS untouched, since there is no self-dependency in libc++. + # 3. There is no runtime library nor stdlib. In that case, overwrite the + # LDFLAGS. + local nostdlib_flags=( -nostdlib --rtlib=compiler-rt -lc ) + local nort_flags=( -nodefaultlibs -lc ) + if ! test_compiler && ! test_compiler "${nostdlib_flags[@]}"; then + if test_compiler "${nort_flags[@]}"; then + local -x LDFLAGS="${LDFLAGS} ${nort_flags[*]}" + ewarn "${CXX} seems to lack runtime, trying with ${nort_flags[*]}" fi fi + local install_prefix=${EPREFIX} + target_is_not_host && install_prefix+=/usr/${CTARGET} + local libdir=$(get_libdir) local mycmakeargs=( - -DCMAKE_CXX_COMPILER_TARGET="${CHOST}" + -DCMAKE_CXX_COMPILER_TARGET="${CTARGET}" + -DCMAKE_INSTALL_PREFIX="${install_prefix}/usr" -DPython3_EXECUTABLE="${PYTHON}" -DLLVM_ENABLE_RUNTIMES=libcxx -DLLVM_INCLUDE_TESTS=OFF @@ -125,7 +139,16 @@ multilib_src_configure() { # this is broken with standalone builds, and also meaningless -DLIBCXXABI_USE_LLVM_UNWINDER=OFF ) - + if is_crosspkg; then + # Needed to target built libc headers + local -x CFLAGS="${CFLAGS} -isystem ${ESYSROOT}/usr/${CTARGET}/usr/include" + mycmakeargs+=( + # Without this, the compiler will compile a test program + # and fail due to no builtins. + -DCMAKE_C_COMPILER_WORKS=1 + -DCMAKE_CXX_COMPILER_WORKS=1 + ) + fi if use test; then mycmakeargs+=( -DLLVM_EXTERNAL_LIT="${EPREFIX}/usr/bin/lit" @@ -159,6 +182,7 @@ multilib_src_install() { # since we've replaced libc++.{a,so} with ldscripts, now we have to # install the extra symlinks if [[ ${CHOST} != *-darwin* ]] ; then + target_is_not_host && into /usr/${CTARGET} dolib.so lib/libc++_shared.so use static-libs && dolib.a lib/libc++_static.a fi