From 43b14b07004b438cb0e0260c7e293cd63302a17d Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Fri, 5 Nov 2021 20:15:41 +0100 Subject: [PATCH] eclass/multilib: Sync with gentoo It's from gentoo commit f64708850264e93cb54c8857d6eb459a4faf274e. --- .../portage-stable/eclass/multilib.eclass | 105 +++++++++++++++--- 1 file changed, 91 insertions(+), 14 deletions(-) diff --git a/sdk_container/src/third_party/portage-stable/eclass/multilib.eclass b/sdk_container/src/third_party/portage-stable/eclass/multilib.eclass index 63bde5cbb6..483f8d10c7 100644 --- a/sdk_container/src/third_party/portage-stable/eclass/multilib.eclass +++ b/sdk_container/src/third_party/portage-stable/eclass/multilib.eclass @@ -1,14 +1,20 @@ -# Copyright 1999-2015 Gentoo Foundation +# Copyright 1999-2021 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: multilib.eclass # @MAINTAINER: -# amd64@gentoo.org # toolchain@gentoo.org +# @SUPPORTED_EAPIS: 5 6 7 8 # @BLURB: This eclass is for all functions pertaining to handling multilib configurations. # @DESCRIPTION: # This eclass is for all functions pertaining to handling multilib configurations. +case ${EAPI:-0} in + # EAPI=0 is still used by crossdev, bug #797367 + 0|5|6|7|8) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; +esac + if [[ -z ${_MULTILIB_ECLASS} ]]; then _MULTILIB_ECLASS=1 @@ -48,7 +54,7 @@ has_multilib_profile() { # fall back on old behavior. Any profile that has these set should also # depend on a newer version of portage (not yet released) which uses these # over CONF_LIBDIR in econf, dolib, etc... -if has "${EAPI:-0}" 0 1 2 3 4 5; then +if [[ ${EAPI} == [05] ]] ; then get_libdir() { local CONF_LIBDIR if [ -n "${CONF_LIBDIR_OVERRIDE}" ] ; then @@ -294,11 +300,22 @@ get_modname() { } # This is for the toolchain to setup profile variables when pulling in -# a crosscompiler (and thus they aren't set in the profile) +# a crosscompiler (and thus they aren't set in the profile). multilib_env() { local CTARGET=${1:-${CTARGET}} local cpu=${CTARGET%%*-} + if [[ ${CTARGET} = *-musl* ]]; then + # musl has no multilib support and can run only in 'lib': + # - https://bugs.gentoo.org/675954 + # - https://gcc.gnu.org/PR90077 + # - https://github.com/gentoo/musl/issues/245 + : ${MULTILIB_ABIS=default} + : ${DEFAULT_ABI=default} + export MULTILIB_ABIS DEFAULT_ABI + return + fi + case ${cpu} in aarch64*) # Not possible to do multilib with aarch64 and a single toolchain. @@ -386,19 +403,43 @@ multilib_env() { : ${DEFAULT_ABI=ppc64} ;; riscv64*) - export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d} + export CFLAGS_lp64d=${CFLAGS_lp64d--mabi=lp64d -march=rv64imafdc} export CHOST_lp64d=${CTARGET} export CTARGET_lp64d=${CTARGET} - export LIBDIR_lp64d="lib64/lp64d" + export LIBDIR_lp64d=${LIBDIR_lp64d-lib64/lp64d} - export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64} + export CFLAGS_lp64=${CFLAGS_lp64--mabi=lp64 -march=rv64imac} export CHOST_lp64=${CTARGET} export CTARGET_lp64=${CTARGET} - export LIBDIR_lp64="lib64/lp64" + export LIBDIR_lp64=${LIBDIR_lp64-lib64/lp64} - : ${MULTILIB_ABIS=lp64d lp64} + export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d -march=rv32imafdc} + export CHOST_ilp32d=${CTARGET/riscv64/riscv32} + export CTARGET_ilp32d=${CTARGET/riscv64/riscv32} + export LIBDIR_ilp32d=${LIBDIR_ilp32d-lib32/ilp32d} + + export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac} + export CHOST_ilp32=${CTARGET/riscv64/riscv32} + export CTARGET_ilp32=${CTARGET/riscv64/riscv32} + export LIBDIR_ilp32=${LIBDIR_ilp32-lib32/ilp32} + + : ${MULTILIB_ABIS=lp64d lp64 ilp32d ilp32} : ${DEFAULT_ABI=lp64d} ;; + riscv32*) + export CFLAGS_ilp32d=${CFLAGS_ilp32d--mabi=ilp32d} + export CHOST_ilp32d=${CTARGET} + export CTARGET_ilp32d=${CTARGET} + export LIBDIR_ilp32d=${LIBDIR_ilp32d-lib32/ilp32d} + + export CFLAGS_ilp32=${CFLAGS_ilp32--mabi=ilp32 -march=rv32imac} + export CHOST_ilp32=${CTARGET} + export CTARGET_ilp32=${CTARGET} + export LIBDIR_ilp32=${LIBDIR_ilp32-lib32/ilp32} + + : ${MULTILIB_ABIS=ilp32d ilp32} + : ${DEFAULT_ABI=ilp32d} + ;; s390x*) export CFLAGS_s390=${CFLAGS_s390--m31} # the 31 is not a typo export CHOST_s390=${CTARGET/s390x/s390} @@ -445,9 +486,32 @@ multilib_toolchain_setup() { export ABI=$1 + local save_restore_variables=( + CBUILD + CHOST + AR + CC + CXX + F77 + FC + LD + NM + OBJCOPY + OBJDUMP + PKG_CONFIG + RANLIB + READELF + STRINGS + STRIP + PKG_CONFIG_LIBDIR + PKG_CONFIG_PATH + PKG_CONFIG_SYSTEM_INCLUDE_PATH + PKG_CONFIG_SYSTEM_LIBRARY_PATH + ) + # First restore any saved state we have laying around. if [[ ${_DEFAULT_ABI_SAVED} == "true" ]] ; then - for v in CHOST CBUILD AS CC CXX F77 FC LD PKG_CONFIG_{LIBDIR,PATH} ; do + for v in "${save_restore_variables[@]}" ; do vv="_abi_saved_${v}" [[ ${!vv+set} == "set" ]] && export ${v}="${!vv}" || unset ${v} unset ${vv} @@ -455,11 +519,9 @@ multilib_toolchain_setup() { unset _DEFAULT_ABI_SAVED fi - # We want to avoid the behind-the-back magic of gcc-config as it - # screws up ccache and distcc. See #196243 for more info. if [[ ${ABI} != ${DEFAULT_ABI} ]] ; then - # Back that multilib-ass up so we can restore it later - for v in CHOST CBUILD AS CC CXX F77 FC LD PKG_CONFIG_{LIBDIR,PATH} ; do + # Backup multilib state so we can restore it later + for v in "${save_restore_variables[@]}" ; do vv="_abi_saved_${v}" [[ ${!v+set} == "set" ]] && export ${vv}="${!v}" || unset ${vv} done @@ -472,15 +534,30 @@ multilib_toolchain_setup() { # Set the CHOST native first so that we pick up the native # toolchain and not a cross-compiler by accident #202811. + # + # Make sure ${save_restore_variables[@]} list matches below. export CHOST=$(get_abi_CHOST ${DEFAULT_ABI}) + + export AR="$(tc-getAR)" # Avoid 'ar', use '${CHOST}-ar' export CC="$(tc-getCC) $(get_abi_CFLAGS)" export CXX="$(tc-getCXX) $(get_abi_CFLAGS)" export F77="$(tc-getF77) $(get_abi_CFLAGS)" export FC="$(tc-getFC) $(get_abi_CFLAGS)" export LD="$(tc-getLD) $(get_abi_LDFLAGS)" + export NM="$(tc-getNM)" # Avoid 'nm', use '${CHOST}-nm' + export OBJCOPY="$(tc-getOBJCOPY)" # Avoid 'objcopy', use '${CHOST}-objcopy' + export OBJDUMP="$(tc-getOBJDUMP)" # Avoid 'objdump', use '${CHOST}-objdump' + export PKG_CONFIG="$(tc-getPKG_CONFIG)" + export RANLIB="$(tc-getRANLIB)" # Avoid 'ranlib', use '${CHOST}-ranlib' + export READELF="$(tc-getREADELF)" # Avoid 'readelf', use '${CHOST}-readelf' + export STRINGS="$(tc-getSTRINGS)" # Avoid 'strings', use '${CHOST}-strings' + export STRIP="$(tc-getSTRIP)" # Avoid 'strip', use '${CHOST}-strip' + export CHOST=$(get_abi_CHOST $1) export PKG_CONFIG_LIBDIR=${EPREFIX}/usr/$(get_libdir)/pkgconfig export PKG_CONFIG_PATH=${EPREFIX}/usr/share/pkgconfig + export PKG_CONFIG_SYSTEM_INCLUDE_PATH=${EPREFIX}/usr/include + export PKG_CONFIG_SYSTEM_LIBRARY_PATH=${EPREFIX}/$(get_libdir):${EPREFIX}/usr/$(get_libdir) fi }