From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9291 invoked by alias); 6 Aug 2008 19:53:53 -0000 Received: (qmail 9258 invoked by uid 22791); 6 Aug 2008 19:53:47 -0000 X-Spam-Check-By: sourceware.org Received: from igw1.br.ibm.com (HELO igw1.br.ibm.com) (32.104.18.24) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 06 Aug 2008 19:52:38 +0000 Received: from mailhub1.br.ibm.com (mailhub1 [9.18.232.109]) by igw1.br.ibm.com (Postfix) with ESMTP id C21BB32C0D5 for ; Wed, 6 Aug 2008 16:23:54 -0300 (BRT) Received: from d24av01.br.ibm.com (d24av01.br.ibm.com [9.18.232.46]) by mailhub1.br.ibm.com (8.13.8/8.13.8/NCO v9.0) with ESMTP id m76JotZY487812 for ; Wed, 6 Aug 2008 16:51:22 -0300 Received: from d24av01.br.ibm.com (loopback [127.0.0.1]) by d24av01.br.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m76JoVll019692 for ; Wed, 6 Aug 2008 16:50:48 -0300 Received: from [9.8.1.201] ([9.8.1.201]) by d24av01.br.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id m76JoQ7C018260; Wed, 6 Aug 2008 16:50:27 -0300 Subject: Re: [RFA][patch 1/9] Initial Python support, patch du jour From: Thiago Jung Bauermann To: Eli Zaretskii Cc: tromey@redhat.com, drow@false.org, gdb-patches@sourceware.org In-Reply-To: References: <20080429155212.444237503@br.ibm.com> <20080429155304.288626880@br.ibm.com> <20080528205921.GA2969@caradoc.them.org> <20080615181833.uxmo25mg0kko40kw@imap.linux.ibm.com> <1216107418.14956.27.camel@localhost.localdomain> <1216245620.12209.18.camel@localhost.localdomain> <20080718195010.GA14356@caradoc.them.org> <1216653969.31797.6.camel@localhost.localdomain> <1217909927.7578.61.camel@localhost.localdomain> <1218000867.4534.56.camel@localhost.localdomain> Content-Type: text/plain Date: Wed, 06 Aug 2008 19:53:00 -0000 Message-Id: <1218052202.6617.2.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.22.3.1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-08/txt/msg00137.txt.bz2 On Wed, 2008-08-06 at 21:21 +0300, Eli Zaretskii wrote: > Otherwise, the patches for the manual are okay with me; thanks. Thanks! I made the changes and committed the version below. Now to the next Python patches. :-) --=20 []'s Thiago Jung Bauermann IBM Linux Technology Center gdb/ 2008-08-06 Vladimir Prus Tom Tromey Thiago Jung Bauermann Doug Evans * Makefile.in (SUBDIR_PYTHON_OBS, SUBDIR_PYTHON_SRCS, SUBDIR_PYTHON_DEPS, SUBDIR_PYTHON_LDFLAGS, SUBDIR_PYTHON_CFLAGS, PYTHON_CFLAGS): New. (python_h, python_internal_h): New. (cli-script.o): Depend on python.h (python.o, python-utils.o): New. * cli/cli-script.c (print_command_lines): Handle python_control. (execute_control_command): Handle python_control. (execute_control_command_untraced): New function. (while_command): Call execute_control_command_untraced. (if_command): Likewise. (get_command_line): Remove static attribute. (read_next_line): Handle "python". (recurse_read_control_structure): Handle python_control. (read_command_lines): Handle python_control. Include python.h. * cli/cli-script.h (get_command_line): Add prototype. (execute_control_command_untraced): Likewise. * configure.ac: Add --with-python. * defs.h (enum command_control_type) : New constant. * python/python-internal.h: New file. * python/python.c: New file. * python/python.h: New file. * python/python-utils.c: New file. * NEWS: Mention Python scripting support and its new commands. gdb/doc/ 2008-08-06 Tom Tromey * gdb.texinfo (Extending GDB): New chapter. (Sequences): Demoted chapter, now a section under the new Extending GDB chapter. (Python): New section. gdb/testsuite/ 2008-08-06 Tom Tromey * gdb.python/python.exp: New file. Index: gdb.git/gdb/Makefile.in =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/Makefile.in 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/Makefile.in 2008-08-06 16:04:36.000000000 -0300 @@ -254,6 +254,19 @@ SUBDIR_TUI_LDFLAGS=3D SUBDIR_TUI_CFLAGS=3D \ -DTUI=3D1 =20 +# +# python sub directory definitons +# +SUBDIR_PYTHON_OBS =3D \ + python.o \ + python-utils.o +SUBDIR_PYTHON_SRCS =3D \ + python/python.c \ + python/python-utils.c +SUBDIR_PYTHON_DEPS =3D +SUBDIR_PYTHON_LDFLAGS=3D +SUBDIR_PYTHON_CFLAGS=3D + =20 # Opcodes currently live in one of two places. Either they are in the # opcode library, typically ../opcodes, or they are in a header file @@ -951,6 +964,13 @@ tui_wingeneral_h =3D $(srcdir)/tui/tui-win tui_win_h =3D $(srcdir)/tui/tui-win.h $(tui_data_h) tui_winsource_h =3D $(srcdir)/tui/tui-winsource.h $(tui_data_h) =20 +# +# gdb/python/ headers +# + +python_h =3D $(srcdir)/python/python.h $(value_h) +python_internal_h =3D $(srcdir)/python/python-internal.h + # gdb/features preparsed descriptions features_headers =3D $(defs_h) $(gdbtypes_h) $(target_descriptions_h) arm_with_iwmmxt_c =3D $(srcdir)/features/arm-with-iwmmxt.c $(features_head= ers) @@ -3044,7 +3064,8 @@ cli-logging.o: $(srcdir)/cli/cli-logging $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-logging.c cli-script.o: $(srcdir)/cli/cli-script.c $(defs_h) $(value_h) $(language_h= ) \ $(ui_out_h) $(gdb_string_h) $(exceptions_h) $(top_h) $(cli_cmds_h) \ - $(cli_decode_h) $(cli_script_h) $(gdb_assert_h) $(breakpoint_h) + $(cli_decode_h) $(cli_script_h) $(gdb_assert_h) $(breakpoint_h) \ + $(python_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-script.c cli-setshow.o: $(srcdir)/cli/cli-setshow.c $(defs_h) $(readline_tilde_h) \ $(value_h) $(gdb_string_h) $(ui_out_h) $(cli_decode_h) $(cli_cmds_h) \ @@ -3372,4 +3393,22 @@ tui-winsource.o: $(srcdir)/tui/tui-winso $(gdb_curses_h) $(gdb_assert_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/tui/tui-winsource.c =20 +# +# gdb/python/ dependencies +# +# Need to explicitly specify the compile rule as make will do nothing +# or try to compile the object file into the sub-directory. + +# Flags needed to compile Python code +PYTHON_CFLAGS=3D@PYTHON_CFLAGS@ + +python.o: $(srcdir)/python/python.c $(defs_h) $(python_h) \ + $(command_h) $(libiberty_h) $(cli_decode_h) $(charset_h) $(top_h) \ + $(exceptions_h) $(python_internal_h) $(version_h) $(cli_script_h) \ + $(ui_out_h) $(target_h) $(gdbthread_h) + $(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) $(srcdir)/python/python.c +python-utils.o: $(srcdir)/python/python-utils.c $(defs_h) $(python_interna= l_h) + $(CC) -c $(INTERNAL_CFLAGS) $(PYTHON_CFLAGS) \ + $(srcdir)/python/python-utils.c -o python-utils.o + ### end of the gdb Makefile.in. Index: gdb.git/gdb/NEWS =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/NEWS 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/NEWS 2008-08-06 16:04:36.000000000 -0300 @@ -62,12 +62,24 @@ have also been fixed. gdbserver executable to debug both 32-bit and 64-bit programs. (This requires gdbserver itself to be built as a 64-bit executable.) =20 +* Python scripting + + GDB now has support for scripting using Python. Whether this is + available is determined at configure time. + * New commands =20 find [/size-char] [/max-count] start-address, end-address|+search-space-si= ze, val1 [, val2, ...] Search memory for a sequence of bytes. =20 +maint set python print-stack +maint show python print-stack + Show a stack trace when an error is encountered in a Python script. + +python [CODE] + Invoke CODE by passing it to the Python interpreter. + set print symbol-loading show print symbol-loading Control printing of symbol loading messages. Index: gdb.git/gdb/cli/cli-script.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/cli/cli-script.c 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/cli/cli-script.c 2008-08-06 16:04:36.000000000 -0300 @@ -34,6 +34,8 @@ #include "cli/cli-script.h" #include "gdb_assert.h" =20 +#include "python/python.h" + /* Prototypes for local functions */ =20 static enum command_control_type @@ -102,7 +104,7 @@ build_command_line (enum command_control /* Build and return a new command structure for the control commands such as "if" and "while". */ =20 -static struct command_line * +struct command_line * get_command_line (enum command_control_type type, char *arg) { struct command_line *cmd; @@ -225,6 +227,20 @@ print_command_lines (struct ui_out *uiou continue; } =20 + if (list->control_type =3D=3D python_control) + { + ui_out_field_string (uiout, NULL, "python"); + ui_out_text (uiout, "\n"); + /* Don't indent python code at all. */ + print_command_lines (uiout, *list->body_list, 0); + if (depth) + ui_out_spaces (uiout, 2 * depth); + ui_out_field_string (uiout, NULL, "end"); + ui_out_text (uiout, "\n"); + list =3D list->next; + continue; + } + /* ignore illegal command type and try next */ list =3D list->next; } /* while (list) */ @@ -527,6 +543,12 @@ execute_control_command (struct command_ ret =3D commands_from_control_command (new_line, cmd); break; } + case python_control: + { + eval_python_from_control_command (cmd); + ret =3D simple_control; + break; + } =20 default: warning (_("Invalid control type in canned commands structure.")); @@ -538,6 +560,17 @@ execute_control_command (struct command_ return ret; } =20 +/* Like execute_control_command, but first set + suppress_next_print_command_trace. */ + +enum command_control_type +execute_control_command_untraced (struct command_line *cmd) +{ + suppress_next_print_command_trace =3D 1; + return execute_control_command (cmd); +} + + /* "while" command support. Executes a body of statements while the loop condition is nonzero. */ =20 @@ -552,8 +585,7 @@ while_command (char *arg, int from_tty) if (command =3D=3D NULL) return; =20 - suppress_next_print_command_trace =3D 1; - execute_control_command (command); + execute_control_command_untraced (command); free_command_lines (&command); } =20 @@ -571,8 +603,7 @@ if_command (char *arg, int from_tty) if (command =3D=3D NULL) return; =20 - suppress_next_print_command_trace =3D 1; - execute_control_command (command); + execute_control_command_untraced (command); free_command_lines (&command); } =20 @@ -886,6 +917,12 @@ read_next_line (struct command_line **co first_arg++; *command =3D build_command_line (commands_control, first_arg); } + else if (p1 - p =3D=3D 6 && !strncmp (p, "python", 6)) + { + /* Note that we ignore the inline "python command" form + here. */ + *command =3D build_command_line (python_control, ""); + } else if (p1 - p =3D=3D 10 && !strncmp (p, "loop_break", 10)) { *command =3D (struct command_line *) @@ -962,6 +999,7 @@ recurse_read_control_structure (struct c { if (current_cmd->control_type =3D=3D while_control || current_cmd->control_type =3D=3D if_control + || current_cmd->control_type =3D=3D python_control || current_cmd->control_type =3D=3D commands_control) { /* Success reading an entire canned sequence of commands. */ @@ -1013,6 +1051,7 @@ recurse_read_control_structure (struct c on it. */ if (next->control_type =3D=3D while_control || next->control_type =3D=3D if_control + || next->control_type =3D=3D python_control || next->control_type =3D=3D commands_control) { control_level++; @@ -1086,6 +1125,7 @@ read_command_lines (char *prompt_arg, in =20 if (next->control_type =3D=3D while_control || next->control_type =3D=3D if_control + || next->control_type =3D=3D python_control || next->control_type =3D=3D commands_control) { control_level++; Index: gdb.git/gdb/cli/cli-script.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/cli/cli-script.h 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/cli/cli-script.h 2008-08-06 16:04:36.000000000 -0300 @@ -40,6 +40,12 @@ extern void show_user_1 (struct cmd_list extern enum command_control_type execute_control_command (struct command_line *cmd); =20 +extern enum command_control_type + execute_control_command_untraced (struct command_line *cmd); + +extern struct command_line *get_command_line (enum command_control_type, + char *); + extern void print_command_lines (struct ui_out *, struct command_line *, unsigned int); =20 Index: gdb.git/gdb/configure.ac =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/configure.ac 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/configure.ac 2008-08-06 16:04:36.000000000 -0300 @@ -497,6 +497,125 @@ else fi fi =20 +dnl Utility to simplify finding libpython. +AC_DEFUN([AC_TRY_LIBPYTHON], +[ + version=3D$1 + define([have_libpython_var],$2) + define([VERSION],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + [HAVE_LIB]VERSION=3Dno + AC_MSG_CHECKING([for ${version}]) + save_LIBS=3D$LIBS + LIBS=3D"$LIBS -l${version}" + AC_LINK_IFELSE(AC_LANG_PROGRAM([[#include "${version}/Python.h"]], + [[Py_Initialize ();]]), + [[HAVE_LIB]VERSION=3Dyes + have_libpython_var=3Dyes], + [LIBS=3D$save_LIBS]) + AC_MSG_RESULT([$[HAVE_LIB]VERSION]) +]) + +AC_ARG_WITH(python, + AS_HELP_STRING([--with-python], [include python support (auto/yes/no/)]), + [], [with_python=3Dauto]) +AC_MSG_CHECKING([whether to use python]) +AC_MSG_RESULT([$with_python]) + +if test "${with_python}" =3D no; then + AC_MSG_WARN([python support disabled; some features may be unavailable.]) + have_libpython=3Dno +else + case "${with_python}" in + yes | auto) + # Leave as empty, use defaults. + python_includes=3D + python_libs=3D + ;; + /*) + python_includes=3D"-I${with_python}/include" + python_libs=3D"-L${with_python}/lib" + ;; + *) + AC_ERROR(invalid value for --with-python) + ;; + esac + + save_CPPFLAGS=3D$CPPFLAGS + CPPFLAGS=3D"$CPPFLAGS ${python_includes}" + save_LIBS=3D$LIBS + LIBS=3D"$LIBS ${python_libs}" + have_libpython=3Dno + if test "${have_libpython}" =3D no; then + AC_TRY_LIBPYTHON(python2.6, have_libpython) + if test "${HAVE_LIBPYTHON2_6}" =3D yes; then + AC_DEFINE(HAVE_LIBPYTHON2_6, 1, [Define if Python 2.6 is being used.= ]) + fi + fi + if test ${have_libpython} =3D no; then + AC_TRY_LIBPYTHON(python2.5, have_libpython) + if test "${HAVE_LIBPYTHON2_5}" =3D yes; then + AC_DEFINE(HAVE_LIBPYTHON2_5, 1, [Define if Python 2.5 is being used.= ]) + fi + fi + if test ${have_libpython} =3D no; then + AC_TRY_LIBPYTHON(python2.4, have_libpython) + if test "${HAVE_LIBPYTHON2_4}" =3D yes; then + AC_DEFINE(HAVE_LIBPYTHON2_4, 1, [Define if Python 2.4 is being used.= ]) + fi + fi + if test ${have_libpython} =3D no; then + case "${with_python}" in + yes) + AC_MSG_ERROR([python is missing or unusable]) + ;; + auto) + AC_MSG_WARN([python is missing or unusable; some features may be una= vailable.]) + ;; + *) + AC_MSG_ERROR([no usable python found at ${with_python}]) + ;; + esac + CPPFLAGS=3D$save_CPPFLAGS + LIBS=3D$save_LIBS + fi +fi + +if test "${have_libpython}" =3D yes; then + AC_DEFINE(HAVE_PYTHON, 1, [Define if Python interpreter is being linked = in.]) + CONFIG_OBS=3D"$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" + CONFIG_DEPS=3D"$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)" + CONFIG_SRCS=3D"$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)" + ENABLE_CFLAGS=3D"$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" + + # 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 whi= ch + # would make the python-related objects be compiled differently from the + # rest of GDB (e.g., -O2 and -fPIC). + if test "${GCC}" =3D yes; then + tentative_python_cflags=3D"-fno-strict-aliasing -DNDEBUG -fwrapv" + fi + + if test "x${tentative_python_cflags}" !=3D x; then + AC_MSG_CHECKING(compiler flags for python code) + for flag in ${tentative_python_cflags}; do + # Check that the compiler accepts it + saved_CFLAGS=3D"$CFLAGS" + CFLAGS=3D"$CFLAGS $flag" + AC_TRY_COMPILE([],[],PYTHON_CFLAGS=3D"${PYTHON_CFLAGS} $flag",) + CFLAGS=3D"$saved_CFLAGS" + done + AC_MSG_RESULT(${PYTHON_CFLAGS}) + fi +else + # Even if Python support is not compiled in, we need to have this file + # included in order to recognize the GDB command "python". + CONFIG_OBS=3D"$CONFIG_OBS python.o" + CONFIG_SRCS=3D"$CONFIG_SRCS python/python.c" +fi +AC_SUBST(PYTHON_CFLAGS) + # ------------------------- # # Checks for header files. # # ------------------------- # Index: gdb.git/gdb/defs.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/defs.h 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/defs.h 2008-08-06 16:04:36.000000000 -0300 @@ -652,6 +652,7 @@ enum command_control_type while_control, if_control, commands_control, + python_control, invalid_control }; =20 Index: gdb.git/gdb/doc/gdb.texinfo =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/doc/gdb.texinfo 2008-08-05 18:39:32.000000000 -0300 +++ gdb.git/gdb/doc/gdb.texinfo 2008-08-06 16:09:34.000000000 -0300 @@ -159,7 +159,7 @@ software in general. We will miss him. * Remote Debugging:: Debugging remote programs * Configurations:: Configuration-specific information * Controlling GDB:: Controlling @value{GDBN} -* Sequences:: Canned sequences of commands +* Extending GDB:: Extending @value{GDBN} * Interpreters:: Command Interpreters * TUI:: @value{GDBN} Text User Interface * Emacs:: Using @value{GDBN} under @sc{gnu} Emacs @@ -16845,8 +16845,21 @@ Turns on or off debugging messages for b Displays the current state of XML debugging messages. @end table =20 +@node Extending GDB +@chapter Extending @value{GDBN} +@cindex extending GDB + +@value{GDBN} provides two mechanisms for extension. The first is based +on composition of @value{GDBN} commands, and the second is based on the +Python scripting language. + +@menu +* Sequences:: Canned Sequences of Commands +* Python:: Scripting @value{GDBN} using Python +@end menu + @node Sequences -@chapter Canned Sequences of Commands +@section Canned Sequences of Commands =20 Aside from breakpoint commands (@pxref{Break Commands, ,Breakpoint Command Lists}), @value{GDBN} provides two ways to store sequences of @@ -16861,7 +16874,7 @@ files. @end menu =20 @node Define -@section User-defined Commands +@subsection User-defined Commands =20 @cindex user-defined command @cindex arguments, to user-defined commands @@ -16973,7 +16986,7 @@ commands that normally print messages to messages when used in a user-defined command. =20 @node Hooks -@section User-defined Command Hooks +@subsection User-defined Command Hooks @cindex command hooks @cindex hooks, for commands @cindex hooks, pre-command @@ -17054,7 +17067,7 @@ If you try to define a hook which does n get a warning from the @code{define} command. =20 @node Command Files -@section Command Files +@subsection Command Files =20 @cindex command files @cindex scripting commands @@ -17158,7 +17171,7 @@ Terminate the block of commands that are =20 =20 @node Output -@section Commands for Controlled Output +@subsection Commands for Controlled Output =20 During the execution of a command file or a user-defined command, normal @value{GDBN} output is suppressed; the only output that appears is what is @@ -17305,6 +17318,159 @@ printf "D32: %Hf - D64: %Df - D128: %DDf =20 @end table =20 +@node Python +@section Scripting @value{GDBN} using Python +@cindex python scripting +@cindex scripting with python + +You can script @value{GDBN} using the @uref{http://www.python.org/, +Python programming language}. This feature is available only if +@value{GDBN} was configured using @option{--with-python}. + +@menu +* Python Commands:: Accessing Python from @value{GDBN}. +* Python API:: Accessing @value{GDBN} from Python. +@end menu + +@node Python Commands +@subsection Python Commands +@cindex python commands +@cindex commands to access python + +@value{GDBN} provides one command for accessing the Python interpreter, +and one related setting: + +@table @code +@kindex python +@item python @r{[}@var{code}@r{]} +The @code{python} command can be used to evaluate Python code. + +If given an argument, the @code{python} command will evaluate the +argument as a Python command. For example: + +@smallexample +(@value{GDBP}) python print 23 +23 +@end smallexample + +If you do not provide an argument to @code{python}, it will act as a +multi-line command, like @code{define}. In this case, the Python +script is made up of subsequent command lines, given after the +@code{python} command. This command list is terminated using a line +containing @code{end}. For example: + +@smallexample +(@value{GDBP}) python +Type python script +End with a line saying just "end". +>print 23 +>end +23 +@end smallexample + +@kindex maint set python print-stack +@item maint set python print-stack +By default, @value{GDBN} will print a stack trace when an error occurs +in a Python script. This can be controlled using @code{maint set +python print-stack}: if @code{on}, the default, then Python stack +printing is enabled; if @code{off}, then Python stack printing is +disabled. +@end table + +@node Python API +@subsection Python API +@cindex python api +@cindex programming in python + +@cindex python stdout +@cindex python pagination +At startup, @value{GDBN} overrides Python's @code{sys.stdout} and +@code{sys.stderr} to print using @value{GDBN}'s output-paging streams. +A Python program which outputs to one of these streams may have its +output interrupted by the user (@pxref{Screen Size}). In this +situation, a Python @code{KeyboardInterrupt} exception is thrown. + +@menu +* Basic Python:: Basic Python Functions. +* Exception Handling:: +@end menu + +@node Basic Python +@subsubsection Basic Python + +@cindex python functions +@cindex python module +@cindex gdb module +@value{GDBN} introduces a new Python module, named @code{gdb}. All +methods and classes added by @value{GDBN} are placed in this module. +@value{GDBN} automatically @code{import}s the @code{gdb} module for +use in all scripts evaluated by the @code{python} command. + +@findex gdb.execute +@defun execute command +Evaluate @var{command}, a string, as a @value{GDBN} CLI command. +If a GDB exception happens while @var{command} runs, it is +translated as described in @ref{Exception Handling,,Exception Handling}. +If no exceptions occur, this function returns @code{None}. +@end defun + +@findex gdb.get_parameter +@defun get_parameter parameter +Return the value of a @value{GDBN} parameter. @var{parameter} is a +string naming the parameter to look up; @var{parameter} may contain +spaces if the parameter has a multi-part name. For example, +@samp{print object} is a valid parameter name. + +If the named parameter does not exist, this function throws a +@code{RuntimeError}. Otherwise, the parameter's value is converted to +a Python value of the appropriate type, and returned. +@end defun + +@findex gdb.write +@defun write string +Print a string to @value{GDBN}'s paginated standard output stream. +Writing to @code{sys.stdout} or @code{sys.stderr} will automatically +call this function. +@end defun + +@findex gdb.flush +@defun flush +Flush @value{GDBN}'s paginated standard output stream. Flushing +@code{sys.stdout} or @code{sys.stderr} will automatically call this +function. +@end defun + +@node Exception Handling +@subsubsection Exception Handling +@cindex python exceptions +@cindex exceptions, python + +When executing the @code{python} command, Python exceptions +uncaught within the Python code are translated to calls to +@value{GDBN} error-reporting mechanism. If the command that called +@code{python} does not handle the error, @value{GDBN} will +terminate it and print an error message containing the Python +exception name, the associated value, and the Python call stack +backtrace at the point where the exception was raised. Example: + +@smallexample +(@value{GDBP}) python print foo +Traceback (most recent call last): + File "", line 1, in +NameError: name 'foo' is not defined +@end smallexample + +@value{GDBN} errors that happen in @value{GDBN} commands invoked by Python +code are converted to Python @code{RuntimeError} exceptions. User +interrupt (via @kbd{C-c} or by typing @kbd{q} at a pagination +prompt) is translated to a Python @code{KeyboardInterrupt} +exception. If you catch these exceptions in your Python code, your +exception handler will see @code{RuntimeError} or +@code{KeyboardInterrupt} as the exception type, the @value{GDBN} error +message as its value, and the Python call stack backtrace at the +Python statement closest to where the @value{GDBN} error occured as the +traceback. + @node Interpreters @chapter Command Interpreters @cindex command interpreters Index: gdb.git/gdb/python/python-internal.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/python/python-internal.h 2008-08-06 16:04:36.000000000 -0300 @@ -0,0 +1,71 @@ +/* Gdb/Python header for private use by Python module. + + Copyright (C) 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . = */ + +#ifndef GDB_PYTHON_INTERNAL_H +#define GDB_PYTHON_INTERNAL_H + +/* Python 2.4 doesn't include stdint.h soon enough to get {u,}intptr_t + needed by pyport.h. */ +#include + +/* /usr/include/features.h on linux systems will define _POSIX_C_SOURCE + if it sees _GNU_SOURCE (which config.h will define). + pyconfig.h defines _POSIX_C_SOURCE to a different value than + /usr/include/features.h does causing compilation to fail. + To work around this, undef _POSIX_C_SOURCE before we include Python.h. = */ +#undef _POSIX_C_SOURCE + +#if HAVE_LIBPYTHON2_4 +#include "python2.4/Python.h" +/* Py_ssize_t is not defined until 2.5. */ +typedef Py_intptr_t Py_ssize_t; +#elif HAVE_LIBPYTHON2_5 +#include "python2.5/Python.h" +#elif HAVE_LIBPYTHON2_6 +#include "python2.6/Python.h" +#else +#error "Unable to find usable Python.h" +#endif + +struct block; +struct symbol; +struct symtab_and_line; + +extern PyObject *gdb_module; + +struct cleanup *make_cleanup_py_decref (PyObject *py); + +/* Use this after a TRY_EXCEPT to throw the appropriate Python + exception. */ +#define GDB_PY_HANDLE_EXCEPTION(Exception) \ + do { \ + if (Exception.reason < 0) \ + return PyErr_Format (Exception.reason =3D=3D RETURN_QUIT \ + ? PyExc_KeyboardInterrupt : PyExc_RuntimeError, \ + "%s", Exception.message); \ + } while (0) + + +void gdbpy_print_stack (void); + +PyObject *python_string_to_unicode (PyObject *obj); +char *unicode_to_target_string (PyObject *unicode_str); +char *python_string_to_target_string (PyObject *obj); + +#endif /* GDB_PYTHON_INTERNAL_H */ Index: gdb.git/gdb/python/python-utils.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/python/python-utils.c 2008-08-06 16:04:36.000000000 -0300 @@ -0,0 +1,117 @@ +/* General utility routines for GDB/Python. + + Copyright (C) 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . = */ + +#include "defs.h" +#include "charset.h" +#include "python-internal.h" + + +/* This is a cleanup function which decrements the refcount on a + Python object. */ + +static void +py_decref (void *p) +{ + PyObject *py =3D p; + /* Note that we need the extra braces in this 'if' to avoid a + warning from gcc. */ + if (py) + { + Py_DECREF (py); + } +} + +/* Return a new cleanup which will decrement the Python object's + refcount when run. */ + +struct cleanup * +make_cleanup_py_decref (PyObject *py) +{ + return make_cleanup (py_decref, (void *) py); +} + +/* Converts a Python 8-bit string to a unicode string object. Assumes the + 8-bit string is in the host charset. If an error occurs during convers= ion, + returns NULL with a python exception set. + + As an added bonus, the functions accepts a unicode string and returns it + right away, so callers don't need to check which kind of string they've + got. + + If the given object is not one of the mentioned string types, NULL is + returned, with the TypeError python exception set. */ +PyObject * +python_string_to_unicode (PyObject *obj) +{ + PyObject *unicode_str; + + /* If obj is already a unicode string, just return it. + I wish life was always that simple... */ + if (PyUnicode_Check (obj)) + unicode_str =3D obj; + else if (PyString_Check (obj)) + unicode_str =3D PyUnicode_FromEncodedObject (obj, host_charset (), NUL= L); + else + { + PyErr_SetString (PyExc_TypeError, + _("Expected a string or unicode object.")); + unicode_str =3D NULL; + } + + return unicode_str; +} + +/* Returns a newly allocated string with the contents of the given unicode + string object converted to the target's charset. If an error occurs du= ring + the conversion, NULL will be returned and a python exception will be se= t. + + The caller is responsible for xfree'ing the string. */ +char * +unicode_to_target_string (PyObject *unicode_str) +{ + char *target_string; + PyObject *string; + + /* Translate string to target's charset. */ + string =3D PyUnicode_AsEncodedString (unicode_str, target_charset (), NU= LL); + if (string =3D=3D NULL) + return NULL; + + target_string =3D xstrdup (PyString_AsString (string)); + + Py_DECREF (string); + + return target_string; +} + +/* Converts a python string (8-bit or unicode) to a target string in + the target's charset. Returns NULL on error, with a python exception s= et. + + The caller is responsible for xfree'ing the string. */ +char * +python_string_to_target_string (PyObject *obj) +{ + PyObject *str; + + str =3D python_string_to_unicode (obj); + if (str =3D=3D NULL) + return NULL; + + return unicode_to_target_string (str); +} Index: gdb.git/gdb/python/python.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/python/python.c 2008-08-06 16:04:36.000000000 -0300 @@ -0,0 +1,438 @@ +/* General python/gdb code + + Copyright (C) 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . = */ + +#include "defs.h" +#include "command.h" +#include "ui-out.h" +#include "cli/cli-script.h" +#include "gdbcmd.h" + +#include + +/* True if we should print the stack when catching a Python error, + false otherwise. */ +static int gdbpy_should_print_stack =3D 1; + +#ifdef HAVE_PYTHON + +#include "python.h" +#include "libiberty.h" +#include "cli/cli-decode.h" +#include "charset.h" +#include "top.h" +#include "exceptions.h" +#include "python-internal.h" +#include "version.h" +#include "target.h" +#include "gdbthread.h" + + +PyObject *gdb_module; + +static PyObject *get_parameter (PyObject *, PyObject *); +static PyObject *execute_gdb_command (PyObject *, PyObject *); +static PyObject *gdbpy_write (PyObject *, PyObject *); +static PyObject *gdbpy_flush (PyObject *, PyObject *); + +static PyMethodDef GdbMethods[] =3D +{ + { "execute", execute_gdb_command, METH_VARARGS, + "Execute a gdb command" }, + { "get_parameter", get_parameter, METH_VARARGS, + "Return a gdb parameter's value" }, + + { "write", gdbpy_write, METH_VARARGS, + "Write a string using gdb's filtered stream." }, + { "flush", gdbpy_flush, METH_NOARGS, + "Flush gdb's filtered stdout stream." }, + + {NULL, NULL, 0, NULL} +}; + +/* Given a command_line, return a command string suitable for passing + to Python. Lines in the string are separated by newlines. The + return value is allocated using xmalloc and the caller is + responsible for freeing it. */ + +static char * +compute_python_string (struct command_line *l) +{ + struct command_line *iter; + char *script =3D NULL; + int size =3D 0; + int here; + + for (iter =3D l; iter; iter =3D iter->next) + size +=3D strlen (iter->line) + 1; + + script =3D xmalloc (size + 1); + here =3D 0; + for (iter =3D l; iter; iter =3D iter->next) + { + int len =3D strlen (iter->line); + strcpy (&script[here], iter->line); + here +=3D len; + script[here++] =3D '\n'; + } + script[here] =3D '\0'; + return script; +} + +/* Take a command line structure representing a 'python' command, and + evaluate its body using the Python interpreter. */ + +void +eval_python_from_control_command (struct command_line *cmd) +{ + char *script; + + if (cmd->body_count !=3D 1) + error (_("Invalid \"python\" block structure.")); + + script =3D compute_python_string (cmd->body_list[0]); + PyRun_SimpleString (script); + xfree (script); + if (PyErr_Occurred ()) + { + gdbpy_print_stack (); + error (_("error while executing Python code")); + } +} + +/* Implementation of the gdb "python" command. */ + +static void +python_command (char *arg, int from_tty) +{ + while (arg && *arg && isspace (*arg)) + ++arg; + if (arg && *arg) + { + PyRun_SimpleString (arg); + if (PyErr_Occurred ()) + { + gdbpy_print_stack (); + error (_("error while executing Python code")); + } + } + else + { + struct command_line *l =3D get_command_line (python_control, ""); + struct cleanup *cleanups =3D make_cleanup_free_command_lines (&l); + execute_control_command_untraced (l); + do_cleanups (cleanups); + } +} + +=0C + +/* Transform a gdb parameters's value into a Python value. May return + NULL (and set a Python exception) on error. Helper function for + get_parameter. */ + +static PyObject * +parameter_to_python (struct cmd_list_element *cmd) +{ + switch (cmd->var_type) + { + case var_string: + case var_string_noescape: + case var_optional_filename: + case var_filename: + case var_enum: + { + char *str =3D * (char **) cmd->var; + if (! str) + str =3D ""; + return PyString_Decode (str, strlen (str), host_charset (), NULL); + } + + case var_boolean: + { + if (* (int *) cmd->var) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; + } + + case var_auto_boolean: + { + enum auto_boolean ab =3D * (enum auto_boolean *) cmd->var; + if (ab =3D=3D AUTO_BOOLEAN_TRUE) + Py_RETURN_TRUE; + else if (ab =3D=3D AUTO_BOOLEAN_FALSE) + Py_RETURN_FALSE; + else + Py_RETURN_NONE; + } + + case var_integer: + if ((* (int *) cmd->var) =3D=3D INT_MAX) + Py_RETURN_NONE; + /* Fall through. */ + case var_zinteger: + return PyLong_FromLong (* (int *) cmd->var); + + case var_uinteger: + { + unsigned int val =3D * (unsigned int *) cmd->var; + if (val =3D=3D UINT_MAX) + Py_RETURN_NONE; + return PyLong_FromUnsignedLong (val); + } + } + + return PyErr_Format (PyExc_RuntimeError, "programmer error: unhandled ty= pe"); +} + +/* A Python function which returns a gdb parameter's value as a Python + value. */ + +static PyObject * +get_parameter (PyObject *self, PyObject *args) +{ + struct cmd_list_element *alias, *prefix, *cmd; + char *arg, *newarg; + volatile struct gdb_exception except; + + if (! PyArg_ParseTuple (args, "s", &arg)) + return NULL; + + newarg =3D concat ("show ", arg, (char *) NULL); + + TRY_CATCH (except, RETURN_MASK_ALL) + { + if (! lookup_cmd_composition (newarg, &alias, &prefix, &cmd)) + { + xfree (newarg); + return PyErr_Format (PyExc_RuntimeError, + "could not find variable `%s'", arg); + } + } + xfree (newarg); + GDB_PY_HANDLE_EXCEPTION (except); + + if (! cmd->var) + return PyErr_Format (PyExc_RuntimeError, "`%s' is not a variable", arg= ); + return parameter_to_python (cmd); +} + +/* A Python function which evaluates a string using the gdb CLI. */ + +static PyObject * +execute_gdb_command (PyObject *self, PyObject *args) +{ + struct cmd_list_element *alias, *prefix, *cmd; + char *arg, *newarg; + volatile struct gdb_exception except; + struct cleanup *old_chain; + + if (! PyArg_ParseTuple (args, "s", &arg)) + return NULL; + + old_chain =3D make_cleanup (null_cleanup, 0); + + TRY_CATCH (except, RETURN_MASK_ALL) + { + execute_command (arg, 0); + } + GDB_PY_HANDLE_EXCEPTION (except); + + /* Do any commands attached to breakpoint we stopped at. Only if we + are always running synchronously. Or if we have just executed a + command that doesn't start the target. */ + if (!target_can_async_p () || !is_running (inferior_ptid)) + { + bpstat_do_actions (&stop_bpstat); + do_cleanups (old_chain); + } + + Py_RETURN_NONE; +} + +=0C + +/* Printing. */ + +/* A python function to write a single string using gdb's filtered + output stream. */ +static PyObject * +gdbpy_write (PyObject *self, PyObject *args) +{ + char *arg; + if (! PyArg_ParseTuple (args, "s", &arg)) + return NULL; + printf_filtered ("%s", arg); + Py_RETURN_NONE; +} + +/* A python function to flush gdb's filtered output stream. */ +static PyObject * +gdbpy_flush (PyObject *self, PyObject *args) +{ + gdb_flush (gdb_stdout); + Py_RETURN_NONE; +} + +/* Print a python exception trace, or print nothing and clear the + python exception, depending on gdbpy_should_print_stack. Only call + this if a python exception is set. */ +void +gdbpy_print_stack (void) +{ + if (gdbpy_should_print_stack) + PyErr_Print (); + else + PyErr_Clear (); +} + +#else /* HAVE_PYTHON */ + +/* Dummy implementation of the gdb "python" command. */ + +static void +python_command (char *arg, int from_tty) +{ + while (arg && *arg && isspace (*arg)) + ++arg; + if (arg && *arg) + error (_("Python scripting is not supported in this copy of GDB.")); + else + { + struct command_line *l =3D get_command_line (python_control, ""); + struct cleanup *cleanups =3D make_cleanup_free_command_lines (&l); + execute_control_command_untraced (l); + do_cleanups (cleanups); + } +} + +void +eval_python_from_control_command (struct command_line *cmd) +{ + error (_("Python scripting is not supported in this copy of GDB.")); +} + +#endif /* HAVE_PYTHON */ + +=0C + +/* Lists for 'maint set python' commands. */ + +static struct cmd_list_element *set_python_list; +static struct cmd_list_element *show_python_list; + +/* Function for use by 'maint set python' prefix command. */ + +static void +set_python (char *args, int from_tty) +{ + help_list (set_python_list, "maintenance set python ", -1, gdb_stdout); +} + +/* Function for use by 'maint show python' prefix command. */ + +static void +show_python (char *args, int from_tty) +{ + cmd_show_list (show_python_list, from_tty, ""); +} + +/* Initialize the Python code. */ + +void +_initialize_python (void) +{ + add_com ("python", class_obscure, python_command, +#ifdef HAVE_PYTHON + _("\ +Evaluate a Python command.\n\ +\n\ +The command can be given as an argument, for instance:\n\ +\n\ + python print 23\n\ +\n\ +If no argument is given, the following lines are read and used\n\ +as the Python commands. Type a line containing \"end\" to indicate\n\ +the end of the command.") +#else /* HAVE_PYTHON */ + _("\ +Evaluate a Python command.\n\ +\n\ +Python scripting is not supported in this copy of GDB.\n\ +This command is only a placeholder.") +#endif /* HAVE_PYTHON */ + ); + + add_prefix_cmd ("python", no_class, show_python, + _("Prefix command for python maintenance settings."), + &show_python_list, "maint show python ", 0, + &maintenance_show_cmdlist); + add_prefix_cmd ("python", no_class, set_python, + _("Prefix command for python maintenance settings."), + &set_python_list, "maint set python ", 0, + &maintenance_set_cmdlist); + + add_setshow_boolean_cmd ("print-stack", class_maintenance, + &gdbpy_should_print_stack, _("\ +Enable or disable printing of Python stack dump on error."), _("\ +Show whether Python stack will be printed on error."), _("\ +Enables or disables printing of Python stack traces."), + NULL, NULL, + &set_python_list, + &show_python_list); + +#ifdef HAVE_PYTHON + Py_Initialize (); + + gdb_module =3D Py_InitModule ("gdb", GdbMethods); + + /* The casts to (char*) are for python 2.4. */ + PyModule_AddStringConstant (gdb_module, "VERSION", (char*) version); + PyModule_AddStringConstant (gdb_module, "HOST_CONFIG", (char*) host_name= ); + PyModule_AddStringConstant (gdb_module, "TARGET_CONFIG", (char*) target_= name); + + PyRun_SimpleString ("import gdb"); + + /* Create a couple objects which are used for Python's stdout and + stderr. */ + PyRun_SimpleString ("\ +import sys\n\ +class GdbOutputFile:\n\ + def close(self):\n\ + # Do nothing.\n\ + return None\n\ +\n\ + def isatty(self):\n\ + return False\n\ +\n\ + def write(self, s):\n\ + gdb.write(s)\n\ +\n\ + def writelines(self, iterable):\n\ + for line in iterable:\n\ + self.write(line)\n\ +\n\ + def flush(self):\n\ + gdb.flush()\n\ +\n\ +sys.stderr =3D GdbOutputFile()\n\ +sys.stdout =3D GdbOutputFile()\n\ +"); +#endif /* HAVE_PYTHON */ +} Index: gdb.git/gdb/python/python.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/python/python.h 2008-08-06 16:04:36.000000000 -0300 @@ -0,0 +1,27 @@ +/* Python/gdb header for generic use in gdb + + Copyright (C) 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . = */ + +#ifndef GDB_PYTHON_H +#define GDB_PYTHON_H + +#include "value.h" + +void eval_python_from_control_command (struct command_line *); + +#endif /* GDB_PYTHON_H */ Index: gdb.git/gdb/testsuite/gdb.python/python.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ gdb.git/gdb/testsuite/gdb.python/python.exp 2008-08-06 16:04:36.0000000= 00 -0300 @@ -0,0 +1,66 @@ +# Copyright (C) 2008 Free Software Foundation, Inc. + +# 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 . + +# This file is part of the GDB testsuite. It tests the mechanism +# exposing values to Python. + +if $tracelevel then { + strace $tracelevel +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir + +gdb_test_multiple "python print 23" "verify python support" { + -re "not supported.*$gdb_prompt $" { + unsupported "python support is disabled" + return -1 + } + -re "$gdb_prompt $" {} +} + +# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}... +# Run a test named NAME, consisting of multiple lines of input. +# After each input line INPUT, search for result line RESULT. +# Succeed if all results are seen; fail otherwise. +proc gdb_py_test_multiple {name args} { + global gdb_prompt + foreach {input result} $args { + if {[gdb_test_multiple $input "$name - $input" { + -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" { + pass "$name - $input" + } + }]} { + return 1 + } + } + return 0 +} + +gdb_py_test_multiple "multi-line python command" \ + "python" "" \ + "print 23" "" \ + "end" "23" + +gdb_py_test_multiple "show python command" \ + "define zzq" "Type commands for definition of .* just \"end\"\\.*" \ + "python" "" \ + "print 23" "" \ + "end" "" \ + "end" "" \ + "show user zzq" "User command zzq:.* python.*print 23.* end" Index: gdb.git/gdb/config.in =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/config.in 2008-08-06 16:16:01.000000000 -0300 +++ gdb.git/gdb/config.in 2008-08-06 16:23:30.000000000 -0300 @@ -184,6 +184,15 @@ /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM =20 +/* Define if Python 2.4 is being used. */ +#undef HAVE_LIBPYTHON2_4 + +/* Define if Python 2.5 is being used. */ +#undef HAVE_LIBPYTHON2_5 + +/* Define if Python 2.6 is being used. */ +#undef HAVE_LIBPYTHON2_6 + /* Define if libunwind library is being used. */ #undef HAVE_LIBUNWIND =20 @@ -307,6 +316,9 @@ /* Define if sys/ptrace.h defines the PT_GETXMMREGS request. */ #undef HAVE_PT_GETXMMREGS =20 +/* Define if Python interpreter is being linked in. */ +#undef HAVE_PYTHON + /* Define to 1 if you have the `realpath' function. */ #undef HAVE_REALPATH =20 Index: gdb.git/gdb/configure =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gdb.git.orig/gdb/configure 2008-08-06 16:15:58.000000000 -0300 +++ gdb.git/gdb/configure 2008-08-06 16:23:26.000000000 -0300 @@ -314,7 +314,7 @@ ac_subdirs_all=3D"$ac_subdirs_all doc test ac_subdirs_all=3D"$ac_subdirs_all gdbtk" ac_subdirs_all=3D"$ac_subdirs_all multi-ice" ac_subdirs_all=3D"$ac_subdirs_all gdbserver" -ac_subst_vars=3D'SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE= _VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transf= orm_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir locals= tatedir libdir includedir oldincludedir infodir mandir build_alias host_ali= as target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAI= NER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP = EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_c= pu host_vendor host_os target target_cpu target_vendor target_os USE_NLS LI= BINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTO= BJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE= GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY G= NULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK = GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN= GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECM= P GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GN= ULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GN= ULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY = HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP= HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTO= K_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGN= AL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE= _UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_= STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTR= DIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_= WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRD= IFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX= STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WC= HAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDI= NT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION = ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP = INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am= __untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH = CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE subdirs TARGET_OBS PKGVERS= ION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLL= TOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CF= LAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT ALLOCA CONFIG_LDFLAGS TARGET_SYSTEM_= ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_HARDWIRE WIN32= LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEVEL TCL_BIN_DIR= TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_LIB_FILE TCL_S= TUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DEPS TK_VERSION = TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_STUB_LIB_FILE = TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DEPS TK_XINCLUDE= S X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_DIR SIM SIM_OB= S ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_SRCS CONFIG_AL= L CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir frags nm_h LIB= ICONV LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOBJS gltests_LTL= IBOBJS' +ac_subst_vars=3D'SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE= _VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transf= orm_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir locals= tatedir libdir includedir oldincludedir infodir mandir build_alias host_ali= as target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS MAINTAINER_MODE_TRUE MAINTAI= NER_MODE_FALSE MAINT CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP = EGREP RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_c= pu host_vendor host_os target target_cpu target_vendor target_os USE_NLS LI= BINTL LIBINTL_DEP INCINTL XGETTEXT GMSGFMT POSUB CATALOGS DATADIRNAME INSTO= BJEXT GENCAT CATOBJEXT localedir GL_COND_LIBTOOL_TRUE GL_COND_LIBTOOL_FALSE= GNULIB_MEMMEM GNULIB_MEMPCPY GNULIB_MEMRCHR GNULIB_STPCPY GNULIB_STPNCPY G= NULIB_STRCHRNUL GNULIB_STRDUP GNULIB_STRNDUP GNULIB_STRNLEN GNULIB_STRPBRK = GNULIB_STRSEP GNULIB_STRSTR GNULIB_STRCASESTR GNULIB_STRTOK_R GNULIB_MBSLEN= GNULIB_MBSNLEN GNULIB_MBSCHR GNULIB_MBSRCHR GNULIB_MBSSTR GNULIB_MBSCASECM= P GNULIB_MBSNCASECMP GNULIB_MBSPCASECMP GNULIB_MBSCASESTR GNULIB_MBSCSPN GN= ULIB_MBSPBRK GNULIB_MBSSPN GNULIB_MBSSEP GNULIB_MBSTOK_R GNULIB_STRERROR GN= ULIB_STRSIGNAL HAVE_DECL_MEMMEM HAVE_MEMPCPY HAVE_DECL_MEMRCHR HAVE_STPCPY = HAVE_STPNCPY HAVE_STRCHRNUL HAVE_DECL_STRDUP HAVE_STRNDUP HAVE_DECL_STRNDUP= HAVE_DECL_STRNLEN HAVE_STRPBRK HAVE_STRSEP HAVE_STRCASESTR HAVE_DECL_STRTO= K_R HAVE_DECL_STRERROR HAVE_DECL_STRSIGNAL REPLACE_STRERROR REPLACE_STRSIGN= AL REPLACE_MEMMEM REPLACE_STRCASESTR REPLACE_STRSTR HAVE_LONG_LONG_INT HAVE= _UNSIGNED_LONG_LONG_INT HAVE_INTTYPES_H HAVE_SYS_TYPES_H INCLUDE_NEXT NEXT_= STDINT_H HAVE_STDINT_H HAVE_SYS_INTTYPES_H HAVE_SYS_BITYPES_H BITSIZEOF_PTR= DIFF_T BITSIZEOF_SIG_ATOMIC_T BITSIZEOF_SIZE_T BITSIZEOF_WCHAR_T BITSIZEOF_= WINT_T HAVE_SIGNED_SIG_ATOMIC_T HAVE_SIGNED_WCHAR_T HAVE_SIGNED_WINT_T PTRD= IFF_T_SUFFIX SIG_ATOMIC_T_SUFFIX SIZE_T_SUFFIX WCHAR_T_SUFFIX WINT_T_SUFFIX= STDINT_H NEXT_STRING_H GNULIB_WCWIDTH HAVE_DECL_WCWIDTH REPLACE_WCWIDTH WC= HAR_H HAVE_WCHAR_H NEXT_WCHAR_H LIBGNU_LIBDEPS LIBGNU_LTLIBDEPS GNULIB_STDI= NT_H PACKAGE INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W VERSION = ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP = INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am= __untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH = CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE subdirs TARGET_OBS PKGVERS= ION REPORT_BUGS_TO REPORT_BUGS_TEXI LN_S YACC AR ac_ct_AR DLLTOOL ac_ct_DLL= TOOL WINDRES ac_ct_WINDRES MIG ac_ct_MIG READLINE READLINE_DEPS READLINE_CF= LAGS HAVE_LIBEXPAT LIBEXPAT LTLIBEXPAT PYTHON_CFLAGS ALLOCA CONFIG_LDFLAGS = TARGET_SYSTEM_ROOT TARGET_SYSTEM_ROOT_DEFINE WARN_CFLAGS WERROR_CFLAGS SER_= HARDWIRE WIN32LIBS LIBGUI GUI_CFLAGS_X WIN32LDAPP TCL_VERSION TCL_PATCH_LEV= EL TCL_BIN_DIR TCL_SRC_DIR TCL_LIB_FILE TCL_LIB_FLAG TCL_LIB_SPEC TCL_STUB_= LIB_FILE TCL_STUB_LIB_FLAG TCL_STUB_LIB_SPEC TCL_INCLUDE TCL_LIBRARY TCL_DE= PS TK_VERSION TK_BIN_DIR TK_SRC_DIR TK_LIB_FILE TK_LIB_FLAG TK_LIB_SPEC TK_= STUB_LIB_FILE TK_STUB_LIB_FLAG TK_STUB_LIB_SPEC TK_INCLUDE TK_LIBRARY TK_DE= PS TK_XINCLUDES X_CFLAGS X_LDFLAGS X_LIBS GDBTKLIBS GDBTK_CFLAGS GDBTK_SRC_= DIR SIM SIM_OBS ENABLE_CFLAGS PROFILE_CFLAGS CONFIG_OBS CONFIG_DEPS CONFIG_= SRCS CONFIG_ALL CONFIG_CLEAN CONFIG_INSTALL CONFIG_UNINSTALL target_subdir = frags nm_h LIBICONV LIBOBJS LTLIBOBJS gl_LIBOBJS gl_LTLIBOBJS gltests_LIBOB= JS gltests_LTLIBOBJS' ac_subst_files=3D'host_makefile_frag' ac_pwd=3D`pwd` =20 @@ -890,6 +890,7 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld default=3Dno --with-libexpat-prefix[=3DDIR] search for libexpat in DIR/include and D= IR/lib --without-libexpat-prefix don't search for libexpat in includedir an= d libdir + --with-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 with caution on other system) @@ -11197,6 +11198,358 @@ done fi fi =20 + + + +# Check whether --with-python or --without-python was given. +if test "${with_python+set}" =3D set; then + withval=3D"$with_python" + +else + with_python=3Dauto +fi; +echo "$as_me:$LINENO: checking whether to use python" >&5 +echo $ECHO_N "checking whether to use python... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $with_python" >&5 +echo "${ECHO_T}$with_python" >&6 + +if test "${with_python}" =3D no; then + { echo "$as_me:$LINENO: WARNING: python support disabled; some features = may be unavailable." >&5 +echo "$as_me: WARNING: python support disabled; some features may be unava= ilable." >&2;} + have_libpython=3Dno +else + case "${with_python}" in + yes | auto) + # Leave as empty, use defaults. + python_includes=3D + python_libs=3D + ;; + /*) + python_includes=3D"-I${with_python}/include" + python_libs=3D"-L${with_python}/lib" + ;; + *) + { { echo "$as_me:$LINENO: error: invalid value for --with-python" >&5 +echo "$as_me: error: invalid value for --with-python" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + save_CPPFLAGS=3D$CPPFLAGS + CPPFLAGS=3D"$CPPFLAGS ${python_includes}" + save_LIBS=3D$LIBS + LIBS=3D"$LIBS ${python_libs}" + have_libpython=3Dno + if test "${have_libpython}" =3D no; then + + version=3Dpython2.6 + + + HAVE_LIBPYTHON2_6=3Dno + echo "$as_me:$LINENO: checking for ${version}" >&5 +echo $ECHO_N "checking for ${version}... $ECHO_C" >&6 + save_LIBS=3D$LIBS + LIBS=3D"$LIBS -l${version}" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include "${version}/Python.h" +int +main () +{ +Py_Initialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=3D$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); } && + { ac_try=3D'test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try=3D'test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; }; then + HAVE_LIBPYTHON2_6=3Dyes + have_libpython=3Dyes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=3D$save_LIBS +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: result: $HAVE_LIBPYTHON2_6" >&5 +echo "${ECHO_T}$HAVE_LIBPYTHON2_6" >&6 + + if test "${HAVE_LIBPYTHON2_6}" =3D yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBPYTHON2_6 1 +_ACEOF + + fi + fi + if test ${have_libpython} =3D no; then + + version=3Dpython2.5 + + + HAVE_LIBPYTHON2_5=3Dno + echo "$as_me:$LINENO: checking for ${version}" >&5 +echo $ECHO_N "checking for ${version}... $ECHO_C" >&6 + save_LIBS=3D$LIBS + LIBS=3D"$LIBS -l${version}" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include "${version}/Python.h" +int +main () +{ +Py_Initialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=3D$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); } && + { ac_try=3D'test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try=3D'test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; }; then + HAVE_LIBPYTHON2_5=3Dyes + have_libpython=3Dyes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=3D$save_LIBS +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: result: $HAVE_LIBPYTHON2_5" >&5 +echo "${ECHO_T}$HAVE_LIBPYTHON2_5" >&6 + + if test "${HAVE_LIBPYTHON2_5}" =3D yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBPYTHON2_5 1 +_ACEOF + + fi + fi + if test ${have_libpython} =3D no; then + + version=3Dpython2.4 + + + HAVE_LIBPYTHON2_4=3Dno + echo "$as_me:$LINENO: checking for ${version}" >&5 +echo $ECHO_N "checking for ${version}... $ECHO_C" >&6 + save_LIBS=3D$LIBS + LIBS=3D"$LIBS -l${version}" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include "${version}/Python.h" +int +main () +{ +Py_Initialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=3D$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); } && + { ac_try=3D'test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try=3D'test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; }; then + HAVE_LIBPYTHON2_4=3Dyes + have_libpython=3Dyes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=3D$save_LIBS +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + echo "$as_me:$LINENO: result: $HAVE_LIBPYTHON2_4" >&5 +echo "${ECHO_T}$HAVE_LIBPYTHON2_4" >&6 + + if test "${HAVE_LIBPYTHON2_4}" =3D yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LIBPYTHON2_4 1 +_ACEOF + + fi + fi + if test ${have_libpython} =3D no; then + case "${with_python}" in + yes) + { { echo "$as_me:$LINENO: error: python is missing or unusable" >&5 +echo "$as_me: error: python is missing or unusable" >&2;} + { (exit 1); exit 1; }; } + ;; + auto) + { echo "$as_me:$LINENO: WARNING: python is missing or unusable; some= features may be unavailable." >&5 +echo "$as_me: WARNING: python is missing or unusable; some features may be= unavailable." >&2;} + ;; + *) + { { echo "$as_me:$LINENO: error: no usable python found at ${with_py= thon}" >&5 +echo "$as_me: error: no usable python found at ${with_python}" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + CPPFLAGS=3D$save_CPPFLAGS + LIBS=3D$save_LIBS + fi +fi + +if test "${have_libpython}" =3D yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PYTHON 1 +_ACEOF + + CONFIG_OBS=3D"$CONFIG_OBS \$(SUBDIR_PYTHON_OBS)" + CONFIG_DEPS=3D"$CONFIG_DEPS \$(SUBDIR_PYTHON_DEPS)" + CONFIG_SRCS=3D"$CONFIG_SRCS \$(SUBDIR_PYTHON_SRCS)" + ENABLE_CFLAGS=3D"$ENABLE_CFLAGS \$(SUBDIR_PYTHON_CFLAGS)" + + # 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 whi= ch + # would make the python-related objects be compiled differently from the + # rest of GDB (e.g., -O2 and -fPIC). + if test "${GCC}" =3D yes; then + tentative_python_cflags=3D"-fno-strict-aliasing -DNDEBUG -fwrapv" + fi + + if test "x${tentative_python_cflags}" !=3D x; then + echo "$as_me:$LINENO: checking compiler flags for python code" >&5 +echo $ECHO_N "checking compiler flags for python code... $ECHO_C" >&6 + for flag in ${tentative_python_cflags}; do + # Check that the compiler accepts it + saved_CFLAGS=3D"$CFLAGS" + CFLAGS=3D"$CFLAGS $flag" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=3D$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); } && + { ac_try=3D'test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try=3D'test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=3D$? + echo "$as_me:$LINENO: \$? =3D $ac_status" >&5 + (exit $ac_status); }; }; then + PYTHON_CFLAGS=3D"${PYTHON_CFLAGS} $flag" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS=3D"$saved_CFLAGS" + done + echo "$as_me:$LINENO: result: ${PYTHON_CFLAGS}" >&5 +echo "${ECHO_T}${PYTHON_CFLAGS}" >&6 + fi +else + # Even if Python support is not compiled in, we need to have this file + # included in order to recognize the GDB command "python". + CONFIG_OBS=3D"$CONFIG_OBS python.o" + CONFIG_SRCS=3D"$CONFIG_SRCS python/python.c" +fi + + # ------------------------- # # Checks for header files. # # ------------------------- # @@ -26284,7 +26637,7 @@ s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t=20 s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t -s,@VERSION@,$VERSION,;t t +s,@PYTHON2_4@,$PYTHON2_4,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t @@ -26331,6 +26684,7 @@ s,@READLINE_CFLAGS@,$READLINE_CFLAGS,;t=20 s,@HAVE_LIBEXPAT@,$HAVE_LIBEXPAT,;t t s,@LIBEXPAT@,$LIBEXPAT,;t t s,@LTLIBEXPAT@,$LTLIBEXPAT,;t t +s,@PYTHON_CFLAGS@,$PYTHON_CFLAGS,;t t s,@ALLOCA@,$ALLOCA,;t t s,@CONFIG_LDFLAGS@,$CONFIG_LDFLAGS,;t t s,@TARGET_SYSTEM_ROOT@,$TARGET_SYSTEM_ROOT,;t t