Home | History | Annotate | Line # | Download | only in contrib
      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.10  mrg # (C) 2010-2021 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.10  mrg gmp='gmp-6.2.1.tar.bz2'
     31  1.10  mrg mpfr='mpfr-4.1.0.tar.bz2'
     32  1.10  mrg mpc='mpc-1.2.1.tar.gz'
     33  1.10  mrg isl='isl-0.24.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 if type wget > /dev/null ; then
     50   1.6  mrg   fetch='wget'
     51   1.6  mrg else
     52   1.9  mrg   fetch='curl -LO'
     53   1.3  mrg fi
     54   1.6  mrg chksum_extension='sha512'
     55   1.6  mrg directory='.'
     56   1.6  mrg 
     57   1.6  mrg helptext="usage: ${program} [OPTION...]
     58   1.6  mrg 
     59   1.6  mrg Downloads some prerequisites needed by GCC.  Run this from the top level of the
     60   1.6  mrg GCC source tree and the GCC build will do the right thing.
     61   1.6  mrg 
     62   1.6  mrg The following options are available:
     63   1.6  mrg 
     64   1.6  mrg  --directory=DIR  download and unpack packages into DIR instead of '.'
     65   1.6  mrg  --force          download again overwriting existing packages
     66   1.6  mrg  --no-force       do not download existing packages again (default)
     67   1.6  mrg  --isl            download ISL, needed for Graphite loop optimizations (default)
     68   1.6  mrg  --graphite       same as --isl
     69   1.6  mrg  --no-isl         don't download ISL
     70   1.6  mrg  --no-graphite    same as --no-isl
     71   1.6  mrg  --verify         verify package integrity after download (default)
     72   1.6  mrg  --no-verify      don't verify package integrity
     73   1.6  mrg  --sha512         use SHA512 checksum to verify package integrity (default)
     74   1.6  mrg  --md5            use MD5 checksum to verify package integrity
     75   1.6  mrg  --help           show this text and exit
     76   1.6  mrg  --version        show version information and exit
     77   1.6  mrg "
     78   1.6  mrg 
     79   1.6  mrg versiontext="${program} ${version}
     80  1.10  mrg Copyright (C) 2016-2021 Free Software Foundation, Inc.
     81   1.6  mrg This is free software; see the source for copying conditions.  There is NO
     82   1.6  mrg warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
     83   1.3  mrg 
     84   1.6  mrg die() {
     85   1.6  mrg     echo "error: $@" >&2
     86   1.6  mrg     exit 1
     87   1.6  mrg }
     88   1.6  mrg 
     89   1.6  mrg for arg in "$@"
     90   1.6  mrg do
     91   1.6  mrg     case "${arg}" in
     92   1.6  mrg         --help)
     93   1.6  mrg             echo "${helptext}"
     94   1.6  mrg             exit
     95   1.6  mrg             ;;
     96   1.6  mrg         --version)
     97   1.6  mrg             echo "${versiontext}"
     98   1.6  mrg             exit
     99   1.6  mrg             ;;
    100   1.6  mrg     esac
    101   1.6  mrg done
    102   1.6  mrg unset arg
    103   1.6  mrg 
    104  1.10  mrg # Emulate Linux's 'md5sum --check' on macOS
    105   1.6  mrg md5_check() {
    106   1.6  mrg   # Store the standard input: a line from contrib/prerequisites.md5:
    107   1.6  mrg   md5_checksum_line=$(cat -)
    108   1.6  mrg   # Grab the text before the first space
    109   1.6  mrg   md5_checksum_expected="${md5_checksum_line%% *}"
    110   1.6  mrg   # Grab the text after the first space
    111   1.6  mrg   file_to_check="${md5_checksum_line##* }"
    112   1.6  mrg   # Calculate the md5 checksum for the downloaded file
    113   1.6  mrg   md5_checksum_output=$(md5 -r "${file_to_check}")
    114   1.6  mrg   # Grab the text before the first space
    115   1.6  mrg   md5_checksum_detected="${md5_checksum_output%% *}"
    116  1.10  mrg   [ "${md5_checksum_expected}" = "${md5_checksum_detected}" ] \
    117   1.6  mrg     || die "Cannot verify integrity of possibly corrupted file ${file_to_check}"
    118   1.6  mrg   echo "${file_to_check}: OK"
    119   1.6  mrg }
    120   1.6  mrg 
    121   1.6  mrg 
    122   1.6  mrg argnext=
    123   1.6  mrg for arg in "$@"
    124   1.6  mrg do
    125   1.6  mrg     if [ "x${argnext}" = x ]
    126   1.6  mrg     then
    127   1.6  mrg         case "${arg}" in
    128   1.6  mrg             --directory)
    129   1.6  mrg                 argnext='directory'
    130   1.6  mrg                 ;;
    131   1.6  mrg             --directory=*)
    132   1.6  mrg                 directory="${arg#--directory=}"
    133   1.6  mrg                 ;;
    134   1.6  mrg             --force)
    135   1.6  mrg                 force=1
    136   1.6  mrg                 ;;
    137   1.6  mrg             --no-force)
    138   1.6  mrg                 force=0
    139   1.6  mrg                 ;;
    140   1.6  mrg             --isl|--graphite)
    141   1.6  mrg                 graphite=1
    142   1.6  mrg                 ;;
    143   1.6  mrg             --no-isl|--no-graphite)
    144   1.6  mrg                 graphite=0
    145   1.6  mrg                 ;;
    146   1.6  mrg             --verify)
    147   1.6  mrg                 verify=1
    148   1.6  mrg                 ;;
    149   1.6  mrg             --no-verify)
    150   1.6  mrg                 verify=0
    151   1.6  mrg                 ;;
    152   1.6  mrg             --sha512)
    153   1.6  mrg                 chksum_extension='sha512'
    154   1.6  mrg                 verify=1
    155   1.6  mrg                 ;;
    156   1.6  mrg             --md5)
    157   1.6  mrg                 chksum_extension='md5'
    158   1.6  mrg                 verify=1
    159   1.6  mrg                 ;;
    160   1.6  mrg             -*)
    161   1.6  mrg                 die "unknown option: ${arg}"
    162   1.6  mrg                 ;;
    163   1.6  mrg             *)
    164   1.6  mrg                 die "too many arguments"
    165   1.6  mrg                 ;;
    166   1.6  mrg         esac
    167   1.6  mrg     else
    168   1.6  mrg         case "${arg}" in
    169   1.6  mrg             -*)
    170   1.6  mrg                 die "Missing argument for option --${argnext}"
    171   1.6  mrg                 ;;
    172   1.6  mrg         esac
    173   1.6  mrg         case "${argnext}" in
    174   1.6  mrg             directory)
    175   1.6  mrg                 directory="${arg}"
    176   1.6  mrg                 ;;
    177   1.6  mrg             *)
    178   1.6  mrg                 die "The impossible has happened"
    179   1.6  mrg                 ;;
    180   1.6  mrg         esac
    181   1.6  mrg         argnext=
    182   1.6  mrg     fi
    183   1.6  mrg done
    184   1.6  mrg [ "x${argnext}" = x ] || die "Missing argument for option --${argnext}"
    185   1.6  mrg unset arg argnext
    186   1.6  mrg 
    187  1.10  mrg case $chksum_extension in
    188  1.10  mrg   sha512)
    189  1.10  mrg     case $OS in
    190  1.10  mrg       "Darwin"|"FreeBSD"|"DragonFly"|"AIX")
    191  1.10  mrg         chksum='shasum -a 512 --check'
    192  1.10  mrg       ;;
    193  1.10  mrg       "OpenBSD")
    194  1.10  mrg         chksum='sha512 -c'
    195  1.10  mrg       ;;
    196  1.10  mrg       *)
    197  1.10  mrg         chksum='sha512sum -c'
    198  1.10  mrg       ;;
    199  1.10  mrg     esac
    200  1.10  mrg   ;;
    201  1.10  mrg   md5)
    202  1.10  mrg     case $OS in
    203  1.10  mrg       "Darwin")
    204  1.10  mrg         chksum='md5_check'
    205  1.10  mrg       ;;
    206  1.10  mrg       *)
    207  1.10  mrg         chksum='md5sum -c'
    208  1.10  mrg       ;;
    209  1.10  mrg     esac
    210  1.10  mrg     ;;
    211  1.10  mrg   *)
    212  1.10  mrg     die "Unkown checksum $chksum_extension"
    213  1.10  mrg   ;;
    214  1.10  mrg esac
    215  1.10  mrg 
    216   1.6  mrg [ -e ./gcc/BASE-VER ]                                                         \
    217   1.6  mrg     || die "You must run this script in the top-level GCC source directory"
    218   1.6  mrg 
    219   1.6  mrg [ -d "${directory}" ]                                                         \
    220   1.6  mrg     || die "No such directory: ${directory}"
    221   1.6  mrg 
    222   1.6  mrg for ar in $(echo_archives)
    223   1.6  mrg do
    224   1.6  mrg     if [ ${force} -gt 0 ]; then rm -f "${directory}/${ar}"; fi
    225   1.6  mrg     [ -e "${directory}/${ar}" ]                                               \
    226  1.10  mrg         || ( cd "${directory}" && ${fetch} --no-verbose "${base_url}${ar}" )  \
    227   1.6  mrg         || die "Cannot download ${ar} from ${base_url}"
    228   1.6  mrg done
    229   1.6  mrg unset ar
    230   1.6  mrg 
    231   1.6  mrg if [ ${verify} -gt 0 ]
    232   1.6  mrg then
    233   1.6  mrg     chksumfile="contrib/prerequisites.${chksum_extension}"
    234   1.6  mrg     [ -r "${chksumfile}" ] || die "No checksums available"
    235   1.6  mrg     for ar in $(echo_archives)
    236   1.6  mrg     do
    237   1.6  mrg         grep "${ar}" "${chksumfile}"                                          \
    238   1.6  mrg             | ( cd "${directory}" && ${chksum} )                              \
    239   1.6  mrg             || die "Cannot verify integrity of possibly corrupted file ${ar}"
    240   1.6  mrg     done
    241   1.6  mrg     unset chksumfile
    242   1.3  mrg fi
    243   1.6  mrg unset ar
    244   1.6  mrg 
    245   1.6  mrg for ar in $(echo_archives)
    246   1.6  mrg do
    247   1.6  mrg     package="${ar%.tar*}"
    248   1.6  mrg     if [ ${force} -gt 0 ]; then rm -rf "${directory}/${package}"; fi
    249  1.10  mrg     case $ar in
    250  1.10  mrg     *.gz)
    251  1.10  mrg 	uncompress='gzip -d'
    252  1.10  mrg 	;;
    253  1.10  mrg     *.bz2)
    254  1.10  mrg 	uncompress='bzip2 -d'
    255  1.10  mrg 	;;
    256  1.10  mrg     *)
    257  1.10  mrg 	uncompress='cat'
    258  1.10  mrg 	;;
    259  1.10  mrg     esac
    260   1.6  mrg     [ -e "${directory}/${package}" ]                                          \
    261  1.10  mrg         || ( cd "${directory}" && $uncompress <"${ar}" | tar -xf - )          \
    262   1.6  mrg         || die "Cannot extract package from ${ar}"
    263   1.6  mrg     unset package
    264   1.6  mrg done
    265   1.6  mrg unset ar
    266   1.6  mrg 
    267   1.6  mrg for ar in $(echo_archives)
    268   1.6  mrg do
    269   1.6  mrg     target="${directory}/${ar%.tar*}/"
    270   1.6  mrg     linkname="${ar%-*}"
    271   1.6  mrg     if [ ${force} -gt 0 ]; then rm -f "${linkname}"; fi
    272   1.6  mrg     [ -e "${linkname}" ]                                                      \
    273   1.6  mrg         || ln -s "${target}" "${linkname}"                                    \
    274   1.6  mrg         || die "Cannot create symbolic link ${linkname} --> ${target}"
    275   1.6  mrg     unset target linkname
    276   1.6  mrg done
    277   1.6  mrg unset ar
    278   1.6  mrg 
    279   1.6  mrg echo "All prerequisites downloaded successfully."
    280