[PATCH v2] Enable GDB build with in-tree GMP and MPFR

Bernd Edlinger
2020-12-14T17:41:12Z

[-- Attachment #1: Type: text/plain, Size: 1323 bytes --]

Well,

I thought, I should add a few words in the README
about this feature:

diff --git a/gdb/README b/gdb/README
index e65c5ea..db0a774 100644
--- a/gdb/README
+++ b/gdb/README
@@ -488,6 +488,9 @@ 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. 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 +502,9 @@ 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. 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

Tested on x86_64-pc-linux-gnu.
Is it OK for trunk?

Thanks
Bernd.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Enable-GDB-build-with-in-tree-GMP-and-MPFR.patch --]
[-- Type: text/x-patch; name="0001-Enable-GDB-build-with-in-tree-GMP-and-MPFR.patch", Size: 17679 bytes --]

From 367fae972e90370540468786f59856cb7581f6b2 Mon Sep 17 00:00:00 2001
From: Bernd Edlinger <bernd.edlinger@hotmail.de>
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 <bernd.edlinger@hotmail.de>

* Makefile.def: Prepare for GDB build with intree GMP.
* Makefile.in: Regenerate.

gdb:
2020-12-10 Bernd Edlinger <bernd.edlinger@hotmail.de>

* configure.ac: Add --with-gmp=DIR, --with-gmp-include=DIR
and --with-gmp-lib=DIR
as well as --with-mpfr-include=DIR and --with-mpfr-lib=DIR
for compatibility with top level configure script.
* configure: Regenerate.
* README: Mention ./contrib/download_prerequisites.

contrib:
2020-12-10 Bernd Edlinger <bernd.edlinger@hotmail.de>

