279 lines
7.7 KiB
Bash
Executable file
279 lines
7.7 KiB
Bash
Executable file
#! /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."
|