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