From 41fdfbe1633009d2395b4714a6b3bfabb74691ef 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-11-15 Bernd Edlinger * Makefile.def: Prepare for GDB build with intree GMP. * Makefile.in: Regenerate. gdb: 2020-11-15 Bernd Edlinger * 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. contrib: 2020-11-15 Bernd Edlinger * 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/configure | 52 ++++++++ gdb/configure.ac | 25 ++++ 7 files changed, 351 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..a8b78da --- /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/configure b/gdb/configure index a3e73b4..034485d 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 ], [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