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.
This commit is contained in:
Doug Evans 2010-05-27 03:40:45 +00:00
parent ec685c5eca
commit 0c4a40633c
8 changed files with 185 additions and 35 deletions

View file

@ -1,5 +1,19 @@
2010-05-26 Doug Evans <dje@google.com> 2010-05-26 Doug Evans <dje@google.com>
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 * configure.ac: Try to use python's distutils to fetch compilation
parameters. parameters.
* configure: Regenerate. * configure: Regenerate.

View file

@ -403,6 +403,31 @@ AC_DEFUN([CY_AC_TK_PRIVATE_HEADERS], [
fi fi
]) ])
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.
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
else
test_prefix=$prefix
fi
else
test_prefix=$exec_prefix
fi
value=0
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 GDB_AC_WITH_DIR([VARIABLE], [ARG-NAME], [HELP], [DEFAULT])
dnl Add a new --with option that defines a directory. dnl Add a new --with option that defines a directory.
dnl The result is stored in VARIABLE. AC_DEFINE_DIR is called dnl The result is stored in VARIABLE. AC_DEFINE_DIR is called
@ -419,21 +444,5 @@ AC_DEFUN([GDB_AC_WITH_DIR], [
[$1]=$withval], [[$1]=[$4]]) [$1]=$withval], [[$1]=[$4]])
AC_DEFINE_DIR([$1], [$1], [$3]) AC_DEFINE_DIR([$1], [$1], [$3])
AC_SUBST([$1]) AC_SUBST([$1])
if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then GDB_AC_DEFINE_RELOCATABLE([$1], [$2], ${ac_define_dir})
if test "x$prefix" = xNONE; then
test_prefix=/usr/local
else
test_prefix=$prefix
fi
else
test_prefix=$exec_prefix
fi
value=0
case ${ac_define_dir} 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.])
]) ])

View file

@ -766,6 +766,9 @@
'ptrdiff_t'. */ 'ptrdiff_t'. */
#undef PTRDIFF_T_SUFFIX #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. */ /* Relocated directory for source files. */
#undef RELOC_SRCDIR #undef RELOC_SRCDIR
@ -838,6 +841,10 @@
'wint_t'. */ 'wint_t'. */
#undef WINT_T_SUFFIX #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. */ /* Define if the simulator is being linked in. */
#undef WITH_SIM #undef WITH_SIM

65
gdb/configure vendored
View file

