sys-libs/libcxx: fix prefix bootstrap

When bootstrapping prefix on darwin, libcxx must be installed before
llvm is built during stage2 (in EPREFIX/tmp) and during stage3 (in
EPREFIX). llvm_pkg_setup, however, identifies the *installed* llvm to
set environment variables with the correct path to llvm. Since llvm is
not installed, we have to skip that step. But during bootstrap, we don't
need those environment vars to be modified anyway because
bootstrap-prefix.sh already sets them with the paths to the correct llvm
(which is the host's llm during stage2 and the EPREFIX/tmp llvm during
stage3).

Once stage3 is complete, llvm is installed in EPREFIX, so the system
rebuild (with `emerge -e system`) will successfully use llvm_pkg_setup.
bootstrap-prefix.sh is no longer controlling the vars at that point, so
it is important to allow llvm_pkg_setup to correctly modify the vars.

Other required fixes include:
- eprefrixify some dylib paths in CMakeLists.txt (dylib is only used
  on darwin, so this is not an issue when compiling on other platforms).
- ensure want_gcc_s is OFF even if use=-libunwind on darwin
- keyword with ~x64-macos

Bug: https://bugs.gentoo.org/758167
Signed-off-by: Jacob Floyd <cognifloyd@gmail.com>
Signed-off-by: Fabian Groffen <grobian@gentoo.org>
This commit is contained in:
Jacob Floyd
2020-12-20 15:46:30 -06:00
committed by Fabian Groffen
parent a4b70b6b13
commit 74c82761ee
6 changed files with 115 additions and 16 deletions

View File

@@ -21,3 +21,7 @@ media-gfx/tachyon threads opengl
# Elias Pipping <pipping@gentoo.org> (2007-11-29)
# won't compile without
media-libs/libsdl opengl
# Jacob Floyd <cognifloyd@gmail.org> (2020-12-20)
# Make sure we always use libcxxabi on macos prefix
sys-libs/libcxx libcxxabi

View File

