From patchwork Wed Feb 19 16:27:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 38228 Received: (qmail 75234 invoked by alias); 19 Feb 2020 16:27:13 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 75222 invoked by uid 89); 19 Feb 2020 16:27:12 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=helping, H*m:andrew, Intel, intel X-HELO: mail-wr1-f65.google.com Received: from mail-wr1-f65.google.com (HELO mail-wr1-f65.google.com) (209.85.221.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 19 Feb 2020 16:27:08 +0000 Received: by mail-wr1-f65.google.com with SMTP id n10so1304789wrm.1 for ; Wed, 19 Feb 2020 08:27:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=9VQIgmPJ+cGkp62+U8HnhehLfPVs5YJOQ2PIdg/ALrk=; b=Wud8TuTy9iQ63xdPo+fmIqKE+pycj53nv4YaQN8xP3NmgdrszQP9/UUwWu+f1OALw7 CSkcN/M/mtS5Do9ZWG/AKdHVsXVp5CgICMRzyA7uwlvzNfbF06GtyNU1WTExX5oPtQ1y /TJm6cITmGS9DehPsB5E2L9YpJj5jJanb1ZIjSTkBp0eJV3GnBcugmV4HS28fuf4Cque yiC+PcZKwN8q+hp8D4Y8Lfeq8G1JUwk7KYZDg+cZAksrHqW/v6kaaJyD6OBetNHqZohf fpjSPSDctoGR4UjiwMCxGNxYuKHy3n3CkeTGLbmUqR20Drn9uNfqJYVKGpygYfegOL/v wWkw== Return-Path: Received: from localhost (host86-186-80-160.range86-186.btcentralplus.com. [86.186.80.160]) by smtp.gmail.com with ESMTPSA id k13sm299400wrx.59.2020.02.19.08.27.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 19 Feb 2020 08:27:05 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess Subject: [PATCHv2] gdb: Allow more control over where to find python libraries Date: Wed, 19 Feb 2020 16:27:03 +0000 Message-Id: <20200219162703.17530-1-andrew.burgess@embecosm.com> In-Reply-To: <20200206164617.7461-1-andrew.burgess@embecosm.com> References: <20200206164617.7461-1-andrew.burgess@embecosm.com> X-IsSubscribed: yes The only change since v1 is rewording of the commit message to make the aim of the patch clearer. I still need to make sure that Eli is happy with this change before I'll consider merging this. --- The motivation behind this commit is to make it easier to bundle the Python *.py library files with GDB when statically linking GDB against libpython. The Python files will be manually added into the GDB installation tree, and GDB should be able to find them at run-time. The installation tree will look like this: . |-- bin/ |-- include/ |-- lib/ | `-- python3.8/ `-- share/ The benefit here is that the entire installation tree can be bundled into a single archive and copied to another machine with a different version of Python installed, and GDB will still work, including its Python support. In use the new configure options would be used something like this, first build and install a static Python library: mkdir python cd python # Clone or download Python into a src/ directory. mkdir build export PYTHON_INSTALL_PATH=$PWD/install cd build ../src/configure --disable-shared --prefix=$PYTHON_INSTALL_PATH make make install Now build and install GDB: mkdir binutils-gdb cd binutils-gdb # Clone or download GDB into a src/ directory. mkdir build export GDB_INSTALL_DIR=$PWD/install cd build ../src/configure \ --prefix=$GDB_INSTALL_DIR \ --with-python=$PYTHON_INSTALL_PATH/bin/python3 \ --with-python-libdir=$GDB_INSTALL_DIR/lib make all-gdb make install-gdb Finally, copy the Python libraries into the GDB install: cp -r $PYTHON_INSTALL_DIR/lib/python3.8/ $GDB_INSTALL_DIR/lib After this the Python src, build, and install directories are no longer needed and can be deleted. If the new --with-python-libdir option is not used then the existing behaviour is left unchanged, GDB will look for the Python libraries in the lib/ directory within the python path. The concatenation of the python prefix and the string 'lib/' is now done at configure time, rather than at run time in GDB as it was previous, however, this was never something that the user had dynamic control over, so there's no loss of functionality. gdb/ChangeLog: * config.in: Regenerate. * configure: Regenerate. * configure.ac: Add --with-python-libdir option. * main.c: Use WITH_PYTHON_LIBDIR. --- gdb/ChangeLog | 7 +++++++ gdb/config.in | 8 ++++++++ gdb/configure | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ gdb/configure.ac | 24 ++++++++++++++++++++++++ gdb/main.c | 11 +++-------- 5 files changed, 91 insertions(+), 8 deletions(-) diff --git a/gdb/config.in b/gdb/config.in index cb886ba8e1a..9c5c1ce834d 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -649,6 +649,10 @@ /* Define as the return type of ptrace. */ #undef PTRACE_TYPE_RET +/* Define if the python lib directory should be relocated when GDB is moved. + */ +#undef PYTHON_LIBDIR_RELOCATABLE + /* Define if the python directory should be relocated when GDB is moved. */ #undef PYTHON_PATH_RELOCATABLE @@ -752,6 +756,10 @@ /* Define if the PPC simulator is being linked in. */ #undef WITH_PPC_SIM +/* Directory containing Python's standard libraries from --with-python-libdir. + */ +#undef WITH_PYTHON_LIBDIR + /* Define if --with-python provides a path, either directly or via python-config.py --exec-prefix. */ #undef WITH_PYTHON_PATH diff --git a/gdb/configure b/gdb/configure index 4f2d7f8f232..ea1198ba63a 100755 --- a/gdb/configure +++ b/gdb/configure @@ -887,6 +887,7 @@ with_libexpat_prefix with_mpfr with_libmpfr_prefix with_python +with_python_libdir with_guile enable_source_highlight with_intel_pt @@ -1615,6 +1616,8 @@ Optional Packages: --without-libmpfr-prefix don't search for libmpfr in includedir and libdir --with-python[=PYTHON] include python support (auto/yes/no/) + --with-python-libdir[=DIR] + search for python's libraries in DIR --with-guile[=GUILE] include guile support (auto/yes/no//) --with-intel-pt include Intel Processor Trace support (auto/yes/no) @@ -10606,6 +10609,21 @@ _ACEOF fi fi + +# Check whether --with-python-libdir was given. +if test "${with_python_libdir+set}" = set; then : + withval=$with_python_libdir; +else + + # If no python libdir is specified then select one based on + # python's prefix path. + if test -n "${python_prefix}"; then + with_python_libdir=${python_prefix}/lib + fi + +fi + + if test "${have_libpython}" != no; then $as_echo "#define HAVE_PYTHON 1" >>confdefs.h @@ -10616,6 +10634,37 @@ $as_echo "#define HAVE_PYTHON 1" >>confdefs.h CONFIG_INSTALL="$CONFIG_INSTALL install-python" ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" + if test -n "${with_python_libdir}"; then + +cat >>confdefs.h <<_ACEOF +#define WITH_PYTHON_LIBDIR "${with_python_libdir}" +_ACEOF + + + if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then + if test "x$prefix" = xNONE; then + test_prefix=/usr/local + else + test_prefix=$prefix + fi + else + test_prefix=$exec_prefix + fi + value=0 + case ${with_python_libdir} in + "${test_prefix}"|"${test_prefix}/"*|\ + '${exec_prefix}'|'${exec_prefix}/'*) + value=1 + ;; + esac + +cat >>confdefs.h <<_ACEOF +#define PYTHON_LIBDIR_RELOCATABLE $value +_ACEOF + + + fi + # Flags needed to compile Python code (taken from python-config --cflags). # We cannot call python-config directly because it will output whatever was # used when compiling the Python interpreter itself, including flags which diff --git a/gdb/configure.ac b/gdb/configure.ac index 335971fdf66..a51c5eda6b5 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -890,6 +890,24 @@ else fi fi +dnl Use --with-python-libdir to control where GDB looks for the Python +dnl libraries. +dnl +dnl If this is not given then the default will be based on the value +dnl passed to --with-python, which is in the python_prefix variable. +dnl If the --with-python option wasn't given then the default value in +dnl python_prefix is based on running the 'gdb/python/python-config +dnl --exec-prefix' script. +AC_ARG_WITH(python-libdir, + AS_HELP_STRING([--with-python-libdir@<:@=DIR@:>@], [search for python's libraries in DIR]), + [],[ + # If no python libdir is specified then select one based on + # python's prefix path. + if test -n "${python_prefix}"; then + with_python_libdir=${python_prefix}/lib + fi + ]) + if test "${have_libpython}" != no; then AC_DEFINE(HAVE_PYTHON, 1, [Define if Python interpreter is being linked in.]) CONFIG_OBS="$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" @@ -898,6 +916,12 @@ if test "${have_libpython}" != no; then CONFIG_INSTALL="$CONFIG_INSTALL install-python" ENABLE_CFLAGS="$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" + if test -n "${with_python_libdir}"; then + AC_DEFINE_UNQUOTED(WITH_PYTHON_LIBDIR, "${with_python_libdir}", + [Directory containing Python's standard libraries from --with-python-libdir.]) + GDB_AC_DEFINE_RELOCATABLE(PYTHON_LIBDIR, [python lib], ${with_python_libdir}) + fi + # Flags needed to compile Python code (taken from python-config --cflags). # We cannot call python-config directly because it will output whatever was # used when compiling the Python interpreter itself, including flags which diff --git a/gdb/main.c b/gdb/main.c index d5e5a678baa..a03ed8117ab 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -575,14 +575,9 @@ captured_main_1 (struct captured_main_args *context) gdb_datadir = relocate_gdb_directory (GDB_DATADIR, GDB_DATADIR_RELOCATABLE); -#ifdef WITH_PYTHON_PATH - { - /* For later use in helping Python find itself. */ - char *tmp = concat (WITH_PYTHON_PATH, SLASH_STRING, "lib", (char *) NULL); - - python_libdir = relocate_gdb_directory (tmp, PYTHON_PATH_RELOCATABLE); - xfree (tmp); - } +#ifdef WITH_PYTHON_LIBDIR + python_libdir = relocate_gdb_directory (WITH_PYTHON_LIBDIR, + PYTHON_LIBDIR_RELOCATABLE); #endif #ifdef RELOC_SRCDIR