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