| #! /bin/sh |
| #! -*- coding:utf-8; mode:shell-script; -*- |
| |
| # Download some prerequisites needed by GCC. |
| # Run this from the top level of the GCC source tree and the GCC build will do |
| # the right thing. Run it with the `--help` option for more information. |
| # |
| # (C) 2010-2021 Free Software Foundation |
| # |
| # This program is free software: you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation, either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, but |
| # WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see http://www.gnu.org/licenses/. |
| |
| program='download_prerequisites' |
| version='(unversioned)' |
| |
| # MAINTAINERS: If you update the package versions below, please |
| # remember to also update the files `contrib/prerequisites.sha512` and |
| # `contrib/prerequisites.md5` with the new checksums. |
| |
| gmp='gmp-6.2.1.tar.bz2' |
| mpfr='mpfr-4.1.0.tar.bz2' |
| mpc='mpc-1.2.1.tar.gz' |
| isl='isl-0.24.tar.bz2' |
| |
| base_url='http://gcc.gnu.org/pub/gcc/infrastructure/' |
| |
| echo_archives() { |
| echo "${gmp}" |
| echo "${mpfr}" |
| echo "${mpc}" |
| if [ ${graphite} -gt 0 ]; then echo "${isl}"; fi |
| } |
| |
| graphite=1 |
| verify=1 |
| force=0 |
| OS=$(uname) |
| |
| if type wget > /dev/null ; then |
| fetch='wget' |
| else |
| fetch='curl -LO' |
| fi |
| chksum_extension='sha512' |
| directory='.' |
| |
| helptext="usage: ${program} [OPTION...] |
| |
| Downloads some prerequisites needed by GCC. Run this from the top level of the |
| GCC source tree and the GCC build will do the right thing. |
| |
| The following options are available: |
| |
| --directory=DIR download and unpack packages into DIR instead of '.' |
| --force download again overwriting existing packages |
| --no-force do not download existing packages again (default) |
| --isl download ISL, needed for Graphite loop optimizations (default) |
| --graphite same as --isl |
| --no-isl don't download ISL |
| --no-graphite same as --no-isl |
| --verify verify package integrity after download (default) |
| --no-verify don't verify package integrity |
| --sha512 use SHA512 checksum to verify package integrity (default) |
| --md5 use MD5 checksum to verify package integrity |
| --help show this text and exit |
| --version show version information and exit |
| " |
| |
| versiontext="${program} ${version} |
| Copyright (C) 2016-2021 Free Software Foundation, Inc. |
| This is free software; see the source for copying conditions. There is NO |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." |
| |
| die() { |
| echo "error: $@" >&2 |
| exit 1 |
| } |
| |
| for arg in "$@" |
| do |
| case "${arg}" in |
| --help) |
| echo "${helptext}" |
| exit |
| ;; |
| --version) |
| echo "${versiontext}" |
| exit |
| ;; |
| esac |
| done |
| unset arg |
| |
| # Emulate Linux's 'md5sum --check' on macOS |
| md5_check() { |
| # Store the standard input: a line from contrib/prerequisites.md5: |
| md5_checksum_line=$(cat -) |
| # Grab the text before the first space |
| md5_checksum_expected="${md5_checksum_line%% *}" |
| # Grab the text after the first space |
| file_to_check="${md5_checksum_line##* }" |
| # Calculate the md5 checksum for the downloaded file |
| md5_checksum_output=$(md5 -r "${file_to_check}") |
| # Grab the text before the first space |
| md5_checksum_detected="${md5_checksum_output%% *}" |
| [ "${md5_checksum_expected}" = "${md5_checksum_detected}" ] \ |
| || die "Cannot verify integrity of possibly corrupted file ${file_to_check}" |
| echo "${file_to_check}: OK" |
| } |
| |
| |
| argnext= |
| for arg in "$@" |
| do |
| if [ "x${argnext}" = x ] |
| then |
| case "${arg}" in |
| --directory) |
| argnext='directory' |
| ;; |
| --directory=*) |
| directory="${arg#--directory=}" |
| ;; |
| --force) |
| force=1 |
| ;; |
| --no-force) |
| force=0 |
| ;; |
| --isl|--graphite) |
| graphite=1 |
| ;; |
| --no-isl|--no-graphite) |
| graphite=0 |
| ;; |
| --verify) |
| verify=1 |
| ;; |
| --no-verify) |
| verify=0 |
| ;; |
| --sha512) |
| chksum_extension='sha512' |
| verify=1 |
| ;; |
| --md5) |
| chksum_extension='md5' |
| verify=1 |
| ;; |
| -*) |
| die "unknown option: ${arg}" |
| ;; |
| *) |
| die "too many arguments" |
| ;; |
| esac |
| else |
| case "${arg}" in |
| -*) |
| die "Missing argument for option --${argnext}" |
| ;; |
| esac |
| case "${argnext}" in |
| directory) |
| directory="${arg}" |
| ;; |
| *) |
| die "The impossible has happened" |
| ;; |
| esac |
| argnext= |
| fi |
| done |
| [ "x${argnext}" = x ] || die "Missing argument for option --${argnext}" |
| unset arg argnext |
| |
| case $chksum_extension in |
| sha512) |
| case $OS in |
| "Darwin"|"FreeBSD"|"DragonFly"|"AIX") |
| chksum='shasum -a 512 --check' |
| ;; |
| "OpenBSD") |
| chksum='sha512 -c' |
| ;; |
| *) |
| chksum='sha512sum -c' |
| ;; |
| esac |
| ;; |
| md5) |
| case $OS in |
| "Darwin") |
| chksum='md5_check' |
| ;; |
| *) |
| chksum='md5sum -c' |
| ;; |
| esac |
| ;; |
| *) |
| die "Unkown checksum $chksum_extension" |
| ;; |
| esac |
| |
| [ -e ./gcc/BASE-VER ] \ |
| || die "You must run this script in the top-level GCC source directory" |
| |
| [ -d "${directory}" ] \ |
| || die "No such directory: ${directory}" |
| |
| for ar in $(echo_archives) |
| do |
| if [ ${force} -gt 0 ]; then rm -f "${directory}/${ar}"; fi |
| [ -e "${directory}/${ar}" ] \ |
| || ( cd "${directory}" && ${fetch} --no-verbose "${base_url}${ar}" ) \ |
| || die "Cannot download ${ar} from ${base_url}" |
| done |
| unset ar |
| |
| if [ ${verify} -gt 0 ] |
| then |
| chksumfile="contrib/prerequisites.${chksum_extension}" |
| [ -r "${chksumfile}" ] || die "No checksums available" |
| for ar in $(echo_archives) |
| do |
| grep "${ar}" "${chksumfile}" \ |
| | ( cd "${directory}" && ${chksum} ) \ |
| || die "Cannot verify integrity of possibly corrupted file ${ar}" |
| done |
| unset chksumfile |
| fi |
| unset ar |
| |
| for ar in $(echo_archives) |
| do |
| package="${ar%.tar*}" |
| if [ ${force} -gt 0 ]; then rm -rf "${directory}/${package}"; fi |
| case $ar in |
| *.gz) |
| uncompress='gzip -d' |
| ;; |
| *.bz2) |
| uncompress='bzip2 -d' |
| ;; |
| *) |
| uncompress='cat' |
| ;; |
| esac |
| [ -e "${directory}/${package}" ] \ |
| || ( cd "${directory}" && $uncompress <"${ar}" | tar -xf - ) \ |
| || die "Cannot extract package from ${ar}" |
| unset package |
| done |
| unset ar |
| |
| for ar in $(echo_archives) |
| do |
| target="${directory}/${ar%.tar*}/" |
| linkname="${ar%-*}" |
| if [ ${force} -gt 0 ]; then rm -f "${linkname}"; fi |
| [ -e "${linkname}" ] \ |
| || ln -s "${target}" "${linkname}" \ |
| || die "Cannot create symbolic link ${linkname} --> ${target}" |
| unset target linkname |
| done |
| unset ar |
| |
| echo "All prerequisites downloaded successfully." |