-
Notifications
You must be signed in to change notification settings - Fork 73
/
Dockerfile.template
152 lines (145 loc) · 5.78 KB
/
Dockerfile.template
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
FROM buildpack-deps:{{ .debian.version }}
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
# install abigail-tools so we can use abidiff later to verify that we don't break Debian packages
abigail-tools \
; \
rm -rf /var/lib/apt/lists/*
# https://gcc.gnu.org/mirrors.html
ENV GPG_KEYS \
# 1024D/745C015A 1999-11-09 Gerald Pfeifer <[email protected]>
B215C1633BCA0477615F1B35A5B3A004745C015A \
# 1024D/B75C61B8 2003-04-10 Mark Mitchell <[email protected]>
B3C42148A44E6983B3E4CC0793FA9B1AB75C61B8 \
# 1024D/902C9419 2004-12-06 Gabriel Dos Reis <[email protected]>
90AA470469D3965A87A5DCB494D03953902C9419 \
# 1024D/F71EDF1C 2000-02-13 Joseph Samuel Myers <[email protected]>
80F98B2E0DAB6C8281BDF541A7C8C3B2F71EDF1C \
# 2048R/FC26A641 2005-09-13 Richard Guenther <[email protected]>
7F74F97C103468EE5D750B583AB00996FC26A641 \
# 1024D/C3C45C06 2004-04-21 Jakub Jelinek <[email protected]>
33C235A34C46AA3FFB293709A328C3A2C3C45C06 \
# 4096R/09B5FA62 2020-05-28 Jakub Jelinek <[email protected]>
D3A93CAD751C2AF4F8C7AD516C35B99309B5FA62
# https://gcc.gnu.org/mirrors.html
ENV GCC_MIRRORS \
https://ftpmirror.gnu.org/gcc \
https://mirrors.kernel.org/gnu/gcc \
https://bigsearcher.com/mirrors/gcc/releases \
http://www.netgull.com/gcc/releases \
https://ftpmirror.gnu.org/gcc \
# "sourceware.org" is the canonical upstream release host (the host of "gcc.gnu.org")
https://sourceware.org/pub/gcc/releases \
# only attempt the origin FTP as a mirror of last resort
ftp://ftp.gnu.org/gnu/gcc
# Last Modified: {{ .lastModified }}
ENV GCC_VERSION {{ .version }}
# Docker EOL: {{ .eol }}
RUN set -ex; \
\
savedAptMark="$(apt-mark showmanual)"; \
apt-get update; \
apt-get install -y --no-install-recommends \
dpkg-dev \
flex \
gnupg \
; \
rm -r /var/lib/apt/lists/*; \
\
_fetch() { \
local fetch="$1"; shift; \
local file="$1"; shift; \
for mirror in $GCC_MIRRORS; do \
if curl -fL "$mirror/$fetch" -o "$file"; then \
return 0; \
fi; \
done; \
echo >&2 "error: failed to download '$fetch' from several mirrors"; \
return 1; \
}; \
\
_fetch "gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.{{ .compression }}.sig" 'gcc.tar.{{ .compression }}.sig'; \
_fetch "gcc-$GCC_VERSION/gcc-$GCC_VERSION.tar.{{ .compression }}" 'gcc.tar.{{ .compression }}'; \
export GNUPGHOME="$(mktemp -d)"; \
for key in $GPG_KEYS; do \
gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key"; \
done; \
gpg --batch --verify gcc.tar.{{ .compression }}.sig gcc.tar.{{ .compression }}; \
gpgconf --kill all; \
rm -rf "$GNUPGHOME"; \
mkdir -p /usr/src/gcc; \
tar -xf gcc.tar.{{ .compression }} -C /usr/src/gcc --strip-components=1; \
rm gcc.tar.{{ .compression }}*; \
\
cd /usr/src/gcc; \
\
# "download_prerequisites" pulls down a bunch of tarballs and extracts them,
# but then leaves the tarballs themselves lying around
./contrib/download_prerequisites; \
{ rm *.tar.* || true; }; \
\
# explicitly update autoconf config.guess and config.sub so they support more arches/libcs
for f in config.guess config.sub; do \
wget -O "$f" "https://git.savannah.gnu.org/cgit/config.git/plain/$f?id=7d3d27baf8107b630586c962c057e22149653deb"; \
# find any more (shallow) copies of the file we grabbed and update them too
find -mindepth 2 -name "$f" -exec cp -v "$f" '{}' ';'; \
done; \
\
dir="$(mktemp -d)"; \
cd "$dir"; \
\
extraConfigureArgs=''; \
dpkgArch="$(dpkg --print-architecture)"; \
case "$dpkgArch" in \
# with-arch: https://salsa.debian.org/toolchain-team/gcc/-/blob/gcc-13-debian/debian/rules2#L533-573
# with-float: https://salsa.debian.org/toolchain-team/gcc/-/blob/gcc-13-debian/debian/rules2#L521-523
# with-mode: https://salsa.debian.org/toolchain-team/gcc/-/blob/gcc-13-debian/debian/rules2#L571
armel) \
extraConfigureArgs="$extraConfigureArgs --with-arch=armv5te --with-float=soft" \
;; \
armhf) \
# https://bugs.launchpad.net/ubuntu/+source/gcc-defaults/+bug/1939379/comments/2
extraConfigureArgs="$extraConfigureArgs --with-arch=armv7-a+fp --with-float=hard --with-mode=thumb" \
;; \
\
# with-arch-32: https://salsa.debian.org/toolchain-team/gcc/-/blob/gcc-13-debian/debian/rules2#L670
i386) \
extraConfigureArgs="$extraConfigureArgs --with-arch-32=i686"; \
;; \
esac; \
\
gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)"; \
/usr/src/gcc/configure \
--build="$gnuArch" \
--disable-multilib \
--enable-languages=c,c++,fortran,go \
$extraConfigureArgs \
; \
make -j "$(nproc)"; \
make install-strip; \
\
cd ..; \
\
rm -rf "$dir" /usr/src/gcc; \
\
apt-mark auto '.*' > /dev/null; \
[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; \
apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false
# gcc installs .so files in /usr/local/lib64 (and /usr/local/lib)...
RUN set -ex; \
# this filename needs to sort higher than all the architecture filenames ("aarch64-...", "armeabi...", etc)
{ echo '/usr/local/lib64'; echo '/usr/local/lib'; } > /etc/ld.so.conf.d/000-local-lib.conf; \
ldconfig -v; \
# the libc created by gcc might be too old for a newer Debian
# check that the Debian libstdc++ doesn't have newer requirements than the gcc one
deb="$(readlink -ve /usr/lib/*/libstdc++.so* | head -1)"; \
gcc="$(readlink -ve /usr/local/lib*/libstdc++.so | head -1)"; \
# using LD_PRELOAD to make sure "abidiff" itself doesn't fail with the exact error we're trying to test for 😂😭
LD_PRELOAD="$deb" abidiff --no-added-syms "$deb" "$gcc"
# ensure that alternatives are pointing to the new compiler and that old one is no longer used
RUN set -ex; \
dpkg-divert --divert /usr/bin/gcc.orig --rename /usr/bin/gcc; \
dpkg-divert --divert /usr/bin/g++.orig --rename /usr/bin/g++; \
dpkg-divert --divert /usr/bin/gfortran.orig --rename /usr/bin/gfortran; \
update-alternatives --install /usr/bin/cc cc /usr/local/bin/gcc 999