From 0c4a40633c767da2c7659a3f460cf1e8e3dd3a5c Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Thu, 27 May 2010 03:40:45 +0000 Subject: [PATCH] Allow python to find its files if moved from original location. * acinclude.m4 (GDB_AC_DEFINE_RELOCATABLE): New function. (GDB_AC_WITH_DIR): Call it. * configure.ac: Define WITH_PYTHON_PATH if we can find the python installation directory. * config.in: Regenerate. * configure: Regenerate. * defs.h (python_libdir): Declare. * main.c (python_libdir): Define. (captured_main): Initialize python_libdir. * python/python.c (_initialize_python): #ifdef WITH_PYTHON_PATH, call Py_SetProgramName to make sure python can find its libraries and modules. --- gdb/ChangeLog | 14 ++++++++++ gdb/acinclude.m4 | 39 ++++++++++++++++----------- gdb/config.in | 7 +++++ gdb/configure | 65 ++++++++++++++++++++++++++++++++++++++------- gdb/configure.ac | 64 +++++++++++++++++++++++++++++++++++++------- gdb/defs.h | 4 +++ gdb/main.c | 12 +++++++++ gdb/python/python.c | 11 ++++++++ 8 files changed, 183 insertions(+), 33 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b386504006..2b67f9a900 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,19 @@ 2010-05-26 Doug Evans + Allow python to find its files if moved from original location. + * acinclude.m4 (GDB_AC_DEFINE_RELOCATABLE): New function. + (GDB_AC_WITH_DIR): Call it. + * configure.ac: Define WITH_PYTHON_PATH if we can find the + python installation directory. + * config.in: Regenerate. + * configure: Regenerate. + * defs.h (python_libdir): Declare. + * main.c (python_libdir): Define. + (captured_main): Initialize python_libdir. + * python/python.c (_initialize_python): #ifdef WITH_PYTHON_PATH, + call Py_SetProgramName to make sure python can find its libraries + and modules. + * configure.ac: Try to use python's distutils to fetch compilation parameters. * configure: Regenerate. diff --git a/gdb/acinclude.m4 b/gdb/acinclude.m4 index e3f604ecff..1942ef484f 100644 --- a/gdb/acinclude.m4 +++ b/gdb/acinclude.m4 @@ -403,22 +403,12 @@ AC_DEFUN([CY_AC_TK_PRIVATE_HEADERS], [ fi ]) -dnl GDB_AC_WITH_DIR([VARIABLE], [ARG-NAME], [HELP], [DEFAULT]) -dnl Add a new --with option that defines a directory. -dnl The result is stored in VARIABLE. AC_DEFINE_DIR is called -dnl on this variable, as is AC_SUBST. -dnl ARG-NAME is the base name of the argument (without "--with"). -dnl HELP is the help text to use. -dnl If the user's choice is relative to the prefix, then the +dnl GDB_AC_DEFINE_RELOCATABLE([VARIABLE], [ARG-NAME], [SHELL-VARIABLE]) +dnl For use in processing directory values for --with-foo. +dnl If the path in SHELL_VARIABLE is relative to the prefix, then the dnl result is relocatable, then this will define the C macro dnl VARIABLE_RELOCATABLE to 1; otherwise it is defined as 0. -dnl DEFAULT is the default value, which is used if the user -dnl does not specify the argument. -AC_DEFUN([GDB_AC_WITH_DIR], [ - AC_ARG_WITH([$2], AS_HELP_STRING([--with-][$2][=PATH], [$3]), [ - [$1]=$withval], [[$1]=[$4]]) - AC_DEFINE_DIR([$1], [$1], [$3]) - AC_SUBST([$1]) +AC_DEFUN([GDB_AC_DEFINE_RELOCATABLE], [ if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then if test "x$prefix" = xNONE; then test_prefix=/usr/local @@ -429,11 +419,30 @@ AC_DEFUN([GDB_AC_WITH_DIR], [ test_prefix=$exec_prefix fi value=0 - case ${ac_define_dir} in + case [$3] in "${test_prefix}"|"${test_prefix}/"*|\ '${exec_prefix}'|'${exec_prefix}/'*) value=1 ;; esac AC_DEFINE_UNQUOTED([$1]_RELOCATABLE, $value, [Define if the $2 directory should be relocated when GDB is moved.]) +]) + +dnl GDB_AC_WITH_DIR([VARIABLE], [ARG-NAME], [HELP], [DEFAULT]) +dnl Add a new --with option that defines a directory. +dnl The result is stored in VARIABLE. AC_DEFINE_DIR is called +dnl on this variable, as is AC_SUBST. +dnl ARG-NAME is the base name of the argument (without "--with"). +dnl HELP is the help text to use. +dnl If the user's choice is relative to the prefix, then the +dnl result is relocatable, then this will define the C macro +dnl VARIABLE_RELOCATABLE to 1; otherwise it is defined as 0. +dnl DEFAULT is the default value, which is used if the user +dnl does not specify the argument. +AC_DEFUN([GDB_AC_WITH_DIR], [ + AC_ARG_WITH([$2], AS_HELP_STRING([--with-][$2][=PATH], [$3]), [ + [$1]=$withval], [[$1]=[$4]]) + AC_DEFINE_DIR([$1], [$1], [$3]) + AC_SUBST([$1]) + GDB_AC_DEFINE_RELOCATABLE([$1], [$2], ${ac_define_dir}) ]) diff --git a/gdb/config.in b/gdb/config.in index 448c4e28bb..76cb363083 100644 --- a/gdb/config.in +++ b/gdb/config.in @@ -766,6 +766,9 @@ 'ptrdiff_t'. */ #undef PTRDIFF_T_SUFFIX +/* Define if the python directory should be relocated when GDB is moved. */ +#undef PYTHON_PATH_RELOCATABLE + /* Relocated directory for source files. */ #undef RELOC_SRCDIR @@ -838,6 +841,10 @@ 'wint_t'. */ #undef WINT_T_SUFFIX +/* Define if --with-python provides a path, either directly or via + python-config.py --exec-prefix. */ +#undef WITH_PYTHON_PATH + /* Define if the simulator is being linked in. */ #undef WITH_SIM diff --git a/gdb/configure b/gdb/configure index a69db06bd4..1ac7d4b7af 100755 --- a/gdb/configure +++ b/gdb/configure @@ -1658,7 +1658,8 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld default=no --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-python include python support (auto/yes/no/) + --with-python[=PYTHON] include python support + (auto/yes/no/) --without-included-regex don't use included regex; this is the default on systems with version 2 of the GNU C library (use @@ -7777,6 +7778,7 @@ _ACEOF + if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then if test "x$prefix" = xNONE; then test_prefix=/usr/local @@ -7800,6 +7802,7 @@ _ACEOF + # GDB's datadir relocation @@ -7824,6 +7827,7 @@ _ACEOF + if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then if test "x$prefix" = xNONE; then test_prefix=/usr/local @@ -7848,6 +7852,7 @@ _ACEOF + # Check whether --with-relocated-sources was given. if test "${with_relocated_sources+set}" = set; then : withval=$with_relocated_sources; reloc_srcdir="${withval}" @@ -10433,6 +10438,7 @@ fi + # Check whether --with-python was given. if test "${with_python+set}" = set; then : withval=$with_python; @@ -10450,23 +10456,23 @@ if test "${with_python}" = no; then $as_echo "$as_me: WARNING: python support disabled; some features may be unavailable." >&2;} have_libpython=no else - have_python_config=no case "${with_python}" in /*) if test -d ${with_python}; then # Assume the python binary is ${with_python}/bin/python. - python_prefix=${with_python} python_prog="${with_python}/bin/python" + python_prefix= if test ! -x ${python_prog}; then # Fall back to gdb 7.0/7.1 behaviour. python_prog=missing + python_prefix=${with_python} fi elif test -x ${with_python}; then # While we can't run python compiled for $host (unless host == build), # the user could write a script that provides the needed information, # so we support that. - python_prefix= python_prog=${with_python} + python_prefix= else as_fn_error "invalid value for --with-python" "$LINENO" 5 fi @@ -10596,6 +10602,10 @@ fi if test $? != 0; then as_fn_error "failure running python-config --ldflags" "$LINENO" 5 fi + python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix` + if test $? != 0; then + as_fn_error "failure running python-config --exec-prefix" "$LINENO" 5 + fi have_python_config=yes else # Fall back to gdb 7.0/7.1 behaviour. @@ -10606,6 +10616,7 @@ fi python_includes="-I${python_prefix}/include" python_libs="-L${python_prefix}/lib" fi + have_python_config=no fi # Having "/pythonX.Y" in the include path is awkward. @@ -10615,7 +10626,7 @@ fi # path of the, umm, include file. So strip away this part of the # output of python-config --includes. python_includes=`echo "${python_includes} " \ - | sed -e 's,/python[0-9]*[.][0-9]* , ,g'` + | sed -e 's,/python[0-9]*[.][0-9]* , ,g'` # If we have python-config, only try the configuration it provides. # Otherwise fallback on the old way of trying different versions of @@ -10624,8 +10635,9 @@ fi have_libpython=no if test "${have_python_config}" = yes; then python_version=`echo " ${python_libs} " \ - | sed -e 's,^.* -l\(python[0-9]*[.][0-9]*\) .*$,\1,'` - if test "${python_version}" != ""; then + | sed -e 's,^.* -l\(python[0-9]*[.][0-9]*\) .*$,\1,'` + case "${python_version}" in + python*) version=${python_version} @@ -10661,9 +10673,11 @@ rm -f core conftest.err conftest.$ac_objext \ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${found_usable_python}" >&5 $as_echo "${found_usable_python}" >&6; } - else + ;; + *) as_fn_error "unable to determine python version from ${python_libs}" "$LINENO" 5 - fi + ;; + esac else if test "${have_libpython}" = no; then @@ -10804,6 +10818,37 @@ $as_echo "$as_me: WARNING: python is missing or unusable; some features may be u as_fn_error "no usable python found at ${with_python}" "$LINENO" 5 ;; esac + else + if test -n "${python_prefix}"; then + +cat >>confdefs.h <<_ACEOF +#define WITH_PYTHON_PATH "${python_prefix}" +_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 ${python_prefix} in + "${test_prefix}"|"${test_prefix}/"*|\ + '${exec_prefix}'|'${exec_prefix}/'*) + value=1 + ;; + esac + +cat >>confdefs.h <<_ACEOF +#define PYTHON_PATH_RELOCATABLE $value +_ACEOF + + + fi fi fi @@ -14596,6 +14641,7 @@ _ACEOF + if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then if test "x$prefix" = xNONE; then test_prefix=/usr/local @@ -14619,6 +14665,7 @@ _ACEOF + # Check whether --enable-werror was given. if test "${enable_werror+set}" = set; then : enableval=$enable_werror; case "${enableval}" in diff --git a/gdb/configure.ac b/gdb/configure.ac index fb9b470f84..70608afedb 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -616,8 +616,40 @@ AC_DEFUN([AC_TRY_LIBPYTHON], AC_MSG_RESULT([${found_usable_python}]) ]) +dnl There are several different values for --with-python: +dnl +dnl no - Don't include python support. +dnl yes - Include python support, error if it's missing. +dnl If we find python in $PATH, use it to fetch configure options, +dnl otherwise assume the compiler can find it with no help from us. +dnl Python 2.6, 2.5, and then 2.4 are tried in turn. +dnl auto - Same as "yes", but if python is missing from the system, +dnl fall back to "no". +dnl /path/to/python/exec-prefix - +dnl Use the python located in this directory. +dnl If /path/to/python/exec-prefix/bin/python exists, use it to find +dnl the compilation parameters. Otherwise use +dnl -I/path/to/python/exec-prefix/include, +dnl -L/path/to/python/exec-prefix/lib. +dnl Python 2.6, 2.5, and then 2.4 are tried in turn. +dnl NOTE: This case is historical. It is what was done for 7.0/7.1 +dnl but is deprecated. +dnl /path/to/python/executable - +dnl Run python-config.py with this version of python to fetch the +dnl compilation parameters. +dnl NOTE: This needn't be the real python executable. +dnl In a cross-compilation scenario (build != host), this could be +dnl a shell script that provides what python-config.py provides for +dnl --ldflags, --includes, --exec-prefix. +dnl python-executable - +dnl Find python-executable in $PATH, and then handle the same as +dnl /path/to/python/executable. +dnl +dnl If a python program is specified, it is used to run python-config.py and +dnl is passed --ldflags, --includes, --exec-prefix. + AC_ARG_WITH(python, - AS_HELP_STRING([--with-python], [include python support (auto/yes/no/)]), + AS_HELP_STRING([--with-python@<:@=PYTHON@:>@], [include python support (auto/yes/no/)]), [], [with_python=auto]) AC_MSG_CHECKING([whether to use python]) AC_MSG_RESULT([$with_python]) @@ -626,23 +658,23 @@ if test "${with_python}" = no; then AC_MSG_WARN([python support disabled; some features may be unavailable.]) have_libpython=no else - have_python_config=no case "${with_python}" in /*) if test -d ${with_python}; then # Assume the python binary is ${with_python}/bin/python. - python_prefix=${with_python} python_prog="${with_python}/bin/python" + python_prefix= if test ! -x ${python_prog}; then # Fall back to gdb 7.0/7.1 behaviour. python_prog=missing + python_prefix=${with_python} fi elif test -x ${with_python}; then # While we can't run python compiled for $host (unless host == build), # the user could write a script that provides the needed information, # so we support that. - python_prefix= python_prog=${with_python} + python_prefix= else AC_ERROR(invalid value for --with-python) fi @@ -692,6 +724,10 @@ else if test $? != 0; then AC_ERROR(failure running python-config --ldflags) fi + python_prefix=`${python_prog} ${srcdir}/python/python-config.py --exec-prefix` + if test $? != 0; then + AC_ERROR(failure running python-config --exec-prefix) + fi have_python_config=yes else # Fall back to gdb 7.0/7.1 behaviour. @@ -702,6 +738,7 @@ else python_includes="-I${python_prefix}/include" python_libs="-L${python_prefix}/lib" fi + have_python_config=no fi # Having "/pythonX.Y" in the include path is awkward. @@ -711,7 +748,7 @@ else # path of the, umm, include file. So strip away this part of the # output of python-config --includes. python_includes=`echo "${python_includes} " \ - | sed -e 's,/python[[0-9]]*[[.]][[0-9]]* , ,g'` + | sed -e 's,/python[[0-9]]*[[.]][[0-9]]* , ,g'` # If we have python-config, only try the configuration it provides. # Otherwise fallback on the old way of trying different versions of @@ -720,13 +757,16 @@ else have_libpython=no if test "${have_python_config}" = yes; then python_version=`echo " ${python_libs} " \ - | sed -e 's,^.* -l\(python[[0-9]]*[[.]][[0-9]]*\) .*$,\1,'` - if test "${python_version}" != ""; then + | sed -e 's,^.* -l\(python[[0-9]]*[[.]][[0-9]]*\) .*$,\1,'` + case "${python_version}" in + python*) AC_TRY_LIBPYTHON(${python_version}, have_libpython, ${python_includes}, ${python_libs}) - else + ;; + *) AC_MSG_ERROR([unable to determine python version from ${python_libs}]) - fi + ;; + esac else if test "${have_libpython}" = no; then AC_TRY_LIBPYTHON(python2.6, have_libpython, @@ -761,6 +801,12 @@ else AC_MSG_ERROR([no usable python found at ${with_python}]) ;; esac + else + if test -n "${python_prefix}"; then + AC_DEFINE_UNQUOTED(WITH_PYTHON_PATH, "${python_prefix}", + [Define if --with-python provides a path, either directly or via python-config.py --exec-prefix.]) + GDB_AC_DEFINE_RELOCATABLE(PYTHON_PATH, python, ${python_prefix}) + fi fi fi diff --git a/gdb/defs.h b/gdb/defs.h index b18e03fdf5..a727a4b7ca 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -157,6 +157,10 @@ extern char *gdb_sysroot; /* GDB datadir, used to store data files. */ extern char *gdb_datadir; +/* If non-NULL, the possibly relocated path to python's "lib" directory + specified with --with-python. */ +extern char *python_libdir; + /* Search path for separate debug files. */ extern char *debug_file_directory; diff --git a/gdb/main.c b/gdb/main.c index 254e74d4d1..c5c712acff 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -68,6 +68,10 @@ char *gdb_sysroot = 0; /* GDB datadir, used to store data files. */ char *gdb_datadir = 0; +/* If gdb was configured with --with-python=/path, + the possibly relocated path to python's lib directory. */ +char *python_libdir = 0; + struct ui_file *gdb_stdout; struct ui_file *gdb_stderr; struct ui_file *gdb_stdlog; @@ -351,6 +355,14 @@ captured_main (void *data) gdb_datadir = relocate_directory (argv[0], GDB_DATADIR, GDB_DATADIR_RELOCATABLE); +#ifdef WITH_PYTHON_PATH + /* For later use in helping Python find itself. */ + python_libdir = relocate_directory (argv[0], + concat (WITH_PYTHON_PATH, + SLASH_STRING, "lib", NULL), + PYTHON_PATH_RELOCATABLE); +#endif + #ifdef RELOC_SRCDIR add_substitute_path_rule (RELOC_SRCDIR, make_relative_prefix (argv[0], BINDIR, diff --git a/gdb/python/python.c b/gdb/python/python.c index 288c701d47..0b7b7ba28c 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -647,6 +647,17 @@ Enables or disables printing of Python stack traces."), &show_python_list); #ifdef HAVE_PYTHON +#ifdef WITH_PYTHON_PATH + /* Work around problem where python gets confused about where it is, + and then can't find its libraries, etc. + NOTE: Python assumes the following layout: + /foo/bin/python + /foo/lib/pythonX.Y/... + This must be done before calling Py_Initialize. */ + Py_SetProgramName (concat (ldirname (python_libdir), SLASH_STRING, "bin", + SLASH_STRING, "python", NULL)); +#endif + Py_Initialize (); PyEval_InitThreads (); -- 2.34.1