summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony G. Basile <blueness@gentoo.org>2016-04-12 20:05:45 -0400
committerAnthony G. Basile <blueness@gentoo.org>2016-04-12 20:05:45 -0400
commit6714d08e2f90e2d372ba4e6571d96dd6b653a764 (patch)
tree823541b3eab688c1dce5bb2dba992d158a041f0f /sys-libs/uclibc-ng
parentqt5-build.eclass: drop 5.4 support (diff)
downloadgentoo-6714d08e2f90e2d372ba4e6571d96dd6b653a764.tar.gz
gentoo-6714d08e2f90e2d372ba4e6571d96dd6b653a764.tar.bz2
gentoo-6714d08e2f90e2d372ba4e6571d96dd6b653a764.zip
sys-libs/uclibc-ng: initial commit
Package-Manager: portage-2.2.26
Diffstat (limited to 'sys-libs/uclibc-ng')
-rw-r--r--sys-libs/uclibc-ng/Manifest1
-rw-r--r--sys-libs/uclibc-ng/files/uclibc-compat.patch12
-rw-r--r--sys-libs/uclibc-ng/metadata.xml20
-rw-r--r--sys-libs/uclibc-ng/uclibc-ng-1.0.13.ebuild403
-rw-r--r--sys-libs/uclibc-ng/uclibc-ng-9999.ebuild403
5 files changed, 839 insertions, 0 deletions
diff --git a/sys-libs/uclibc-ng/Manifest b/sys-libs/uclibc-ng/Manifest
new file mode 100644
index 000000000000..9bef84b87ec0
--- /dev/null
+++ b/sys-libs/uclibc-ng/Manifest
@@ -0,0 +1 @@
+DIST uClibc-ng-1.0.13.tar.bz2 2950676 SHA256 2d3530fa9321022db30c4576b272d8113efb75393f9b43281bd3b014c75bd2d4 SHA512 aae994d06119756161b9a38eeb8b4a0b8531dfaf13094158218cce2500cd02dcac9067160a5a2764d355e1208ee7cda04f4c1ddf7f6812c794f4680c938e9b22 WHIRLPOOL e612f9a152335c9b89fe6e10dcab0ad44978c205da8230597f3ff3b8adee81a95a71dfcec36afc9c0c262fa56d643de47a705840e841363a13b0af2fee686653
diff --git a/sys-libs/uclibc-ng/files/uclibc-compat.patch b/sys-libs/uclibc-ng/files/uclibc-compat.patch
new file mode 100644
index 000000000000..58277561b749
--- /dev/null
+++ b/sys-libs/uclibc-ng/files/uclibc-compat.patch
@@ -0,0 +1,12 @@
+diff -Naur uClibc-ng-1.0.13.orig/ldso/ldso/Makefile.in uClibc-ng-1.0.13/ldso/ldso/Makefile.in
+--- uClibc-ng-1.0.13.orig/ldso/ldso/Makefile.in 2016-03-13 21:48:40.000000000 +0000
++++ uClibc-ng-1.0.13/ldso/ldso/Makefile.in 2016-04-08 13:45:06.837079637 +0000
+@@ -76,8 +76,6 @@
+ $(ldso:.$(ABI_VERSION)=): | $(top_builddir)lib
+ $(ldso:.$(ABI_VERSION)=): $($(UCLIBC_LDSO_NAME)_OUT)/$(UCLIBC_LDSO_NAME)_so.a
+ $(call link.so,$(ldso_FULL_NAME),$(ABI_VERSION))
+- # link for backward compatibility
+- (cd $(top_builddir)lib; ln -sf $(UCLIBC_LDSO_NAME).so.$(ABI_VERSION) $(UCLIBC_LDSO_NAME).so.0 )
+
+ $($(UCLIBC_LDSO_NAME)_OUT)/$(UCLIBC_LDSO_NAME)_so.a: $(ldso-y)
+ $(Q)$(RM) $@
diff --git a/sys-libs/uclibc-ng/metadata.xml b/sys-libs/uclibc-ng/metadata.xml
new file mode 100644
index 000000000000..1e21008dfac2
--- /dev/null
+++ b/sys-libs/uclibc-ng/metadata.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>blueness@gentoo.org</email>
+ <name>Anthony G. Basile</name>
+ </maintainer>
+ <maintainer type="project">
+ <email>embedded@gentoo.org</email>
+ <name>Embedded Gentoo</name>
+ </maintainer>
+ <longdescription>
+ uClibc-ng is a small C library for developing embedded Linux systems. It is much
+ smaller than the GNU C Library, but nearly all applications supported by glibc
+ also work perfectly with uClibc-ng.
+ </longdescription>
+ <use>
+ <flag name="rpc">Enable sun nis/rpc support (you should use libtirpc though)</flag>
+ </use>
+</pkgmetadata>
diff --git a/sys-libs/uclibc-ng/uclibc-ng-1.0.13.ebuild b/sys-libs/uclibc-ng/uclibc-ng-1.0.13.ebuild
new file mode 100644
index 000000000000..aec352394cfe
--- /dev/null
+++ b/sys-libs/uclibc-ng/uclibc-ng-1.0.13.ebuild
@@ -0,0 +1,403 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI="6"
+
+inherit flag-o-matic multilib savedconfig toolchain-funcs versionator
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://uclibc-ng.org/git/uclibc-ng"
+ inherit git-r3
+ MY_P=uclibc-ng-${PV}
+else
+ MY_P=uClibc-ng-${PV}
+fi
+
+DESCRIPTION="C library for developing embedded Linux systems"
+HOMEPAGE="http://www.uclibc.org/"
+if [[ ${PV} != "9999" ]] ; then
+ PATCH_VER=""
+ SRC_URI="http://downloads.uclibc-ng.org/releases/${PV}/${MY_P}.tar.bz2"
+ KEYWORDS="-* ~amd64 ~arm ~mips ~ppc ~x86"
+fi
+
+LICENSE="LGPL-2"
+SLOT="0"
+IUSE="debug hardened iconv ipv6 rpc crosscompile_opts_headers-only"
+RESTRICT="strip"
+
+# 1) We can't upgrade from uclibc to uclibc-ng via a soft blocker since portage
+# will delete the ld.so sym link prematurely and break the system. So we
+# will hard block and give manual migration instructions.
+# 2) Currently uclibc and uclibc-ng's iconv are in bad shape. We've been using
+# the breakout library. The disadvantage here is that we have to sprinkle
+# LDFAGS=-liconv on build systems that need to link against libiconv.
+RDEPEND="
+ !!sys-libs/uclibc
+ iconv? ( dev-libs/libiconv )"
+
+S=${WORKDIR}/${MY_P}
+
+export CBUILD=${CBUILD:-${CHOST}}
+export CTARGET=${CTARGET:-${CHOST}}
+if [[ ${CHOST} == ${CTARGET} ]] ; then
+ if [[ ${CATEGORY} == cross-* ]] ; then
+ export CTARGET=${CATEGORY#cross-}
+ fi
+fi
+
+is_crosscompile() {
+ [[ ${CHOST} != ${CTARGET} ]]
+}
+
+alt_build_kprefix() {
+ if [[ ${CBUILD} == ${CHOST} && ${CHOST} == ${CTARGET} ]] ; then
+ echo /usr/include
+ else
+ echo /usr/${CTARGET}/usr/include
+ fi
+}
+
+just_headers() {
+ use crosscompile_opts_headers-only && is_crosscompile
+}
+
+uclibc_endian() {
+ # XXX: this wont work for a toolchain which is bi-endian, but we
+ # dont have any such thing at the moment, so not a big deal
+ touch "${T}"/endian.s
+ $(tc-getAS ${CTARGET}) "${T}"/endian.s -o "${T}"/endian.o
+ case $(file "${T}"/endian.o) in
+ *" MSB "*) echo "BIG";;
+ *" LSB "*) echo "LITTLE";;
+ *) echo "NFC";;
+ esac
+ rm -f "${T}"/endian.{s,o}
+}
+
+kconfig_q_opt() {
+ local flag=$1; shift
+ case ${flag} in
+ y|n) ;;
+ *) flag=$(usex ${flag} y n) ;;
+ esac
+
+ local var="defs_${flag}"
+ eval "${var}+=( $* )"
+}
+
+get_opt() {
+ (
+ unset ${1}
+ . ${2:-"${S}"/.config}
+ echo ${!1}
+ )
+}
+
+make_oldconfig() {
+ yes "" 2>/dev/null | emake -s oldconfig >/dev/null
+}
+
+make_config() {
+ restore_config .config
+ if [ -f .config ]; then
+ make_oldconfig
+ return 0
+ else
+ ewarn "Could not locate user configfile, so we will save a default one"
+ fi
+
+ emake ARCH=$1 defconfig >/dev/null
+
+ local defs_{y,n}
+
+ # These are forced off
+ defs_n=(
+ DOASSERTS
+ DODEBUG_PT
+ HAS_NO_THREADS
+ PROPOLICE_BLOCK_ABRT
+ SSP_QUICK_CANARY
+ SUPPORT_LD_DEBUG_EARLY
+ UCLIBC_HAS_CTYPE_UNSAFE
+ UCLIBC_HAS_LOCALE
+ UCLIBC_HAS_SSP_COMPAT
+ )
+
+ # These are forced on
+ defs_y=(
+ COMPAT_ATEXIT
+ DO_C99_MATH
+ DO_XSI_MATH
+ FORCE_SHAREABLE_TEXT_SEGMENTS
+ LDSO_GNU_HASH_SUPPORT
+ LDSO_PRELINK_SUPPORT
+ LDSO_PRELOAD_FILE_SUPPORT
+ LDSO_RUNPATH_OF_EXECUTABLE
+ LDSO_STANDALONE_SUPPORT
+ MALLOC_GLIBC_COMPAT
+ PROPOLICE_BLOCK_SEGV
+ PTHREADS_DEBUG_SUPPORT
+ UCLIBC_HAS_ARC4RANDOM
+ UCLIBC_HAS_BACKTRACE
+ UCLIBC_HAS_BSD_RES_CLOSE
+ UCLIBC_HAS_CONTEXT_FUNCS
+ UCLIBC_HAS_CTYPE_CHECKED
+ UCLIBC_HAS_EXTRA_COMPAT_RES_STATE
+ UCLIBC_HAS_FENV
+ UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE
+ UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE
+ UCLIBC_HAS_FOPEN_LARGEFILE_MODE
+ UCLIBC_HAS_FTS
+ UCLIBC_HAS_FTW
+ UCLIBC_HAS_GETPT
+ UCLIBC_HAS_GLIBC_CUSTOM_PRINTF
+ UCLIBC_HAS_GLIBC_CUSTOM_STREAMS
+ UCLIBC_HAS_GNU_GLOB
+ UCLIBC_HAS_HEXADECIMAL_FLOATS
+ UCLIBC_HAS_LIBNSL_STUB
+ UCLIBC_HAS_LIBRESOLV_STUB
+ UCLIBC_HAS_LIBUTIL
+ UCLIBC_HAS_NFTW
+ UCLIBC_HAS_OBSOLETE_BSD_SIGNAL
+ UCLIBC_HAS_OBSTACK
+ UCLIBC_HAS_PRINTF_M_SPEC
+ UCLIBC_HAS_PROGRAM_INVOCATION_NAME
+ UCLIBC_HAS_RESOLVER_SUPPORT
+ UCLIBC_HAS_SHA256_CRYPT_IMPL
+ UCLIBC_HAS_SHA512_CRYPT_IMPL
+ UCLIBC_HAS_SSP
+ UCLIBC_HAS_STUBS
+ UCLIBC_HAS_SYS_ERRLIST
+ UCLIBC_HAS_SYS_SIGLIST
+ UCLIBC_HAS_THREADS_NATIVE
+ UCLIBC_HAS_TZ_FILE_READ_MANY
+ UCLIBC_HAS_UTMP
+ UCLIBC_HAS_UTMPX
+ UCLIBC_HAS_WCHAR
+ UCLIBC_HAS_WORDEXP
+ UCLIBC_NTP_LEGACY
+ UCLIBC_SUPPORT_AI_ADDRCONFIG
+ UCLIBC_SUSV2_LEGACY
+ UCLIBC_SUSV3_LEGACY
+ UCLIBC_SUSV3_LEGACY_MACROS
+ UCLIBC_SUSV4_LEGACY
+ UCLIBC_USE_NETLINK
+ )
+
+ sed -i -e '/ARCH_.*_ENDIAN/d' .config
+ kconfig_q_opt y "ARCH_WANTS_$(uclibc_endian)_ENDIAN"
+
+ kconfig_q_opt debug DODEBUG
+ kconfig_q_opt debug SUPPORT_LD_DEBUG
+ kconfig_q_opt debug UCLIBC_HAS_PROFILING
+
+ kconfig_q_opt ipv6 UCLIBC_HAS_IPV6
+
+ kconfig_q_opt rpc UCLIBC_HAS_RPC
+ kconfig_q_opt rpc UCLIBC_HAS_FULL_RPC
+ kconfig_q_opt rpc UCLIBC_HAS_REENTRANT_RPC
+
+ kconfig_q_opt hardened UCLIBC_BUILD_NOEXECSTACK
+ kconfig_q_opt hardened UCLIBC_BUILD_NOW
+ kconfig_q_opt hardened UCLIBC_BUILD_PIE
+ kconfig_q_opt hardened UCLIBC_BUILD_RELRO
+ kconfig_q_opt hardened UCLIBC_BUILD_SSP
+
+ local count def
+ for count in 1 2 ; do
+ # Run twice as some config opts depend on others being enabled first.
+ for def in ${defs_y[@]} ; do
+ sed -i -e "s|.*\<${def}\>.*set|${def}=y|g" .config
+ done
+ for def in ${defs_n[@]} ; do
+ sed -i -e "s|${def}=y|# ${def} is not set|g" .config
+ done
+ make_oldconfig
+ done
+
+ einfo "Enabled options:"
+ for def in ${defs_y[@]} ; do
+ einfo " " $(grep "^${def}=y" .config || echo "could not find ${def}")
+ done
+ einfo "Disabled options:"
+ for def in ${defs_n[@]} ; do
+ einfo " " $(grep "^# ${def} is not set" .config || echo "could not find ${def}")
+ done
+
+ # setup build and run paths
+ sed -i \
+ -e "/^CROSS_COMPILER_PREFIX/s|=.*|=\"${CTARGET}-\"|" \
+ -e "/^KERNEL_HEADERS/s|=.*|=\"$(alt_build_kprefix)\"|" \
+ -e "/^SHARED_LIB_LOADER_PREFIX/s|=.*|=\"/$(get_libdir)\"|" \
+ -e "/^DEVEL_PREFIX/s|=.*|=\"/usr\"|" \
+ -e "/^RUNTIME_PREFIX/s|=.*|=\"/\"|" \
+ -e "/^UCLIBC_EXTRA_CFLAGS/s|=.*|=\"${UCLIBC_EXTRA_CFLAGS}\"|" \
+ .config || die
+
+ make_oldconfig
+}
+
+pkg_setup() {
+ # Make sure our CHOST is a uclibc toolchain for native compiling
+ if [[ ${CHOST} == ${CTARGET} ]]; then
+ case ${CHOST} in
+ *-uclinux*|*-uclibc*) ;;
+ *) die "Use sys-devel/crossdev to build a uclibc toolchain" ;;
+ esac
+ fi
+
+ # uClibc-ng doesn't carry old Linux threads, and since we force
+ # threading our only choice is NPTL which requires i486 and later.
+ [[ ${CTARGET} == i386* ]] && die "i386 can't support Native Posix Threads (NPTL)."
+}
+
+src_prepare() {
+ local version subversion
+
+ # uclibc-ng tries to create a two sym link with ld.so,
+ # ld-uClibc.so.{0,MAJOR_VERSION} -> ld-uClibc-<version>.so
+ # where MAJOR_VERSION != 0 indicates the ABI verison.
+ # We want to get rid of this and just have ABI = 0.
+ eapply "${FILESDIR}"/uclibc-compat.patch
+
+ # We need to change the major.minor.sublevel of uclibc-ng.
+ # Upstream sets MAJOR_VERSION = 1 which breaks runtime linking.
+ # If we really want the ABI bump, we'll have to hack the gcc
+ # spec file and change the '*link:' rule.
+ version=( $(get_version_components) )
+ if [[ -z ${version[1]} ]]; then
+ subversion=0
+ else
+ if [[ -z ${version[2]} ]]; then
+ subversion=${version[1]}
+ else
+ subversion=${version[1]}.${version[2]}
+ fi
+ fi
+
+ sed -i \
+ -e "/^MAJOR_VERSION/s|:=.*|:= 0|" \
+ -e "/^MINOR_VERSION/s|:=.*|:= ${version[0]}|" \
+ -e "/^SUBLEVEL/s|:=.*|:= ${subversion}|" \
+ Rules.mak || die
+
+ eapply_user
+}
+
+src_configure() {
+ # Map our toolchain arch name to the name expected by uClibc-ng.
+ local target=$(tc-arch)
+ case ${target} in
+ amd64) target="x86_64";;
+ arm) target="arm";;
+ mips) target="mips";;
+ ppc) target="powerpc";;
+ x86) target="i386";;
+ esac
+
+ # Do arch specific configuration by changing the defaults in
+ # extra/Configs/Config.<arch>. If these are not overridden
+ # by an save .config, they will be selected by default.
+
+ # For i386, i486, i586 and i686
+ local cpu
+ if [[ ${target} == "i386" ]]; then
+ [[ ${CTARGET} == i[456]86* ]] && cpu="${CTARGET:1:1}86"
+ sed -i -e "s|default CONFIG_686|default CONFIG_${cpu:-486}|" \
+ extra/Configs/Config.i385 || die
+ fi
+
+ # For arm
+ if [[ ${target} == "arm" ]]; then
+ sed -i -e '/Build for EABI/a \\tdefault y' extra/Configs/Config.arm
+ fi
+
+ # For mips
+ if [[ ${target} == "mips" ]]; then
+ sed -i -e "s|default CONFIG_MIPS_O32_ABI|CONFIG_MIPS_${ABI^[on]}_ABI|" \
+ extra/Configs/Config.mips || die
+ fi
+
+ # We set HOSTCC to the proper tuple rather than just 'gcc'
+ sed -i -e "s|^HOSTCC.*=.*|HOSTCC=$(tc-getBUILD_CC)|" Rules.mak
+
+ make_config ${target}
+
+ einfo
+ einfo "Runtime Prefix: /"
+ einfo "Devel Prefix: /usr"
+ einfo "Kernel Prefix: $(alt_build_kprefix)"
+ einfo "CBUILD: ${CBUILD}"
+ einfo "CHOST: ${CHOST}"
+ einfo "CTARGET: ${CTARGET}"
+ einfo "ABI: ${ABI}"
+ einfo "ENDIAN: $(uclibc_endian)"
+ einfo
+}
+
+src_compile() {
+ emake headers
+ just_headers && return 0
+
+ emake
+ if is_crosscompile ; then
+ emake -C utils hostutils
+ else
+ emake utils
+ fi
+}
+
+src_test() {
+ is_crosscompile && return 0
+
+ # assert test fails on pax/grsec enabled kernels
+ # normal vfork test fails in sandbox (both glibc/uclibc)
+ emake UCLIBC_ONLY=1 check
+}
+
+src_install() {
+ local sysroot=${D}
+ is_crosscompile && sysroot+="/usr/${CTARGET}"
+
+ local target="install"
+ just_headers && target="install_headers"
+ emake DESTDIR="${sysroot}" ${target}
+
+ save_config .config
+
+ # remove files coming from kernel-headers
+ rm -rf "${sysroot}"/usr/include/{linux,asm*}
+
+ # Make sure we install the sys-include symlink so that when
+ # we build a 2nd stage cross-compiler, gcc finds the target
+ # system headers correctly. See gcc/doc/gccinstall.info
+ if is_crosscompile ; then
+ dosym usr/include /usr/${CTARGET}/sys-include
+ if ! just_headers && [[ -n $(get_opt HAVE_SHARED) ]] ; then
+ newbin utils/ldconfig.host ${CTARGET}-ldconfig
+ newbin utils/ldd.host ${CTARGET}-ldd
+ fi
+ return 0
+ fi
+
+ emake DESTDIR="${D}" install_utils
+ dobin extra/scripts/getent
+ dodoc README docs/*.txt
+}
+
+pkg_postinst() {
+ is_crosscompile && return 0
+
+ if [ ! -e "${ROOT}"/etc/TZ ] ; then
+ ewarn "Please remember to set your timezone in /etc/TZ"
+ mkdir -p "${ROOT}"/etc
+ echo "UTC" > "${ROOT}"/etc/TZ
+ fi
+ [ "${ROOT}" != "/" ] && return 0
+ # update cache before reloading init
+ ldconfig
+ # reload init ...
+ /sbin/telinit U 2>/dev/null
+}
diff --git a/sys-libs/uclibc-ng/uclibc-ng-9999.ebuild b/sys-libs/uclibc-ng/uclibc-ng-9999.ebuild
new file mode 100644
index 000000000000..aec352394cfe
--- /dev/null
+++ b/sys-libs/uclibc-ng/uclibc-ng-9999.ebuild
@@ -0,0 +1,403 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI="6"
+
+inherit flag-o-matic multilib savedconfig toolchain-funcs versionator
+
+if [[ ${PV} == "9999" ]] ; then
+ EGIT_REPO_URI="git://uclibc-ng.org/git/uclibc-ng"
+ inherit git-r3
+ MY_P=uclibc-ng-${PV}
+else
+ MY_P=uClibc-ng-${PV}
+fi
+
+DESCRIPTION="C library for developing embedded Linux systems"
+HOMEPAGE="http://www.uclibc.org/"
+if [[ ${PV} != "9999" ]] ; then
+ PATCH_VER=""
+ SRC_URI="http://downloads.uclibc-ng.org/releases/${PV}/${MY_P}.tar.bz2"
+ KEYWORDS="-* ~amd64 ~arm ~mips ~ppc ~x86"
+fi
+
+LICENSE="LGPL-2"
+SLOT="0"
+IUSE="debug hardened iconv ipv6 rpc crosscompile_opts_headers-only"
+RESTRICT="strip"
+
+# 1) We can't upgrade from uclibc to uclibc-ng via a soft blocker since portage
+# will delete the ld.so sym link prematurely and break the system. So we
+# will hard block and give manual migration instructions.
+# 2) Currently uclibc and uclibc-ng's iconv are in bad shape. We've been using
+# the breakout library. The disadvantage here is that we have to sprinkle
+# LDFAGS=-liconv on build systems that need to link against libiconv.
+RDEPEND="
+ !!sys-libs/uclibc
+ iconv? ( dev-libs/libiconv )"
+
+S=${WORKDIR}/${MY_P}
+
+export CBUILD=${CBUILD:-${CHOST}}
+export CTARGET=${CTARGET:-${CHOST}}
+if [[ ${CHOST} == ${CTARGET} ]] ; then
+ if [[ ${CATEGORY} == cross-* ]] ; then
+ export CTARGET=${CATEGORY#cross-}
+ fi
+fi
+
+is_crosscompile() {
+ [[ ${CHOST} != ${CTARGET} ]]
+}
+
+alt_build_kprefix() {
+ if [[ ${CBUILD} == ${CHOST} && ${CHOST} == ${CTARGET} ]] ; then
+ echo /usr/include
+ else
+ echo /usr/${CTARGET}/usr/include
+ fi
+}
+
+just_headers() {
+ use crosscompile_opts_headers-only && is_crosscompile
+}
+
+uclibc_endian() {
+ # XXX: this wont work for a toolchain which is bi-endian, but we
+ # dont have any such thing at the moment, so not a big deal
+ touch "${T}"/endian.s
+ $(tc-getAS ${CTARGET}) "${T}"/endian.s -o "${T}"/endian.o
+ case $(file "${T}"/endian.o) in
+ *" MSB "*) echo "BIG";;
+ *" LSB "*) echo "LITTLE";;
+ *) echo "NFC";;
+ esac
+ rm -f "${T}"/endian.{s,o}
+}
+
+kconfig_q_opt() {
+ local flag=$1; shift
+ case ${flag} in
+ y|n) ;;
+ *) flag=$(usex ${flag} y n) ;;
+ esac
+
+ local var="defs_${flag}"
+ eval "${var}+=( $* )"
+}
+
+get_opt() {
+ (
+ unset ${1}
+ . ${2:-"${S}"/.config}
+ echo ${!1}
+ )
+}
+
+make_oldconfig() {
+ yes "" 2>/dev/null | emake -s oldconfig >/dev/null
+}
+
+make_config() {
+ restore_config .config
+ if [ -f .config ]; then
+ make_oldconfig
+ return 0
+ else
+ ewarn "Could not locate user configfile, so we will save a default one"
+ fi
+
+ emake ARCH=$1 defconfig >/dev/null
+
+ local defs_{y,n}
+
+ # These are forced off
+ defs_n=(
+ DOASSERTS
+ DODEBUG_PT
+ HAS_NO_THREADS
+ PROPOLICE_BLOCK_ABRT
+ SSP_QUICK_CANARY
+ SUPPORT_LD_DEBUG_EARLY
+ UCLIBC_HAS_CTYPE_UNSAFE
+ UCLIBC_HAS_LOCALE
+ UCLIBC_HAS_SSP_COMPAT
+ )
+
+ # These are forced on
+ defs_y=(
+ COMPAT_ATEXIT
+ DO_C99_MATH
+ DO_XSI_MATH
+ FORCE_SHAREABLE_TEXT_SEGMENTS
+ LDSO_GNU_HASH_SUPPORT
+ LDSO_PRELINK_SUPPORT
+ LDSO_PRELOAD_FILE_SUPPORT
+ LDSO_RUNPATH_OF_EXECUTABLE
+ LDSO_STANDALONE_SUPPORT
+ MALLOC_GLIBC_COMPAT
+ PROPOLICE_BLOCK_SEGV
+ PTHREADS_DEBUG_SUPPORT
+ UCLIBC_HAS_ARC4RANDOM
+ UCLIBC_HAS_BACKTRACE
+ UCLIBC_HAS_BSD_RES_CLOSE
+ UCLIBC_HAS_CONTEXT_FUNCS
+ UCLIBC_HAS_CTYPE_CHECKED
+ UCLIBC_HAS_EXTRA_COMPAT_RES_STATE
+ UCLIBC_HAS_FENV
+ UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE
+ UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE
+ UCLIBC_HAS_FOPEN_LARGEFILE_MODE
+ UCLIBC_HAS_FTS
+ UCLIBC_HAS_FTW
+ UCLIBC_HAS_GETPT
+ UCLIBC_HAS_GLIBC_CUSTOM_PRINTF
+ UCLIBC_HAS_GLIBC_CUSTOM_STREAMS
+ UCLIBC_HAS_GNU_GLOB
+ UCLIBC_HAS_HEXADECIMAL_FLOATS
+ UCLIBC_HAS_LIBNSL_STUB
+ UCLIBC_HAS_LIBRESOLV_STUB
+ UCLIBC_HAS_LIBUTIL
+ UCLIBC_HAS_NFTW
+ UCLIBC_HAS_OBSOLETE_BSD_SIGNAL
+ UCLIBC_HAS_OBSTACK
+ UCLIBC_HAS_PRINTF_M_SPEC
+ UCLIBC_HAS_PROGRAM_INVOCATION_NAME
+ UCLIBC_HAS_RESOLVER_SUPPORT
+ UCLIBC_HAS_SHA256_CRYPT_IMPL
+ UCLIBC_HAS_SHA512_CRYPT_IMPL
+ UCLIBC_HAS_SSP
+ UCLIBC_HAS_STUBS
+ UCLIBC_HAS_SYS_ERRLIST
+ UCLIBC_HAS_SYS_SIGLIST
+ UCLIBC_HAS_THREADS_NATIVE
+ UCLIBC_HAS_TZ_FILE_READ_MANY
+ UCLIBC_HAS_UTMP
+ UCLIBC_HAS_UTMPX
+ UCLIBC_HAS_WCHAR
+ UCLIBC_HAS_WORDEXP
+ UCLIBC_NTP_LEGACY
+ UCLIBC_SUPPORT_AI_ADDRCONFIG
+ UCLIBC_SUSV2_LEGACY
+ UCLIBC_SUSV3_LEGACY
+ UCLIBC_SUSV3_LEGACY_MACROS
+ UCLIBC_SUSV4_LEGACY
+ UCLIBC_USE_NETLINK
+ )
+
+ sed -i -e '/ARCH_.*_ENDIAN/d' .config
+ kconfig_q_opt y "ARCH_WANTS_$(uclibc_endian)_ENDIAN"
+
+ kconfig_q_opt debug DODEBUG
+ kconfig_q_opt debug SUPPORT_LD_DEBUG
+ kconfig_q_opt debug UCLIBC_HAS_PROFILING
+
+ kconfig_q_opt ipv6 UCLIBC_HAS_IPV6
+
+ kconfig_q_opt rpc UCLIBC_HAS_RPC
+ kconfig_q_opt rpc UCLIBC_HAS_FULL_RPC
+ kconfig_q_opt rpc UCLIBC_HAS_REENTRANT_RPC
+
+ kconfig_q_opt hardened UCLIBC_BUILD_NOEXECSTACK
+ kconfig_q_opt hardened UCLIBC_BUILD_NOW
+ kconfig_q_opt hardened UCLIBC_BUILD_PIE
+ kconfig_q_opt hardened UCLIBC_BUILD_RELRO
+ kconfig_q_opt hardened UCLIBC_BUILD_SSP
+
+ local count def
+ for count in 1 2 ; do
+ # Run twice as some config opts depend on others being enabled first.
+ for def in ${defs_y[@]} ; do
+ sed -i -e "s|.*\<${def}\>.*set|${def}=y|g" .config
+ done
+ for def in ${defs_n[@]} ; do
+ sed -i -e "s|${def}=y|# ${def} is not set|g" .config
+ done
+ make_oldconfig
+ done
+
+ einfo "Enabled options:"
+ for def in ${defs_y[@]} ; do
+ einfo " " $(grep "^${def}=y" .config || echo "could not find ${def}")
+ done
+ einfo "Disabled options:"
+ for def in ${defs_n[@]} ; do
+ einfo " " $(grep "^# ${def} is not set" .config || echo "could not find ${def}")
+ done
+
+ # setup build and run paths
+ sed -i \
+ -e "/^CROSS_COMPILER_PREFIX/s|=.*|=\"${CTARGET}-\"|" \
+ -e "/^KERNEL_HEADERS/s|=.*|=\"$(alt_build_kprefix)\"|" \
+ -e "/^SHARED_LIB_LOADER_PREFIX/s|=.*|=\"/$(get_libdir)\"|" \
+ -e "/^DEVEL_PREFIX/s|=.*|=\"/usr\"|" \
+ -e "/^RUNTIME_PREFIX/s|=.*|=\"/\"|" \
+ -e "/^UCLIBC_EXTRA_CFLAGS/s|=.*|=\"${UCLIBC_EXTRA_CFLAGS}\"|" \
+ .config || die
+
+ make_oldconfig
+}
+
+pkg_setup() {
+ # Make sure our CHOST is a uclibc toolchain for native compiling
+ if [[ ${CHOST} == ${CTARGET} ]]; then
+ case ${CHOST} in
+ *-uclinux*|*-uclibc*) ;;
+ *) die "Use sys-devel/crossdev to build a uclibc toolchain" ;;
+ esac
+ fi
+
+ # uClibc-ng doesn't carry old Linux threads, and since we force
+ # threading our only choice is NPTL which requires i486 and later.
+ [[ ${CTARGET} == i386* ]] && die "i386 can't support Native Posix Threads (NPTL)."
+}
+
+src_prepare() {
+ local version subversion
+
+ # uclibc-ng tries to create a two sym link with ld.so,
+ # ld-uClibc.so.{0,MAJOR_VERSION} -> ld-uClibc-<version>.so
+ # where MAJOR_VERSION != 0 indicates the ABI verison.
+ # We want to get rid of this and just have ABI = 0.
+ eapply "${FILESDIR}"/uclibc-compat.patch
+
+ # We need to change the major.minor.sublevel of uclibc-ng.
+ # Upstream sets MAJOR_VERSION = 1 which breaks runtime linking.
+ # If we really want the ABI bump, we'll have to hack the gcc
+ # spec file and change the '*link:' rule.
+ version=( $(get_version_components) )
+ if [[ -z ${version[1]} ]]; then
+ subversion=0
+ else
+ if [[ -z ${version[2]} ]]; then
+ subversion=${version[1]}
+ else
+ subversion=${version[1]}.${version[2]}
+ fi
+ fi
+
+ sed -i \
+ -e "/^MAJOR_VERSION/s|:=.*|:= 0|" \
+ -e "/^MINOR_VERSION/s|:=.*|:= ${version[0]}|" \
+ -e "/^SUBLEVEL/s|:=.*|:= ${subversion}|" \
+ Rules.mak || die
+
+ eapply_user
+}
+
+src_configure() {
+ # Map our toolchain arch name to the name expected by uClibc-ng.
+ local target=$(tc-arch)
+ case ${target} in
+ amd64) target="x86_64";;
+ arm) target="arm";;
+ mips) target="mips";;
+ ppc) target="powerpc";;
+ x86) target="i386";;
+ esac
+
+ # Do arch specific configuration by changing the defaults in
+ # extra/Configs/Config.<arch>. If these are not overridden
+ # by an save .config, they will be selected by default.
+
+ # For i386, i486, i586 and i686
+ local cpu
+ if [[ ${target} == "i386" ]]; then
+ [[ ${CTARGET} == i[456]86* ]] && cpu="${CTARGET:1:1}86"
+ sed -i -e "s|default CONFIG_686|default CONFIG_${cpu:-486}|" \
+ extra/Configs/Config.i385 || die
+ fi
+
+ # For arm
+ if [[ ${target} == "arm" ]]; then
+ sed -i -e '/Build for EABI/a \\tdefault y' extra/Configs/Config.arm
+ fi
+
+ # For mips
+ if [[ ${target} == "mips" ]]; then
+ sed -i -e "s|default CONFIG_MIPS_O32_ABI|CONFIG_MIPS_${ABI^[on]}_ABI|" \
+ extra/Configs/Config.mips || die
+ fi
+
+ # We set HOSTCC to the proper tuple rather than just 'gcc'
+ sed -i -e "s|^HOSTCC.*=.*|HOSTCC=$(tc-getBUILD_CC)|" Rules.mak
+
+ make_config ${target}
+
+ einfo
+ einfo "Runtime Prefix: /"
+ einfo "Devel Prefix: /usr"
+ einfo "Kernel Prefix: $(alt_build_kprefix)"
+ einfo "CBUILD: ${CBUILD}"
+ einfo "CHOST: ${CHOST}"
+ einfo "CTARGET: ${CTARGET}"
+ einfo "ABI: ${ABI}"
+ einfo "ENDIAN: $(uclibc_endian)"
+ einfo
+}
+
+src_compile() {
+ emake headers
+ just_headers && return 0
+
+ emake
+ if is_crosscompile ; then
+ emake -C utils hostutils
+ else
+ emake utils
+ fi
+}
+
+src_test() {
+ is_crosscompile && return 0
+
+ # assert test fails on pax/grsec enabled kernels
+ # normal vfork test fails in sandbox (both glibc/uclibc)
+ emake UCLIBC_ONLY=1 check
+}
+
+src_install() {
+ local sysroot=${D}
+ is_crosscompile && sysroot+="/usr/${CTARGET}"
+
+ local target="install"
+ just_headers && target="install_headers"
+ emake DESTDIR="${sysroot}" ${target}
+
+ save_config .config
+
+ # remove files coming from kernel-headers
+ rm -rf "${sysroot}"/usr/include/{linux,asm*}
+
+ # Make sure we install the sys-include symlink so that when
+ # we build a 2nd stage cross-compiler, gcc finds the target
+ # system headers correctly. See gcc/doc/gccinstall.info
+ if is_crosscompile ; then
+ dosym usr/include /usr/${CTARGET}/sys-include
+ if ! just_headers && [[ -n $(get_opt HAVE_SHARED) ]] ; then
+ newbin utils/ldconfig.host ${CTARGET}-ldconfig
+ newbin utils/ldd.host ${CTARGET}-ldd
+ fi
+ return 0
+ fi
+
+ emake DESTDIR="${D}" install_utils
+ dobin extra/scripts/getent
+ dodoc README docs/*.txt
+}
+
+pkg_postinst() {
+ is_crosscompile && return 0
+
+ if [ ! -e "${ROOT}"/etc/TZ ] ; then
+ ewarn "Please remember to set your timezone in /etc/TZ"
+ mkdir -p "${ROOT}"/etc
+ echo "UTC" > "${ROOT}"/etc/TZ
+ fi
+ [ "${ROOT}" != "/" ] && return 0
+ # update cache before reloading init
+ ldconfig
+ # reload init ...
+ /sbin/telinit U 2>/dev/null
+}