tcross-gcc - scripts - various script and utils
(HTM) git clone git://z3bra.org/scripts
(DIR) Log
(DIR) Files
(DIR) Refs
---
tcross-gcc (5634B)
---
1 #!/bin/sh -ex
2 #
3 # Couple of useful links:
4 # + http://wiki.osdev.org/GCC_Cross-Compiler
5 # + http://wiki.osdev.org/Cross-Compiler_Successful_Builds
6 # + https://git.framasoft.org/Ypnose/solyste/blob/master/scripts/create-crossenv
7 # + http://kegel.com/crosstool/
8 # + https://github.com/GregorR/musl-cross/tree/master/patches
9 #
10 # 0. download gcc, binutils, gmp, mpc, mpfr
11 # 1. extract them
12 # 2. patch everything that require patching
13 # 3. prepare gcc (move gmp, mpc, mpfr in)
14 # 4. install linux headers
15 # 5. build binutils
16 # 6. build musl
17 # 7. build gcc
18 # 8. add pkg-config wrapper
19
20 # cross compiler environment
21 MARCH=$(uname -m)
22 TARGET=${TARGET:-${MARCH}-linux-musl}
23 PREFIX=${PREFIX:-${HOME}/cross/gcc-${MARCH}}
24 BLDDIR=${BLDDIR:-${HOME}/cross/build}
25 SRCDIR=${SRCDIR:-${HOME}/cross/source}
26 PATCHD=${PATCHD:-${HOME}/cross/patches}
27
28 # compilation variables
29 CFLAGS="-Os -fomit-frame-pointer -pipe"
30 CXXFLAGS="${CFLAGS}"
31 CPPFLAGS="${CFLAGS}"
32 LDFLAGS="-Wl,--as-needed"
33 MAKEFLAGS="-j4"
34
35 # versions
36 GCCV=${GCCV:-4.8.5}
37 BINV=${BINV:-2.25}
38 GMPV=${GMPV:-5.1.3}
39 MPCV=${MPCV:-1.0.3}
40 MPFRV=${MPFRV:-3.1.3}
41 MUSLV=${MUSLV:-1.1.10}
42 KERNV=${KERNV:-4.1.4}
43
44
45 # random but useful vars
46 PATH="${PREFIX}/bin:${PATH}"
47 GNUMIRROR=ftp://ftp.gnu.org/gnu
48 MUSLMIRROR=http://www.musl-libc.org/releases
49 LINUXMIRROR=https://www.kernel.org/pub/linux/kernel/v4.x
50
51 # Preparing sources
52 mkdir -p "${SRCDIR}" "${BLDDIR}" "${PREFIX}"
53 cd "${SRCDIR}"
54
55 #
56 # ┏━┓
57 # ┃┃┃
58 # ┗━┛╹
59 # Get all GNU tarballs
60 grab_sources() {
61 curl -O -# "${GNUMIRROR}/gcc/gcc-${GCCV}/gcc-${GCCV}.tar.gz"
62 curl -O -# "${GNUMIRROR}/binutils/binutils-${BINV}.tar.gz"
63 curl -O -# "${GNUMIRROR}/mpc/mpc-${MPCV}.tar.gz"
64 curl -O -# "${GNUMIRROR}/gmp/gmp-${GMPV}.tar.gz"
65 curl -O -# "${GNUMIRROR}/mpfr/mpfr-${MPFRV}.tar.gz"
66 curl -O -# "${MUSLMIRROR}/musl-${MUSLV}.tar.gz"
67 curl -O -# "${LINUXMIRROR}/linux-${KERNV}.tar.xz"
68 }
69
70 #
71 # ╺┓
72 # ┃
73 # ╺┻╸╹
74 # Extract everything
75 extract_source() {
76 tar xz < gcc-${GCCV}.tar.gz
77 tar xz < binutils-${BINV}.tar.gz
78 tar xz < mpc-${MPCV}.tar.gz
79 tar xz < gmp-${GMPV}.tar.gz
80 tar xz < mpfr-${MPFRV}.tar.gz
81 tar xz < musl-${MUSLV}.tar.gz
82 tar xJ < linux-${KERNV}.tar.xz
83 }
84
85 #
86 # ┏━┓
87 # ┏━┛
88 # ┗━╸╹
89 # Patch all source trees.
90 # This will take all patches in $PATCHD matching the programs
91 # (eg: gcc-4.8.4-*.diff to patch gcc in version 4.8.4)
92 patch_sources() {
93 for DIR in $(find "${SRCDIR}" -maxdepth 1 -type d); do
94 cd "${DIR}"
95 cat "${PATCHD}/$(basename ${DIR})"-*.diff | patch -Np1
96 done
97 }
98
99 #
100 # ┏━┓
101 # ╺━┫
102 # ┗━┛╹
103 # Prepare the gcc dir
104 prepare_gcc() {
105 mv "${SRCDIR}/gmp-${GMPV}" "${SRCDIR}/gcc-${GCCV}/gmp"
106 mv "${SRCDIR}/mpc-${MPCV}" "${SRCDIR}/gcc-${GCCV}/mpc"
107 mv "${SRCDIR}/mpfr-${MPFRV}" "${SRCDIR}/gcc-${GCCV}/mpfr"
108 }
109
110 #
111 # ╻ ╻
112 # ┗━┫
113 # ╹╹
114 # Get linux headers
115 install_headers() {
116 cd "${SRCDIR}/linux-${KERNV}"
117 make ARCH=$(uname -m) headers_check
118 make ARCH=$(uname -m) INSTALL_HDR_PATH=${PREFIX}/${TARGET} headers_install
119 rm -r "${SRCDIR}/linux-${KERNV}"
120 }
121
122 #
123 # ┏━╸
124 # ┗━┓
125 # ┗━┛╹
126 # Build binutils and install them to ${PREFIX}
127 install_binutils() {
128 mkdir -p "${BLDDIR}/binutils"
129 cd "${BLDDIR}/binutils"
130 ${SRCDIR}/binutils-${BINV}/configure --target=${TARGET} \
131 --prefix=${PREFIX} \
132 --with-sysroot=${PREFIX}/${TARGET} \
133 --disable-nls \
134 --disable-shared \
135 --disable-multilib
136 make configure-host
137 make LDFLAGS="${LDFLAGS} -all-static -static"
138 make install
139 rm -rf "${BLDDIR}/binutils"
140 rm -rf "${SRCDIR}/binutils-${BINV}"
141 }
142
143 #
144 # ┏━┓
145 # ┣━┓
146 # ┗━┛╹
147 # Build the musl libc
148 install_musl() {
149 cd "${SRCDIR}/musl-${MUSLV}"
150 ./configure --prefix=${PREFIX}/${TARGET} \
151 --target=${TARGET} \
152 --disable-gcc-wrapper \
153 --disable-debug \
154 --disable-shared \
155 --disable-warning
156 make LDFLAGS="${LDFLAGS}"
157 make install
158 rm -rf "${SRCDIR}/musl-${MUSLV}"
159 }
160
161 #
162 # ┏━┓
163 # ┃
164 # ╹╹
165 # Build gcc linked against musl
166 install_gcc() {
167 mkdir -p "${BLDDIR}/gcc"
168 cd "${BLDDIR}/gcc"
169 ${SRCDIR}/gcc-${GCCV}/configure --target=${TARGET} \
170 --prefix=${PREFIX} \
171 --with-sysroot=${PREFIX}/${TARGET} \
172 --with-native-system-header-dir=/include \
173 --disable-nls \
174 --disable-shared \
175 --disable-multilib \
176 --disable-libmudflap \
177 --enable-languages=c
178 make LDFLAGS="${LDFLAGS} -static" all-gcc all-target-libgcc
179 make install-gcc install-target-libgcc
180 rm -rf "${BLDDIR}/gcc"
181 rm -rf "${SRCDIR}/gcc-${GCCV}"
182 }
183
184 #
185 # ┏━┓
186 # ┣━┫
187 # ┗━┛╹
188 # Add pkg-config wrapper
189 install_pkgconfig() {
190 cat << EOF > "${PREFIX}/bin/${TARGET}-pkg-config"
191 #!/bin/sh
192 export PKG_CONFIG_SYSROOT_DIR=${PREFIX}/${TARGET}
193 export PKG_CONFIG_LIBDIR=${PREFIX}/${TARGET}/usr/lib/pkgconfig
194 export PKG_CONFIG_PATH=\$PKG_CONFIG_LIBDIR
195
196 exec pkg-config --static "\$@"
197 EOF
198 chmod 755 "${PREFIX}/bin/${TARGET}-pkg-config"
199 }
200
201 grab_sources
202 extract_source
203 patch_sources
204 prepare_gcc
205 install_headers
206 install_binutils
207 install_musl
208 install_gcc
209 install_pkgconfig
210
211 rm -rf "${SRCDIR}"
212 rm -rf "${BLDDIR}"
213 rm -rf "${PREFIX}/share"
214 rm -f "${PREFIX}/lib/libiberty.a"
215
216 cat << EOF | tee ${PREFIX}/README
217 TRIPLET : $TARGET
218 PREFIX : $PREFIX
219
220 GCC : $GCCV
221 BINUTILS: $BINV
222 MUSL : $MUSLV
223 KERNEL : $KERNV
224 EOF