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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
|
# Copyright 1999-2018 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
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="https://uclibc-ng.org/"
if [[ ${PV} != "9999" ]] ; then
PATCH_VER=""
SRC_URI="https://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 symlink-compat headers-only"
# tests fail due to unusual makefile
RESTRICT="strip test"
# 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 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
LDSO_SAFE_RUNPATH
)
# These are forced on
defs_y=(
DO_C99_MATH
DO_XSI_MATH
FORCE_SHAREABLE_TEXT_SEGMENTS
LDSO_GNU_HASH_SUPPORT
LDSO_PRELOAD_FILE_SUPPORT
LDSO_RUNPATH
LDSO_RUNPATH_OF_EXECUTABLE
LDSO_STANDALONE_SUPPORT
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_LIBUTIL
UCLIBC_HAS_NFTW
UCLIBC_HAS_OBSOLETE_BSD_SIGNAL
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 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 extraversion
# 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-r1.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
extraversion=0
else
subversion=${version[1]}
if [[ -z ${version[2]} ]]; then
extraversion=0
else
extraversion=.${version[2]}
fi
fi
sed -i \
-e "/^MAJOR_VERSION/s|:=.*|:= 0|" \
-e "/^MINOR_VERSION/s|:=.*|:= ${version[0]}|" \
-e "/^SUBLEVEL/s|:=.*|:= ${subversion}|" \
-e "/^EXTRAVERSION/s|:=.*|:= ${extraversion}|" \
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.i386 || die
fi
# For arm
if [[ ${target} == "arm" ]]; then
sed -i -e '/Build for EABI/a \\tdefault y' extra/Configs/Config.arm
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
if use symlink-compat; then
dosym libc.so.0 "${DESTDIR}"/lib/libcrypt.so.0
dosym libc.so.0 "${DESTDIR}"/lib/libdl.so.0
dosym libc.so.0 "${DESTDIR}"/lib/libm.so.0
dosym libc.so.0 "${DESTDIR}"/lib/libpthread.so.0
dosym libc.so.0 "${DESTDIR}"/lib/librt.so.0
dosym libc.so.0 "${DESTDIR}"/lib/libresolv.so.0
dosym libc.so.0 "${DESTDIR}"/lib/libubacktrace.so.0
dosym libc.so.0 "${DESTDIR}"/lib/libutil.so.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
}
|