@@ -14,7 +14,7 @@ llvm.org_set_globals
LICENSE="Apache-2.0-with-LLVM-exceptions || ( UoI-NCSA MIT )"
SLOT="0"
KEYWORDS="amd64 arm arm64 ~riscv x86"
KEYWORDS="amd64 arm arm64 ~riscv x86 ~x64-macos"
IUSE="elibc_glibc elibc_musl +libcxxabi +libunwind +static-libs test"
REQUIRED_USE="libunwind? ( libcxxabi )"
RESTRICT="!test? ( test )"
@@ -41,7 +41,11 @@ python_check_deps() {
}
pkg_setup() {
llvm_pkg_setup
# darwin prefix builds do not have llvm installed yet, so rely on bootstrap-prefix
# to set the appropriate path vars to LLVM instead of using llvm_pkg_setup.
if [[ ${CHOST} != *-darwin* ]] || has_version dev-lang/llvm; then
llvm_pkg_setup
fi
use test && python-any-r1_pkg_setup
if ! use libcxxabi && ! tc-is-gcc ; then
@@ -58,6 +62,10 @@ src_prepare() {
eapply "${FILESDIR}/${PN}-3.9-cmake-link-flags.patch"
llvm.org_src_prepare
# eprefixify static path references to libc++abi for symbol re-export to
# avoid linking against it twice in both /usr/lib and ${EPREFIX}/usr/lib
sed -i -e "s^/usr/lib/libc++abi.dylib^${EPREFIX}&^g" lib/CMakeLists.txt || die
}
test_compiler() {
@@ -99,6 +107,15 @@ multilib_src_configure() {
extra_libs+=( "${compiler_rt}" )
fi
fi
elif [[ ${CHOST} == *-darwin* ]] && tc-is-clang; then
# clang-based darwin prefix disables libunwind useflag during
# bootstrap, because libunwind is not in the prefix yet.
# override the default, though, because clang based libcxx
# should never use gcc_s on Darwin.
want_gcc_s=OFF
# compiler_rt is not available in EPREFIX during bootstrap,
# so we cannot link to it yet anyway, so keep the defaults
# of want_compiler_rt=OFF and extra_libs=()
fi
# bootstrap: cmake is unhappy if compiler can't link to stdlib
@@ -188,8 +205,10 @@ gen_shared_ldscript() {
multilib_src_install() {
cmake_src_install
gen_shared_ldscript
use static-libs && gen_static_ldscript
if [[ ${CHOST} != *-darwin* ]] ; then
gen_shared_ldscript
use static-libs && gen_static_ldscript
fi
}
pkg_postinst() {

View File

@@ -42,7 +42,11 @@ python_check_deps() {
}
pkg_setup() {
llvm_pkg_setup
# darwin prefix builds do not have llvm installed yet, so rely on bootstrap-prefix
# to set the appropriate path vars to LLVM instead of using llvm_pkg_setup.
if [[ ${CHOST} != *-darwin* ]] || has_version dev-lang/llvm; then
llvm_pkg_setup
fi
use test && python-any-r1_pkg_setup
if ! use libcxxabi && ! tc-is-gcc ; then
@@ -59,6 +63,10 @@ src_prepare() {
eapply "${FILESDIR}/${PN}-3.9-cmake-link-flags.patch"
llvm.org_src_prepare
# eprefixify static path references to libc++abi for symbol re-export to
# avoid linking against it twice in both /usr/lib and ${EPREFIX}/usr/lib
sed -i -e "s^/usr/lib/libc++abi.dylib^${EPREFIX}&^g" lib/CMakeLists.txt || die
}
test_compiler() {
@@ -100,6 +108,15 @@ multilib_src_configure() {
extra_libs+=( "${compiler_rt}" )
fi
fi
elif [[ ${CHOST} == *-darwin* ]] && tc-is-clang; then
# clang-based darwin prefix disables libunwind useflag during
# bootstrap, because libunwind is not in the prefix yet.
# override the default, though, because clang based libcxx
# should never use gcc_s on Darwin.
want_gcc_s=OFF
# compiler_rt is not available in EPREFIX during bootstrap,
# so we cannot link to it yet anyway, so keep the defaults
# of want_compiler_rt=OFF and extra_libs=()
fi
# bootstrap: cmake is unhappy if compiler can't link to stdlib
@@ -189,8 +206,10 @@ gen_shared_ldscript() {
multilib_src_install() {
cmake_src_install
gen_shared_ldscript
use static-libs && gen_static_ldscript
if [[ ${CHOST} != *-darwin* ]] ; then
gen_shared_ldscript
use static-libs && gen_static_ldscript
fi
}
pkg_postinst() {

View File

@@ -42,7 +42,11 @@ python_check_deps() {
}
pkg_setup() {
llvm_pkg_setup
# darwin prefix builds do not have llvm installed yet, so rely on bootstrap-prefix
# to set the appropriate path vars to LLVM instead of using llvm_pkg_setup.
if [[ ${CHOST} != *-darwin* ]] || has_version dev-lang/llvm; then
llvm_pkg_setup
fi
use test && python-any-r1_pkg_setup
if ! use libcxxabi && ! tc-is-gcc ; then
@@ -59,6 +63,10 @@ src_prepare() {
eapply "${FILESDIR}/${PN}-3.9-cmake-link-flags.patch"
llvm.org_src_prepare
# eprefixify static path references to libc++abi for symbol re-export to
# avoid linking against it twice in both /usr/lib and ${EPREFIX}/usr/lib
sed -i -e "s^/usr/lib/libc++abi.dylib^${EPREFIX}&^g" lib/CMakeLists.txt || die
}
test_compiler() {
@@ -100,6 +108,15 @@ multilib_src_configure() {
extra_libs+=( "${compiler_rt}" )
fi
fi
elif [[ ${CHOST} == *-darwin* ]] && tc-is-clang; then
# clang-based darwin prefix disables libunwind useflag during
# bootstrap, because libunwind is not in the prefix yet.
# override the default, though, because clang based libcxx
# should never use gcc_s on Darwin.
want_gcc_s=OFF
# compiler_rt is not available in EPREFIX during bootstrap,
# so we cannot link to it yet anyway, so keep the defaults
# of want_compiler_rt=OFF and extra_libs=()
fi
# bootstrap: cmake is unhappy if compiler can't link to stdlib
@@ -189,8 +206,10 @@ gen_shared_ldscript() {
multilib_src_install() {
cmake_src_install
gen_shared_ldscript
use static-libs && gen_static_ldscript
if [[ ${CHOST} != *-darwin* ]] ; then
gen_shared_ldscript
use static-libs && gen_static_ldscript
fi
}
pkg_postinst() {

View File

@@ -42,7 +42,11 @@ python_check_deps() {
}
pkg_setup() {
llvm_pkg_setup
# darwin prefix builds do not have llvm installed yet, so rely on bootstrap-prefix
# to set the appropriate path vars to LLVM instead of using llvm_pkg_setup.
if [[ ${CHOST} != *-darwin* ]] || has_version dev-lang/llvm; then
llvm_pkg_setup
fi
use test && python-any-r1_pkg_setup
if ! use libcxxabi && ! tc-is-gcc ; then
@@ -59,6 +63,10 @@ src_prepare() {
eapply "${FILESDIR}/${PN}-3.9-cmake-link-flags.patch"
llvm.org_src_prepare
# eprefixify static path references to libc++abi for symbol re-export to
# avoid linking against it twice in both /usr/lib and ${EPREFIX}/usr/lib
sed -i -e "s^/usr/lib/libc++abi.dylib^${EPREFIX}&^g" lib/CMakeLists.txt || die
}
test_compiler() {
@@ -100,6 +108,15 @@ multilib_src_configure() {
extra_libs+=( "${compiler_rt}" )
fi
fi
elif [[ ${CHOST} == *-darwin* ]] && tc-is-clang; then
# clang-based darwin prefix disables libunwind useflag during
# bootstrap, because libunwind is not in the prefix yet.
# override the default, though, because clang based libcxx
# should never use gcc_s on Darwin.
want_gcc_s=OFF
# compiler_rt is not available in EPREFIX during bootstrap,
# so we cannot link to it yet anyway, so keep the defaults
# of want_compiler_rt=OFF and extra_libs=()
fi
# bootstrap: cmake is unhappy if compiler can't link to stdlib
@@ -189,8 +206,10 @@ gen_shared_ldscript() {
multilib_src_install() {
cmake_src_install
gen_shared_ldscript
use static-libs && gen_static_ldscript
if [[ ${CHOST} != *-darwin* ]] ; then
gen_shared_ldscript
use static-libs && gen_static_ldscript
fi
}
pkg_postinst() {

View File

@@ -42,7 +42,11 @@ python_check_deps() {
}
pkg_setup() {
llvm_pkg_setup
# darwin prefix builds do not have llvm installed yet, so rely on bootstrap-prefix
# to set the appropriate path vars to LLVM instead of using llvm_pkg_setup.
if [[ ${CHOST} != *-darwin* ]] || has_version dev-lang/llvm; then
llvm_pkg_setup
fi
use test && python-any-r1_pkg_setup
if ! use libcxxabi && ! tc-is-gcc ; then
@@ -59,6 +63,10 @@ src_prepare() {
eapply "${FILESDIR}/${PN}-3.9-cmake-link-flags.patch"
llvm.org_src_prepare
# eprefixify static path references to libc++abi for symbol re-export to
# avoid linking against it twice in both /usr/lib and ${EPREFIX}/usr/lib
sed -i -e "s^/usr/lib/libc++abi.dylib^${EPREFIX}&^g" lib/CMakeLists.txt || die
}
test_compiler() {
@@ -100,6 +108,15 @@ multilib_src_configure() {
extra_libs+=( "${compiler_rt}" )
fi
fi
elif [[ ${CHOST} == *-darwin* ]] && tc-is-clang; then
# clang-based darwin prefix disables libunwind useflag during
# bootstrap, because libunwind is not in the prefix yet.
# override the default, though, because clang based libcxx
# should never use gcc_s on Darwin.
want_gcc_s=OFF
# compiler_rt is not available in EPREFIX during bootstrap,
# so we cannot link to it yet anyway, so keep the defaults
# of want_compiler_rt=OFF and extra_libs=()
fi
# bootstrap: cmake is unhappy if compiler can't link to stdlib
@@ -189,8 +206,10 @@ gen_shared_ldscript() {
multilib_src_install() {
cmake_src_install
gen_shared_ldscript
use static-libs && gen_static_ldscript
if [[ ${CHOST} != *-darwin* ]] ; then
gen_shared_ldscript
use static-libs && gen_static_ldscript
fi
}
pkg_postinst() {