mirror of
https://github.com/flatcar/scripts.git
synced 2025-10-03 03:21:43 +02:00
eclass/sysroot: Sync with Gentoo
It's from Gentoo commit 68f87a7fe8498f8fd45fef8817e5de596d302cdf. Signed-off-by: Mathieu Tortuyaux <mtortuyaux@microsoft.com>
This commit is contained in:
parent
9c671a3447
commit
94f7244f0d
@ -7,7 +7,11 @@
|
||||
# @AUTHOR:
|
||||
# James Le Cuirot <chewi@gentoo.org>
|
||||
# @SUPPORTED_EAPIS: 7 8
|
||||
# @BLURB: Common functions for using a different sysroot (e.g. cross-compiling)
|
||||
# @BLURB: Common functions for using a different (sys)root
|
||||
# @DESCRIPTION:
|
||||
# This eclass provides common functions to run executables within a different
|
||||
# root or sysroot, with or without emulation by QEMU. Despite the name, these
|
||||
# functions can be used in src_* or pkg_* phase functions.
|
||||
|
||||
case ${EAPI} in
|
||||
7|8) ;;
|
||||
@ -39,7 +43,7 @@ qemu_arch() {
|
||||
|
||||
# @FUNCTION: sysroot_make_run_prefixed
|
||||
# @DESCRIPTION:
|
||||
# Create a wrapper script for directly running executables within a sysroot
|
||||
# Create a wrapper script for directly running executables within a (sys)root
|
||||
# without changing the root directory. The path to that script is returned. If
|
||||
# no sysroot has been set, then this function returns unsuccessfully.
|
||||
#
|
||||
@ -48,19 +52,38 @@ qemu_arch() {
|
||||
# environment if binfmt_misc has been used with the F flag. It is not feasible
|
||||
# to add a conditional dependency on QEMU.
|
||||
sysroot_make_run_prefixed() {
|
||||
local QEMU_ARCH=$(qemu_arch) SCRIPT MYROOT MYEROOT LIBGCC
|
||||
|
||||
if [[ ${EBUILD_PHASE_FUNC} == src_* ]]; then
|
||||
[[ -z ${SYSROOT} ]] && return 1
|
||||
SCRIPT="${T}"/sysroot-run-prefixed
|
||||
MYROOT=${SYSROOT}
|
||||
MYEROOT=${ESYSROOT}
|
||||
|
||||
local SCRIPT="${T}"/sysroot-run-prefixed
|
||||
local QEMU_ARCH=$(qemu_arch)
|
||||
# Both methods below might need help to find GCC's libs. GCC might not
|
||||
# be installed in the SYSROOT. Note that Clang supports this flag too.
|
||||
LIBGCC=$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -print-libgcc-file-name)
|
||||
LIBGCC=${LIBGCC%/*}
|
||||
else
|
||||
[[ -z ${ROOT} ]] && return 1
|
||||
SCRIPT="${T}"/root-run-prefixed
|
||||
MYROOT=${ROOT}
|
||||
MYEROOT=${EROOT}
|
||||
|
||||
# Both methods below might need help to find GCC's libraries. GCC might not
|
||||
# even be installed in the SYSROOT. Note that Clang supports this flag too.
|
||||
local LIBGCC=$($(tc-getCC) ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} -print-libgcc-file-name)
|
||||
# Both methods below might need help to find GCC's libs. libc++ systems
|
||||
# won't have this file, but it's not needed in that case.
|
||||
if [[ -f ${EROOT}/etc/ld.so.conf.d/05gcc-${CHOST}.conf ]]; then
|
||||
local LIBGCC_A
|
||||
mapfile -t LIBGCC_A < "${EROOT}/etc/ld.so.conf.d/05gcc-${CHOST}.conf"
|
||||
LIBGCC=$(printf "%s:" "${LIBGCC_A[@]/#/${ROOT}}")
|
||||
LIBGCC=${LIBGCC%:}
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ ${QEMU_ARCH} == $(qemu_arch "${CBUILD}") ]]; then
|
||||
# glibc: ld.so is a symlink, ldd is a binary.
|
||||
# musl: ld.so doesn't exist, ldd is a symlink.
|
||||
local DLINKER=$(find "${ESYSROOT}"/usr/bin/{ld.so,ldd} -type l -print -quit 2>/dev/null || die "failed to find dynamic linker")
|
||||
local DLINKER=$(find "${MYEROOT}"/usr/bin/{ld.so,ldd} -type l -print -quit 2>/dev/null || die "failed to find dynamic linker")
|
||||
|
||||
# musl symlinks ldd to ld-musl.so to libc.so. We want the ld-musl.so
|
||||
# path, not the libc.so path, so don't resolve the symlinks entirely.
|
||||
@ -70,16 +93,29 @@ sysroot_make_run_prefixed() {
|
||||
# adjust RUNPATHs, but it is probably good enough.
|
||||
install -m0755 /dev/stdin "${SCRIPT}" <<-EOF || die
|
||||
#!/bin/sh
|
||||
LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}\${LD_LIBRARY_PATH+:}${LIBGCC%/*}:${ESYSROOT}/$(get_libdir):${ESYSROOT}/usr/$(get_libdir)" exec "${DLINKER}" "\${@}"
|
||||
LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}\${LD_LIBRARY_PATH+:}${LIBGCC}:${MYEROOT}/$(get_libdir):${MYEROOT}/usr/$(get_libdir)" exec "${DLINKER}" "\${@}"
|
||||
EOF
|
||||
else
|
||||
# Use QEMU's environment variables rather than its command line
|
||||
# arguments to cover both explicit and implicit QEMU usage.
|
||||
install -m0755 /dev/stdin "${SCRIPT}" <<-EOF || die
|
||||
#!/bin/sh
|
||||
QEMU_SET_ENV="\${QEMU_SET_ENV}\${QEMU_SET_ENV+,}LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}\${LD_LIBRARY_PATH+:}${LIBGCC%/*}" QEMU_LD_PREFIX="${SYSROOT}" exec $(type -P "qemu-${QEMU_ARCH}") "\${@}"
|
||||
QEMU_SET_ENV="\${QEMU_SET_ENV}\${QEMU_SET_ENV+,}LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}\${LD_LIBRARY_PATH+:}${LIBGCC}" QEMU_LD_PREFIX="${MYROOT}" exec $(type -P "qemu-${QEMU_ARCH}") "\${@}"
|
||||
EOF
|
||||
fi
|
||||
|
||||
echo "${SCRIPT}"
|
||||
}
|
||||
|
||||
# @FUNCTION: sysroot_run_prefixed
|
||||
# @DESCRIPTION:
|
||||
# Create a wrapper script with sysroot_make_run_prefixed if necessary, and use
|
||||
# it to execute the given command, otherwise just execute the command directly.
|
||||
sysroot_run_prefixed() {
|
||||
local script
|
||||
if script=$(sysroot_make_run_prefixed); then
|
||||
"${script}" "${@}"
|
||||
else
|
||||
"${@}"
|
||||
fi
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user