| OLD | NEW |
| 1 #!/bin/bash | 1 #!/bin/bash |
| 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 # | 5 # |
| 6 #@ This script creates the mips trusted SDK. | 6 #@ This script creates the mips trusted SDK. |
| 7 #@ It must be run from the native_client directory. | 7 #@ It must be run from the native_client directory. |
| 8 | 8 |
| 9 # This script is intended to build a mipsel-linux-gnu cross compilation | 9 # This script is intended to build a mipsel-linux-gnu cross compilation |
| 10 # toolchain that runs on x86 linux and generates code for a little-endian, | 10 # toolchain that runs on x86 linux and generates code for a little-endian, |
| 11 # hard-float, mips32 target. | 11 # hard-float, mips32 target. |
| 12 | 12 |
| 13 ###################################################################### | 13 ###################################################################### |
| 14 # Config | 14 # Config |
| 15 ###################################################################### | 15 ###################################################################### |
| 16 | 16 |
| 17 set -o nounset | 17 set -o nounset |
| 18 set -o errexit | 18 set -o errexit |
| 19 | 19 |
| 20 readonly SCRIPT_DIR=$(dirname $0) | 20 readonly SCRIPT_DIR=$(dirname $0) |
| 21 readonly NACL_ROOT=$(cd ${SCRIPT_DIR}/../.. && pwd) |
| 21 | 22 |
| 22 readonly MAKE_OPTS="-j8" | 23 readonly MAKE_OPTS="-j8" |
| 23 readonly ARCH="mips32" | 24 readonly ARCH="mips32" |
| 24 | 25 |
| 25 readonly GMP_URL="http://ftp.gnu.org/gnu/gmp/gmp-5.1.3.tar.bz2" | 26 readonly GMP_URL="http://ftp.gnu.org/gnu/gmp/gmp-5.1.3.tar.bz2" |
| 26 readonly GMP_SHA1SUM="b35928e2927b272711fdfbf71b7cfd5f86a6b165" | 27 readonly GMP_SHA1SUM="b35928e2927b272711fdfbf71b7cfd5f86a6b165" |
| 27 | 28 |
| 28 readonly MPFR_URL="http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.2.tar.bz2" | 29 readonly MPFR_URL="http://ftp.gnu.org/gnu/mpfr/mpfr-3.1.2.tar.bz2" |
| 29 readonly MPFR_SHA1SUM="46d5a11a59a4e31f74f73dd70c5d57a59de2d0b4" | 30 readonly MPFR_SHA1SUM="46d5a11a59a4e31f74f73dd70c5d57a59de2d0b4" |
| 30 | 31 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 41 readonly KERNEL_SHA1SUM="9b094e817a7a9b7c09b5bc268e23de642c6c407a" | 42 readonly KERNEL_SHA1SUM="9b094e817a7a9b7c09b5bc268e23de642c6c407a" |
| 42 | 43 |
| 43 readonly GDB_URL="http://ftp.gnu.org/gnu/gdb/gdb-7.7.1.tar.bz2" | 44 readonly GDB_URL="http://ftp.gnu.org/gnu/gdb/gdb-7.7.1.tar.bz2" |
| 44 readonly GDB_SHA1SUM="35228319f7c715074a80be42fff64c7645227a80" | 45 readonly GDB_SHA1SUM="35228319f7c715074a80be42fff64c7645227a80" |
| 45 | 46 |
| 46 readonly GLIBC_URL="http://ftp.gnu.org/gnu/glibc/glibc-2.19.tar.bz2" | 47 readonly GLIBC_URL="http://ftp.gnu.org/gnu/glibc/glibc-2.19.tar.bz2" |
| 47 readonly GLIBC_SHA1SUM="382f4438a7321dc29ea1a3da8e7852d2c2b3208c" | 48 readonly GLIBC_SHA1SUM="382f4438a7321dc29ea1a3da8e7852d2c2b3208c" |
| 48 | 49 |
| 49 readonly DOWNLOAD_QEMU_URL="http://wiki.qemu-project.org/download/qemu-2.0.0.tar
.bz2" | 50 readonly DOWNLOAD_QEMU_URL="http://wiki.qemu-project.org/download/qemu-2.0.0.tar
.bz2" |
| 50 | 51 |
| 51 readonly INSTALL_ROOT=$(pwd)/toolchain/linux_x86/mips_trusted | 52 readonly OUT_DIR=$(dirname ${NACL_ROOT})/out |
| 52 | 53 readonly INSTALL_ROOT=${NACL_ROOT}/toolchain/linux_x86/mips_trusted |
| 53 readonly TMP=$(pwd)/toolchain/tmp/crosstool-trusted | 54 readonly JAIL_MIPS32=${INSTALL_ROOT}/sysroot |
| 54 | 55 readonly TMP=${OUT_DIR}/sysroot_mips_trusted |
| 55 readonly BUILD_DIR=${TMP}/build | 56 readonly BUILD_DIR=${TMP}/build |
| 56 | |
| 57 readonly JAIL_MIPS32=${INSTALL_ROOT}/sysroot | |
| 58 | |
| 59 readonly CROSS_TARBALL="chromesdk_linux_mipsel" | 57 readonly CROSS_TARBALL="chromesdk_linux_mipsel" |
| 58 readonly TAR_ARCHIVE=${OUT_DIR}/sysroot_mipsel_trusted_jessie.tar.gz |
| 59 readonly PACKAGES=" |
| 60 libgcc1 |
| 61 libc6 |
| 62 libc6-dev |
| 63 libstdc++6 |
| 64 libssl1.0.0 |
| 65 libssl-dev |
| 66 zlib1g |
| 67 zlib1g-dev |
| 68 " |
| 60 | 69 |
| 61 ###################################################################### | 70 ###################################################################### |
| 62 # Helper | 71 # Helper |
| 63 ###################################################################### | 72 ###################################################################### |
| 64 | 73 |
| 65 Banner() { | 74 Banner() { |
| 66 echo "######################################################################" | 75 echo "######################################################################" |
| 67 echo $* | 76 echo $* |
| 68 echo "######################################################################" | 77 echo "######################################################################" |
| 69 } | 78 } |
| 70 | 79 |
| 71 SubBanner() { | 80 SubBanner() { |
| 72 echo "......................................................................" | 81 echo "......................................................................" |
| 73 echo $* | 82 echo $* |
| 74 echo "......................................................................" | 83 echo "......................................................................" |
| 75 } | 84 } |
| 76 | 85 |
| 86 |
| 77 Usage() { | 87 Usage() { |
| 78 echo | 88 egrep "^#@" $0 | cut --bytes=3- |
| 79 echo "$0 <nacl_sdk|chrome_sdk>" | |
| 80 echo | |
| 81 echo "nacl_sdk - Build nacl toolchain and package it" | |
| 82 echo "chrome_sdk - Build chrome toolchain and package it" | |
| 83 echo | |
| 84 } | 89 } |
| 85 | 90 |
| 86 DownloadOrCopy() { | 91 DownloadOrCopy() { |
| 87 local url=$1 | 92 local url=$1 |
| 88 local filename="${TMP}/${url##*/}" | 93 local filename="${TMP}/${url##*/}" |
| 89 local filetype="${url%%:*}" | 94 local filetype="${url%%:*}" |
| 90 | 95 |
| 91 if [ "${filename}" == "" ]; then | 96 if [ "${filename}" == "" ]; then |
| 92 echo "Unknown error occured. Aborting." | 97 echo "Unknown error occured. Aborting." |
| 93 exit 1 | 98 exit 1 |
| 94 fi | 99 fi |
| 95 | 100 |
| 96 if [[ "${filetype}" == "http" || ${filetype} == "https" ]] ; then | 101 if [[ "${filetype}" == "http" || ${filetype} == "https" ]] ; then |
| 97 if [ ! -f "${filename}" ]; then | 102 if [ ! -f "${filename}" ]; then |
| 98 SubBanner "downloading from ${url} -> ${filename}" | 103 SubBanner "downloading from ${url} -> ${filename}" |
| 99 wget ${url} -O ${filename} | 104 wget ${url} -O ${filename} |
| 105 else |
| 106 SubBanner "using existing file: ${filename}" |
| 100 fi | 107 fi |
| 101 else | 108 else |
| 102 SubBanner "copying from ${url}" | 109 SubBanner "copying from ${url}" |
| 103 cp ${url} ${filename} | 110 cp ${url} ${filename} |
| 104 fi | 111 fi |
| 105 } | 112 } |
| 106 | 113 |
| 107 DownloadOrCopyAndVerify() { | 114 DownloadOrCopyAndVerify() { |
| 108 local url=$1 | 115 local url=$1 |
| 109 local checksum=$2 | 116 local checksum=$2 |
| 110 local filename="${TMP}/${url##*/}" | 117 local filename="${TMP}/${url##*/}" |
| 111 local filetype="${url%%:*}" | 118 local filetype="${url%%:*}" |
| 112 | 119 |
| 113 if [ "${filename}" == "" ]; then | 120 if [ "${filename}" == "" ]; then |
| 114 echo "Unknown error occured. Aborting." | 121 echo "Unknown error occured. Aborting." |
| 115 exit 1 | 122 exit 1 |
| 116 fi | 123 fi |
| 117 | 124 |
| 118 if [[ "${filetype}" == "http" || ${filetype} == "https" ]] ; then | 125 if [[ "${filetype}" == "http" || ${filetype} == "https" ]] ; then |
| 119 if [ ! -f "${filename}" ]; then | 126 if [ ! -f "${filename}" ]; then |
| 120 SubBanner "downloading from ${url} -> ${filename}" | 127 SubBanner "downloading from ${url} -> ${filename}" |
| 121 wget ${url} -O ${filename} | 128 wget ${url} -O ${filename} |
| 129 else |
| 130 SubBanner "using existing file: ${filename}" |
| 122 fi | 131 fi |
| 123 if [ "${checksum}" != "nochecksum" ]; then | 132 if [ "${checksum}" != "nochecksum" ]; then |
| 124 if [ "$(sha1sum ${filename} | cut -d ' ' -f 1)" != "${checksum}" ]; then | 133 if [ "$(sha1sum ${filename} | cut -d ' ' -f 1)" != "${checksum}" ]; then |
| 125 echo "${filename} sha1sum failed. Deleting file and aborting." | 134 echo "${filename} sha1sum failed. Deleting file and aborting." |
| 126 rm -f ${filename} | 135 rm -f ${filename} |
| 127 exit 1 | 136 exit 1 |
| 128 fi | 137 fi |
| 129 fi | 138 fi |
| 130 else | 139 else |
| 131 SubBanner "copying from ${url}" | 140 SubBanner "copying from ${url}" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 156 echo "Required binary $tool not found." | 165 echo "Required binary $tool not found." |
| 157 echo "Exiting." | 166 echo "Exiting." |
| 158 exit 1 | 167 exit 1 |
| 159 fi | 168 fi |
| 160 done | 169 done |
| 161 } | 170 } |
| 162 | 171 |
| 163 | 172 |
| 164 ClearInstallDir() { | 173 ClearInstallDir() { |
| 165 Banner "clearing dirs in ${INSTALL_ROOT}" | 174 Banner "clearing dirs in ${INSTALL_ROOT}" |
| 166 rm -rf ${INSTALL_ROOT}/* | 175 rm -rf ${INSTALL_ROOT} |
| 167 mkdir -p ${JAIL_MIPS32} | 176 mkdir -p ${INSTALL_ROOT} |
| 168 } | 177 } |
| 169 | 178 |
| 179 |
| 170 ClearBuildDir() { | 180 ClearBuildDir() { |
| 171 Banner "clearing dirs in ${BUILD_DIR}" | 181 Banner "clearing dirs in ${BUILD_DIR}" |
| 172 rm -rf ${BUILD_DIR}/* | 182 rm -rf ${BUILD_DIR}/* |
| 173 } | 183 } |
| 174 | 184 |
| 185 |
| 175 CreateTarBall() { | 186 CreateTarBall() { |
| 176 local tarball=$1 | 187 Banner "creating tar ball ${TAR_ARCHIVE}" |
| 177 Banner "creating tar ball ${tarball}" | 188 tar cfz ${TAR_ARCHIVE} -C ${INSTALL_ROOT} . |
| 178 tar cfz ${tarball}.tgz -C ${INSTALL_ROOT} . | |
| 179 } | 189 } |
| 180 | 190 |
| 181 | 191 |
| 182 # Download the toolchain source tarballs or use a local copy when available. | 192 # Download the toolchain source tarballs or use a local copy when available. |
| 183 DownloadOrCopyAndInstallToolchain() { | 193 DownloadOrCopyAndInstallToolchain() { |
| 184 Banner "Installing toolchain" | 194 Banner "Installing toolchain" |
| 185 | 195 |
| 186 tarball="${TMP}/${GCC_URL##*/}" | 196 tarball="${TMP}/${GCC_URL##*/}" |
| 187 DownloadOrCopyAndVerify ${GCC_URL} ${GCC_SHA1SUM} | 197 DownloadOrCopyAndVerify ${GCC_URL} ${GCC_SHA1SUM} |
| 188 SubBanner "extracting from ${tarball}" | 198 if [ ! -d ${TMP}/gcc-4.9.0 ]; then |
| 189 tar jxf ${tarball} -C ${TMP} | 199 SubBanner "extracting from ${tarball}" |
| 200 tar jxf ${tarball} -C ${TMP} |
| 201 fi |
| 190 | 202 |
| 191 pushd ${TMP}/gcc-* | 203 pushd ${TMP}/gcc-4.9.0 |
| 192 | 204 |
| 193 local tarball="${TMP}/${GMP_URL##*/}" | 205 local tarball="${TMP}/${GMP_URL##*/}" |
| 194 DownloadOrCopyAndVerify ${GMP_URL} ${GMP_SHA1SUM} | 206 DownloadOrCopyAndVerify ${GMP_URL} ${GMP_SHA1SUM} |
| 195 SubBanner "extracting from ${tarball}" | 207 SubBanner "extracting from ${tarball}" |
| 196 tar jxf ${tarball} | 208 tar jxf ${tarball} |
| 197 local filename=`ls | grep gmp\-` | 209 local filename=`ls | grep gmp\-` |
| 198 rm -f gmp | 210 rm -f gmp |
| 199 ln -s ${filename} gmp | 211 ln -s ${filename} gmp |
| 200 # Fix gmp configure problem with flex. | 212 # Fix gmp configure problem with flex. |
| 201 sed -i "s/m4-not-needed/m4/" gmp/configure | 213 sed -i "s/m4-not-needed/m4/" gmp/configure |
| (...skipping 11 matching lines...) Expand all Loading... |
| 213 SubBanner "extracting from ${tarball}" | 225 SubBanner "extracting from ${tarball}" |
| 214 tar zxf ${tarball} | 226 tar zxf ${tarball} |
| 215 local filename=`ls | grep mpc\-` | 227 local filename=`ls | grep mpc\-` |
| 216 rm -f mpc | 228 rm -f mpc |
| 217 ln -s ${filename} mpc | 229 ln -s ${filename} mpc |
| 218 | 230 |
| 219 popd | 231 popd |
| 220 | 232 |
| 221 local tarball="${TMP}/${BINUTILS_URL##*/}" | 233 local tarball="${TMP}/${BINUTILS_URL##*/}" |
| 222 DownloadOrCopyAndVerify ${BINUTILS_URL} ${BINUTILS_SHA1SUM} | 234 DownloadOrCopyAndVerify ${BINUTILS_URL} ${BINUTILS_SHA1SUM} |
| 223 SubBanner "extracting from ${tarball}" | 235 if [ ! -d ${TMP}/binutils-2.24 ]; then |
| 224 tar jxf ${tarball} -C ${TMP} | 236 SubBanner "extracting from ${tarball}" |
| 237 tar jxf ${tarball} -C ${TMP} |
| 238 fi |
| 225 | 239 |
| 226 tarball="${TMP}/${GDB_URL##*/}" | 240 tarball="${TMP}/${GDB_URL##*/}" |
| 227 DownloadOrCopyAndVerify ${GDB_URL} ${GDB_SHA1SUM} | 241 DownloadOrCopyAndVerify ${GDB_URL} ${GDB_SHA1SUM} |
| 228 SubBanner "extracting from ${tarball}" | 242 if [ ! -d ${TMP}/gdb-7.7.1 ]; then |
| 229 tar jxf ${tarball} -C ${TMP} | 243 SubBanner "extracting from ${tarball}" |
| 244 tar jxf ${tarball} -C ${TMP} |
| 245 fi |
| 230 | 246 |
| 231 tarball="${TMP}/${KERNEL_URL##*/}" | 247 tarball="${TMP}/${KERNEL_URL##*/}" |
| 232 DownloadOrCopyAndVerify ${KERNEL_URL} ${KERNEL_SHA1SUM} | 248 DownloadOrCopyAndVerify ${KERNEL_URL} ${KERNEL_SHA1SUM} |
| 233 SubBanner "extracting from ${tarball}" | 249 SubBanner "extracting from ${tarball}" |
| 234 tar zxf ${tarball} -C ${TMP} | 250 tar zxf ${tarball} -C ${TMP} |
| 235 | 251 |
| 236 tarball="${TMP}/${GLIBC_URL##*/}" | 252 tarball="${TMP}/${GLIBC_URL##*/}" |
| 237 DownloadOrCopyAndVerify ${GLIBC_URL} ${GLIBC_SHA1SUM} | 253 DownloadOrCopyAndVerify ${GLIBC_URL} ${GLIBC_SHA1SUM} |
| 238 SubBanner "extracting from ${tarball}" | 254 if [ ! -d ${TMP}/glibc-2.19 ]; then |
| 239 tar jxf ${tarball} -C ${TMP} | 255 SubBanner "extracting from ${tarball}" |
| 256 tar jxf ${tarball} -C ${TMP} |
| 257 fi |
| 240 | 258 |
| 241 | 259 |
| 242 Banner "Preparing the code" | 260 Banner "Preparing the code" |
| 243 | 261 |
| 244 # Fix a minor syntax issue in tc-mips.c. | 262 # Fix a minor syntax issue in tc-mips.c. |
| 245 local OLD_TEXT="as_warn_where (fragp->fr_file, fragp->fr_line, msg);" | 263 local OLD_TEXT="as_warn_where (fragp->fr_file, fragp->fr_line, msg);" |
| 246 local NEW_TEXT="as_warn_where (fragp->fr_file, fragp->fr_line, \"%s\", msg);" | 264 local NEW_TEXT="as_warn_where (fragp->fr_file, fragp->fr_line, \"%s\", msg);" |
| 247 local FILE_NAME="${TMP}/binutils-2.24/gas/config/tc-mips.c" | 265 local FILE_NAME="${TMP}/binutils-2.24/gas/config/tc-mips.c" |
| 248 sed -i "s/${OLD_TEXT}/${NEW_TEXT}/g" "${FILE_NAME}" | 266 sed -i "s/${OLD_TEXT}/${NEW_TEXT}/g" "${FILE_NAME}" |
| 249 | 267 |
| 250 export PATH=${INSTALL_ROOT}/bin:$PATH | 268 export PATH=${INSTALL_ROOT}/bin:$PATH |
| 269 local PREFIX_MIPSEL=/usr |
| 270 local PREFIX=/ |
| 251 | 271 |
| 252 | 272 |
| 253 Banner "Building binutils" | 273 Banner "Building binutils" |
| 254 | 274 |
| 255 rm -rf ${BUILD_DIR}/binutils/ | |
| 256 mkdir -p ${BUILD_DIR}/binutils/ | 275 mkdir -p ${BUILD_DIR}/binutils/ |
| 257 pushd ${BUILD_DIR}/binutils/ | 276 pushd ${BUILD_DIR}/binutils/ |
| 258 | 277 |
| 259 SubBanner "Configuring" | 278 SubBanner "Configuring" |
| 260 ${TMP}/binutils-2.24/configure \ | 279 ${TMP}/binutils-2.24/configure \ |
| 261 --prefix=${INSTALL_ROOT} \ | 280 --prefix=${PREFIX} \ |
| 262 --target=mipsel-linux-gnu \ | 281 --target=mipsel-linux-gnu \ |
| 263 --with-sysroot=${JAIL_MIPS32} | 282 --with-sysroot=${JAIL_MIPS32} |
| 264 | 283 |
| 265 SubBanner "Make" | 284 SubBanner "Make" |
| 266 make ${MAKE_OPTS} all-binutils all-gas all-ld | 285 make ${MAKE_OPTS} all-binutils all-gas all-ld |
| 267 | 286 |
| 268 SubBanner "Install" | 287 SubBanner "Install" |
| 269 make ${MAKE_OPTS} install-binutils install-gas install-ld | 288 make ${MAKE_OPTS} DESTDIR=${INSTALL_ROOT} install-binutils install-gas \ |
| 289 install-ld |
| 270 | 290 |
| 271 popd | 291 popd |
| 272 | 292 |
| 273 | 293 |
| 274 Banner "Building GCC (initial)" | 294 Banner "Building GCC (initial)" |
| 275 | 295 |
| 276 rm -rf ${BUILD_DIR}/gcc/initial | |
| 277 mkdir -p ${BUILD_DIR}/gcc/initial | 296 mkdir -p ${BUILD_DIR}/gcc/initial |
| 278 pushd ${BUILD_DIR}/gcc/initial | 297 pushd ${BUILD_DIR}/gcc/initial |
| 279 | 298 |
| 280 SubBanner "Configuring" | 299 SubBanner "Configuring" |
| 281 ${TMP}/gcc-4.9.0/configure \ | 300 ${TMP}/gcc-4.9.0/configure \ |
| 282 --prefix=${INSTALL_ROOT} \ | 301 --prefix=${PREFIX} \ |
| 283 --disable-libssp \ | 302 --disable-libssp \ |
| 284 --disable-libgomp \ | 303 --disable-libgomp \ |
| 285 --disable-libmudflap \ | 304 --disable-libmudflap \ |
| 286 --disable-fixed-point \ | 305 --disable-fixed-point \ |
| 287 --disable-decimal-float \ | 306 --disable-decimal-float \ |
| 288 --with-mips-plt \ | 307 --with-mips-plt \ |
| 289 --with-endian=little \ | 308 --with-endian=little \ |
| 290 --with-arch=${ARCH} \ | 309 --with-arch=${ARCH} \ |
| 291 --enable-languages=c \ | 310 --enable-languages=c \ |
| 292 --with-newlib \ | 311 --with-newlib \ |
| 293 --without-headers \ | 312 --without-headers \ |
| 294 --disable-shared \ | 313 --disable-shared \ |
| 295 --disable-threads \ | 314 --disable-threads \ |
| 296 --disable-libquadmath \ | 315 --disable-libquadmath \ |
| 297 --disable-libatomic \ | 316 --disable-libatomic \ |
| 298 --target=mipsel-linux-gnu | 317 --target=mipsel-linux-gnu |
| 299 | 318 |
| 300 SubBanner "Make" | 319 SubBanner "Make" |
| 301 make ${MAKE_OPTS} all | 320 make ${MAKE_OPTS} all |
| 302 | 321 |
| 303 SubBanner "Install" | 322 SubBanner "Install" |
| 304 make ${MAKE_OPTS} install | 323 make ${MAKE_OPTS} DESTDIR=${INSTALL_ROOT} install |
| 305 | 324 |
| 306 popd | 325 popd |
| 307 | 326 |
| 308 | 327 |
| 309 Banner "Installing Linux kernel headers" | 328 Banner "Installing Linux kernel headers" |
| 310 pushd ${TMP}/linux-3.14.2 | 329 pushd ${TMP}/linux-3.14.2 |
| 311 make headers_install ARCH=mips INSTALL_HDR_PATH=${JAIL_MIPS32}/usr | 330 make headers_install ARCH=mips INSTALL_HDR_PATH=${JAIL_MIPS32}${PREFIX_MIPSEL} |
| 312 popd | 331 popd |
| 313 | 332 |
| 333 |
| 314 Banner "Building GLIBC" | 334 Banner "Building GLIBC" |
| 315 | 335 |
| 316 rm -rf ${BUILD_DIR}/glibc/final | 336 mkdir -p ${BUILD_DIR}/glibc |
| 317 mkdir -p ${BUILD_DIR}/glibc/final | 337 pushd ${BUILD_DIR}/glibc |
| 318 pushd ${BUILD_DIR}/glibc/final | |
| 319 | 338 |
| 320 BUILD_CC=gcc \ | 339 BUILD_CC=gcc \ |
| 321 AR=mipsel-linux-gnu-ar \ | 340 AR=mipsel-linux-gnu-ar \ |
| 322 RANLIB=mipsel-linux-gnu-ranlibi \ | 341 RANLIB=mipsel-linux-gnu-ranlibi \ |
| 323 CC=mipsel-linux-gnu-gcc \ | 342 CC=mipsel-linux-gnu-gcc \ |
| 324 CXX=mipsel-linux-gnu-g++ \ | 343 CXX=mipsel-linux-gnu-g++ \ |
| 325 ${TMP}/glibc-2.19/configure \ | 344 ${TMP}/glibc-2.19/configure \ |
| 326 --prefix=/usr \ | 345 --prefix=${PREFIX_MIPSEL} \ |
| 327 --enable-add-ons \ | 346 --enable-add-ons \ |
| 328 --host=mipsel-linux-gnu \ | 347 --host=mipsel-linux-gnu \ |
| 329 --disable-profile \ | 348 --disable-profile \ |
| 330 --without-gd \ | 349 --without-gd \ |
| 331 --without-cvs \ | 350 --without-cvs \ |
| 332 --build=i686-pc-linux-gnu \ | 351 --build=i686-pc-linux-gnu \ |
| 333 --with-headers=${JAIL_MIPS32}/usr/include | 352 --with-sysroot=${JAIL_MIPS32} \ |
| 353 --with-headers=${JAIL_MIPS32}${PREFIX_MIPSEL}/include |
| 354 |
| 334 | 355 |
| 335 SubBanner "Make" | 356 SubBanner "Make" |
| 336 make ${MAKE_OPTS} all | 357 make ${MAKE_OPTS} all |
| 337 | 358 |
| 338 SubBanner "Install" | 359 SubBanner "Install" |
| 339 make ${MAKE_OPTS} install install_root=${JAIL_MIPS32} | 360 make ${MAKE_OPTS} DESTDIR=${JAIL_MIPS32} install |
| 340 | 361 |
| 341 popd | 362 popd |
| 342 | 363 |
| 343 | |
| 344 Banner "Building GCC (final)" | 364 Banner "Building GCC (final)" |
| 345 | 365 |
| 346 rm -rf ${BUILD_DIR}/gcc/final | |
| 347 mkdir -p ${BUILD_DIR}/gcc/final | 366 mkdir -p ${BUILD_DIR}/gcc/final |
| 348 pushd ${BUILD_DIR}/gcc/final | 367 pushd ${BUILD_DIR}/gcc/final |
| 349 | 368 |
| 369 export MULTIARCH_DIRNAME=mipsel-linux-gnu |
| 370 |
| 350 ${TMP}/gcc-4.9.0/configure \ | 371 ${TMP}/gcc-4.9.0/configure \ |
| 351 --prefix=${INSTALL_ROOT} \ | 372 --prefix=${PREFIX} \ |
| 352 --disable-libssp \ | 373 --disable-libssp \ |
| 353 --disable-libgomp \ | 374 --disable-libgomp \ |
| 354 --disable-libmudflap \ | 375 --disable-libmudflap \ |
| 355 --disable-fixed-point \ | 376 --disable-fixed-point \ |
| 356 --disable-decimal-float \ | 377 --disable-decimal-float \ |
| 357 --with-mips-plt \ | 378 --with-mips-plt \ |
| 358 --with-endian=little \ | 379 --with-endian=little \ |
| 359 --with-arch=${ARCH} \ | 380 --with-arch=${ARCH} \ |
| 360 --target=mipsel-linux-gnu \ | 381 --target=mipsel-linux-gnu \ |
| 361 --enable-__cxa_atexit \ | 382 --enable-__cxa_atexit \ |
| 362 --enable-languages=c,c++ \ | 383 --enable-languages=c,c++ \ |
| 363 --with-sysroot=${JAIL_MIPS32} | 384 --enable-multiarch \ |
| 385 --with-sysroot=${PREFIX}/sysroot \ |
| 386 --with-build-sysroot=${JAIL_MIPS32} |
| 387 |
| 364 | 388 |
| 365 SubBanner "Make" | 389 SubBanner "Make" |
| 366 make ${MAKE_OPTS} all | 390 make ${MAKE_OPTS} all |
| 367 | 391 |
| 368 SubBanner "Install" | 392 SubBanner "Install" |
| 369 make ${MAKE_OPTS} install | 393 make ${MAKE_OPTS} DESTDIR=${INSTALL_ROOT} install |
| 370 | 394 |
| 371 popd | 395 popd |
| 372 | 396 |
| 373 | 397 |
| 374 Banner "Building GDB" | 398 Banner "Building GDB" |
| 375 | 399 |
| 376 rm -rf ${BUILD_DIR}/gdb/ | |
| 377 mkdir -p ${BUILD_DIR}/gdb/ | 400 mkdir -p ${BUILD_DIR}/gdb/ |
| 378 pushd ${BUILD_DIR}/gdb/ | 401 pushd ${BUILD_DIR}/gdb/ |
| 379 | 402 |
| 380 ${TMP}/gdb-7.7.1/configure \ | 403 ${TMP}/gdb-7.7.1/configure \ |
| 381 --prefix=${INSTALL_ROOT} \ | 404 --prefix=${PREFIX} \ |
| 382 --target=mipsel-linux-gnu | 405 --target=mipsel-linux-gnu |
| 383 | 406 |
| 384 SubBanner "Make" | 407 SubBanner "Make" |
| 385 make ${MAKE_OPTS} all-gdb | 408 make ${MAKE_OPTS} all-gdb |
| 386 | 409 |
| 387 SubBanner "Install" | 410 SubBanner "Install" |
| 388 make ${MAKE_OPTS} install-gdb | 411 make ${MAKE_OPTS} DESTDIR=${INSTALL_ROOT} install-gdb |
| 389 | 412 |
| 390 popd | 413 popd |
| 391 } | 414 } |
| 392 | 415 |
| 393 | 416 |
| 394 # ---------------------------------------------------------------------- | 417 # ---------------------------------------------------------------------- |
| 395 # mips32 deb files to complete our code sourcery jail | 418 # mips32 deb files to complete our code sourcery jail |
| 396 # ---------------------------------------------------------------------- | 419 # ---------------------------------------------------------------------- |
| 397 | 420 |
| 398 readonly REPO_DEBIAN=http://ftp.debian.org/debian | 421 readonly REPO_DEBIAN=http://ftp.debian.org/debian |
| 399 readonly MIPS32_PACKAGES=${REPO_DEBIAN}/dists/wheezy/main/binary-mipsel/Packages
.bz2 | 422 readonly MIPS32_PACKAGES=${REPO_DEBIAN}/dists/jessie/main/binary-mipsel/Packages
.gz |
| 423 readonly PACKAGE_LIST=${SCRIPT_DIR}/packagelist.jessie.mipsel.base |
| 400 | 424 |
| 401 readonly BASE_PACKAGELIST_MIPS32=${SCRIPT_DIR}/packagelist.wheezy.mipsel.base | 425 #@ |
| 402 readonly EXTRA_PACKAGELIST_MIPS32=${SCRIPT_DIR}/packagelist.wheezy.mipsel.extra | 426 #@ GeneratePackageList |
| 403 readonly TMP_BASE_PKG_MIPS32=${TMP}/packagelist.generated.wheezy.mipsel.base | 427 #@ |
| 404 readonly TMP_EXTRA_PKG_MIPS32=${TMP}/packagelist.generated.wheezy.mipsel.extra | 428 GeneratePackageList() { |
| 405 | 429 Banner "generating package lists for mips32" |
| 406 GeneratePackageLists() { | 430 rm -f ${TMP}/Packages.gz |
| 407 local sdk_target=$1 | |
| 408 local packages= | |
| 409 local TMP_PACKAGELIST= | |
| 410 Banner "generating ${sdk_target} package lists for mips32" | |
| 411 rm -f ${TMP}/Packages.bz2 | |
| 412 DownloadOrCopy ${MIPS32_PACKAGES} | 431 DownloadOrCopy ${MIPS32_PACKAGES} |
| 413 bzcat ${TMP}/Packages.bz2\ | 432 zcat ${TMP}/Packages.gz\ |
| 414 | egrep '^(Package:|Filename:)' > ${TMP}/Packages_mipsel | 433 | egrep '^(Package:|Filename:)' > ${TMP}/Packages_mipsel |
| 415 | 434 |
| 416 if [ ${sdk_target} == "nacl_sdk" ] ; then | 435 echo -n > ${PACKAGE_LIST} |
| 417 echo -n > ${TMP_BASE_PKG_MIPS32} | |
| 418 TMP_PACKAGELIST=${TMP_BASE_PKG_MIPS32} | |
| 419 packages=$(cat ${BASE_PACKAGELIST_MIPS32}) | |
| 420 elif [ ${sdk_target} == "chrome_sdk" ] ; then | |
| 421 echo -n > ${TMP_EXTRA_PKG_MIPS32} | |
| 422 TMP_PACKAGELIST=${TMP_EXTRA_PKG_MIPS32} | |
| 423 packages=$(cat ${EXTRA_PACKAGELIST_MIPS32}) | |
| 424 else | |
| 425 Banner "ERROR: Packages for \"${sdk_taget}\" not defined." | |
| 426 exit -1 | |
| 427 fi | |
| 428 | 436 |
| 429 for pkg in ${packages} ; do | 437 for pkg in ${PACKAGES} ; do |
| 430 grep -A 1 "${pkg}\$" ${TMP}/Packages_mipsel\ | 438 grep -A 1 "${pkg}\$" ${TMP}/Packages_mipsel\ |
| 431 | egrep -o "pool/.*" >> ${TMP_PACKAGELIST} | 439 | egrep -o "pool/.*" >> ${PACKAGE_LIST} |
| 432 done | 440 done |
| 433 } | 441 } |
| 434 | 442 |
| 435 InstallMissingLibraries() { | 443 #@ |
| 436 local sdk_target=$1 | 444 #@ InstallPackages |
| 445 #@ |
| 446 InstallPackages() { |
| 447 mkdir -p ${JAIL_MIPS32} |
| 437 local DEP_FILES_NEEDED_MIPS32= | 448 local DEP_FILES_NEEDED_MIPS32= |
| 438 | 449 DEP_FILES_NEEDED_MIPS32=$(cat ${PACKAGE_LIST}) |
| 439 if [ ${sdk_target} == "nacl_sdk" ] ; then | |
| 440 DEP_FILES_NEEDED_MIPS32=$(cat ${TMP_BASE_PKG_MIPS32}) | |
| 441 elif [ ${sdk_target} == "chrome_sdk" ] ; then | |
| 442 DEP_FILES_NEEDED_MIPS32=$(cat ${TMP_EXTRA_PKG_MIPS32}) | |
| 443 else | |
| 444 Banner "ERROR: Target \"${sdk_taget}\" not defined." | |
| 445 exit -1 | |
| 446 fi | |
| 447 | 450 |
| 448 for file in ${DEP_FILES_NEEDED_MIPS32} ; do | 451 for file in ${DEP_FILES_NEEDED_MIPS32} ; do |
| 449 local package="${TMP}/${file##*/}" | 452 local package="${TMP}/${file##*/}" |
| 450 Banner "installing ${file}" | 453 Banner "installing ${file}" |
| 451 DownloadOrCopy ${REPO_DEBIAN}/${file} | 454 DownloadOrCopy ${REPO_DEBIAN}/${file} |
| 452 SubBanner "extracting to ${JAIL_MIPS32}" | 455 SubBanner "extracting to ${JAIL_MIPS32}" |
| 453 dpkg --fsys-tarfile ${package}\ | 456 dpkg --fsys-tarfile ${package}\ |
| 454 | tar -xvf - --exclude=./usr/share -C ${JAIL_MIPS32} | 457 | tar -xvf - --exclude=./usr/share -C ${JAIL_MIPS32} |
| 455 done | 458 done |
| 456 } | 459 } |
| 457 | 460 |
| 458 # Workaround for missing headers since pkg-config is not working correctly. | |
| 459 FixIncludes() { | |
| 460 Banner "Fixing includes" | |
| 461 pushd ${JAIL_MIPS32}/usr/include/glib-2.0 | |
| 462 ln -s ../../lib/glib-2.0/include/glibconfig.h . | |
| 463 popd | |
| 464 | |
| 465 pushd ${JAIL_MIPS32}/usr/include/gtk-2.0 | |
| 466 ln -s ../../lib/gtk-2.0/include/gdkconfig.h . | |
| 467 popd | |
| 468 | |
| 469 pushd ${JAIL_MIPS32}/usr/include/dbus-1.0/dbus | |
| 470 ln -s ../../../lib/dbus-1.0/include/dbus/dbus-arch-deps.h . | |
| 471 popd | |
| 472 } | |
| 473 | |
| 474 FixLinks() { | |
| 475 Banner "Fixing links" | |
| 476 pushd ${JAIL_MIPS32}/lib/ | |
| 477 mv mipsel-linux-gnu/* . | |
| 478 rm -rf mipsel-linux-gnu | |
| 479 ln -s . mipsel-linux-gnu | |
| 480 popd | |
| 481 | |
| 482 pushd ${JAIL_MIPS32}/usr/lib/ | |
| 483 mkdir -p pkgconfig | |
| 484 mv mipsel-linux-gnu/pkgconfig/* pkgconfig/ | |
| 485 rm -rf mipsel-linux-gnu/pkgconfig | |
| 486 mv mipsel-linux-gnu/* . | |
| 487 rm -rf mipsel-linux-gnu | |
| 488 ln -s . mipsel-linux-gnu | |
| 489 popd | |
| 490 | |
| 491 pushd ${JAIL_MIPS32}/usr/lib/ | |
| 492 rm -f libstdc++.so* | |
| 493 ln -s ../../../mipsel-linux-gnu/lib/libstdc++.so.6.0.20 . | |
| 494 ln -s libstdc++.so.6.0.20 libstdc++.so.6 | |
| 495 ln -s libstdc++.so.6.0.20 libstdc++.so | |
| 496 | |
| 497 rm -f libgcc_s.so* | |
| 498 ln -s ../../../mipsel-linux-gnu/lib/libgcc_s.so.1 . | |
| 499 ln -s libgcc_s.so.1 libgcc_s.so | |
| 500 popd | |
| 501 } | |
| 502 | |
| 503 FixLibs() { | |
| 504 Banner "Fixing libraries" | |
| 505 | |
| 506 readonly liblist="libbz2.so \ | |
| 507 libcom_err.so \ | |
| 508 libdbus-1.so \ | |
| 509 libexpat.so \ | |
| 510 libglib-2.0.so \ | |
| 511 libgpg-error.so \ | |
| 512 libkeyutils.so \ | |
| 513 libpamc.so \ | |
| 514 libpam_misc.so \ | |
| 515 libpam.so \ | |
| 516 libpci.so \ | |
| 517 libpcre.so \ | |
| 518 libpng12.so \ | |
| 519 libudev.so \ | |
| 520 libz.so" | |
| 521 | |
| 522 pushd ${JAIL_MIPS32}/usr/lib/ | |
| 523 for library in ${liblist}; do | |
| 524 rm -f ${library} | |
| 525 ln -s ../../lib/${library}.[0123] ${library} | |
| 526 done | |
| 527 popd | |
| 528 } | |
| 529 | |
| 530 BuildAndInstallQemu() { | 461 BuildAndInstallQemu() { |
| 531 local saved_dir=$(pwd) | 462 local saved_dir=$(pwd) |
| 532 local tmpdir="${TMP}/qemu-mips.nacl" | 463 local tmpdir="${TMP}/qemu-mips.nacl" |
| 533 local tarball="qemu-2.0.0.tar.bz2" | 464 local tarball="qemu-2.0.0.tar.bz2" |
| 534 | 465 |
| 535 Banner "Building qemu in ${tmpdir}" | 466 Banner "Building qemu in ${tmpdir}" |
| 536 | 467 |
| 537 rm -rf ${tmpdir} | 468 rm -rf ${tmpdir} |
| 538 mkdir ${tmpdir} | 469 mkdir ${tmpdir} |
| 539 cd ${tmpdir} | 470 cd ${tmpdir} |
| 540 | 471 |
| 541 SubBanner "Downloading" | 472 SubBanner "Downloading" |
| 542 wget -c ${DOWNLOAD_QEMU_URL} | 473 wget -c ${DOWNLOAD_QEMU_URL} |
| 543 | 474 |
| 544 SubBanner "Untarring" | 475 SubBanner "Untarring" |
| 545 tar xf ${tarball} | 476 tar xf ${tarball} |
| 546 cd qemu-2.0.0 | 477 cd qemu-2.0.0 |
| 547 | 478 |
| 548 SubBanner "Configuring" | 479 SubBanner "Configuring" |
| 549 env -i PATH=/usr/bin/:/bin \ | 480 env -i PATH=/usr/bin/:/bin \ |
| 550 ./configure \ | 481 ./configure \ |
| 551 --disable-system \ | 482 --disable-system \ |
| 552 --enable-linux-user \ | 483 --enable-linux-user \ |
| 553 --disable-bsd-user \ | 484 --disable-bsd-user \ |
| 554 --target-list=mipsel-linux-user \ | 485 --target-list=mipsel-linux-user \ |
| 555 --disable-sdl \ | 486 --disable-sdl \ |
| 556 --disable-linux-aio | 487 --disable-linux-aio |
| 557 | 488 |
| 558 SubBanner "Make" | 489 SubBanner "Make" |
| 559 env -i PATH=/usr/bin/:/bin \ | 490 env -i PATH=/usr/bin/:/bin make ${MAKE_OPTS} |
| 560 make MAKE_OPTS=${MAKE_OPTS} | |
| 561 | 491 |
| 562 SubBanner "Install" | 492 SubBanner "Install" |
| 563 cp mipsel-linux-user/qemu-mipsel ${INSTALL_ROOT}/qemu-mips32 | 493 cp mipsel-linux-user/qemu-mipsel ${INSTALL_ROOT}/qemu-mips32 |
| 564 cd ${saved_dir} | 494 cd ${saved_dir} |
| 565 cp tools/trusted_cross_toolchains/qemu_tool_mips32.sh ${INSTALL_ROOT} | 495 cp tools/trusted_cross_toolchains/qemu_tool_mips32.sh ${INSTALL_ROOT} |
| 566 ln -sf qemu_tool_mips32.sh ${INSTALL_ROOT}/run_under_qemu_mips32 | 496 ln -sf qemu_tool_mips32.sh ${INSTALL_ROOT}/run_under_qemu_mips32 |
| 567 } | 497 } |
| 568 | 498 |
| 499 CleanupSysrootSymlinks() { |
| 500 Banner "jail symlink cleanup" |
| 501 |
| 502 pushd ${JAIL_MIPS32} |
| 503 find usr/lib -type l -printf '%p %l\n' | while read link target; do |
| 504 # skip links with non-absolute paths |
| 505 if [[ ${target} != /* ]] ; then |
| 506 continue |
| 507 fi |
| 508 echo "${link}: ${target}" |
| 509 case "${link}" in |
| 510 usr/lib/mipsel-linux-gnu/*) |
| 511 # Relativize the symlink. |
| 512 ln -snfv "../../..${target}" "${link}" |
| 513 ;; |
| 514 usr/lib/*) |
| 515 # Relativize the symlink. |
| 516 ln -snfv "../..${target}" "${link}" |
| 517 ;; |
| 518 esac |
| 519 done |
| 520 |
| 521 find usr/lib -type l -printf '%p %l\n' | while read link target; do |
| 522 # Make sure we catch new bad links. |
| 523 if [ ! -r "${link}" ]; then |
| 524 echo "ERROR: FOUND BAD LINK ${link}" |
| 525 exit -1 |
| 526 fi |
| 527 done |
| 528 popd |
| 529 } |
| 530 |
| 531 #@ |
| 532 #@ UploadArchive <revision> |
| 533 #@ |
| 534 #@ Upload archive to Cloud Storage along with json manifest and |
| 535 #@ update toolchain_revisions to point to new version. |
| 536 #@ This requires write access the Cloud Storage bucket for Native Client. |
| 537 UploadArchive() { |
| 538 local REV=$1 |
| 539 local TAR_NAME=$(basename ${TAR_ARCHIVE}) |
| 540 local GS_FILE=nativeclient-archive2/toolchain/${REV}/${TAR_NAME} |
| 541 local URL=https://storage.googleapis.com/${GS_FILE} |
| 542 set -x |
| 543 gsutil cp -a public-read ${TAR_ARCHIVE} gs://${GS_FILE} |
| 544 local package_version=build/package_version/package_version.py |
| 545 ${package_version} archive --archive-package linux_x86/mips_trusted \ |
| 546 ${TAR_ARCHIVE}@${URL} |
| 547 ${package_version} upload --upload-package linux_x86/mips_trusted \ |
| 548 --revision ${REV} |
| 549 ${package_version} setrevision --revision-package linux_x86/mips_trusted \ |
| 550 --revision ${REV} |
| 551 set +x |
| 552 } |
| 553 |
| 554 help() { |
| 555 Usage |
| 556 } |
| 557 |
| 569 ###################################################################### | 558 ###################################################################### |
| 570 # Main | 559 # Main |
| 571 ###################################################################### | 560 ###################################################################### |
| 572 | 561 |
| 573 if [[ $# -eq 0 ]] ; then | 562 mkdir -p ${TMP} |
| 574 echo "you must specify a mode on the commandline:" | |
| 575 echo | |
| 576 Usage | |
| 577 exit -1 | |
| 578 | 563 |
| 579 elif [[ $1 == "nacl_sdk" || $1 == "chrome_sdk" ]] ; then | 564 BuildSysroot() { |
| 580 mkdir -p ${TMP} | |
| 581 SanityCheck | 565 SanityCheck |
| 582 ClearInstallDir | 566 ClearInstallDir |
| 583 ClearBuildDir | 567 ClearBuildDir |
| 584 DownloadOrCopyAndInstallToolchain | 568 DownloadOrCopyAndInstallToolchain |
| 585 GeneratePackageLists $1 | 569 GeneratePackageList |
| 586 InstallMissingLibraries $1 | 570 InstallPackages |
| 587 FixLinks | 571 CleanupSysrootSymlinks |
| 588 if [[ $1 == "nacl_sdk" ]] ; then | 572 BuildAndInstallQemu |
| 589 BuildAndInstallQemu | 573 CreateTarBall |
| 590 CreateTarBall $1 | 574 } |
| 591 else | |
| 592 FixLibs | |
| 593 FixIncludes | |
| 594 CreateTarBall ${CROSS_TARBALL} | |
| 595 fi | |
| 596 | 575 |
| 576 if [[ $# -eq 0 ]] ; then |
| 577 BuildSysroot |
| 578 elif [[ "$(type -t $1)" != "function" ]]; then |
| 579 echo "ERROR: unknown function '$1'." >&2 |
| 580 echo "For help, try:" |
| 581 echo " $0 help" |
| 582 exit 1 |
| 597 else | 583 else |
| 598 Usage | 584 "$@" |
| 599 exit -1 | |
| 600 | |
| 601 fi | 585 fi |
| 602 | |
| OLD | NEW |