You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/sys-libs/musl/musl-9999.ebuild

203 lines
5.6 KiB

# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit crossdev flag-o-matic toolchain-funcs prefix
DESCRIPTION="Light, fast and, simple C library focused on standards-conformance and safety"
HOMEPAGE="https://musl.libc.org"
if [[ ${PV} == 9999 ]] ; then
EGIT_REPO_URI="https://git.musl-libc.org/git/musl"
inherit git-r3
else
VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/musl.asc
inherit verify-sig
SRC_URI="https://musl.libc.org/releases/${P}.tar.gz"
SRC_URI+=" verify-sig? ( https://musl.libc.org/releases/${P}.tar.gz.asc )"
KEYWORDS="-* ~amd64 ~arm ~arm64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~x86"
BDEPEND="verify-sig? ( sec-keys/openpgp-keys-musl )"
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
"
LICENSE="MIT LGPL-2 GPL-2"
SLOT="0"
IUSE="crypt headers-only split-usr"
QA_SONAME="usr/lib/libc.so"
QA_DT_NEEDED="usr/lib/libc.so"
# bug #830213
QA_PRESTRIPPED="usr/lib/crtn.o"
# We want crypt on by default for this as sys-libs/libxcrypt isn't (yet?)
# built as part as crossdev. Also, elide the blockers when in cross-*,
# as it doesn't make sense to block the normal CBUILD libxcrypt at all
# there when we're installing into /usr/${CHOST} anyway.
if is_crosspkg ; then
IUSE="${IUSE/crypt/+crypt}"
else
RDEPEND="crypt? ( !sys-libs/libxcrypt[system] )"
PDEPEND="!crypt? ( sys-libs/libxcrypt[system] )"
fi
just_headers() {
use headers-only && target_is_not_host
}
pkg_setup() {
if [ ${CTARGET} == ${CHOST} ] ; then
case ${CHOST} in
*-musl*) ;;
*) die "Use sys-devel/crossdev to build a musl toolchain" ;;
esac
fi
# Fix for bug #667126, copied from glibc ebuild:
# make sure host make.conf doesn't pollute us
if target_is_not_host || tc-is-cross-compiler ; then
CHOST=${CTARGET} strip-unsupported-flags
fi
}
src_unpack() {
if [[ ${PV} == 9999 ]] ; then
git-r3_src_unpack
elif use verify-sig ; then
# We only verify the release; not the additional (fixed, safe) files
# we download.
# (Seem to get IPC error on verifying in cross?)
! target_is_not_host && verify-sig_verify_detached "${DISTDIR}"/${P}.tar.gz{,.asc}
fi
default
}
src_prepare() {
default
mkdir "${WORKDIR}"/misc || die
cp "${DISTDIR}"/getconf.c "${WORKDIR}"/misc/getconf.c || die
cp "${DISTDIR}/${GETENT_FILE}" "${WORKDIR}"/misc/getent.c || die
cp "${DISTDIR}"/iconv.c "${WORKDIR}"/misc/iconv.c || die
}
src_configure() {
strip-flags && filter-lto # Prevent issues caused by aggressive optimizations & bug #877343
tc-getCC ${CTARGET}
just_headers && export CC=true
local sysroot
target_is_not_host && sysroot=/usr/${CTARGET}
./configure \
--target=${CTARGET} \
--prefix="${EPREFIX}${sysroot}/usr" \
--syslibdir="${EPREFIX}${sysroot}/lib" \
--disable-gcc-wrapper || die
}
src_compile() {
emake obj/include/bits/alltypes.h
just_headers && return 0
emake
if ! is_crosspkg ; then
emake -C "${T}" getconf getent iconv \
CC="$(tc-getCC)" \
CFLAGS="${CFLAGS}" \
CPPFLAGS="${CPPFLAGS}" \
LDFLAGS="${LDFLAGS}" \
VPATH="${WORKDIR}/misc"
fi
$(tc-getCC) ${CPPFLAGS} ${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=
target_is_not_host && sysroot=/usr/${CTARGET}
local ldso=$(basename "${ED}${sysroot}"/lib/ld-musl-*)
dosym -r "${sysroot}/lib/${ldso}" "${sysroot}/usr/bin/ldd"
if ! use crypt ; then
# Allow sys-libs/libxcrypt[system] to provide it instead
rm "${ED}/usr/include/crypt.h" || die
rm "${ED}/usr/$(get_libdir)/libcrypt.a" || die
fi
if ! is_crosspkg ; 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)
# The musl build system seems to create a symlink:
# ${D}/lib/ld-musl-${arch}.so.1 -> /usr/lib/libc.so.1 (absolute)
# During cross or within prefix, there's no guarantee that the host is
# using musl so that file may not exist. Use a relative symlink within
# ${D} instead.
rm "${ED}"/lib/ld-musl-${arch}.so.1 || die
if use split-usr; then
dosym ../usr/lib/libc.so /lib/ld-musl-${arch}.so.1
# If it's still a dead symlink, OK, we really do need to abort.
[[ -e "${ED}"/lib/ld-musl-${arch}.so.1 ]] || die
else
dosym libc.so /usr/lib/ld-musl-${arch}.so.1
[[ -e "${ED}"/usr/lib/ld-musl-${arch}.so.1 ]] || die
fi
cp "${FILESDIR}"/ldconfig.in-r3 "${T}"/ldconfig.in || die
sed -e "s|@@ARCH@@|${arch}|" "${T}"/ldconfig.in > "${T}"/ldconfig || die
eprefixify "${T}"/ldconfig
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
fi
if target_is_not_host ; then
into /usr/${CTARGET}
dolib.a libssp_nonshared.a
else
dolib.a libssp_nonshared.a
fi
}
pkg_preinst() {
# Nothing to do if just installing headers
just_headers && return
# Prepare /etc/ld.so.conf.d/ for files
mkdir -p "${EROOT}"/etc/ld.so.conf.d
}
pkg_postinst() {
target_is_not_host && return 0
[[ -n "${ROOT}" ]] && return 0
ldconfig || die
}