summaryrefslogtreecommitdiff
blob: 7c515090def609787be36e57324a834df1b1da46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

inherit eutils linux-info multilib toolchain-funcs linux-mod

DESCRIPTION="A minimal libc subset for use with initramfs."
HOMEPAGE="http://www.zytor.com/mailman/listinfo/klibc"
SRC_URI="ftp://ftp.kernel.org/pub/linux/libs/klibc/${P}.tar.bz2
	ftp://ftp.kernel.org/pub/linux/libs/klibc/Testing/${P}.tar.bz2"

LICENSE="|| ( GPL-2 LGPL-2 )"
KEYWORDS="~amd64 -mips ~ppc ~x86 ~sparc"
SLOT="0"
IUSE="debug n32"

DEPEND="dev-lang/perl
	virtual/linux-sources"
RDEPEND="dev-lang/perl"

# Klibc has no PT_GNU_STACK support, so scanning for execstacks is moot
QA_EXECSTACK="*"

src_unpack() {
	unpack ${A}
	cd "${S}"

	# Symlink /usr/src/linux to ${S}/linux
	ln -snf "${KV_DIR}" linux

	# Build interp.o with EXTRA_KLIBCAFLAGS (.S source)
	epatch "${FILESDIR}"/${PN}-1.4.11-interp-flags.patch

	# Fixes for sparc and ppc
	epatch "${FILESDIR}"/${P}-sigaction.patch

	# Prevent klibc from prestripping stuff
#	epatch "${FILESDIR}"/${P}-nostrip.patch
}

src_compile() {
	local myargs

	[[ ${KV_DIR} != "${KV_OUT_DIR}" ]] && \
		myargs="KLIBCKERNELOBJ='${KV_OUT_DIR}/' KBUILD_SRC='1'"

	use debug && myargs="${myargs} V=1"

	emake \
		EXTRA_KLIBCAFLAGS="-Wa,--noexecstack" \
		EXTRA_KLIBCLDFLAGS="-z,noexecstack" \
		HOSTCC="$(tc-getBUILD_CC)" CC="$(get-KERNEL_CC)" \
		INSTALLDIR="/usr/$(get_libdir)/klibc" \
		KLIBCARCH=$(tc-arch-kernel) \
		SHLIBDIR="/$(get_libdir)" \
		libdir="/usr/$(get_libdir)" \
		mandir="/usr/share/man" \
		${myargs} || die "Compile failed!"
}

src_install() {
	local myargs klibc_prefix

	[[ ${KV_DIR} != "${KV_OUT_DIR}" ]] && \
		myargs="KLIBCKERNELOBJ='${KV_OUT_DIR}/' KBUILD_SRC='1'"

	use debug && myargs="${myargs} V=1"

	if tc-is-cross-compiler ; then
		klibc_prefix=$("${S}/klcc/$(tc-arch-kernel)-klcc" -print-klibc-prefix)
	else
		klibc_prefix=$("${S}/klcc/klcc" -print-klibc-prefix)
	fi

	emake \
		HOSTCC="$(tc-getBUILD_CC)" CC="$(get-KERNEL_CC)" \
		EXTRA_KLIBCAFLAGS="-Wa,--noexecstack" \
		EXTRA_KLIBCLDFLAGS="-z,noexecstack" \
		INSTALLDIR="/usr/$(get_libdir)/klibc" \
		INSTALLROOT="${D}" \
		KLIBCARCH=$(tc-arch-kernel) \
		SHLIBDIR="/$(get_libdir)" \
		libdir="/usr/$(get_libdir)" \
		mandir="/usr/share/man" \
		${myargs} \
		install || die "Install failed!"

	# klibc doesn't support prelinking, so we need to mask it
	cat > "${T}/70klibc" <<-EOF
		PRELINK_PATH_MASK="/usr/$(get_libdir)/klibc"
	EOF

	doenvd "${T}"/70klibc

	# Fix the permissions (bug #178053) on /usr/$(get_libdir)/klibc/include
	# Actually I have no idea, why the includes have those weird-ass permissions
	# on a particular system, might be due to inherited permissions from parent
	# directory

	find "${D}"/usr/$(get_libdir)/klibc/include | xargs chmod o+rX

	# Hardlinks becoming copies
	for x in gunzip zcat ; do
		rm -f "${D}/${klibc_prefix}/bin/${x}"
		dosym gzip "${klibc_prefix}/bin/${x}"
	done

	if ! tc-is-cross-compiler ; then
		cd "${S}"
		insinto /usr/share/aclocal
		doins contrib/klibc.m4

		dodoc README usr/klibc/CAVEATS usr/klibc/README
		newdoc usr/klibc/arch/README README.klibc.arch
		docinto dash; newdoc usr/dash/README.klibc README
		docinto gzip; dodoc usr/gzip/README
	fi
}