blob: e16fd4c10b75b427396f1fbe94d9c173f3ba9b7c (
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
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
|
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI="7"
inherit flag-o-matic toolchain-funcs
if [[ ${PV} == "9999" ]] ; then
EGIT_REPO_URI="https://sourceware.org/git/newlib-cygwin.git"
inherit git-r3
else
SRC_URI="ftp://sourceware.org/pub/newlib/${P}.tar.gz"
KEYWORDS="~arm ~hppa ~m68k ~mips ~ppc ~ppc64 ~sparc ~x86"
fi
export CBUILD=${CBUILD:-${CHOST}}
export CTARGET=${CTARGET:-${CHOST}}
if [[ ${CTARGET} == ${CHOST} ]] ; then
if [[ ${CATEGORY} == cross-* ]] ; then
export CTARGET=${CATEGORY#cross-}
fi
fi
DESCRIPTION="Newlib is a C library intended for use on embedded systems"
HOMEPAGE="https://sourceware.org/newlib/"
LICENSE="NEWLIB LIBGLOSS GPL-2"
SLOT="0"
IUSE="nls threads unicode headers-only nano"
RESTRICT="strip"
PATCHES=(
"${FILESDIR}"/${PN}-3.3.0-no-nano-cxx.patch
)
NEWLIBBUILD="${WORKDIR}/build"
NEWLIBNANOBUILD="${WORKDIR}/build.nano"
NEWLIBNANOTMPINSTALL="${WORKDIR}/nano_tmp_install"
# Adding -U_FORTIFY_SOURCE to counter the effect of Gentoo's
# auto-addition of _FORTIFY_SOURCE at gcc site: bug #656018#c4
# Currently newlib can't be built itself when _FORTIFY_SOURCE
# is set.
CFLAGS_FULL="-ffunction-sections -fdata-sections -U_FORTIFY_SOURCE"
CFLAGS_NANO="-Os -ffunction-sections -fdata-sections -U_FORTIFY_SOURCE"
pkg_setup() {
# Reject newlib-on-glibc type installs
if [[ ${CTARGET} == ${CHOST} ]] ; then
case ${CHOST} in
*-newlib|*-elf) ;;
*) die "Use sys-devel/crossdev to build a newlib toolchain" ;;
esac
fi
case ${CTARGET} in
msp430*)
if ver_test $(gcc-version ${CTARGET}) -lt 10.1; then
# bug #717610
die "gcc for ${CTARGET} has to be 10.1 or above"
fi
;;
esac
}
src_configure() {
# TODO: we should fix this
unset LDFLAGS
CHOST=${CTARGET} strip-unsupported-flags
CCASFLAGS_ORIG="${CCASFLAGS}"
CFLAGS_ORIG="${CFLAGS}"
local myconf=(
# Disable legacy syscall stub code in newlib. These have been
# moved to libgloss for a long time now, so the code in newlib
# itself just gets in the way.
--disable-newlib-supplied-syscalls
)
[[ ${CTARGET} == "spu" ]] \
&& myconf+=( --disable-newlib-multithread ) \
|| myconf+=( $(use_enable threads newlib-multithread) )
mkdir -p "${NEWLIBBUILD}"
cd "${NEWLIBBUILD}"
export "CFLAGS_FOR_TARGET=${CFLAGS_ORIG} ${CFLAGS_FULL}"
export "CCASFLAGS=${CCASFLAGS_ORIG} ${CFLAGS_FULL}"
ECONF_SOURCE=${S} \
econf \
$(use_enable unicode newlib-mb) \
$(use_enable nls) \
"${myconf[@]}"
# Build newlib-nano beside newlib (original)
# Based on https://tracker.debian.org/media/packages/n/newlib/rules-2.1.0%2Bgit20140818.1a8323b-2
if use nano ; then
mkdir -p "${NEWLIBNANOBUILD}" || die
cd "${NEWLIBNANOBUILD}" || die
export "CFLAGS_FOR_TARGET=${CFLAGS_ORIG} ${CFLAGS_NANO}"
export "CCASFLAGS=${CCASFLAGS_ORIG} ${CFLAGS_NANO}"
ECONF_SOURCE=${S} \
econf \
$(use_enable unicode newlib-mb) \
$(use_enable nls) \
--enable-newlib-reent-small \
--disable-newlib-fvwrite-in-streamio \
--disable-newlib-fseek-optimization \
--disable-newlib-wide-orient \
--enable-newlib-nano-malloc \
--disable-newlib-unbuf-stream-opt \
--enable-lite-exit \
--enable-newlib-global-atexit \
--enable-newlib-nano-formatted-io \
${myconf}
fi
}
src_compile() {
export "CFLAGS_FOR_TARGET=${CFLAGS_ORIG} ${CFLAGS_FULL}"
export "CCASFLAGS=${CCASFLAGS_ORIG} ${CFLAGS_FULL}"
emake -C "${NEWLIBBUILD}"
if use nano ; then
export "CFLAGS_FOR_TARGET=${CFLAGS_ORIG} ${CFLAGS_NANO}"
export "CCASFLAGS=${CCASFLAGS_ORIG} ${CFLAGS_NANO}"
emake -C "${NEWLIBNANOBUILD}"
fi
}
src_install() {
cd "${NEWLIBBUILD}" || die
emake -j1 DESTDIR="${D}" install
if use nano ; then
cd "${NEWLIBNANOBUILD}" || die
emake -j1 DESTDIR="${NEWLIBNANOTMPINSTALL}" install
# Rename nano lib* files to lib*_nano and move to the real ${D}
local nanolibfiles=""
nanolibfiles=$(find "${NEWLIBNANOTMPINSTALL}" -regex ".*/lib\(c\|g\|rdimon\)\.a" -print)
for f in ${nanolibfiles}; do
local l="${f##${NEWLIBNANOTMPINSTALL}}"
mv -v "${f}" "${D}/${l%%\.a}_nano.a" || die
done
# Move newlib-nano's version of newlib.h to newlib-nano/newlib.h
mkdir -p "${D}/usr/${CTARGET}/include/newlib-nano" || die
mv "${NEWLIBNANOTMPINSTALL}/usr/${CTARGET}/include/newlib.h" \
"${D}/usr/${CTARGET}/include/newlib-nano/newlib.h" || die
fi
# minor hack to keep things clean
rm -rf "${D}"/usr/share/info || die
rm -rf "${D}"/usr/info || die
}
|