commit:     6fcf738f7222d3f288a7670a8f6f257dfe8cb11b
Author:     Michal Rostecki <vadorovsky <AT> protonmail <DOT> com>
AuthorDate: Sat Sep 13 18:41:08 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Oct  8 02:20:23 2025 +0000
URL:        https://gitweb.gentoo.org/proj/crossdev.git/commit/?id=6fcf738f

crossdev: Bootstrap the full LLVM toolchain

Include llvm-libunwind and libcxx in the LLVM-based cross environments,
so they are fully ready to build any package.

Bug: https://bugs.gentoo.org/915048
Closes: https://bugs.gentoo.org/941140
Closes: https://bugs.gentoo.org/942214
Signed-off-by: Michal Rostecki <vadorovsky <AT> protonmail.com>
Part-of: https://github.com/gentoo/crossdev/pull/24
Signed-off-by: Sam James <sam <AT> gentoo.org>

 crossdev | 184 +++++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 109 insertions(+), 75 deletions(-)

diff --git a/crossdev b/crossdev
index fb03720..c3e0ead 100755
--- a/crossdev
+++ b/crossdev
@@ -906,6 +906,9 @@ KCAT="sys-kernel" ; KPKG="linux-headers" ; KVER="" KUSE="" 
KENV="" KOVL="" KMASK
 LCAT="sys-libs"   ; LPKG="[none]"        ; LVER="" LUSE="" LENV="" LOVL="" 
LMASK="" LFORCE=""
 DCAT="dev-debug"  ; DPKG="gdb"           ; DVER="" DUSE="" DENV="" DOVL="" 
DMASK="" DFORCE=""
 RCAT="llvm-runtimes" ; RPKG="compiler-rt"   ; RVER="" RUSE="" RENV="" ROVL="" 
RMASK="" RFORCE=""
+UCAT="llvm-runtimes" ; UPKG="libunwind"     ; UVER="" UUSE="" UENV="" UOVL="" 
UMASK="" UFORCE=""
+ACAT="llvm-runtimes" ; APKG="libcxxabi"     ; AVER="" AUSE="" AENV="" AOVL="" 
AMASK="" AFORCE=""
+PCAT="llvm-runtimes" ; PPKG="libcxx"        ; PVER="" PUSE="" PENV="" POVL="" 
PMASK="" PFORCE=""
 CCAT="sys-devel"  ; CPKG="clang-crossdev-wrappers" ; CVER="" CUSE="" CENV="" 
COVL="" CMASK="" CFORCE=""
 XPKGS=() XVERS=() XUSES=() XENVS=() XOVLS=() XMASKS=() XFORCES=()
 DEFAULT_VER="[latest]"
