Home | History | Annotate | Line # | Download | only in contrib
download_prerequisites revision 1.9
      1  1.1  mrg #! /bin/sh
      2  1.6  mrg #! -*- coding:utf-8; mode:shell-script; -*-
      3  1.1  mrg 
      4  1.6  mrg # Download some prerequisites needed by GCC.
      5  1.6  mrg # Run this from the top level of the GCC source tree and the GCC build will do
      6  1.6  mrg # the right thing.  Run it with the `--help` option for more information.
      7  1.1  mrg #
      8  1.6  mrg # (C) 2010-2016 Free Software Foundation
      9  1.1  mrg #
     10  1.1  mrg # This program is free software: you can redistribute it and/or modify
     11  1.1  mrg # it under the terms of the GNU General Public License as published by
     12  1.1  mrg # the Free Software Foundation, either version 3 of the License, or
     13  1.1  mrg # (at your option) any later version.
     14  1.1  mrg # 
     15  1.1  mrg # This program is distributed in the hope that it will be useful, but
     16  1.1  mrg # WITHOUT ANY WARRANTY; without even the implied warranty of
     17  1.1  mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
     18  1.1  mrg # General Public License for more details.
     19  1.1  mrg # 
     20  1.1  mrg # You should have received a copy of the GNU General Public License
     21  1.1  mrg # along with this program. If not, see http://www.gnu.org/licenses/.
     22  1.1  mrg 
     23  1.6  mrg program='download_prerequisites'
     24  1.6  mrg version='(unversioned)'
     25  1.6  mrg 
     26  1.6  mrg # MAINTAINERS: If you update the package versions below, please
     27  1.6  mrg # remember to also update the files `contrib/prerequisites.sha512` and
     28  1.6  mrg # `contrib/prerequisites.md5` with the new checksums.
     29  1.6  mrg 
     30  1.6  mrg gmp='gmp-6.1.0.tar.bz2'
     31  1.9  mrg mpfr='mpfr-3.1.6.tar.bz2'
     32  1.6  mrg mpc='mpc-1.0.3.tar.gz'
     33  1.7  mrg isl='isl-0.18.tar.bz2'
     34  1.6  mrg 
     35  1.9  mrg base_url='http://gcc.gnu.org/pub/gcc/infrastructure/'
     36  1.6  mrg 
     37  1.6  mrg echo_archives() {
     38  1.6  mrg     echo "${gmp}"
     39  1.6  mrg     echo "${mpfr}"
     40  1.6  mrg     echo "${mpc}"
     41  1.6  mrg     if [ ${graphite} -gt 0 ]; then echo "${isl}"; fi
     42  1.6  mrg }
     43  1.6  mrg 
     44  1.6  mrg graphite=1
     45  1.6  mrg verify=1
     46  1.6  mrg force=0
     47  1.6  mrg OS=$(uname)
     48  1.6  mrg 
     49  1.6  mrg case $OS in
     50  1.7  mrg   "Darwin"|"FreeBSD"|"DragonFly")
     51  1.6  mrg     chksum='shasum -a 512 --check'
     52  1.6  mrg   ;;
     53  1.6  mrg   *)
     54  1.8  mrg     chksum='sha512sum -c'
     55  1.6  mrg   ;;
     56  1.6  mrg esac
     57  1.6  mrg 
     58  1.6  mrg if type wget > /dev/null ; then
     59  1.6  mrg   fetch='wget'
     60  1.6  mrg else
     61  1.9  mrg   fetch='curl -LO'
     62  1.3  mrg fi
     63  1.6  mrg chksum_extension='sha512'
     64  1.6  mrg directory='.'
     65  1.6  mrg 
     66  1.6  mrg helptext="usage: ${program} [OPTION...]
     67  1.6  mrg 
     68  1.6  mrg Downloads some prerequisites needed by GCC.  Run this from the top level of the
     69  1.6  mrg GCC source tree and the GCC build will do the right thing.
     70  1.6  mrg 
     71  1.6  mrg The following options are available:
     72  1.6  mrg 
     73  1.6  mrg  --directory=DIR  download and unpack packages into DIR instead of '.'
     74  1.6  mrg  --force          download again overwriting existing packages
     75  1.6  mrg  --no-force       do not download existing packages again (default)
     76  1.6  mrg  --isl            download ISL, needed for Graphite loop optimizations (default)
     77  1.6  mrg  --graphite       same as --isl
     78  1.6  mrg  --no-isl         don't download ISL
     79  1.6  mrg  --no-graphite    same as --no-isl
     80  1.6  mrg  --verify         verify package integrity after download (default)
     81  1.6  mrg  --no-verify      don't verify package integrity
     82  1.6  mrg  --sha512         use SHA512 checksum to verify package integrity (default)
     83  1.6  mrg  --md5            use MD5 checksum to verify package integrity
     84  1.6  mrg  --help           show this text and exit
     85  1.6  mrg  --version        show version information and exit
     86  1.6  mrg "
     87  1.6  mrg 
     88  1.6  mrg versiontext="${program} ${version}
     89  1.6  mrg Copyright (C) 2016 Free Software Foundation, Inc.
     90  1.6  mrg This is free software; see the source for copying conditions.  There is NO
     91  1.6  mrg warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
     92  1.3  mrg 
     93  1.6  mrg die() {
     94  1.6  mrg     echo "error: $@" >&2
     95  1.6  mrg     exit 1
     96  1.6  mrg }
     97  1.6  mrg 
     98  1.6  mrg for arg in "$@"
     99  1.6  mrg do
    100  1.6  mrg     case "${arg}" in
    101  1.6  mrg         --help)
    102  1.6  mrg             echo "${helptext}"
    103  1.6  mrg             exit
    104  1.6  mrg             ;;
    105  1.6  mrg         --version)
    106  1.6  mrg             echo "${versiontext}"
    107  1.6  mrg             exit
    108  1.6  mrg             ;;
    109  1.6  mrg     esac
    110  1.6  mrg done
    111  1.6  mrg unset arg
    112  1.6  mrg 
    113  1.6  mrg # Emulate Linux's 'md5 --check' on macOS
    114  1.6  mrg md5_check() {
    115  1.6  mrg   # Store the standard input: a line from contrib/prerequisites.md5:
    116  1.6  mrg   md5_checksum_line=$(cat -)
    117  1.6  mrg   # Grab the text before the first space
    118  1.6  mrg   md5_checksum_expected="${md5_checksum_line%% *}"
    119  1.6  mrg   # Grab the text after the first space
    120  1.6  mrg   file_to_check="${md5_checksum_line##* }"
    121  1.6  mrg   # Calculate the md5 checksum for the downloaded file
    122  1.6  mrg   md5_checksum_output=$(md5 -r "${file_to_check}")
    123  1.6  mrg   # Grab the text before the first space
    124  1.6  mrg   md5_checksum_detected="${md5_checksum_output%% *}"
    125  1.6  mrg   [ "${md5_checksum_expected}" == "${md5_checksum_detected}" ] \
    126  1.6  mrg     || die "Cannot verify integrity of possibly corrupted file ${file_to_check}"
    127  1.6  mrg   echo "${file_to_check}: OK"
    128  1.6  mrg }
    129  1.6  mrg 
    130  1.6  mrg 
    131  1.6  mrg argnext=
    132  1.6  mrg for arg in "$@"
    133  1.6  mrg do
    134  1.6  mrg     if [ "x${argnext}" = x ]
    135  1.6  mrg     then
    136  1.6  mrg         case "${arg}" in
    137  1.6  mrg             --directory)
    138  1.6  mrg                 argnext='directory'
    139  1.6  mrg                 ;;
    140  1.6  mrg             --directory=*)
    141  1.6  mrg                 directory="${arg#--directory=}"
    142  1.6  mrg                 ;;
    143  1.6  mrg             --force)
    144  1.6  mrg                 force=1
    145  1.6  mrg                 ;;
    146  1.6  mrg             --no-force)
    147  1.6  mrg                 force=0
    148  1.6  mrg                 ;;
    149  1.6  mrg             --isl|--graphite)
    150  1.6  mrg                 graphite=1
    151  1.6  mrg                 ;;
    152  1.6  mrg             --no-isl|--no-graphite)
    153  1.6  mrg                 graphite=0
    154  1.6  mrg                 ;;
    155  1.6  mrg             --verify)
    156  1.6  mrg                 verify=1
    157  1.6  mrg                 ;;
    158  1.6  mrg             --no-verify)
    159  1.6  mrg                 verify=0
    160  1.6  mrg                 ;;
    161  1.6  mrg             --sha512)
    162  1.6  mrg                 case $OS in
    163  1.6  mrg                   "Darwin")
    164  1.6  mrg                     chksum='shasum -a 512 --check'
    165  1.6  mrg                   ;;
    166  1.6  mrg                   *)
    167  1.6  mrg                     chksum='sha512sum --check'
    168  1.6  mrg                   ;;
    169  1.6  mrg                 esac
    170  1.6  mrg                 chksum_extension='sha512'
    171  1.6  mrg                 verify=1
    172  1.6  mrg                 ;;
    173  1.6  mrg             --md5)
    174  1.6  mrg                 case $OS in
    175  1.6  mrg                   "Darwin")
    176  1.6  mrg                     chksum='md5_check'
    177  1.6  mrg                   ;;
    178  1.6  mrg                   *)
    179  1.6  mrg                     chksum='md5 --check'
    180  1.6  mrg                   ;;
    181  1.6  mrg                 esac
    182  1.6  mrg                 chksum_extension='md5'
    183  1.6  mrg                 verify=1
    184  1.6  mrg                 ;;
    185  1.6  mrg             -*)
    186  1.6  mrg                 die "unknown option: ${arg}"
    187  1.6  mrg                 ;;
    188  1.6  mrg             *)
    189  1.6  mrg                 die "too many arguments"
    190  1.6  mrg                 ;;
    191  1.6  mrg         esac
    192  1.6  mrg     else
    193  1.6  mrg         case "${arg}" in
    194  1.6  mrg             -*)
    195  1.6  mrg                 die "Missing argument for option --${argnext}"
    196  1.6  mrg                 ;;
    197  1.6  mrg         esac
    198  1.6  mrg         case "${argnext}" in
    199  1.6  mrg             directory)
    200  1.6  mrg                 directory="${arg}"
    201  1.6  mrg                 ;;
    202  1.6  mrg             *)
    203  1.6  mrg                 die "The impossible has happened"
    204  1.6  mrg                 ;;
    205  1.6  mrg         esac
    206  1.6  mrg         argnext=
    207  1.6  mrg     fi
    208  1.6  mrg done
    209  1.6  mrg [ "x${argnext}" = x ] || die "Missing argument for option --${argnext}"
    210  1.6  mrg unset arg argnext
    211  1.6  mrg 
    212  1.6  mrg [ -e ./gcc/BASE-VER ]                                                         \
    213  1.6  mrg     || die "You must run this script in the top-level GCC source directory"
    214  1.6  mrg 
    215  1.6  mrg [ -d "${directory}" ]                                                         \
    216  1.6  mrg     || die "No such directory: ${directory}"
    217  1.6  mrg 
    218  1.6  mrg for ar in $(echo_archives)
    219  1.6  mrg do
    220  1.6  mrg     if [ ${force} -gt 0 ]; then rm -f "${directory}/${ar}"; fi
    221  1.6  mrg     [ -e "${directory}/${ar}" ]                                               \
    222  1.6  mrg         || ${fetch} --no-verbose -O "${directory}/${ar}" "${base_url}${ar}"       \
    223  1.6  mrg         || die "Cannot download ${ar} from ${base_url}"
    224  1.6  mrg done
    225  1.6  mrg unset ar
    226  1.6  mrg 
    227  1.6  mrg if [ ${verify} -gt 0 ]
    228  1.6  mrg then
    229  1.6  mrg     chksumfile="contrib/prerequisites.${chksum_extension}"
    230  1.6  mrg     [ -r "${chksumfile}" ] || die "No checksums available"
    231  1.6  mrg     for ar in $(echo_archives)
    232  1.6  mrg     do
    233  1.6  mrg         grep "${ar}" "${chksumfile}"                                          \
    234  1.6  mrg             | ( cd "${directory}" && ${chksum} )                              \
    235  1.6  mrg             || die "Cannot verify integrity of possibly corrupted file ${ar}"
    236  1.6  mrg     done
    237  1.6  mrg     unset chksumfile
    238  1.3  mrg fi
    239  1.6  mrg unset ar
    240  1.6  mrg 
    241  1.6  mrg for ar in $(echo_archives)
    242  1.6  mrg do
    243  1.6  mrg     package="${ar%.tar*}"
    244  1.6  mrg     if [ ${force} -gt 0 ]; then rm -rf "${directory}/${package}"; fi
    245  1.6  mrg     [ -e "${directory}/${package}" ]                                          \
    246  1.6  mrg         || ( cd "${directory}" && tar -xf "${ar}" )                           \
    247  1.6  mrg         || die "Cannot extract package from ${ar}"
    248  1.6  mrg     unset package
    249  1.6  mrg done
    250  1.6  mrg unset ar
    251  1.6  mrg 
    252  1.6  mrg for ar in $(echo_archives)
    253  1.6  mrg do
    254  1.6  mrg     target="${directory}/${ar%.tar*}/"
    255  1.6  mrg     linkname="${ar%-*}"
    256  1.6  mrg     if [ ${force} -gt 0 ]; then rm -f "${linkname}"; fi
    257  1.6  mrg     [ -e "${linkname}" ]                                                      \
    258  1.6  mrg         || ln -s "${target}" "${linkname}"                                    \
    259  1.6  mrg         || die "Cannot create symbolic link ${linkname} --> ${target}"
    260  1.6  mrg     unset target linkname
    261  1.6  mrg done
    262  1.6  mrg unset ar
    263  1.6  mrg 
    264  1.6  mrg echo "All prerequisites downloaded successfully."
    265