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
