summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Sokolov <alexey+gentoo@asokolov.org>2024-10-18 16:00:50 +0200
committerFabian Groffen <grobian@gentoo.org>2024-10-18 16:00:50 +0200
commit0e8cc099b8d696b2354e8705ce83bcf317ed9a7a (patch)
treef11655e7ae9b3a56b18c114a1cf3c46984cc3ceb
parentscripts/bootstrap-prefix: use newer cmake too bootstrap (diff)
downloadprefix-master.tar.gz
prefix-master.tar.bz2
prefix-master.zip
scripts/bootstrap-prefix: add support for Darwin Clang bootstrap pathHEADmaster
This is a slightly modified version of https://github.com/gentoo/prefix/pull/34/commits/6319cbe1d15c3831bd4a2e5b52c4367abc68747d Bug: https://bugs.gentoo.org/758167 Signed-off-by: Alexey Sokolov <alexey+gentoo@asokolov.org> Signed-off-by: Fabian Groffen <grobian@gentoo.org>
-rwxr-xr-xscripts/bootstrap-prefix.sh152
1 files changed, 127 insertions, 25 deletions
diff --git a/scripts/bootstrap-prefix.sh b/scripts/bootstrap-prefix.sh
index fdbe73e17e..86b7860595 100755
--- a/scripts/bootstrap-prefix.sh
+++ b/scripts/bootstrap-prefix.sh
@@ -220,18 +220,17 @@ configure_toolchain() {
# this is Clang, recent enough to compile recent clang
compiler_stage1+="
${llvm_deps}
- sys-libs/libcxxabi
- sys-libs/libcxx
+ sys-libs/compiler-rt
sys-devel/llvm
+ sys-devel/lld
+ sys-devel/clang-common
sys-devel/clang
"
CC=clang
CXX=clang++
- # avoid going through hoops and deps for
- # binutils-apple, rely on the host-installed ld to
- # build a compiler, we'll pull in binutils-apple
- # from system set
- linker=sys-devel/native-cctools
+ linker=
+ [[ "${BOOTSTRAP_STAGE}" == stage2 ]] && \
+ linker=sys-devel/lld
;;
*)
eerror "unknown/unsupported compiler"
@@ -240,12 +239,16 @@ configure_toolchain() {
esac
compiler="
- dev-libs/libffi
${llvm_deps}
+ sys-libs/compiler-rt
sys-libs/libcxxabi
sys-libs/libcxx
sys-devel/llvm
- sys-devel/clang"
+ sys-devel/lld
+ sys-libs/llvm-libunwind
+ sys-devel/clang-common
+ sys-devel/clang
+ "
;;
*-linux*)
is-rap && einfo "Triggering Linux RAP bootstrap"
@@ -457,6 +460,8 @@ bootstrap_profile() {
if [[ ${DARWIN_USE_GCC} == 1 ]] ; then
# amend profile, to use gcc one
profile="${profile}/gcc"
+ elif [[ ${CHOST} == *-darwin* ]] ; then
+ [[ "${BOOTSTRAP_STAGE}" != stage2 ]] && profile+="/clang"
fi
[[ -n ${PROFILE_BASE}${PROFILE_VARIANT} ]] &&
@@ -1466,7 +1471,7 @@ bootstrap_stage1() {
[[ -e ${ROOT}/tmp/${x} ]] || ( cd "${ROOT}"/tmp && ln -s usr/${x} )
done
- configure_toolchain
+ BOOTSTRAP_STAGE="stage1" configure_toolchain || return 1
export CC CXX
# default: empty = NO
@@ -1752,9 +1757,16 @@ bootstrap_stage1() {
# setup a profile for stage2
mkdir -p "${ROOT}"/tmp/etc/. || return 1
[[ -e ${ROOT}/tmp/etc/portage/make.profile ]] || \
- ( "${CP}" -dpR "${ROOT}"/etc/portage "${ROOT}"/tmp/etc && \
+ (
+ "${CP}" -dpR "${ROOT}"/etc/portage "${ROOT}"/tmp/etc && \
rm -f "${ROOT}"/tmp/etc/portage/make.profile && \
- (ROOT="${ROOT}"/tmp PREFIX_DISABLE_RAP=yes bootstrap_profile) ) || return 1
+ (
+ ROOT="${ROOT}"/tmp \
+ PREFIX_DISABLE_RAP="yes" \
+ BOOTSTRAP_STAGE="stage2" \
+ bootstrap_profile
+ )
+ ) || return 1
# setup portage
[[ -e ${ROOT}/tmp/usr/bin/emerge ]] || (bootstrap_portage) || return 1
@@ -1819,7 +1831,6 @@ do_emerge_pkgs() {
"-berkdb"
"-fortran" # gcc
"-gdbm"
- "-libcxx"
"-nls"
"-pcre"
"-python"
@@ -1831,7 +1842,24 @@ do_emerge_pkgs() {
"clang"
"internal-glib"
)
- local override_make_conf_dir="${PORTAGE_OVERRIDE_EPREFIX}${MAKE_CONF_DIR#"${ROOT}"}"
+
+ local skip_llvm_pkg_setup=
+ if [[ ${CHOST}:${DARWIN_USE_GCC} == *-darwin*:0 ]] ; then
+ # Clang-based Darwin
+ myuse+=(
+ "-binutils-plugin"
+ "default-compiler-rt"
+ "default-libcxx"
+ "default-lld"
+ )
+ if [[ "${BOOTSTRAP_STAGE}" == stage2 ]] ; then
+ myuse+=( "bootstrap-prefix" )
+ skip_llvm_pkg_setup="yes"
+ fi
+ fi
+
+ local override_make_conf_dir="${PORTAGE_OVERRIDE_EPREFIX}"
+ override_make_conf_dir+="${MAKE_CONF_DIR#"${ROOT}"}"
if [[ " ${USE} " == *" prefix-stack "* ]] &&
[[ ${PORTAGE_OVERRIDE_EPREFIX} == */tmp ]] &&
@@ -1892,6 +1920,7 @@ do_emerge_pkgs() {
PORTAGE_SYNC_STALE=0 \
FEATURES="-news ${FEATURES}" \
USE="${myuse[*]}" \
+ LLVM_ECLASS_SKIP_PKG_SETUP="${skip_llvm_pkg_setup}" \
"${ROOT}"/tmp/bin/python \
"${ROOT}"/tmp/usr/bin/emerge "${eopts[@]}" "${pkg}"
) || return 1
@@ -1908,7 +1937,7 @@ bootstrap_stage2() {
# Find out what toolchain packages we need, and configure LDFLAGS
# and friends.
- configure_toolchain || return 1
+ BOOTSTRAP_STAGE="stage2" configure_toolchain || return 1
configure_cflags || return 1
export CONFIG_SHELL="${ROOT}"/tmp/bin/bash
export CC CXX
@@ -1995,6 +2024,24 @@ bootstrap_stage2() {
EOF
fi
+ # provide active SDK link on Darwin
+ if [[ ${CHOST} == *-darwin* ]] ; then
+ rm -f "${ROOT}"/tmp/MacOSX.sdk
+ ( cd "${ROOT}"/tmp && ln -s ../MacOSX.sdk MacOSX.sdk )
+ if [[ ${DARWIN_USE_GCC} == 0 ]] ; then
+ # Until proper clang is installed, just redirect calls to it
+ # to the system's one. Libtool is here because its path is
+ # passed to the compiler-rt and llvm's ebuilds.
+ for bin in libtool clang clang++ ; do
+ {
+ echo "#!${ROOT}/tmp/bin/sh"
+ echo "exec ${bin}"' "$@"'
+ } > "${ROOT}/tmp/usr/bin/${CHOST}-${bin}"
+ chmod +x "${ROOT}/tmp/usr/bin/${CHOST}-${bin}"
+ done
+ fi
+ fi
+
# Build a basic compiler and portage dependencies in $ROOT/tmp.
pkgs=(
sys-devel/gnuconfig
@@ -2013,12 +2060,6 @@ bootstrap_stage2() {
sys-devel/binutils-config
)
- # provide active SDK link on Darwin
- if [[ ${CHOST} == *-darwin* ]] ; then
- rm -f "${ROOT}"/tmp/MacOSX.sdk
- ( cd "${ROOT}"/tmp && ln -s ../MacOSX.sdk MacOSX.sdk )
- fi
-
# cmake has some external dependencies which require autoconf, etc.
# unless we only build the buildtool, bug #603012
echo "dev-build/cmake -server" >> "${ROOT}"/tmp/etc/portage/package.use
@@ -2037,8 +2078,8 @@ bootstrap_stage2() {
emerge_pkgs --nodeps "${pkgs[@]}" || return 1
- # Debian multiarch supported by RAP needs ld to support sysroot.
for pkg in ${linker} ; do
+ # Debian multiarch supported by RAP needs ld to support sysroot.
EXTRA_ECONF=$(rapx --with-sysroot=/) \
emerge_pkgs --nodeps "${pkg}" || return 1
done
@@ -2083,12 +2124,22 @@ bootstrap_stage2() {
done
if [[ ${compiler_type} == clang ]] ; then
+ if [[ ${CHOST} == *-darwin* ]] ; then
+ # Stop using host's compilers, but still need 'libtool' in PATH.
+ rm "${ROOT}/tmp/usr/bin/${CHOST}"-{libtool,clang,clang++}
+ mkdir -p "${ROOT}"/usr/bin
+ ln -s "${ROOT}"/tmp/usr/lib/llvm/*/bin/llvm-libtool-darwin \
+ "${ROOT}"/usr/bin/libtool
+ fi
+
# We use Clang as our toolchain compiler, so we need to make
# sure we actually use it
mkdir -p -- "${MAKE_CONF_DIR}"
{
echo
echo "# System compiler on $(uname) Prefix is Clang, do not remove this"
+ echo "AS=\"${CHOST}-clang -c\""
+ echo "CPP=${CHOST}-clang-cpp"
echo "CC=${CHOST}-clang"
echo "CXX=${CHOST}-clang++"
echo "OBJC=${CHOST}-clang"
@@ -2152,7 +2203,7 @@ bootstrap_stage3() {
# they stop mucking up builds.
rm -f "${ROOT}"/tmp/usr/local/bin/{,my,${CHOST}-}{gcc,g++}
- configure_toolchain || return 1
+ BOOTSTRAP_STAGE=stage3 configure_toolchain || return 1
if [[ ${compiler_type} == clang ]] ; then
if ! type -P clang > /dev/null ; then
@@ -2205,7 +2256,6 @@ bootstrap_stage3() {
# (CBUILD, BDEPEND) and with the system being built
# (CHOST, RDEPEND). To correctly bootstrap stage3,
# PORTAGE_OVERRIDE_EPREFIX as BROOT is needed.
- PREROOTPATH="${ROOT}"$(echo /{,tmp/}{usr/,}{,lib/llvm/{12,11,10}/}{s,}bin | sed "s, ,:${ROOT},g") \
EPREFIX="${ROOT}" PORTAGE_TMPDIR="${PORTAGE_TMPDIR}" \
EMERGE_LOG_DIR="${ROOT}"/var/log \
STAGE=stage3 \
@@ -2388,6 +2438,31 @@ bootstrap_stage3() {
PYTHON_COMPAT_OVERRIDE="python$(python_ver)" \
pre_emerge_pkgs --nodeps "${compiler_pkgs[@]}" || return 1
+ if [[ ${CHOST}:${DARWIN_USE_GCC} == *-darwin*:0 ]] ; then
+ # At this point our libc++abi.dylib is dynamically linked to
+ # /usr/lib/libc++abi.dylib. That causes issues with perl later. Force
+ # rebuild of sys-libs/libcxxabi to break this link.
+ rm -Rf "${ROOT}/var/db/pkg/sys-libs/libcxxabi"*
+ PYTHON_COMPAT_OVERRIDE=python$(python_ver) \
+ pre_emerge_pkgs --nodeps "sys-libs/libcxxabi" || return 1
+
+ # Make ${CHOST}-libtool (used by compiler-rt's and llvm's ebuild) to
+ # point at the correct libtool in stage3. Resolve it in runtime, to
+ # support llvm version upgrades.
+ rm -f ${ROOT}/usr/bin/${CHOST}-libtool
+ {
+ echo "#!${ROOT}/bin/sh"
+ echo 'exec llvm-libtool-darwin "$@"'
+ } > "${ROOT}"/usr/bin/${CHOST}-${bin}
+
+ # Now clang is ready, can use it instead of /usr/bin/gcc
+ # TODO: perhaps symlink the whole etc/portage instead?
+ ln -s -f "${ROOT}/etc/portage/make.profile" \
+ "${ROOT}/tmp/etc/portage/make.profile"
+ cp "${ROOT}/etc/portage/make.conf/0100_bootstrap_prefix_clang.conf" \
+ "${ROOT}/tmp/etc/portage/make.conf/"
+ fi
+
# Undo libgcc_s.so path of stage2
# Now we have the compiler right there
unset CC CXX CPPFLAGS LDFLAGS
@@ -2404,8 +2479,35 @@ bootstrap_stage3() {
ln -s bash "${ROOT}"/bin/sh
fi
+ if [[ "${compiler_type}" == clang ]] ; then
+ if [[ ! -e "${ROOT}"/tmp/etc/env.d/11stage3-llvm ]]; then
+ ln -s "${ROOT}"/etc/env.d/60llvm-* \
+ "${ROOT}"/tmp/etc/env.d/11stage3-llvm
+ fi
+ # Prevent usage of AppleClang aka gcc for bad packages which ignore $CC
+ if [[ ! -e "${ROOT}"/usr/bin/gcc ]]; then
+ echo "#!${ROOT}/bin/bash" > "${ROOT}"/usr/bin/gcc
+ echo "false ${CHOST}-clang \"\$@\"" >> "${ROOT}"/usr/bin/gcc
+ fi
+ if [[ ! -e "${ROOT}"/usr/bin/g++ ]]; then
+ echo "#!${ROOT}/bin/bash" > "${ROOT}"/usr/bin/g++
+ echo "false ${CHOST}-clang++ \"\$@\"" >> "${ROOT}"/usr/bin/g++
+ fi
+ chmod +x "${ROOT}"/usr/bin/{gcc,g++}
+ if [[ ${CHOST} == *-darwin* ]]; then
+ if [[ ! -e "${ROOT}"/usr/bin/ld ]]; then
+ echo "#!${ROOT}/bin/bash" > "${ROOT}"/usr/bin/ld
+ echo "false ld64.lld \"\$@\"" >> "${ROOT}"/usr/bin/ld
+ fi
+ chmod +x "${ROOT}"/usr/bin/ld
+ fi
+ fi
+
# Start using apps from the final destination Prefix
- export PREROOTPATH="${ROOT}/usr/bin:${ROOT}/bin"
+ cat > "${ROOT}"/tmp/etc/env.d/10stage3 <<-EOF
+ PATH="${ROOT}/usr/bin:${ROOT}/bin"
+ EOF
+ "${ROOT}"/tmp/usr/sbin/env-update
# Get a sane bash, overwriting tmp symlinks
pre_emerge_pkgs "" "app-shells/bash" || return 1