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>
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.

View File

@ -403,6 +403,31 @@ AC_DEFUN([CY_AC_TK_PRIVATE_HEADERS], [
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 Add a new --with option that defines a directory.
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]])
AC_DEFINE_DIR([$1], [$1], [$3])
AC_SUBST([$1])
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 ${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.])
GDB_AC_DEFINE_RELOCATABLE([$1], [$2], ${ac_define_dir})
])

View File

@ -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

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-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/<path>)
--with-python[=PYTHON] include python support
(auto/yes/no/<python-program>)
--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

View File

@ -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/<path>)]),
AS_HELP_STRING([--with-python@<:@=PYTHON@:>@], [include python support (auto/yes/no/<python-program>)]),
[], [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

View File

@ -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;

View File

@ -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,

View File

@ -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 ();