@ -1658,7 +1658,8 @@ Optional Packages:
--with-gnu-ld assume the C compiler uses GNU ld default=no --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 --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 --without-libexpat-prefix don't search for libexpat in includedir and libdir
--with-python include python support (auto/yes/no/<path>) --with-python[=PYTHON] include python support
(auto/yes/no/<python-program>)
--without-included-regex --without-included-regex
don't use included regex; this is the default on don't use included regex; this is the default on
systems with version 2 of the GNU C library (use 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$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
if test "x$prefix" = xNONE; then if test "x$prefix" = xNONE; then
test_prefix=/usr/local test_prefix=/usr/local
@ -7800,6 +7802,7 @@ _ACEOF
# GDB's datadir relocation # 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$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
if test "x$prefix" = xNONE; then if test "x$prefix" = xNONE; then
test_prefix=/usr/local test_prefix=/usr/local
@ -7848,6 +7852,7 @@ _ACEOF
# Check whether --with-relocated-sources was given. # Check whether --with-relocated-sources was given.
if test "${with_relocated_sources+set}" = set; then : if test "${with_relocated_sources+set}" = set; then :
withval=$with_relocated_sources; reloc_srcdir="${withval}" withval=$with_relocated_sources; reloc_srcdir="${withval}"
@ -10433,6 +10438,7 @@ fi
# Check whether --with-python was given. # Check whether --with-python was given.
if test "${with_python+set}" = set; then : if test "${with_python+set}" = set; then :
withval=$with_python; 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;} $as_echo "$as_me: WARNING: python support disabled; some features may be unavailable." >&2;}
have_libpython=no have_libpython=no
else else
have_python_config=no
case "${with_python}" in case "${with_python}" in
/*) /*)
if test -d ${with_python}; then if test -d ${with_python}; then
# Assume the python binary is ${with_python}/bin/python. # Assume the python binary is ${with_python}/bin/python.
python_prefix=${with_python}
python_prog="${with_python}/bin/python" python_prog="${with_python}/bin/python"
python_prefix=
if test ! -x ${python_prog}; then if test ! -x ${python_prog}; then
# Fall back to gdb 7.0/7.1 behaviour. # Fall back to gdb 7.0/7.1 behaviour.
python_prog=missing python_prog=missing
python_prefix=${with_python}
fi fi
elif test -x ${with_python}; then elif test -x ${with_python}; then
# While we can't run python compiled for $host (unless host == build), # While we can't run python compiled for $host (unless host == build),
# the user could write a script that provides the needed information, # the user could write a script that provides the needed information,
# so we support that. # so we support that.
python_prefix=
python_prog=${with_python} python_prog=${with_python}
python_prefix=
else else
as_fn_error "invalid value for --with-python" "$LINENO" 5 as_fn_error "invalid value for --with-python" "$LINENO" 5
fi fi
@ -10596,6 +10602,10 @@ fi
if test $? != 0; then if test $? != 0; then
as_fn_error "failure running python-config --ldflags" "$LINENO" 5 as_fn_error "failure running python-config --ldflags" "$LINENO" 5
fi 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 have_python_config=yes
else else
# Fall back to gdb 7.0/7.1 behaviour. # Fall back to gdb 7.0/7.1 behaviour.
@ -10606,6 +10616,7 @@ fi
python_includes="-I${python_prefix}/include" python_includes="-I${python_prefix}/include"
python_libs="-L${python_prefix}/lib" python_libs="-L${python_prefix}/lib"
fi fi
have_python_config=no
fi fi
# Having "/pythonX.Y" in the include path is awkward. # 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 # path of the, umm, include file. So strip away this part of the
# output of python-config --includes. # output of python-config --includes.
python_includes=`echo "${python_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. # If we have python-config, only try the configuration it provides.
# Otherwise fallback on the old way of trying different versions of # Otherwise fallback on the old way of trying different versions of
@ -10624,8 +10635,9 @@ fi
have_libpython=no have_libpython=no
if test "${have_python_config}" = yes; then if test "${have_python_config}" = yes; then
python_version=`echo " ${python_libs} " \ python_version=`echo " ${python_libs} " \
| sed -e 's,^.* -l\(python[0-9]*[.][0-9]*\) .*$,\1,'` | sed -e 's,^.* -l\(python[0-9]*[.][0-9]*\) .*$,\1,'`
if test "${python_version}" != ""; then case "${python_version}" in
python*)
version=${python_version} 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 "$as_me:${as_lineno-$LINENO}: result: ${found_usable_python}" >&5
$as_echo "${found_usable_python}" >&6; } $as_echo "${found_usable_python}" >&6; }
else ;;
*)
as_fn_error "unable to determine python version from ${python_libs}" "$LINENO" 5 as_fn_error "unable to determine python version from ${python_libs}" "$LINENO" 5
fi ;;
esac
else else
if test "${have_libpython}" = no; then 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 as_fn_error "no usable python found at ${with_python}" "$LINENO" 5
;; ;;
esac 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
fi fi
@ -14596,6 +14641,7 @@ _ACEOF
if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then if test "x$exec_prefix" = xNONE || test "x$exec_prefix" = 'x${prefix}'; then
if test "x$prefix" = xNONE; then if test "x$prefix" = xNONE; then
test_prefix=/usr/local test_prefix=/usr/local
@ -14619,6 +14665,7 @@ _ACEOF
# Check whether --enable-werror was given. # Check whether --enable-werror was given.
if test "${enable_werror+set}" = set; then : if test "${enable_werror+set}" = set; then :
enableval=$enable_werror; case "${enableval}" in enableval=$enable_werror; case "${enableval}" in

View file

@ -616,8 +616,40 @@ AC_DEFUN([AC_TRY_LIBPYTHON],
AC_MSG_RESULT([${found_usable_python}]) 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, AC_ARG_WITH(python,
AS_HELP_STRING([--with-python], [include python support (auto/yes/no/<path>)]), AS_HELP_STRING([--with-python@<:@=PYTHON@:>@], [include python support (auto/yes/no/<python-program>)]),
[], [with_python=auto]) [], [with_python=auto])
AC_MSG_CHECKING([whether to use python]) AC_MSG_CHECKING([whether to use python])
AC_MSG_RESULT([$with_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.]) AC_MSG_WARN([python support disabled; some features may be unavailable.])
have_libpython=no have_libpython=no
else else
have_python_config=no
case "${with_python}" in case "${with_python}" in
/*) /*)
if test -d ${with_python}; then if test -d ${with_python}; then
# Assume the python binary is ${with_python}/bin/python. # Assume the python binary is ${with_python}/bin/python.
python_prefix=${with_python}
python_prog="${with_python}/bin/python" python_prog="${with_python}/bin/python"
python_prefix=
if test ! -x ${python_prog}; then if test ! -x ${python_prog}; then
# Fall back to gdb 7.0/7.1 behaviour. # Fall back to gdb 7.0/7.1 behaviour.
python_prog=missing python_prog=missing
python_prefix=${with_python}
fi fi
elif test -x ${with_python}; then elif test -x ${with_python}; then
# While we can't run python compiled for $host (unless host == build), # While we can't run python compiled for $host (unless host == build),
# the user could write a script that provides the needed information, # the user could write a script that provides the needed information,
# so we support that. # so we support that.
python_prefix=
python_prog=${with_python} python_prog=${with_python}
python_prefix=
else else
AC_ERROR(invalid value for --with-python) AC_ERROR(invalid value for --with-python)
fi fi
@ -692,6 +724,10 @@ else
if test $? != 0; then if test $? != 0; then
AC_ERROR(failure running python-config --ldflags) AC_ERROR(failure running python-config --ldflags)
fi 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 have_python_config=yes
else else
# Fall back to gdb 7.0/7.1 behaviour. # Fall back to gdb 7.0/7.1 behaviour.
@ -702,6 +738,7 @@ else
python_includes="-I${python_prefix}/include" python_includes="-I${python_prefix}/include"
python_libs="-L${python_prefix}/lib" python_libs="-L${python_prefix}/lib"
fi fi
have_python_config=no
fi fi
# Having "/pythonX.Y" in the include path is awkward. # 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 # path of the, umm, include file. So strip away this part of the
# output of python-config --includes. # output of python-config --includes.
python_includes=`echo "${python_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. # If we have python-config, only try the configuration it provides.
# Otherwise fallback on the old way of trying different versions of # Otherwise fallback on the old way of trying different versions of
@ -720,13 +757,16 @@ else
have_libpython=no have_libpython=no
if test "${have_python_config}" = yes; then if test "${have_python_config}" = yes; then
python_version=`echo " ${python_libs} " \ python_version=`echo " ${python_libs} " \
| sed -e 's,^.* -l\(python[[0-9]]*[[.]][[0-9]]*\) .*$,\1,'` | sed -e 's,^.* -l\(python[[0-9]]*[[.]][[0-9]]*\) .*$,\1,'`
if test "${python_version}" != ""; then case "${python_version}" in
python*)
AC_TRY_LIBPYTHON(${python_version}, have_libpython, AC_TRY_LIBPYTHON(${python_version}, have_libpython,
${python_includes}, ${python_libs}) ${python_includes}, ${python_libs})
else ;;
*)
AC_MSG_ERROR([unable to determine python version from ${python_libs}]) AC_MSG_ERROR([unable to determine python version from ${python_libs}])
fi ;;
esac
else else
if test "${have_libpython}" = no; then if test "${have_libpython}" = no; then
AC_TRY_LIBPYTHON(python2.6, have_libpython, AC_TRY_LIBPYTHON(python2.6, have_libpython,
@ -761,6 +801,12 @@ else
AC_MSG_ERROR([no usable python found at ${with_python}]) AC_MSG_ERROR([no usable python found at ${with_python}])
;; ;;
esac 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
fi fi

View file

@ -157,6 +157,10 @@ extern char *gdb_sysroot;
/* GDB datadir, used to store data files. */ /* GDB datadir, used to store data files. */
extern char *gdb_datadir; 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. */ /* Search path for separate debug files. */
extern char *debug_file_directory; extern char *debug_file_directory;

View file

@ -68,6 +68,10 @@ char *gdb_sysroot = 0;
/* GDB datadir, used to store data files. */ /* GDB datadir, used to store data files. */
char *gdb_datadir = 0; 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_stdout;
struct ui_file *gdb_stderr; struct ui_file *gdb_stderr;
struct ui_file *gdb_stdlog; struct ui_file *gdb_stdlog;
@ -351,6 +355,14 @@ captured_main (void *data)
gdb_datadir = relocate_directory (argv[0], GDB_DATADIR, gdb_datadir = relocate_directory (argv[0], GDB_DATADIR,
GDB_DATADIR_RELOCATABLE); 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 #ifdef RELOC_SRCDIR
add_substitute_path_rule (RELOC_SRCDIR, add_substitute_path_rule (RELOC_SRCDIR,
make_relative_prefix (argv[0], BINDIR, make_relative_prefix (argv[0], BINDIR,

View file

@ -647,6 +647,17 @@ Enables or disables printing of Python stack traces."),
&show_python_list); &show_python_list);
#ifdef HAVE_PYTHON #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 (); Py_Initialize ();
PyEval_InitThreads (); PyEval_InitThreads ();