aboutsummaryrefslogtreecommitdiffstats
path: root/testing/gcc-cross-embedded/APKBUILD
blob: 0cb1d2bcb07c2ee41545a72b5cb9c9aa8e0c8426 (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
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
# Maintainer: Marian Buschsieweke <marian.buschsieweke@ovgu.de>
# Based upon Alpine's avr-gcc and Arch Linux's arm-none-eabi-gcc, to which
# the following people contributed:
# Contributor: Pedro Filipe <xpecex@outlook.com>
# Contributor: Stefan Wagner <stw@bit-strickerei.de>
# Contributor: Anatol Pomozov <anatol.pomozov@gmail.com>
# Contributor: Martin Schmölzer <mschmoelzer@gmail.com>
_targets="
	arm-none-eabi
	mips-mti-elf
	msp430-elf
	riscv-none-elf
	"
# or1k-elf fails to build on 32-bit architectures
case "$CARCH" in
	x86_64|aarch64|ppc64le|mips64) _targets="$_targets or1k-elf"
esac
pkgname=gcc-cross-embedded
pkgver=10.2.0
pkgrel=0
pkgdesc="The GNU Compiler Collection for embedded targets"
url="http://gcc.gnu.org"
depends="gcc"
makedepends="bash linux-headers gmp-dev mpfr-dev mpc1-dev zlib-dev isl-dev"
arch="all !s390x !mips !mips64" # fails on s390x and mips with error message:
# 'internal compiler error: Segmentation fault'
license="GPL-3.0-or-later"
for target in $_targets; do
	targetnorm="${target//-/_}"
	subpackages="gcc-$target:$targetnorm $subpackages"
	makedepends="$makedepends binutils-$target newlib-$target-stage1"
done

source="https://mirrors.kernel.org/gnu/gcc/gcc-$pkgver/gcc-$pkgver.tar.xz"

options="!check"

builddir="$srcdir/gcc-$pkgver"

prepare() {
	default_prepare

	# hack! - some configure tests for header files using "$CPP $CPPFLAGS"
	for dir in libiberty gcc; do
		sed -i "/ac_cpp=/s/\$CPPFLAGS/\$CPPFLAGS -O2/" $dir/configure
	done
}

_build_gcc() {
	case "$target" in
		# Support M and R architecture profiles for ARM
		arm-none-eabi) _target_specific_flags="--with-multilib-list=rmprofile" ;;
		*) _target_specific_flags="" ;;
	esac

	msg "Running ./configure for $target"
	"$builddir"/configure \
		--target=$target \
		--prefix=/usr \
		--with-sysroot=/usr/$target \
		--with-native-system-header-dir=/include \
		--with-headers=/usr/$target/include \
		--with-python-dir=share/gcc-$target \
		--libexecdir=/usr/lib \
		--infodir=/deleteme/info \
		--htmldir=/deleteme/html \
		--pdfdir=/deleteme/pdf \
		--mandir=/deleteme/man \
		--enable-languages=c,c++ \
		--enable-plugins \
		--enable-gnu-indirect-function \
		--disable-decimal-float \
		--disable-libffi \
		--disable-libgomp \
		--disable-libmudflap \
		--disable-libquadmath \
		--disable-libssp \
		--disable-libstdcxx-pch \
		--disable-nls \
		--disable-shared \
		--disable-threads \
		--disable-tls \
		--disable-werror \
		--with-gmp \
		--with-gnu-as \
		--with-gnu-ld \
		--with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' \
		--with-isl \
		--with-libelf \
		--with-mpc \
		--with-mpfr \
		--with-newlib \
		--with-system-zlib \
		--with-pkgversion='Alpine Linux' \
		$_target_specific_flags

	msg "Running make for $target"
	make INHIBIT_LIBC_CFLAGS='-DUSE_TM_CLONE_REGISTRY=0'
}

build() {
	for target in $_targets; do
		# Build "regular" variant
		workingdir="$srcdir/build-$target"
		mkdir "$workingdir"
		cd "$workingdir"
		export CFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections'
		export CXXFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections'
		_build_gcc

		# Rebuild without exceptions to generate nano variant of libstc++
		workingdir="$srcdir/build-$target-nano"
		mkdir "$workingdir"
		cd "$workingdir"
		export CFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections  -fno-exceptions'
		export CXXFLAGS_FOR_TARGET='-pipe -Os -ffunction-sections -fdata-sections  -fno-exceptions'
		_build_gcc
	done
}

package() {
	for target in $_targets; do
		depends="$depends gcc-$target"
	done
	mkdir -p "$pkgdir"
}

_install_subpkg() {
	target="${subpkgname#gcc-}"
	pkgdesc="The GNU Compiler Collection for $target targets"
	depends="$depends binutils-$target"
	workingdir="$srcdir/build-$target"
	cd "$workingdir"
	make install DESTDIR="$subpkgdir" -j1

	# install nano-variant into temporary folder to obtain libstdc++ from there
	workingdir="$srcdir/build-$target-nano"
	cd "$workingdir"
	make install DESTDIR="$subpkgdir-nano" -j1

	# Fetch libstdc++ from nano variant
	multilibs=$($subpkgdir/usr/bin/$target-gcc -print-multi-lib 2>/dev/null)
	for multilib in $multilibs; do
		dir="${multilib%%;*}"
		from_dir=$subpkgdir-nano/usr/$target/lib/$dir
		to_dir=$subpkgdir/usr/$target/lib/$dir
		cp -f $from_dir/libstdc++.a $to_dir/libstdc++_nano.a
		cp -f $from_dir/libsupc++.a $to_dir/libsupc++_nano.a
	done

	# Delete documentation. (The user can use the host GCC doc instead)
	rm -rf "$subpkgdir"/deleteme
	# Delete libcc1.so*, which is already part of the host's gcc
	rm -f "$subpkgdir"/usr/lib/libcc1.so*

	# Strip libs using target binutils
	find "$subpkgdir"/usr/lib -type f -name "*.a" -exec /usr/bin/$target-strip --strip-debug '{}' \;

	# Strip executables using host binutils
	find "$subpkgdir"/usr/bin -type f -executable -exec strip '{}' \;
}

arm_none_eabi() {
	_install_subpkg
}

mips_mti_elf() {
	_install_subpkg
}

msp430_elf() {
	_install_subpkg
}

or1k_elf() {
	_install_subpkg
}

riscv_none_elf() {
	_install_subpkg
}

sha512sums="42ae38928bd2e8183af445da34220964eb690b675b1892bbeb7cd5bb62be499011ec9a93397dba5e2fb681afadfc6f2767d03b9035b44ba9be807187ae6dc65e  gcc-10.2.0.tar.xz"