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