mirror of
https://github.com/flatcar/scripts.git
synced 2025-09-22 22:21:10 +02:00
eclass/toolchain-funcs: Sync with Gentoo
It's from Gentoo commit 66e18dd329f4728409abced4138562a079b30ccd.
This commit is contained in:
parent
5898472f6f
commit
3e4ea8ce36
@ -21,8 +21,6 @@ case ${EAPI} in
|
|||||||
*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
|
*) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
inherit multilib
|
|
||||||
|
|
||||||
# tc-getPROG <VAR [search vars]> <default> [tuple]
|
# tc-getPROG <VAR [search vars]> <default> [tuple]
|
||||||
_tc-getPROG() {
|
_tc-getPROG() {
|
||||||
local tuple=$1
|
local tuple=$1
|
||||||
@ -1147,139 +1145,6 @@ tc-enables-ssp-all() {
|
|||||||
tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
|
tc-cpp-is-true "defined(__SSP_ALL__)" ${CPPFLAGS} ${CFLAGS} ${CXXFLAGS}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# @FUNCTION: gen_usr_ldscript
|
|
||||||
# @USAGE: [-a] <list of libs to create linker scripts for>
|
|
||||||
# @DESCRIPTION:
|
|
||||||
# This function is deprecated. Use the version from
|
|
||||||
# usr-ldscript.eclass instead.
|
|
||||||
gen_usr_ldscript() {
|
|
||||||
ewarn "${FUNCNAME}: Please migrate to usr-ldscript.eclass"
|
|
||||||
|
|
||||||
local lib libdir=$(get_libdir) output_format="" auto=false suffix=$(get_libname)
|
|
||||||
|
|
||||||
tc-is-static-only && return
|
|
||||||
use prefix && return
|
|
||||||
|
|
||||||
# We only care about stuffing / for the native ABI, bug #479448
|
|
||||||
if [[ $(type -t multilib_is_native_abi) == "function" ]] ; then
|
|
||||||
multilib_is_native_abi || return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Eventually we'd like to get rid of this func completely, bug #417451
|
|
||||||
case ${CTARGET:-${CHOST}} in
|
|
||||||
*-darwin*) ;;
|
|
||||||
*-android*) return 0 ;;
|
|
||||||
*linux*) use prefix && return 0 ;;
|
|
||||||
*) return 0 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Just make sure it exists
|
|
||||||
dodir /usr/${libdir}
|
|
||||||
|
|
||||||
if [[ $1 == "-a" ]] ; then
|
|
||||||
auto=true
|
|
||||||
shift
|
|
||||||
dodir /${libdir}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# OUTPUT_FORMAT gives hints to the linker as to what binary format
|
|
||||||
# is referenced ... makes multilib saner
|
|
||||||
local flags=( ${CFLAGS} ${LDFLAGS} -Wl,--verbose )
|
|
||||||
if $(tc-getLD) --version | grep -q 'GNU gold' ; then
|
|
||||||
# If they're using gold, manually invoke the old bfd, bug #487696
|
|
||||||
local d="${T}/bfd-linker"
|
|
||||||
mkdir -p "${d}"
|
|
||||||
ln -sf $(type -P ${CHOST}-ld.bfd) "${d}"/ld
|
|
||||||
flags+=( -B"${d}" )
|
|
||||||
fi
|
|
||||||
output_format=$($(tc-getCC) "${flags[@]}" 2>&1 | sed -n 's/^OUTPUT_FORMAT("\([^"]*\)",.*/\1/p')
|
|
||||||
[[ -n ${output_format} ]] && output_format="OUTPUT_FORMAT ( ${output_format} )"
|
|
||||||
|
|
||||||
for lib in "$@" ; do
|
|
||||||
local tlib
|
|
||||||
if ${auto} ; then
|
|
||||||
lib="lib${lib}${suffix}"
|
|
||||||
else
|
|
||||||
# Ensure /lib/${lib} exists to avoid dangling scripts/symlinks.
|
|
||||||
# This especially is for AIX where $(get_libname) can return ".a",
|
|
||||||
# so /lib/${lib} might be moved to /usr/lib/${lib} (by accident).
|
|
||||||
[[ -r ${ED}/${libdir}/${lib} ]] || continue
|
|
||||||
#TODO: better die here?
|
|
||||||
fi
|
|
||||||
|
|
||||||
case ${CTARGET:-${CHOST}} in
|
|
||||||
*-darwin*)
|
|
||||||
if ${auto} ; then
|
|
||||||
tlib=$(scanmacho -qF'%S#F' "${ED}"/usr/${libdir}/${lib})
|
|
||||||
else
|
|
||||||
tlib=$(scanmacho -qF'%S#F' "${ED}"/${libdir}/${lib})
|
|
||||||
fi
|
|
||||||
[[ -z ${tlib} ]] && die "unable to read install_name from ${lib}"
|
|
||||||
tlib=${tlib##*/}
|
|
||||||
|
|
||||||
if ${auto} ; then
|
|
||||||
mv "${ED}"/usr/${libdir}/${lib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die
|
|
||||||
# some install_names are funky: they encode a version
|
|
||||||
if [[ ${tlib} != ${lib%${suffix}}.*${suffix#.} ]] ; then
|
|
||||||
mv "${ED}"/usr/${libdir}/${tlib%${suffix}}.*${suffix#.} "${ED}"/${libdir}/ || die
|
|
||||||
fi
|
|
||||||
rm -f "${ED}"/${libdir}/${lib}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Mach-O files have an id, which is like a soname, it tells how
|
|
||||||
# another object linking against this lib should reference it.
|
|
||||||
# Since we moved the lib from usr/lib into lib this reference is
|
|
||||||
# wrong. Hence, we update it here. We don't configure with
|
|
||||||
# libdir=/lib because that messes up libtool files.
|
|
||||||
# Make sure we don't lose the specific version, so just modify the
|
|
||||||
# existing install_name
|
|
||||||
if [[ ! -w "${ED}/${libdir}/${tlib}" ]] ; then
|
|
||||||
chmod u+w "${ED}${libdir}/${tlib}" # needed to write to it
|
|
||||||
local nowrite=yes
|
|
||||||
fi
|
|
||||||
install_name_tool \
|
|
||||||
-id "${EPREFIX}"/${libdir}/${tlib} \
|
|
||||||
"${ED}"/${libdir}/${tlib} || die "install_name_tool failed"
|
|
||||||
[[ -n ${nowrite} ]] && chmod u-w "${ED}${libdir}/${tlib}"
|
|
||||||
# Now as we don't use GNU binutils and our linker doesn't
|
|
||||||
# understand linker scripts, just create a symlink.
|
|
||||||
pushd "${ED}/usr/${libdir}" > /dev/null
|
|
||||||
ln -snf "../../${libdir}/${tlib}" "${lib}"
|
|
||||||
popd > /dev/null
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
if ${auto} ; then
|
|
||||||
tlib=$(scanelf -qF'%S#F' "${ED}"/usr/${libdir}/${lib})
|
|
||||||
[[ -z ${tlib} ]] && die "unable to read SONAME from ${lib}"
|
|
||||||
mv "${ED}"/usr/${libdir}/${lib}* "${ED}"/${libdir}/ || die
|
|
||||||
# some SONAMEs are funky: they encode a version before the .so
|
|
||||||
if [[ ${tlib} != ${lib}* ]] ; then
|
|
||||||
mv "${ED}"/usr/${libdir}/${tlib}* "${ED}"/${libdir}/ || die
|
|
||||||
fi
|
|
||||||
rm -f "${ED}"/${libdir}/${lib}
|
|
||||||
else
|
|
||||||
tlib=${lib}
|
|
||||||
fi
|
|
||||||
cat > "${ED}/usr/${libdir}/${lib}" <<-END_LDSCRIPT
|
|
||||||
/* GNU ld script
|
|
||||||
Since Gentoo has critical dynamic libraries in /lib, and the static versions
|
|
||||||
in /usr/lib, we need to have a "fake" dynamic lib in /usr/lib, otherwise we
|
|
||||||
run into linking problems. This "fake" dynamic lib is a linker script that
|
|
||||||
redirects the linker to the real lib. And yes, this works in the cross-
|
|
||||||
compiling scenario as the sysroot-ed linker will prepend the real path.
|
|
||||||
|
|
||||||
See bug https://bugs.gentoo.org/4411 for more info.
|
|
||||||
*/
|
|
||||||
${output_format}
|
|
||||||
GROUP ( ${EPREFIX}/${libdir}/${tlib} )
|
|
||||||
END_LDSCRIPT
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fperms a+x "/usr/${libdir}/${lib}" || die "could not change perms on ${lib}"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# @FUNCTION: tc-get-cxx-stdlib
|
# @FUNCTION: tc-get-cxx-stdlib
|
||||||
# @DESCRIPTION:
|
# @DESCRIPTION:
|
||||||
# Attempt to identify the C++ standard library used by the compiler.
|
# Attempt to identify the C++ standard library used by the compiler.
|
||||||
@ -1291,7 +1156,12 @@ gen_usr_ldscript() {
|
|||||||
#
|
#
|
||||||
# If the library is not recognized, the function returns 1.
|
# If the library is not recognized, the function returns 1.
|
||||||
tc-get-cxx-stdlib() {
|
tc-get-cxx-stdlib() {
|
||||||
local code='#include <ciso646>
|
local code='
|
||||||
|
#if __cplusplus >= 202002L
|
||||||
|
#include <version>
|
||||||
|
#else
|
||||||
|
#include <ciso646>
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_LIBCPP_VERSION)
|
#if defined(_LIBCPP_VERSION)
|
||||||
HAVE_LIBCXX
|
HAVE_LIBCXX
|
||||||
|
Loading…
x
Reference in New Issue
Block a user