@@ -948,69 +951,84 @@ LLVM="no"
 
 while [[ $# -gt 0 ]] ; do
        case $1 in
-       -V|--version)      echo "crossdev-${CROSSDEV_VER}"; exit 0;;
-       -t|--target)       shift; parse_target $1;;
-       --b|--binutils)    shift; BVER=$1;;
-       --benv)            shift; BENV=$1;;
-       -ob|--ov-binutils) shift; BOVL=$1;;
-       --bcat)            shift; BCAT=$1;;
-       --bpkg)            shift; BPKG=$1;;
-       --d|--gdb)         shift; DVER=$1;;
-       --denv)            shift; DENV=$1;;
-       -od|--ov-gdb)      shift; DOVL=$1;;
-       --dcat)            shift; DCAT=$1;;
-       --dpkg)            shift; DPKG=$1;;
-       --g|--gcc)         shift; GVER=$1;;
-       --genv)            shift; GENV=$1;;
-       -og|--ov-gcc)      shift; GOVL=$1;;
-       --gcat)            shift; GCAT=$1;;
-       --gpkg)            shift; GPKG=$1;;
-       --k|--kernel)      shift; KVER=$1;;
-       --kenv)            shift; KENV=$1;;
-       -ok|--ov-kernel)   shift; KOVL=$1;;
-       --kcat)            shift; KCAT=$1;;
-       --kpkg)            shift; KPKG=$1;;
-       --l|--libc)        shift; LVER=$1;;
-       --lenv)            shift; LENV=$1;;
-       -ol|--ov-libc)     shift; LOVL=$1;;
-       --lcat)            shift; LCAT=$1;;
-       --lpkg)            shift; LPKG=$1;;
-       --r|--crt)         shift; RVER=$1;;
-       --renv)            shift; RENV=$1;;
-       -or|--ov-crt)      shift; ROVL=$1;;
-       --rcat)            shift; RCAT=$1;;
-       --rpkg)            shift; RPKG=$1;;
-       --c|--ccw)         shift; CVER=$1;;
-       --cenv)            shift; CENV=$1;;
-       -oc|--ov-ccw)      shift; COVL=$1;;
-       --ccat)            shift; CCAT=$1;;
-       --cpkg)            shift; CPKG=$1;;
-       -ox|--ov-extra)    shift; XOVLS+=( "$1" );;
-       --env)             shift; AENV=$1;;
-       -L|--llvm)         LLVM="yes";;
-       -A|--abis)         shift; MULTILIB_ABIS=$1;;
-       --host-abi)        shift; HOST_ABI=$1;;
-       -S|--stable)       DEFAULT_VER="[stable]";;
-       -C|--clean)        shift; parse_target $1; ACTION="uninstall";;
-       -s?|--stage?)      STAGE=${1:0-1};;
-       -oS|--overlays)    shift; SEARCH_OVERLAYS=$1;;
-       -oO|--ov-output)   shift; CROSSDEV_OVERLAY=$1;;
-       --ex-only)         EX_FAST="yes";;
-       --ex-gcc)          EX_GCC="yes";;
-       --ex-gdb)          EX_GDB="yes";;
-       --ex-pkg)          shift; XPKGS+=( "$1" );;
-       --with-*)          eval $(set_withval $1);;
-       --without-*)       eval $(set_withval $1);;
-       -f|--force)        FORCE="yes";;
-       -x)                SET_X="yes";;
-       --show-target-cfg) SHOW_TARGET_CFG="yes";;
-       --init-target)     INIT_TARGET_ONLY="yes";;
-       --show-fail-log)   SHOW_FAIL_LOG="yes";;
-       --show-repo-cfg)   show_repo_cfg "$2";;
-       -P|--portage)      UOPTS="${UOPTS} $2"; shift;;
-       -h|--help)         usage;;
-       -*)                eerror "UNKNOWN OPTION: '$1'" ; usage 1;;
-       *)                 parse_target $1;;
+       -V|--version)        echo "crossdev-${CROSSDEV_VER}"; exit 0;;
+       -t|--target)         shift; parse_target $1;;
+       --b|--binutils)      shift; BVER=$1;;
+       --benv)              shift; BENV=$1;;
+       -ob|--ov-binutils)   shift; BOVL=$1;;
+       --bcat)              shift; BCAT=$1;;
+       --bpkg)              shift; BPKG=$1;;
+       --d|--gdb)           shift; DVER=$1;;
+       --denv)              shift; DENV=$1;;
+       -od|--ov-gdb)        shift; DOVL=$1;;
+       --dcat)              shift; DCAT=$1;;
+       --dpkg)              shift; DPKG=$1;;
+       --g|--gcc)           shift; GVER=$1;;
+       --genv)              shift; GENV=$1;;
+       -og|--ov-gcc)        shift; GOVL=$1;;
+       --gcat)              shift; GCAT=$1;;
+       --gpkg)              shift; GPKG=$1;;
+       --k|--kernel)        shift; KVER=$1;;
+       --kenv)              shift; KENV=$1;;
+       -ok|--ov-kernel)     shift; KOVL=$1;;
+       --kcat)              shift; KCAT=$1;;
+       --kpkg)              shift; KPKG=$1;;
+       --l|--libc)          shift; LVER=$1;;
+       --lenv)              shift; LENV=$1;;
+       -ol|--ov-libc)       shift; LOVL=$1;;
+       --lcat)              shift; LCAT=$1;;
+       --lpkg)              shift; LPKG=$1;;
+       --r|--crt)           shift; RVER=$1;;
+       --renv)              shift; RENV=$1;;
+       -or|--ov-crt)        shift; ROVL=$1;;
+       --rcat)              shift; RCAT=$1;;
+       --rpkg)              shift; RPKG=$1;;
+       --u|--libunwind)     shift; UVER=$1;;
+       --uenv)              shift; UENV=$1;;
+       -ou|--ov-libuinwind) shift; UOVL=$1;;
+       --ucat)              shift; UCAT=$1;;
+       --upkg)              shift; UPKG=$1;;
+       --a|--libcxxabi)     shift; AVER=$1;;
+       --aenv)              shift; AENV=$1;;
+       -oa|--ov--libcxxabi) shift; AOVL=$1;;
+       --acat)              shift; ACAT=$1;;
+       --apkg)              shift; APKG=$1;;
+       --p|--libcxx)        shift; PVER=$1;;
+       --penv)              shift; PENV=$1;;
+       -op|--ov-libcxx)     shift; POVL=$1;;
+       --pcat)              shift; PCAT=$1;;
+       --ppkg)              shift; PPKG=$1;;
+       --c|--ccw)           shift; CVER=$1;;
+       --cenv)              shift; CENV=$1;;
+       -oc|--ov-ccw)        shift; COVL=$1;;
+       --ccat)              shift; CCAT=$1;;
+       --cpkg)              shift; CPKG=$1;;
+       -ox|--ov-extra)      shift; XOVLS+=( "$1" );;
+       --env)               shift; AENV=$1;;
+       -L|--llvm)           LLVM="yes";;
+       -A|--abis)           shift; MULTILIB_ABIS=$1;;
+       --host-abi)          shift; HOST_ABI=$1;;
+       -S|--stable)         DEFAULT_VER="[stable]";;
+       -C|--clean)          shift; parse_target $1; ACTION="uninstall";;
+       -s?|--stage?)        STAGE=${1:0-1};;
+       -oS|--overlays)      shift; SEARCH_OVERLAYS=$1;;
+       -oO|--ov-output)     shift; CROSSDEV_OVERLAY=$1;;
+       --ex-only)           EX_FAST="yes";;
+       --ex-gcc)            EX_GCC="yes";;
+       --ex-gdb)            EX_GDB="yes";;
+       --ex-pkg)            shift; XPKGS+=( "$1" );;
+       --with-*)            eval $(set_withval $1);;
+       --without-*)         eval $(set_withval $1);;
+       -f|--force)          FORCE="yes";;
+       -x)                  SET_X="yes";;
+       --show-target-cfg)   SHOW_TARGET_CFG="yes";;
+       --init-target)       INIT_TARGET_ONLY="yes";;
+       --show-fail-log)     SHOW_FAIL_LOG="yes";;
+       --show-repo-cfg)     show_repo_cfg "$2";;
+       -P|--portage)        UOPTS="${UOPTS} $2"; shift;;
+       -h|--help)           usage;;
+       -*)                  eerror "UNKNOWN OPTION: '$1'" ; usage 1;;
+       *)                   parse_target $1;;
        esac
        shift
 done
