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/netbsd-csu/netbsd-csu-9.0_beta.ebuild

141 lines
3.4 KiB

# Copyright 1999-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=7
inherit flag-o-matic multilib-minimal toolchain-funcs
DESCRIPTION="crtbegin.o/crtend.o from NetBSD CSU for GCC-free toolchain"
HOMEPAGE="http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/csu/"
SRC_URI="https://dev.gentoo.org/~mgorny/dist/${P}.tar.xz
test? ( https://dev.gentoo.org/~mgorny/dist/netbsd-csu-7.1-tests.tar.bz2 )"
LICENSE="BSD-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="test"
RESTRICT="!test? ( test )"
BDEPEND="app-arch/xz-utils
virtual/pmake
test? ( sys-devel/clang )"
S=${WORKDIR}/${P}/lib/csu
src_prepare() {
default
multilib_copy_sources
}
multilib_src_compile() {
local inc_arch=${ABI:-${ARCH}}
# rewrite ARCH to match NetBSD includes
case "${inc_arch}" in
x86) inc_arch=i386;;
# x32 seems to be equivalent to amd64 as far as we're concerned
x32) inc_arch=amd64;;
arm64) inc_arch=aarch64;;
esac
# we need arch-specific headers for some assembler macros
if [[ ! -d ${WORKDIR}/${P}/sys/arch/${inc_arch} ]]; then
die "Unexpected ABI/ARCH: ${inc_arch}, please report"
fi
ln -s "${WORKDIR}/${P}/sys/arch/${inc_arch}/include" common/machine || die
local opts=(
CC="$(tc-getCC)"
OBJCOPY="$(tc-getOBJCOPY)"
MKPIC=yes
MKSTRIPIDENT=no
)
# rewrite MACHINE_ARCH to match names used in CSU
case "${inc_arch}" in
amd64) opts+=( MACHINE_ARCH=x86_64 );;
*) opts+=( MACHINE_ARCH="${inc_arch}" );;
esac
# we only need those files; crt1 and friends are provided by libc
opts+=( crtbegin.o crtbeginS.o crtend.o )
bmake ${MAKEOPTS} "${opts[@]}" ${EXTRA_EMAKE} || die
ln -s crtbegin.o crtbeginT.o || die
ln -s crtend.o crtendS.o || die
}
multilib_src_test() {
cd "${WORKDIR}"/*-tests || die
# TODO: fix gcc support
local -x CC=${CHOST}-clang
local -x CXX=${CHOST}-clang++
strip-unsupported-flags
local cc=(
# -B sets prefix for internal gcc/clang file lookup
"${CC}" -B"${BUILD_DIR}"
)
# 1. figure out the correct location for crt* files
if tc-is-gcc; then
# gcc requires crt*.o in multi-dir
local multidir=$("${cc[@]}" -print-multi-directory)
if [[ ${multidir} != . ]]; then
ln -s . "${multidir}" || die
fi
elif tc-is-clang; then
# clang is entirely happy with crt*.o in -B
:
else
eerror "Unsupported compiler for tests ($(tc-getCC))"
return
fi
# 2. verify that the compiler can use our crtbegin/crtend
local crtbegin=$("${cc[@]}" -print-file-name=crtbegin.o) || die
local crtend=$("${cc[@]}" -print-file-name=crtend.o) || die
if [[ ! ${crtbegin} -ef ${BUILD_DIR}/crtbegin.o ]]; then
die "Compiler uses wrong crtbegin: ${crtbegin}"
fi
if [[ ! ${crtend} -ef ${BUILD_DIR}/crtend.o ]]; then
die "Compiler uses wrong crtend: ${crtend}"
fi
# 3. build and run the tests
emake CC="${cc[*]}"
local p out exp
for p in ./hello{,-static,-dyn}; do
if [[ ${p} == ./hello-dyn && ${ABI} == x32 ]]; then
einfo "Skipping ${p} on x32 -- known to crash"
continue
fi
ebegin "Testing ${p}"
exp='ctor:main:dtor'
[[ ${p} == ./hello-dyn ]] && exp=libctor:${exp}:libdtor
if ! out=$("${p}"); then
eend 1
die "Test ${p} crashed for ${ABI:-${ARCH}}"
fi
[[ ${out} == ${exp} ]]
if ! eend "${?}"; then
eerror " Expected: ${exp}"
eerror " Output : ${out}"
die "Test ${p} failed for ${ABI:-${ARCH}}"
fi
done
emake clean
}
multilib_src_install() {
dolib.a crtbegin.o crtbeginS.o crtend.o
dosym crtbegin.o "/usr/$(get_libdir)/crtbeginT.o"
dosym crtend.o "/usr/$(get_libdir)/crtendS.o"
}