summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2021-11-10 03:31:26 +0000
committerSam James <sam@gentoo.org>2021-11-10 03:32:25 +0000
commita4957cb794dce725b4801ee16a36f38526bdce2d (patch)
treef593d38683c141b82ab488f9134e68316c2bcf32 /sys-libs/musl
parentsys-libs/ncurses: add 6.3_p20211106 (unkeyworded; for cross/bootstrap testing) (diff)
downloadgentoo-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/musl')
-rw-r--r--sys-libs/musl/musl-1.2.2-r4.ebuild167
-rw-r--r--sys-libs/musl/musl-9999.ebuild20
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 /