* download_prerequisites: New helper script.
* prerequisites.md5: checksums.
* prerequisites.sha512: checksums.
---
Makefile.def | 5 +-
Makefile.in | 4 +-
contrib/download_prerequisites | 263 +++++++++++++++++++++++++++++++++++++++++
contrib/prerequisites.md5 | 2 +
contrib/prerequisites.sha512 | 2 +
gdb/README | 6 +
gdb/configure | 52 ++++++++
gdb/configure.ac | 25 ++++
8 files changed, 357 insertions(+), 2 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..1b99b42 100644
--- a/Makefile.def
+++ b/Makefile.def
@@ -115,7 +115,8 @@ host_modules= { module= zlib; no_install=true; no_check=true;
host_modules= { module= gnulib; };
host_modules= { module= gdbsupport; };
host_modules= { module= gdbserver; };
-host_modules= { module= gdb; };
+host_modules= { module= gdb;
+ extra_configure_flags='@extra_mpfr_configure_flags@ @extra_mpc_mpfr_configure_flags@';};
host_modules= { module= expect; };
host_modules= { module= guile; };
host_modules= { module= tk; };
@@ -391,6 +392,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..738fd32 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -29491,7 +29491,7 @@ configure-gdb:
$$s/$$module_srcdir/configure \
--srcdir=$${topdir}/$$module_srcdir \
$(HOST_CONFIGARGS) --build=${build_alias} --host=${host_alias} \
- --target=${target_alias} \
+ --target=${target_alias} @extra_mpfr_configure_flags@ @extra_mpc_mpfr_configure_flags@ \
|| exit 1
@endif gdb

@@ -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..db0a774 100644
--- a/gdb/README
+++ b/gdb/README
@@ -488,6 +488,9 @@ 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. 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 +502,9 @@ 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. 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 24e6fbc..67747b3 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -899,8 +899,13 @@ with_jit_reader_dir
with_expat
with_libexpat_prefix
with_libexpat_type
+with_gmp_include
+with_gmp_lib
+with_gmp
with_libgmp_prefix
with_libgmp_type
+with_mpfr_include
+with_mpfr_lib
with_mpfr
with_libmpfr_prefix
with_libmpfr_type
@@ -1644,9 +1649,14 @@ Optional Packages:
--with-libexpat-prefix[=DIR] search for libexpat in DIR/include and DIR/lib
--without-libexpat-prefix don't search for libexpat in includedir and libdir
--with-libexpat-type=TYPE type of library to search for (auto/static/shared)
+ --with-gmp-include=DIR GMP include directory
+ --with-gmp-lib=DIR GMP lib directory
+ --with-gmp=DIR GMP install directory
--with-libgmp-prefix[=DIR] search for libgmp in DIR/include and DIR/lib
--without-libgmp-prefix don't search for libgmp in includedir and libdir
--with-libgmp-type=TYPE type of library to search for (auto/static/shared)
+ --with-mpfr-include=DIR MPFR include directory
+ --with-mpfr-lib=DIR MPFR lib directory
--with-mpfr include MPFR support (auto/yes/no)
--with-libmpfr-prefix[=DIR] search for libmpfr in DIR/include and DIR/lib
--without-libmpfr-prefix don't search for libmpfr in includedir and libdir
@@ -9990,6 +10000,35 @@ done
fi
fi

+
+# Check whether --with-gmp_include was given.
+if test "${with_gmp_include+set}" = set; then :
+ withval=$with_gmp_include; CPPFLAGS="$CPPFLAGS -I$withval"
+fi
+
+
+# Check whether --with-gmp_lib was given.
+if test "${with_gmp_lib+set}" = set; then :
+ withval=$with_gmp_lib; LDFLAGS="$LDFLAGS -L$withval"
+fi
+
+
+# Check whether --with-gmp was given.
+if test "${with_gmp+set}" = set; then :
+ withval=$with_gmp;
+ if test -z "$with_gmp_lib" && test -z "$with_gmp_include" ; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ else
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Do not use --with-gmp and --with-gmp-include/--with-gmp-lib options simultaneously.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+
+fi
+
+
# Verify that we have a usable GMP library.

@@ -10474,6 +10513,19 @@ if test "$HAVE_LIBGMP" != yes; then
fi

+# Check whether --with-mpfr_include was given.
+if test "${with_mpfr_include+set}" = set; then :
+ withval=$with_mpfr_include; CPPFLAGS="-I$withval $CPPFLAGS"
+fi
+
+
+# Check whether --with-mpfr_lib was given.
+if test "${with_mpfr_lib+set}" = set; then :
+ withval=$with_mpfr_lib; LDFLAGS="-L$withval $LDFLAGS"
+fi
+
+
+
# Check whether --with-mpfr was given.
if test "${with_mpfr+set}" = set; then :
withval=$with_mpfr;
diff --git a/gdb/configure.ac b/gdb/configure.ac
index 32f25d9..97f43ce 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -683,6 +683,22 @@ else
fi
fi

+AC_ARG_WITH(gmp_include,
+ [ --with-gmp-include=DIR GMP include directory ],
+ CPPFLAGS="$CPPFLAGS -I$withval")
+AC_ARG_WITH(gmp_lib,
+ [ --with-gmp-lib=DIR GMP lib directory ],
+ LDFLAGS="$LDFLAGS -L$withval")
+AC_ARG_WITH(gmp,
+ [ --with-gmp=DIR GMP install directory ], [
+ if test -z "$with_gmp_lib" && test -z "$with_gmp_include" ; then
+ CPPFLAGS="$CPPFLAGS -I$withval/include"
+ LDFLAGS="$LDFLAGS -L$withval/lib"
+ else
+ AC_MSG_FAILURE([Do not use --with-gmp and --with-gmp-include/--with-gmp-lib options simultaneously.])
+ fi
+ ])
+
# Verify that we have a usable GMP library.
AC_LIB_HAVE_LINKFLAGS([gmp], [], [#include <gmp.h>],
[mpz_t n;
@@ -691,6 +707,15 @@ if test "$HAVE_LIBGMP" != yes; then
AC_MSG_ERROR([GMP is missing or unusable])
fi

+AC_ARG_WITH([mpfr_include],
+ [AC_HELP_STRING([--with-mpfr-include=DIR],
+ [MPFR include directory])],
+ [CPPFLAGS="-I$withval $CPPFLAGS"])
+AC_ARG_WITH([mpfr_lib],
+ [AC_HELP_STRING([--with-mpfr-lib=DIR],
+ [MPFR lib directory])],
+ [LDFLAGS="-L$withval $LDFLAGS"])
+
AC_ARG_WITH(mpfr,
AS_HELP_STRING([--with-mpfr], [include MPFR support (auto/yes/no)]),
[], [with_mpfr=auto])
--
1.9.1