diff options
author | Sam James <sam@gentoo.org> | 2021-11-10 03:31:26 +0000 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2021-11-10 03:32:25 +0000 |
commit | a4957cb794dce725b4801ee16a36f38526bdce2d (patch) | |
tree | f593d38683c141b82ab488f9134e68316c2bcf32 /sys-libs | |
parent | sys-libs/ncurses: add 6.3_p20211106 (unkeyworded; for cross/bootstrap testing) (diff) | |
download | gentoo-a4957cb794dce725b4801ee16a36f38526bdce2d.tar.gz gentoo-a4957cb794dce725b4801ee16a36f38526bdce2d.tar.bz2 gentoo-a4957cb794dce725b4801ee16a36f38526bdce2d.zip |
sys-libs/musl: create relative symlink to libc.so if existing one fails
The build system seems to create an absolute symlink to libc.so on
the host which may not exist.
If it doesn't (to avoid being disruptive, we could do this unconditionally),
create a new one relative within ${D} to facilitate SYSROOT installs.
I've hit this a few times when using crossdev but finally dug into it
a bit more.
Bug: https://bugs.gentoo.org/732482
Signed-off-by: Sam James <sam@gentoo.org>
Diffstat (limited to 'sys-libs')
-rw-r--r-- | sys-libs/musl/musl-1.2.2-r4.ebuild | 167 | ||||
-rw-r--r-- | sys-libs/musl/musl-9999.ebuild | 20 |
2 files changed, 185 insertions, 2 deletions
diff --git a/sys-libs/musl/musl-1.2.2-r4.ebuild b/sys-libs/musl/musl-1.2.2-r4.ebuild new file mode 100644 index 000000000000..0fe2c8c9a67b --- /dev/null +++ b/sys-libs/musl/musl-1.2.2-r4.ebuild @@ -0,0 +1,167 @@ +# Copyright 1999-2021 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +inherit eapi8-dosym flag-o-matic toolchain-funcs +if [[ ${PV} == "9999" ]] ; then + EGIT_REPO_URI="git://git.musl-libc.org/musl" + inherit git-r3 +else + SRC_URI="http://www.musl-libc.org/releases/${P}.tar.gz" + KEYWORDS="-* ~amd64 ~arm ~arm64 ~mips ~ppc ~ppc64 ~x86" +fi +GETENT_COMMIT="93a08815f8598db442d8b766b463d0150ed8e2ab" +GETENT_FILE="musl-getent-${GETENT_COMMIT}.c" +SRC_URI+=" + https://dev.gentoo.org/~blueness/musl-misc/getconf.c + https://gitlab.alpinelinux.org/alpine/aports/-/raw/${GETENT_COMMIT}/main/musl/getent.c -> ${GETENT_FILE} + https://dev.gentoo.org/~blueness/musl-misc/iconv.c +" + +export CBUILD=${CBUILD:-${CHOST}} +export CTARGET=${CTARGET:-${CHOST}} +if [[ ${CTARGET} == ${CHOST} ]] ; then + if [[ ${CATEGORY} == cross-* ]] ; then + export CTARGET=${CATEGORY#cross-} + fi +fi + +DESCRIPTION="Light, fast and simple C library focused on standards-conformance and safety" +HOMEPAGE="https://musl.libc.org" +LICENSE="MIT LGPL-2 GPL-2" +SLOT="0" +IUSE="headers-only" + +QA_SONAME="/usr/lib/libc.so" +QA_DT_NEEDED="/usr/lib/libc.so" + +is_crosscompile() { + [[ ${CHOST} != ${CTARGET} ]] +} + +just_headers() { + use headers-only && is_crosscompile +} + +pkg_setup() { + if [ ${CTARGET} == ${CHOST} ] ; then + case ${CHOST} in + *-musl*) ;; + *) die "Use sys-devel/crossdev to build a musl toolchain" ;; + esac + fi + + # fix for #667126, copied from glibc ebuild + # make sure host make.conf doesn't pollute us + if is_crosscompile || tc-is-cross-compiler ; then + CHOST=${CTARGET} strip-unsupported-flags + fi +} + +src_unpack() { + if [[ ${PV} == 9999 ]]; then + git-r3_src_unpack + else + unpack "${P}.tar.gz" + fi + mkdir misc || die + cp "${DISTDIR}"/getconf.c misc/getconf.c || die + cp "${DISTDIR}/${GETENT_FILE}" misc/getent.c || die + cp "${DISTDIR}"/iconv.c misc/iconv.c || die +} + +src_prepare() { + default + + # Expand gethostid instead of being just a stub + eapply "${FILESDIR}/${PN}-1.2.2-gethostid.patch" +} + +src_configure() { + tc-getCC ${CTARGET} + just_headers && export CC=true + + local sysroot + is_crosscompile && sysroot="${EPREFIX}"/usr/${CTARGET} + ./configure \ + --target=${CTARGET} \ + --prefix=${sysroot}/usr \ + --syslibdir=${sysroot}/lib \ + --disable-gcc-wrapper || die +} + +src_compile() { + emake obj/include/bits/alltypes.h + just_headers && return 0 + + emake + if [[ ${CATEGORY} != cross-* ]] ; then + emake -C "${T}" getconf getent iconv \ + CC="$(tc-getCC)" \ + CFLAGS="${CFLAGS}" \ + CPPFLAGS="${CPPFLAGS}" \ + LDFLAGS="${LDFLAGS}" \ + VPATH="${WORKDIR}/misc" + fi + + $(tc-getCC) ${CFLAGS} -c -o libssp_nonshared.o "${FILESDIR}"/stack_chk_fail_local.c || die + $(tc-getAR) -rcs libssp_nonshared.a libssp_nonshared.o || die +} + +src_install() { + local target="install" + just_headers && target="install-headers" + emake DESTDIR="${D}" ${target} + just_headers && return 0 + + # musl provides ldd via a sym link to its ld.so + local sysroot + is_crosscompile && sysroot=/usr/${CTARGET} + local ldso=$(basename "${D}"${sysroot}/lib/ld-musl-*) + dosym ${sysroot}/lib/${ldso} ${sysroot}/usr/bin/ldd + + if [[ ${CATEGORY} != cross-* ]] ; then + # Fish out of config: + # ARCH = ... + # SUBARCH = ... + # and print $(ARCH)$(SUBARCH). + local arch=$(awk '{ k[$1] = $3 } END { printf("%s%s", k["ARCH"], k["SUBARCH"]); }' config.mak) + + if [[ ! -e "${D}"/lib/ld-musl-${arch}.so.1 ]] ; then + # During cross (using crossdev), when emerging sys-libs/musl, + # if /usr/lib/libc.so.1 doesn't exist on the system, installation + # would fail. + # + # The musl build system seems to create a symlink: + # ${D}/lib/ld-musl-${arch}.so.1 -> /usr/lib/libc.so.1 (absolute) + # During cross, there's no guarantee that the host is using musl + # so that file may not exist. Use a relative symlink within ${D} + # instead. + dosym8 -r /usr/lib/libc.so.1 /lib/ld-musl-${arch}.so.1 + + # If it's still a dead symlnk, OK, we really do need to abort. + [[ -e "${D}"/lib/ld-musl-${arch}.so.1 ]] || die + fi + + cp "${FILESDIR}"/ldconfig.in "${T}" || die + sed -e "s|@@ARCH@@|${arch}|" "${T}"/ldconfig.in > "${T}"/ldconfig || die + into / + dosbin "${T}"/ldconfig + into /usr + dobin "${T}"/getconf + dobin "${T}"/getent + dobin "${T}"/iconv + echo 'LDPATH="include ld.so.conf.d/*.conf"' > "${T}"/00musl || die + doenvd "${T}"/00musl + dolib.a libssp_nonshared.a + fi +} + +pkg_postinst() { + is_crosscompile && return 0 + + [ "${ROOT}" != "/" ] && return 0 + + ldconfig || die +} diff --git a/sys-libs/musl/musl-9999.ebuild b/sys-libs/musl/musl-9999.ebuild index 56a2bbbc42f6..5736eadc0fb4 100644 --- a/sys-libs/musl/musl-9999.ebuild +++ b/sys-libs/musl/musl-9999.ebuild @@ -3,7 +3,7 @@ EAPI=7 -inherit flag-o-matic toolchain-funcs +inherit eapi8-dosym flag-o-matic toolchain-funcs if [[ ${PV} == "9999" ]] ; then EGIT_REPO_URI="git://git.musl-libc.org/musl" inherit git-r3 @@ -120,7 +120,23 @@ src_install() { # SUBARCH = ... # and print $(ARCH)$(SUBARCH). local arch=$(awk '{ k[$1] = $3 } END { printf("%s%s", k["ARCH"], k["SUBARCH"]); }' config.mak) - [[ -e "${D}"/lib/ld-musl-${arch}.so.1 ]] || die + + if [[ ! -e "${D}"/lib/ld-musl-${arch}.so.1 ]] ; then + # During cross (using crossdev), when emerging sys-libs/musl, + # if /usr/lib/libc.so.1 doesn't exist on the system, installation + # would fail. + # + # The musl build system seems to create a symlink: + # ${D}/lib/ld-musl-${arch}.so.1 -> /usr/lib/libc.so.1 (absolute) + # During cross, there's no guarantee that the host is using musl + # so that file may not exist. Use a relative symlink within ${D} + # instead. + dosym8 -r /usr/lib/libc.so.1 /lib/ld-musl-${arch}.so.1 + + # If it's still a dead symlnk, OK, we really do need to abort. + [[ -e "${D}"/lib/ld-musl-${arch}.so.1 ]] || die + fi + cp "${FILESDIR}"/ldconfig.in "${T}" || die sed -e "s|@@ARCH@@|${arch}|" "${T}"/ldconfig.in > "${T}"/ldconfig || die into / |