From b7cd2ebb1f555397885279a2ace6bd46ca4f5643 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Sun, 15 Nov 2020 15:37:22 +0100 Subject: [PATCH] Enable GDB build with in-tree GMP and MPFR With this patch GDB can be built with in-tree GMP and/or MPFR. This works also for cross-builds. All that is needed, is a sym-link in the source tree, like this: gmp -> ../gmp-6.1.0 mpfr -> ../mpfr-3.1.4 2020-12-10 Bernd Edlinger * Makefile.def: Prepare for GDB build with intree GMP. * Makefile.in: Regenerate. gdb: 2020-12-10 Bernd Edlinger * configure.ac: Detect in-tree GMP and MPFR. * configure: Regenerate. * README: Mention ./contrib/download_prerequisites. contrib: 2020-12-10 Bernd Edlinger * download_prerequisites: New helper script. * prerequisites.md5: checksums. * prerequisites.sha512: checksums. --- Makefile.def | 2 + Makefile.in | 2 + contrib/download_prerequisites | 263 +++++++++++++++++++++++++++++++++++++++++ contrib/prerequisites.md5 | 2 + contrib/prerequisites.sha512 | 2 + gdb/README | 12 ++ gdb/configure | 20 +++- gdb/configure.ac | 20 +++- 8 files changed, 315 insertions(+), 8 deletions(-) create mode 100755 contrib/download_prerequisites create mode 100644 contrib/prerequisites.md5 create mode 100644 contrib/prerequisites.sha512 diff --git a/Makefile.def b/Makefile.def index 089e70a..b6872c9 100644 --- a/Makefile.def +++ b/Makefile.def @@ -391,6 +391,8 @@ dependencies = { module=all-intl; on=all-libiconv; }; // Host modules specific to gdb. dependencies = { module=configure-gdb; on=all-intl; }; +dependencies = { module=configure-gdb; on=all-gmp; }; +dependencies = { module=configure-gdb; on=all-mpfr; }; dependencies = { module=configure-gdb; on=configure-sim; }; dependencies = { module=configure-gdb; on=all-bfd; }; dependencies = { module=configure-gdb; on=all-gnulib; }; diff --git a/Makefile.in b/Makefile.in index fe34132..ead9430 100644 --- a/Makefile.in +++ b/Makefile.in @@ -52449,6 +52449,8 @@ configure-libcc1: maybe-configure-gcc all-libcc1: maybe-all-gcc all-utils: maybe-all-libiberty configure-gdb: maybe-all-intl +configure-gdb: maybe-all-gmp +configure-gdb: maybe-all-mpfr configure-gdb: maybe-all-bfd configure-gdb: maybe-all-libiconv all-gdb: maybe-all-libiberty diff --git a/contrib/download_prerequisites b/contrib/download_prerequisites new file mode 100755 index 0000000..0d04030 --- /dev/null +++ b/contrib/download_prerequisites @@ -0,0 +1,263 @@ +#! /bin/sh +#! -*- coding:utf-8; mode:shell-script; -*- + +# Download some prerequisites needed by GDB. +# Run this from the top level of the GDB source tree and the GDB build will do +# the right thing. Run it with the `--help` option for more information. +# +# (C) 2010-2020 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.1.0.tar.bz2' +mpfr='mpfr-3.1.4.tar.bz2' + +base_url='http://gcc.gnu.org/pub/gcc/infrastructure/' + +echo_archives() { + echo "${gmp}" + echo "${mpfr}" +} + +verify=1 +force=0 +OS=$(uname) + +case $OS in + "Darwin"|"FreeBSD"|"DragonFly"|"AIX") + chksum='shasum -a 512 --check' + ;; + "OpenBSD") + chksum='sha512 -c' + ;; + *) + chksum='sha512sum -c' + ;; +esac + +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 GDB. Run this from the top level of the +GDB source tree and the GDB 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) + --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) 2020 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 'md5 --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 + ;; + --verify) + verify=1 + ;; + --no-verify) + verify=0 + ;; + --sha512) + case $OS in + "Darwin") + chksum='shasum -a 512 --check' + ;; + *) + chksum='sha512sum --check' + ;; + esac + chksum_extension='sha512' + verify=1 + ;; + --md5) + case $OS in + "Darwin") + chksum='md5_check' + ;; + *) + chksum='md5 --check' + ;; + esac + 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 + +[ -e ./gdb/version.in ] \ + || die "You must run this script in the top-level GDB 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." diff --git a/contrib/prerequisites.md5 b/contrib/prerequisites.md5 new file mode 100644 index 0000000..cf7be0d --- /dev/null +++ b/contrib/prerequisites.md5 @@ -0,0 +1,2 @@ +86ee6e54ebfc4a90b643a65e402c4048 gmp-6.1.0.tar.bz2 +b8a2f6b0e68bef46e53da2ac439e1cf4 mpfr-3.1.4.tar.bz2 diff --git a/contrib/prerequisites.sha512 b/contrib/prerequisites.sha512 new file mode 100644 index 0000000..8f05aff --- /dev/null +++ b/contrib/prerequisites.sha512 @@ -0,0 +1,2 @@ +3c82aeab9c1596d4da8afac2eec38e429e84f3211e1a572cf8fd2b546493c44c039b922a1133eaaa48bd7f3e11dbe795a384e21ed95cbe3ecc58d7ac02246117 gmp-6.1.0.tar.bz2 +51066066ff2c12ed2198605ecf68846b0c96b548adafa5b80e0c786d0df488411a5e8973358fce7192dc977ad4e68414cf14500e3c39746de62465eb145bb819 mpfr-3.1.4.tar.bz2 diff --git a/gdb/README b/gdb/README index e65c5ea..2b9c382 100644 --- a/gdb/README +++ b/gdb/README @@ -488,6 +488,12 @@ more obscure GDB `configure' options are not listed here. Build GDB using the GMP library installed at the directory DIR. If your host does not have GMP installed, you can get the latest version at `https://gmplib.org/'. + You can also build GMP in-tree when you use the script + ./contrib/download_prerequisites. + This must be done before configure. No --with-gmp options must + be used when invoking configure in this case. + Note however, that this does only work with a separate build + directory. `--with-mpfr' Build GDB with GNU MPFR, a library for multiple-precision @@ -499,6 +505,12 @@ more obscure GDB `configure' options are not listed here. available, GDB will fall back to using host floating-point arithmetic. If your host does not have GNU MPFR installed, you can get the latest version from `https://www.mpfr.org/'. + You can also build MPFR in-tree when you use the script + ./contrib/download_prerequisites. + This must be done before configure. No --with-mpfr options must + be used when invoking configure in this case. + Note however, that this does only work with a separate build + directory. `--with-python[=PYTHON]' Build GDB with Python scripting support. (Done by default if diff --git a/gdb/configure b/gdb/configure index 51b4d19..5819002 100755 --- a/gdb/configure +++ b/gdb/configure @@ -9991,6 +9991,13 @@ done fi # Verify that we have a usable GMP library. +if test -d "../gmp"; then + CPPFLAGS="$CPPFLAGS -I../gmp" + LIBGMP="../gmp/.libs/libgmp.a" + +$as_echo "#define HAVE_LIBGMP 1" >>confdefs.h + +else @@ -10431,7 +10438,7 @@ int main () { mpz_t n; - mpz_init (n); + mpz_init (n); ; return 0; } @@ -10469,8 +10476,9 @@ $as_echo "$LIBGMP" >&6; } -if test "$HAVE_LIBGMP" != yes; then - as_fn_error $? "GMP is missing or unusable" "$LINENO" 5 + if test "$HAVE_LIBGMP" != yes; then + as_fn_error $? "GMP is missing or unusable" "$LINENO" 5 + fi fi @@ -10490,6 +10498,12 @@ if test "${with_mpfr}" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: MPFR support disabled; some features may be unavailable." >&5 $as_echo "$as_me: WARNING: MPFR support disabled; some features may be unavailable." >&2;} HAVE_LIBMPFR=no +elif test -d "../mpfr"; then + CPPFLAGS="$CPPFLAGS -I${srcdir}/../mpfr/src" + LIBMPFR="../mpfr/src/.libs/libmpfr.a" + +$as_echo "#define HAVE_LIBMPFR 1" >>confdefs.h + else diff --git a/gdb/configure.ac b/gdb/configure.ac index 28703d7..f1c233c 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -684,11 +684,17 @@ else fi # Verify that we have a usable GMP library. -AC_LIB_HAVE_LINKFLAGS([gmp], [], [#include ], - [mpz_t n; - mpz_init (n);]) -if test "$HAVE_LIBGMP" != yes; then - AC_MSG_ERROR([GMP is missing or unusable]) +if test -d "../gmp"; then + CPPFLAGS="$CPPFLAGS -I../gmp" + LIBGMP="../gmp/.libs/libgmp.a" + AC_DEFINE(HAVE_LIBGMP, 1, [Define if you have the GMP library.]) +else + AC_LIB_HAVE_LINKFLAGS([gmp], [], [#include ], + [mpz_t n; + mpz_init (n);]) + if test "$HAVE_LIBGMP" != yes; then + AC_MSG_ERROR([GMP is missing or unusable]) + fi fi AC_ARG_WITH(mpfr, @@ -700,6 +706,10 @@ AC_MSG_RESULT([$with_mpfr]) if test "${with_mpfr}" = no; then AC_MSG_WARN([MPFR support disabled; some features may be unavailable.]) HAVE_LIBMPFR=no +elif test -d "../mpfr"; then + CPPFLAGS="$CPPFLAGS -I${srcdir}/../mpfr/src" + LIBMPFR="../mpfr/src/.libs/libmpfr.a" + AC_DEFINE(HAVE_LIBMPFR, 1, [Define if you have the MPFR library.]) else AC_LIB_HAVE_LINKFLAGS([mpfr], [gmp], [#include ], [mpfr_exp_t exp; mpfr_t x; -- 1.9.1