@@ -1038,6 +1056,10 @@ GVER=${GVER:-${DEFAULT_VER}}
 KVER=${KVER:-${DEFAULT_VER}}
 LVER=${LVER:-${DEFAULT_VER}}
 DVER=${DVER:-${DEFAULT_VER}}
+RVER=${RVER:-${DEFAULT_VER}}
+AVER=${AVER:-${DEFAULT_VER}}
+PVER=${PVER:-${DEFAULT_VER}}
+UVER=${UVER:-${DEFAULT_VER}}
 STAGE=${STAGE:-${STAGE_DEFAULT}}
 [[ -z ${CTARGET} ]] && usage 1
 for with in HEADERS ; do
@@ -1054,8 +1076,6 @@ if [[ ${LPKG} == "newlib" && ${LVER} == "[stable]" ]]; 
then
        LVER="[latest]"
 fi
 
-RVER="[latest]"
-
 show_target_cfg() {
        local pkgs crosspkgs=()
 
@@ -1245,6 +1265,12 @@ einfo "headers:               `pretty_atom ${KPKG}- 
${KVER}`"
 is_s3 && {
 einfo "libc:                  `pretty_atom ${LPKG}- ${LVER}`"
 }
+is_s4 && {
+[[ "${LLVM}" == "yes" ]] && \
+einfo "llvm-libunwind:        `pretty_atom ${UPKG}- ${UVER}`"
+einfo "libcxxabi:             `pretty_atom ${APKG}- ${AVER}`"
+einfo "libcxx:                `pretty_atom ${PPKG}- ${PVER}`"
+}
 }
 ex_gcc && {
 einfo "Extra: gcc pass:       DO IT"
@@ -1587,7 +1613,7 @@ done
 
 pkglist=( K L )
 if [[ ${LLVM} == "yes" ]] ; then
-       pkglist+=( R C )
+       pkglist+=( R C A P U )
 else
        pkglist+=( B G D )
 fi
@@ -1770,14 +1796,10 @@ if [[ "${LLVM}" == "yes" ]]; then
        [[ -d "${CLANG_CROSS_CFG_DIR}" ]] || mkdir -p "${CLANG_CROSS_CFG_DIR}"
 
        export CLANG_CROSS_CFG="${CLANG_CROSS_CFG_DIR}/${CTARGET}.cfg"
-       # Force --unwindlib=none for now
        cat <<-EOF > "${CLANG_CROSS_CFG}"
-       --rtlib=compiler-rt
        --sysroot=/usr/${CTARGET}
        --target=${CTARGET}
-       --unwindlib=libunwind
-       --stdlib=libc++
-       -fuse-ld=lld
+       @../gentoo-runtimes.cfg
        EOF
        # Workaround until LLVM libc supports dynamic linking and SSP
        [[ "${LPKG}" == "llvm-libc" ]] && cat <<-EOF >> "${CLANG_CROSS_CFG}"
@@ -1885,10 +1907,22 @@ if ! ex_fast ; then
        fi
 
        # stage4: full compiler (C/C++/etc...)
-       if is_s4 && [[ "${LLVM}" != "yes" ]] ; then
-               EOPTS="${EOPTS_UP} --newuse" \
-               USE="${GUSE} ${USE} ${GUSE_DISABLE_STAGE_2}" \
-                       doemerge ${GPKG} ${GPKG}-stage2
+       if is_s4 ; then
+               if [[ "${LLVM}" == "yes" ]]; then
+                       # Static llvm-libunwind is essential for supporting 
simple static linking in
+                       # general, see the bug #892956. The same is done in the 
LLVM profile.
+                       USE="${UUSE} ${USE} static-libs" \
+                               doemerge ${UPKG}
+
+                       USE="${AUSE} ${USE}" \
+                               doemerge ${APKG}
+                       USE="${PUSE} ${USE}" \
+                               doemerge ${PPKG}
+               else
+                       EOPTS="${EOPTS_UP} --newuse" \
+                       USE="${GUSE} ${USE} ${GUSE_DISABLE_STAGE_2}" \
+                               doemerge ${GPKG} ${GPKG}-stage2
+               fi
        fi
 fi
 

Reply via email to