Initial import

v3.5.13-sru
Slávek Banko 12 years ago
commit 239e873a38

@ -0,0 +1,7 @@
Here is an unsorted list of known deficiencies of kdbg.
- Handles only C and C++
- Cannot handle source file names which contain new-lines or
a sequence of the form
:[0-9]+:[0-9]+:beg

@ -0,0 +1,280 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS

@ -0,0 +1,441 @@
Later versions
Please use the gitweb log at http://repo.or.cz/w/kdbg.git to browse
the changes.
Version 2.0.4
Fixed encoding of the Czech translation thanks to Jakub Galgonek.
Added support for QString in Qt4's debug libraries.
Fixed that the debugger window really comes to the foreground and
receives the focus when the debuggee stops at a breakpoint, when this
option is on (http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=171845).
Added a filter edit box to the Attach to Process dialog to improve
usability.
Version 2.0.3
Fixed parsing of gdb output that mentions "operator<<", "operator>>",
"operator<", and "operator>" within text delimited by angle brackets <>.
This fixes a crash when any such function is disassembled and other
misbehaviors.
Fixed parsing stack frames that mention "operator<<" or "operator<".
Thanks to Charles Samuels, who pointed out the problem and provided
an initial fix.
Version 2.0.2
Fixed stack display for functions in an anonymous namespace and
for functions whose names involve template parameter lists (thanks to
André Wöbbeking).
Fixed environment list which would add back the entry from the edit box
even if it was just deleted.
Fixed that the Run/Continue button was enabled while the program was
running.
Fixed parsing of NaN (Not a Number) floating point values.
Version 2.0.1
Updated Hungarian translation (thanks to Tamas Szanto).
Worked around gdb 6.3 crashes at "info line main" command (thanks to
Stefan Taferner).
Updated XSLT debugger parser for xsldbg >= 3.4.0 (by Keith Isdale).
Version 2.0.0
References and const types are treated like the base type (thanks to
Shaheed).
Fixed parsing of large arrays with many different values, which were
terminated by "...".
Fixed the kdbg.desktop file: Encoding is UTF-8, install in XDG menu
location.
Fixed PS_COMMAND detection for Solaris' /bin/sh.
Version 1.9.7
Added a new animated button in the toolbar.
Fixed Norwegian translation file names.
Version 1.9.6
"<invalid float value>" in register dumps was not parsed correctly.
Fixed that variable popup location was computed incorrectly if tab
width is not 0.
Updated the manual.
Implemented printing of Qt4's QStrings.
Version 1.9.5
Fixed some issues when the items in the environment variable list
are selected.
Added a command line option to attach to a process (thanks to
Matthew Allen for the initial code).
Fixed the "Using host libthread_db" error message properly.
Fixed inappropriate icon sizes.
Version 1.9.4
Updated the build system to the latest auto* tools.
Worked around the problem that gdb reports "Using host libthread_db"
on Fedora Core when it processes the file command.
Version 1.9.3
Improved editing of values; it is now possible to edit variables also
in the watch window.
Version 1.9.2
The previous security fix only protects against accidents, not attacks,
as Matt Zimmerman pointed out. Did it right this time.
Basic editing of values in the local variables window is available.
More refinements are still necessary.
Version 1.9.1
Fixed security flaw regarding the program specific debugger command.
Configurable key bindings.
Version 1.9.0
Program arguments that are file names can be browsed for.
Added XSLT debugging (using xsldbg) by Keith Isdale.
The program counter can be changed via point and click.
Improved register formating by Daniel Kristjansson.
"Orphaned breakpoints", i.e. breakpoints that gdb cannot set
immediately, can be set. This helps debug shared libraries and
dynamically loaded modules.
Version 1.2.10
Fixed the "Using host libthread_db" error message.
Fixed inappropriate icon sizes.
Version 1.2.9
The previous security fix only protects against accidents, not attacks,
as Matt Zimmerman pointed out. Did it right this time.
Version 1.2.8
Fixed security flaw regarding the program specific debugger command.
Version 1.2.7
Fixed parsing of stack frames for recent gdbs.
Support vector registers (thanks to Daniel Thor Kristjansson for
initial code).
Work around bug in some gdbs which inhibits printing of QString values.
Version 1.2.6
Opening the Find dialog no longer toggles a breakpoint.
Make mouse wheel work (again) in source, variables, and watch windows.
When a pointer to a struct is expanded the struct is also expanded.
Improved toolbar and application icons.
Version 1.2.5
Now compiles for KDE 3.
Fixed make install for builddir != srcdir.
Fixed status bar flicker. This gives a nice speed-up by a factor of 4
when the contents of an array of 50 QStrings are displayed!
Version 1.2.4
Now compiles for KDE 3 (Beta1).
Support QString of Qt 3.x.
Improved (and fixed) the display of arrays with repeated values.
Fixed crash when a file is reloaded while disassembled code is
displayed.
Fixed parsing of stack frames involving signal handler invocations.
Version 1.2.3
Fixed invisible toolbar under KDE 2.x (really, this time, I promise).
Fixed crash when no line has the cursor (empty files).
Don't display a blank page when a non-existing file was tried to open.
Version 1.2.2
Fixed a special, but common case where removing a breakpoint didn't
work but add more on the same line instead (thanks to Ron Lerech).
Fixed invisible toolbar under KDE 2.1.2 (thanks to Neil Butterworth).
Fixed compilation for gcc 3.0 (thanks to Ben Burton):
Fixed make install if srcdir != builddir.
Changed encoding of German translations (and also Danish, Italian,
Norwegian, Romanian, Slovak, Swedish) to UTF-8, which fixes message
strings under KDE2 (at least for German - couldn't test the others).
Version 1.2.1
Working directory can be browsed for.
Added context menu to move the selected expression from the local
variables window to the watch window.
Fixed crash when environment variables are removed.
Fixed problems with trailing backslashes in watched expressions.
Fixed compilation on FreeBSD (openpty).
Version 1.2.0
Translations for: Hungarian, Japanese, Norwegian (Nynorsk), Serbian,
Turkish
Updated the User's Manual (English, Russian (thanks, Ilmar!), German).
Version 1.1.7beta1
Improved the program icon; made the installation more KDE2 compliant.
Enabled mouse wheel scrolling at various places.
Version 1.1.6
Added memory display.
Single-stepping by instruction.
Watchpoints. Finally! (On Linux/i386 works best with gdb 5!)
Version 1.1.5
Made Delete key work in the watch window.
Breakpoints can be enabled and disabled in the breakpoint list.
Detach from debugged program on exit (and when new program is debugged).
Added a list of recently opened executables (thanks to
Thomas Sparr <thomas.sparr@kreatel.se>).
Version 1.1.4
Fixed endless loop on shutdown.
Brought in line with KDE 1.91 (KDE 2 beta).
Version 1.1.3
Debugging of multi-threaded programs. Requires a gdb that supports
multi-threaded programs, like gdb 5.
Debugger window pops into the foreground when the program stops.
Made tab width a user-settable option.
Version 1.1.2
Display disassembled code.
Version 1.1.1
Use the KDE system fixed font for the source code window.
By default, do not log communication with gdb.
Added an integrated output window (based on code by Judin Max).
Program specific settings can be set. In particular: the debugger
command (required if you are debugging remote devices), the
terminal emulation needed for the program.
Verison 1.1.0
Use docking windows thanks to Judin Max <novaprint@mtu-net.ru>.
Added a register dump window. Based on code by Judin Max.
Implemented "balloons" (tool tips) that show variable values.
./configure fix for NetBSD thanks to
Berndt Josef Wulf <wulf@ping.net.au>.
There's now a Swedish translation thanks to
Örjan Lindbergh <orjan.lindbergh@telia.com>.
Version 1.0.2
Save and restore watched expressions.
More adjustments for the KRASH release.
Show <repeat...> count in QStrings like in normal C strings instead
of repeating the characters.
Use QListView instead of KTabListBox.
Version 1.0.1
Added a hack to set a remote target. Thanks to
Johnny Chan <johnnykc@iprg.nokia.com>.
Display function arguments. Based on suggestions by Johnny Chan.
KDE 2 fixes.
Support builddir != srcdir.
Version 1.0.0
Brought up-to-date for latest KDE 2.
Version 1.0beta3
Removal of minor misfeatures.
Prepared for KDE 2 and Qt 2 (it's a configure option:
--with-kde-version=2).
Added Russian documentation (thanks to
Ilmar S. Habibulin <ilmar@ints.ru>) and German documentation.
There is now a Spanish translation thanks to
Manuel Soriano <manu@europa3.com>.
Version 1.0beta2
Recognize strings with repeated characters: 'x' <repeats 34 times>.
Fix structs with no (additional) data members and other fixes
for gdb 4.18.
Save window size across sessions.
There is now an Italian translation thanks to
Massimo Morin <mmorin@schedsys.com>.
Version 1.0beta1
Fixed non-displaying QString (Qt2) with certain gdb 4.17's (at least
mine here, of SuSE 6.1, had a problem :-)
Fixed cases where gdb commands where executed after debuggee has exited.
Do not execute gdb commands after an interrupt.
Updated some translations. Still most are incomplete. Please help!
There is now a Polish translation thanks to
Jacek Wojdel <wojdel@kbs.twi.tudelft.nl>.
Version 0.3.1
The working directory for the program being debugged can be set
(Execution|Arguments).
There's now a global options dialog in place (File|Global Options).
At the moment the debugger program (which must be gdb, but it could be
an experimental gdb version, for example) and the terminal for program
output can be specified.
Fixed Makefiles to support make DESTDIR=/tmp/foo install (which is
needed by packagers and to create relocatable RPMs).
There's now a Danish translation thanks to
Steen Rabol <rabol@get2net.dk>.
Version 0.3.0
Starting with this version, Qt 1.42 and KDE 1.1 is required.
Ported to Qt 2.0 and KDE post-1.1! KDbg now runs with both
KDE 1.1 (using Qt 1.42) and the latest experimental KDE. You can of
course run one version and debug programs written for the other version.
KDbg can now display Qt 2.0's QString values (which are Unicode
strings)!
Environment variables can be set. Changes become effective the next time
the program being debugged is run.
The breakpoint list has been improved. It disables command buttons at
times when it is not possible to change breakpoints. The icons that
show the breakpoint status are now the same as those in the source
window.
Popup menus (context menus) for frequently used commands have been added
to the source code window (thanks to Tom Nguyen <ttomnguyen@yahoo.com>)
There's now a Russian translation thanks to
Ilmar Habibulin <ilmar@ints.ru>.
Internal restructuring. These changes are invisible. They just make
future extensions less cumbersome.
Version 0.2.5
This is the last version that supports Qt 1.33 and KDE 1.0.
There's now a Czech translation thanks to
Martin Spirk <spirk@kla.pvt.cz>.
Recognize and report when gdb dies unexpectedly. This happens commonly
when writing CORBA programs since gdb obviously has problems in
debugging C++ classes with virtual base classes.
Added conditional breakpoints and ignore counts.
Version 0.2.4
Added a toolbar button to load the executable. The button to open a
source file is still there. I hope it's clear which one does what.
Attaching to a running process is now possible (Execution|Attach).
Made more visible when gdb is busy using a gear wheel in the upper right
corner of the window like kfm.
Made the KTreeView widget more flexible by adding a bunch of virtual
keywords. (No, this doesn't have any influence on the look and feel of
KDbg.) While doing that, I fixed a small repainting bug.
ChangeLog starts here.

@ -0,0 +1,29 @@
SUBDIRS = kdbg po
# not a GNU package. You can remove this line, if
# have all needed files, that a GNU package needs
AUTOMAKE_OPTIONS = foreign
EXTRA_DIST = BUGS ChangeLog-pre-2.2.0 COPYING TODO admin \
ReleaseNotes-2.2.0 \
ReleaseNotes-2.2.1 \
ReleaseNotes-2.2.2
$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ;
$(top_srcdir)/subdirs:
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs
$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in
@cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4
MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files
package-messages:
$(MAKE) -f admin/Makefile.common package-messages
$(MAKE) -C po merge
dist-hook:
cd $(top_distdir) && perl admin/am_edit -padmin
cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs

@ -0,0 +1,921 @@
# Makefile.in generated by automake 1.10.1 from Makefile.am.
# KDE tags expanded automatically by am_edit - $Revision: 483858 $
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = .
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/configure COPYING TODO admin/compile \
admin/config.guess admin/config.sub admin/depcomp \
admin/install-sh admin/ltmain.sh admin/missing \
admin/mkinstalldirs admin/ylwrap
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
#>- html-recursive info-recursive install-data-recursive \
#>- install-dvi-recursive install-exec-recursive \
#>- install-html-recursive install-info-recursive \
#>- install-pdf-recursive install-ps-recursive install-recursive \
#>- installcheck-recursive installdirs-recursive pdf-recursive \
#>- ps-recursive uninstall-recursive
#>+ 7
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
install-html-recursive install-info-recursive \
install-pdf-recursive install-ps-recursive install-recursive \
installcheck-recursive installdirs-recursive pdf-recursive \
ps-recursive uninstall-recursive nmcheck-recursive bcheck-recursive
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
#>+ 1
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d $(distdir) \
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr $(distdir); }; }
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
ARTSCCONFIG = @ARTSCCONFIG@
AUTOCONF = @AUTOCONF@
AUTODIRS = @AUTODIRS@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CONF_FILES = @CONF_FILES@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DCOPIDL = @DCOPIDL@
DCOPIDL2CPP = @DCOPIDL2CPP@
DCOPIDLNG = @DCOPIDLNG@
DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@
KCONFIG_COMPILER = @KCONFIG_COMPILER@
KDECONFIG = @KDECONFIG@
KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@
KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
KDE_INCLUDES = @KDE_INCLUDES@
KDE_LDFLAGS = @KDE_LDFLAGS@
KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@
KDE_MT_LIBS = @KDE_MT_LIBS@
KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@
KDE_PLUGIN = @KDE_PLUGIN@
KDE_RPATH = @KDE_RPATH@
KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
KDE_USE_FPIE = @KDE_USE_FPIE@
KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@
KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@
KDE_USE_PIE = @KDE_USE_PIE@
KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
LDFLAGS = @LDFLAGS@
LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@
LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@
LIBCOMPAT = @LIBCOMPAT@
LIBCRYPT = @LIBCRYPT@
LIBDL = @LIBDL@
LIBJPEG = @LIBJPEG@
LIBOBJS = @LIBOBJS@
LIBPNG = @LIBPNG@
LIBPTHREAD = @LIBPTHREAD@
LIBRESOLV = @LIBRESOLV@
LIBS = @LIBS@
LIBSM = @LIBSM@
LIBSOCKET = @LIBSOCKET@
LIBTOOL = @LIBTOOL@
LIBUCB = @LIBUCB@
LIBUTIL = @LIBUTIL@
LIBZ = @LIBZ@
LIB_KAB = @LIB_KAB@
LIB_KABC = @LIB_KABC@
LIB_KDECORE = @LIB_KDECORE@
LIB_KDED = @LIB_KDED@
LIB_KDEPIM = @LIB_KDEPIM@
LIB_KDEPRINT = @LIB_KDEPRINT@
LIB_KDEUI = @LIB_KDEUI@
LIB_KDNSSD = @LIB_KDNSSD@
LIB_KFILE = @LIB_KFILE@
LIB_KFM = @LIB_KFM@
LIB_KHTML = @LIB_KHTML@
LIB_KIMPROXY = @LIB_KIMPROXY@
LIB_KIO = @LIB_KIO@
LIB_KJS = @LIB_KJS@
LIB_KNEWSTUFF = @LIB_KNEWSTUFF@
LIB_KPARTS = @LIB_KPARTS@
LIB_KSPELL = @LIB_KSPELL@
LIB_KSYCOCA = @LIB_KSYCOCA@
LIB_KUNITTEST = @LIB_KUNITTEST@
LIB_KUTILS = @LIB_KUTILS@
LIB_POLL = @LIB_POLL@
LIB_QPE = @LIB_QPE@
LIB_QT = @LIB_QT@
LIB_SMB = @LIB_SMB@
LIB_X11 = @LIB_X11@
LIB_XEXT = @LIB_XEXT@
LIB_XRENDER = @LIB_XRENDER@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MAKEKDEWIDGETS = @MAKEKDEWIDGETS@
MCOPIDL = @MCOPIDL@
MEINPROC = @MEINPROC@
MKDIR_P = @MKDIR_P@
MOC = @MOC@
MSGFMT = @MSGFMT@
NOOPT_CFLAGS = @NOOPT_CFLAGS@
NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
PS_COMMAND = @PS_COMMAND@
QTE_NORTTI = @QTE_NORTTI@
QT_INCLUDES = @QT_INCLUDES@
QT_LDFLAGS = @QT_LDFLAGS@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TOPSUBDIRS = @TOPSUBDIRS@
UIC = @UIC@
UIC_TR = @UIC_TR@
USER_INCLUDES = @USER_INCLUDES@
USER_LDFLAGS = @USER_LDFLAGS@
USE_EXCEPTIONS = @USE_EXCEPTIONS@
USE_RTTI = @USE_RTTI@
USE_THREADS = @USE_THREADS@
VERSION = @VERSION@
WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@
XGETTEXT = @XGETTEXT@
XMKMF = @XMKMF@
XMLLINT = @XMLLINT@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_INCLUDES = @X_INCLUDES@
X_LDFLAGS = @X_LDFLAGS@
X_PRE_LIBS = @X_PRE_LIBS@
X_RPATH = @X_RPATH@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
all_includes = @all_includes@
all_libraries = @all_libraries@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
kde_appsdir = @kde_appsdir@
kde_bindir = @kde_bindir@
kde_confdir = @kde_confdir@
kde_datadir = @kde_datadir@
kde_htmldir = @kde_htmldir@
kde_icondir = @kde_icondir@
kde_includes = @kde_includes@
kde_kcfgdir = @kde_kcfgdir@
kde_libraries = @kde_libraries@
kde_libs_htmldir = @kde_libs_htmldir@
kde_libs_prefix = @kde_libs_prefix@
kde_locale = @kde_locale@
kde_mimedir = @kde_mimedir@
kde_moduledir = @kde_moduledir@
kde_qtver = @kde_qtver@
kde_servicesdir = @kde_servicesdir@
kde_servicetypesdir = @kde_servicetypesdir@
kde_sounddir = @kde_sounddir@
kde_styledir = @kde_styledir@
kde_templatesdir = @kde_templatesdir@
kde_wallpaperdir = @kde_wallpaperdir@
kde_widgetdir = @kde_widgetdir@
kdeinitdir = @kdeinitdir@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
qt_includes = @qt_includes@
qt_libraries = @qt_libraries@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
x_includes = @x_includes@
x_libraries = @x_libraries@
xdg_appsdir = @xdg_appsdir@
xdg_directorydir = @xdg_directorydir@
xdg_menudir = @xdg_menudir@
SUBDIRS = kdbg po
# not a GNU package. You can remove this line, if
# have all needed files, that a GNU package needs
AUTOMAKE_OPTIONS = foreign
EXTRA_DIST = BUGS ChangeLog-pre-2.2.0 COPYING TODO admin \
ReleaseNotes-2.2.0 \
ReleaseNotes-2.2.1 \
ReleaseNotes-2.2.2
MAINTAINERCLEANFILES = subdirs configure.in acinclude.m4 configure.files
#>- all: config.h
#>+ 1
all: docs-am config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
.SUFFIXES:
am--refresh:
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
#>- @for dep in $?; do \
#>- case '$(am__configure_deps)' in \
#>- *$$dep*) \
#>- echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
#>- cd $(srcdir) && $(AUTOMAKE) --foreign \
#>- && exit 0; \
#>- exit 1;; \
#>- esac; \
#>- done; \
#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
#>- cd $(top_srcdir) && \
#>- $(AUTOMAKE) --foreign Makefile
#>+ 14
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
( \
cd $(srcdir) && $(AUTOMAKE) --foreign \
) || exit 1; echo ' cd $(top_srcdir) && perl admin/am_edit -padmin '; cd $(top_srcdir) && perl admin/am_edit -padmin && exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign Makefile
cd $(top_srcdir) && perl admin/am_edit -padmin Makefile.in
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
echo ' $(SHELL) ./config.status'; \
$(SHELL) ./config.status;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(top_srcdir)/configure: $(am__configure_deps)
#>- cd $(srcdir) && $(AUTOCONF)
#>+ 2
cd $(srcdir) && rm -f configure
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.h: stamp-h1
@if test ! -f $@; then \
rm -f stamp-h1; \
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
else :; fi
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
cd $(top_builddir) && $(SHELL) ./config.status config.h
$(srcdir)/config.h.in: $(am__configure_deps)
cd $(top_srcdir) && $(AUTOHEADER)
rm -f stamp-h1
touch $@
distclean-hdr:
-rm -f config.h stamp-h1
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
$(RECURSIVE_CLEAN_TARGETS):
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
empty_fix=.; \
else \
include_option=--include; \
empty_fix=; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(am__remove_distdir)
test -d $(distdir) || mkdir $(distdir)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
distdir=`$(am__cd) $(distdir) && pwd`; \
top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$$top_distdir" \
distdir="$$distdir/$$subdir" \
am__remove_distdir=: \
am__skip_length_check=: \
distdir) \
|| exit 1; \
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-hook
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist-gzip: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-lzma: distdir
tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
$(am__remove_distdir)
dist-tarZ: distdir
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
$(am__remove_distdir)
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
$(am__remove_distdir)
dist dist-all: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lzma*) \
unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& rm -rf $(DIST_ARCHIVES) \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
check: check-recursive
all-am: Makefile config.h
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
#>- clean: clean-recursive
#>+ 1
clean: kde-rpo-clean clean-recursive
#>- clean-am: clean-generic clean-libtool mostlyclean-am
#>+ 1
clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-hdr \
distclean-libtool distclean-tags
dvi: dvi-recursive
dvi-am:
html: html-recursive
info: info-recursive
info-am:
install-data-am:
install-dvi: install-dvi-recursive
install-exec-am:
install-html: install-html-recursive
install-info: install-info-recursive
install-man:
install-pdf: install-pdf-recursive
install-ps: install-ps-recursive
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am:
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
install-strip
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am am--refresh check check-am clean clean-generic \
clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \
dist-gzip dist-hook dist-lzma dist-shar dist-tarZ dist-zip \
distcheck distclean distclean-generic distclean-hdr \
distclean-libtool distclean-tags distcleancheck distdir \
distuninstallcheck dvi dvi-am html html-am info info-am \
install install-am install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am install-man \
install-pdf install-pdf-am install-ps install-ps-am \
install-strip installcheck installcheck-am installdirs \
installdirs-am maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
ps ps-am tags tags-recursive uninstall uninstall-am
$(top_srcdir)/configure.in: configure.in.in $(top_srcdir)/subdirs
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure.in ;
$(top_srcdir)/subdirs:
cd $(top_srcdir) && $(MAKE) -f admin/Makefile.common subdirs
$(top_srcdir)/acinclude.m4: $(top_srcdir)/admin/acinclude.m4.in $(top_srcdir)/admin/libtool.m4.in
@cd $(top_srcdir) && cat admin/acinclude.m4.in admin/libtool.m4.in > acinclude.m4
package-messages:
$(MAKE) -f admin/Makefile.common package-messages
$(MAKE) -C po merge
dist-hook:
cd $(top_distdir) && perl admin/am_edit -padmin
cd $(top_distdir) && $(MAKE) -f admin/Makefile.common subdirs
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
clean-bcheck:
rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
bcheck: bcheck-recursive
bcheck-am:
@for i in ; do \
if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
echo "$$i"; \
if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
rm -f $$i.bchecktest.cc; exit 1; \
fi ; \
echo "" >> $$i.bchecktest.cc.class; \
perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
rm -f a.out; \
fi ; \
done
#>+ 2
KDE_DIST=stamp-h.in subdirs Makefile.in configure.files config.h.in configure.in configure.in.mid kdbg.spec aclocal.m4 configure.in.in Makefile.am configure acinclude.m4 autogen.sh
#>+ 2
docs-am:
#>+ 7
force-reedit:
\
cd $(srcdir) && $(AUTOMAKE) --foreign \
cd $(top_srcdir) && perl admin/am_edit -padmin Makefile.in
#>+ 21
clean-bcheck:
rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
bcheck: bcheck-recursive
bcheck-am:
@for i in ; do \
if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
echo "$$i"; \
if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
rm -f $$i.bchecktest.cc; exit 1; \
fi ; \
echo "" >> $$i.bchecktest.cc.class; \
perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
rm -f a.out; \
fi ; \
done
#>+ 3
final:
$(MAKE) all-am
#>+ 3
final-install:
$(MAKE) install-am
#>+ 3
no-final:
$(MAKE) all-am
#>+ 3
no-final-install:
$(MAKE) install-am
#>+ 3
kde-rpo-clean:
-rm -f *.rpo
#>+ 3
nmcheck:
nmcheck-am: nmcheck

@ -0,0 +1,19 @@
This is KDbg, a graphical user interface around gdb using
KDE, the K Desktop Environment.
To install:
./configure
make
make install
Problem reports as well as success stories are welcome!
The homepage is at
http://www.kdbg.org/
You'll find the most recent version of KDbg there as well as
other useful information concerning debugging.
Johannes Sixt <j6t@kdbg.org>

@ -0,0 +1,36 @@
KDbg Release Notes for version 2.2.0
====================================
The 2.2.x series is still based on Qt 3 and KDE 3.
Changes since 2.1.1
-------------------
Features:
- Source code windows have now a tab attached, which makes switching
source files much easier.
- Source code windows now show line numbers at the left.
- There are now "Find Next" and "Find Previous" commands with shortcuts
F3 and Shift+F3.
- Improved support of template types in the type tables (which are used
to show structure members next to a structure variable). Notably, the
number of elements in STL and Qt collection classes are shown.
- Arguments for the debugged program can be passed on KDbg's command line.
Bug fixes
- An incorrect terminal command string setting could crash KDbg if it
contained format specifiers other than exactly one '%s'.
- The format specifier in the memory dump window was not correctly
preserved when the expression is changed.
- Setting a conditional breakpoint could crash KDbg.
- Using Attach on systems that use the simplified Attach to Process dialog
could crash KDbg.

@ -0,0 +1,23 @@
KDbg Release Notes for version 2.2.1
====================================
The 2.2.x series is still based on Qt 3 and KDE 3.
Changes since 2.2.0
-------------------
Bug fixes
- Compilation with newer glibc failed.
- A crash could occur when the variable window was updated.
- A crash when command line switch -a was used together with a non-existing
executable name.
- Syntax highlighting was applied to all files, not just C/C++.
- The display was incorrect when a file was reloaded that had disassembly
lines visible.
There are also some minor documentation fixes.

@ -0,0 +1,11 @@
KDbg Release Notes for version 2.2.2
====================================
The 2.2.x series is still based on Qt 3 and KDE 3.
Changes since 2.2.1
-------------------
There is only one bug fix:
- An error message was shown instead of assembler code when gdb 7.1 was used.

44
TODO

@ -0,0 +1,44 @@
7. Show a list of files for the executable.
9. Use gnuclient to show source code in emacs.
10. Provide formatting options in watch window via mouse, not /FMT.
13. Remember which subtrees have been expanded even when function is left and
reentered.
14. Speed up direct members by reusing values that are already available in
members.
19. Improve support of breakpoints in source files having directories in their
names.
22. Allow to change whether signals are handled or ignored.
24. Allow to view fewer or more bytes in the memory dump. Beautify the display.
25. Automatic single-stepping by instruction when a source line is disassembled.
26. Let the user hide some members of certain structures (on a per-type basis).
The parent indicates whether all members are visible. Provide a context menu
to display the hidden entries. Save the settings somewhere.
28. Better support for remote debugging and special versions of gdb, e.g.
"target pilot localhost:2000".
29. "Crash report" function: Stack trace with excerpts of the source code and
variable dumps for every frame.
30. Grey out watch window expressions if there are variables that are not
in scope.
31. Show the memory dump in a combined ASCII and hex view.
32. Allow to manipulate memory in the memory dump window
33. Clear the status bar when the program is (re-)started (because if this takes
some time, you don't know whether KDbg does something.)
35. Allow to copy variable values to the clipboard.
36.

File diff suppressed because it is too large Load Diff

881
aclocal.m4 vendored

@ -0,0 +1,881 @@
# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
m4_if(AC_AUTOCONF_VERSION, [2.63],,
[m4_warning([this file was generated for autoconf 2.63.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])])
# Copyright (C) 2002, 2003, 2005, 2006, 2007 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_AUTOMAKE_VERSION(VERSION)
# ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.10'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
m4_if([$1], [1.10.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
# _AM_AUTOCONF_VERSION(VERSION)
# -----------------------------
# aclocal traces this macro to find the Autoconf version.
# This is a private macro too. Using m4_define simplifies
# the logic in aclocal, which can simply ignore this definition.
m4_define([_AM_AUTOCONF_VERSION], [])
# AM_SET_CURRENT_AUTOMAKE_VERSION
# -------------------------------
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.10.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
#
# Of course, Automake must honor this variable whenever it calls a
# tool from the auxiliary directory. The problem is that $srcdir (and
# therefore $ac_aux_dir as well) can be either absolute or relative,
# depending on how configure is run. This is pretty annoying, since
# it makes $ac_aux_dir quite unusable in subdirectories: in the top
# source directory, any form will work fine, but in subdirectories a
# relative path needs to be adjusted first.
#
# $ac_aux_dir/missing
# fails when called from a subdirectory if $ac_aux_dir is relative
# $top_srcdir/$ac_aux_dir/missing
# fails if $ac_aux_dir is absolute,
# fails when called from a subdirectory in a VPATH build with
# a relative $ac_aux_dir
#
# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
# are both prefixed by $srcdir. In an in-source build this is usually
# harmless because $srcdir is `.', but things will broke when you
# start a VPATH build or use an absolute $srcdir.
#
# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
# and then we would define $MISSING as
# MISSING="\${SHELL} $am_aux_dir/missing"
# This will work as long as MISSING is not called from configure, because
# unfortunately $(top_srcdir) has no meaning in configure.
# However there are other variables, like CC, which are often used in
# configure, and could therefore not use this "fixed" $ac_aux_dir.
#
# Another solution, used here, is to always expand $ac_aux_dir to an
# absolute PATH. The drawback is that using absolute paths prevent a
# configured tree to be moved without reconfiguration.
AC_DEFUN([AM_AUX_DIR_EXPAND],
[dnl Rely on autoconf to set up CDPATH properly.
AC_PREREQ([2.50])dnl
# expand $ac_aux_dir to an absolute path
am_aux_dir=`cd $ac_aux_dir && pwd`
])
# AM_CONDITIONAL -*- Autoconf -*-
# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 8
# AM_CONDITIONAL(NAME, SHELL-CONDITION)
# -------------------------------------
# Define a conditional.
AC_DEFUN([AM_CONDITIONAL],
[AC_PREREQ(2.52)dnl
ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
AC_SUBST([$1_TRUE])dnl
AC_SUBST([$1_FALSE])dnl
_AM_SUBST_NOTMAKE([$1_TRUE])dnl
_AM_SUBST_NOTMAKE([$1_FALSE])dnl
if $2; then
$1_TRUE=
$1_FALSE='#'
else
$1_TRUE='#'
$1_FALSE=
fi
AC_CONFIG_COMMANDS_PRE(
[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
AC_MSG_ERROR([[conditional "$1" was never defined.
Usually this means the macro was only invoked conditionally.]])
fi])])
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 9
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4,
# will think it sees a *use*, and therefore will trigger all it's
# C support machinery. Also note that it means that autoscan, seeing
# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
# _AM_DEPENDENCIES(NAME)
# ----------------------
# See how the compiler implements dependency checking.
# NAME is "CC", "CXX", "GCJ", or "OBJC".
# We try a few techniques and use that to set a single cache variable.
#
# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
# dependency, and given that the user is not expected to run this macro,
# just rely on AC_PROG_CC.
AC_DEFUN([_AM_DEPENDENCIES],
[AC_REQUIRE([AM_SET_DEPDIR])dnl
AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
AC_REQUIRE([AM_MAKE_INCLUDE])dnl
AC_REQUIRE([AM_DEP_TRACK])dnl
ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
[$1], CXX, [depcc="$CXX" am_compiler_list=],
[$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
[$1], UPC, [depcc="$UPC" am_compiler_list=],
[$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
[depcc="$$1" am_compiler_list=])
AC_CACHE_CHECK([dependency style of $depcc],
[am_cv_$1_dependencies_compiler_type],
[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
# We make a subdir and do the tests there. Otherwise we can end up
# making bogus files that we don't know about and never remove. For
# instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output
# in D'.
mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory.
cp "$am_depcomp" conftest.dir
cd conftest.dir
# We will build objects and dependencies in a subdirectory because
# it helps to detect inapplicable dependency modes. For instance
# both Tru64's cc and ICC support -MD to output dependencies as a
# side effect of compilation, but ICC will put the dependencies in
# the current directory while Tru64 will put them in the object
# directory.
mkdir sub
am_cv_$1_dependencies_compiler_type=none
if test "$am_compiler_list" = ""; then
am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
fi
for depmode in $am_compiler_list; do
# Setup a source with many dependencies, because some compilers
# like to wrap large dependency lists on column 80 (with \), and
# we should not choose a depcomp mode which is confused by this.
#
# We need to recreate these files for each test, as the compiler may
# overwrite some of them when testing with obscure command lines.
# This happens at least with the AIX C compiler.
: > sub/conftest.c
for i in 1 2 3 4 5 6; do
echo '#include "conftst'$i'.h"' >> sub/conftest.c
# Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
# Solaris 8's {/usr,}/bin/sh.
touch sub/conftst$i.h
done
echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
case $depmode in
nosideeffect)
# after this tag, mechanisms are not by side-effect, so they'll
# only be used when explicitly requested
if test "x$enable_dependency_tracking" = xyes; then
continue
else
break
fi
;;
none) break ;;
esac
# We check with `-c' and `-o' for the sake of the "dashmstdout"
# mode. It turns out that the SunPro C++ compiler does not properly
# handle `-M -o', and we need to detect this.
if depmode=$depmode \
source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
$SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
>/dev/null 2>conftest.err &&
grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
${MAKE-make} -s -f confmf > /dev/null 2>&1; then
# icc doesn't choke on unknown options, it will just issue warnings
# or remarks (even with -Werror). So we grep stderr for any message
# that says an option was ignored or not supported.
# When given -MP, icc 7.0 and 7.1 complain thusly:
# icc: Command line warning: ignoring option '-M'; no argument required
# The diagnosis changed in icc 8.0:
# icc: Command line remark: option '-MP' not supported
if (grep 'ignoring option' conftest.err ||
grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
am_cv_$1_dependencies_compiler_type=$depmode
break
fi
fi
done
cd ..
rm -rf conftest.dir
else
am_cv_$1_dependencies_compiler_type=none
fi
])
AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
AM_CONDITIONAL([am__fastdep$1], [
test "x$enable_dependency_tracking" != xno \
&& test "$am_cv_$1_dependencies_compiler_type" = gcc3])
])
# AM_SET_DEPDIR
# -------------
# Choose a directory name for dependency files.
# This macro is AC_REQUIREd in _AM_DEPENDENCIES
AC_DEFUN([AM_SET_DEPDIR],
[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
])
# AM_DEP_TRACK
# ------------
AC_DEFUN([AM_DEP_TRACK],
[AC_ARG_ENABLE(dependency-tracking,
[ --disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors])
if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\'
fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])dnl
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
])
# Generate code to set up dependency tracking. -*- Autoconf -*-
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
#serial 3
# _AM_OUTPUT_DEPENDENCY_COMMANDS
# ------------------------------
AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
[for mf in $CONFIG_FILES; do
# Strip MF so we end up with the name of the file.
mf=`echo "$mf" | sed -e 's/:.*$//'`
# Check whether this is an Automake generated Makefile or not.
# We used to match only the files named `Makefile.in', but
# some people rename them; so instead we look at the file content.
# Grep'ing the first line is not enough: some people post-process
# each Makefile.in and add a new line on top of each file to say so.
# Grep'ing the whole file is not good either: AIX grep has a line
# limit of 2048, but all sed's we know have understand at least 4000.
if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
dirpart=`AS_DIRNAME("$mf")`
else
continue
fi
# Extract the definition of DEPDIR, am__include, and am__quote
# from the Makefile without running `make'.
DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
test -z "$DEPDIR" && continue
am__include=`sed -n 's/^am__include = //p' < "$mf"`
test -z "am__include" && continue
am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
# When using ansi2knr, U may be empty or an underscore; expand it
U=`sed -n 's/^U = //p' < "$mf"`
# Find all dependency output files, they are included files with
# $(DEPDIR) in their names. We invoke sed twice because it is the
# simplest approach to changing $(DEPDIR) to its actual value in the
# expansion.
for file in `sed -n "
s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
# Make sure the directory exists.
test -f "$dirpart/$file" && continue
fdir=`AS_DIRNAME(["$file"])`
AS_MKDIR_P([$dirpart/$fdir])
# echo "creating $dirpart/$file"
echo '# dummy' > "$dirpart/$file"
done
done
])# _AM_OUTPUT_DEPENDENCY_COMMANDS
# AM_OUTPUT_DEPENDENCY_COMMANDS
# -----------------------------
# This macro should only be invoked once -- use via AC_REQUIRE.
#
# This code is only required when automatic dependency tracking
# is enabled. FIXME. This creates each `.P' file that we will
# need in order to bootstrap the dependency handling code.
AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
[AC_CONFIG_COMMANDS([depfiles],
[test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
[AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
])
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 8
# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
# Do all the work for Automake. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2008 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 13
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
# The call with PACKAGE and VERSION arguments is the old style
# call (pre autoconf-2.50), which is being phased out. PACKAGE
# and VERSION should now be passed to AC_INIT and removed from
# the call to AM_INIT_AUTOMAKE.
# We support both call styles for the transition. After
# the next Automake release, Autoconf can make the AC_INIT
# arguments mandatory, and then we can depend on a new Autoconf
# release and drop the old call support.
AC_DEFUN([AM_INIT_AUTOMAKE],
[AC_PREREQ([2.60])dnl
dnl Autoconf wants to disallow AM_ names. We explicitly allow
dnl the ones we care about.
m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
AC_REQUIRE([AC_PROG_INSTALL])dnl
if test "`cd $srcdir && pwd`" != "`pwd`"; then
# Use -I$(srcdir) only when $(srcdir) != ., so that make's output
# is not polluted with repeated "-I."
AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
# test to see if srcdir already configured
if test -f $srcdir/config.status; then
AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
fi
fi
# test whether we have cygpath
if test -z "$CYGPATH_W"; then
if (cygpath --version) >/dev/null 2>/dev/null; then
CYGPATH_W='cygpath -w'
else
CYGPATH_W=echo
fi
fi
AC_SUBST([CYGPATH_W])
# Define the identity of the package.
dnl Distinguish between old-style and new-style calls.
m4_ifval([$2],
[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
AC_SUBST([PACKAGE], [$1])dnl
AC_SUBST([VERSION], [$2])],
[_AM_SET_OPTIONS([$1])dnl
dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
[m4_fatal([AC_INIT should be called with package and version arguments])])dnl
AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
_AM_IF_OPTION([no-define],,
[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
# Some tools Automake needs.
AC_REQUIRE([AM_SANITY_CHECK])dnl
AC_REQUIRE([AC_ARG_PROGRAM])dnl
AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
AM_MISSING_PROG(AUTOCONF, autoconf)
AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
AM_MISSING_PROG(AUTOHEADER, autoheader)
AM_MISSING_PROG(MAKEINFO, makeinfo)
AM_PROG_INSTALL_SH
AM_PROG_INSTALL_STRIP
AC_REQUIRE([AM_PROG_MKDIR_P])dnl
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
[_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
[_AM_PROG_TAR([v7])])])
_AM_IF_OPTION([no-dependencies],,
[AC_PROVIDE_IFELSE([AC_PROG_CC],
[_AM_DEPENDENCIES(CC)],
[define([AC_PROG_CC],
defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_CXX],
[_AM_DEPENDENCIES(CXX)],
[define([AC_PROG_CXX],
defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
AC_PROVIDE_IFELSE([AC_PROG_OBJC],
[_AM_DEPENDENCIES(OBJC)],
[define([AC_PROG_OBJC],
defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
])
])
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
# loop where config.status creates the headers, so we can generate
# our stamp files there.
AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
[# Compute $1's index in $config_headers.
_am_arg=$1
_am_stamp_count=1
for _am_header in $config_headers :; do
case $_am_header in
$_am_arg | $_am_arg:* )
break ;;
* )
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
esac
done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_SH
# ------------------
# Define $install_sh.
AC_DEFUN([AM_PROG_INSTALL_SH],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
AC_SUBST(install_sh)])
# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# Check whether the underlying file-system supports filenames
# with a leading dot. For instance MS-DOS doesn't.
AC_DEFUN([AM_SET_LEADING_DOT],
[rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
am__leading_dot=.
else
am__leading_dot=_
fi
rmdir .tst 2>/dev/null
AC_SUBST([am__leading_dot])])
# Check to see how 'make' treats includes. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# AM_MAKE_INCLUDE()
# -----------------
# Check to see how make treats includes.
AC_DEFUN([AM_MAKE_INCLUDE],
[am_make=${MAKE-make}
cat > confinc << 'END'
am__doit:
@echo done
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
AC_MSG_CHECKING([for style of include used by $am_make])
am__include="#"
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# We grep out `Entering directory' and `Leaving directory'
# messages which can occur if `w' ends up in MAKEFLAGS.
# In particular we don't look at `^make:' because GNU make might
# be invoked under some other name (usually "gmake"), in which
# case it prints its new name instead of `make'.
if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
am__include=include
am__quote=
_am_result=GNU
fi
# Now try BSD make style include.
if test "$am__include" = "#"; then
echo '.include "confinc"' > confmf
if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
am__include=.include
am__quote="\""
_am_result=BSD
fi
fi
AC_SUBST([am__include])
AC_SUBST([am__quote])
AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 5
# AM_MISSING_PROG(NAME, PROGRAM)
# ------------------------------
AC_DEFUN([AM_MISSING_PROG],
[AC_REQUIRE([AM_MISSING_HAS_RUN])
$1=${$1-"${am_missing_run}$2"}
AC_SUBST($1)])
# AM_MISSING_HAS_RUN
# ------------------
# Define MISSING if not defined so far and test if it supports --run.
# If it does, set am_missing_run to use it, otherwise, to nothing.
AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
AC_REQUIRE_AUX_FILE([missing])dnl
test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
# Use eval to expand $SHELL
if eval "$MISSING --run true"; then
am_missing_run="$MISSING --run "
else
am_missing_run=
AC_MSG_WARN([`missing' script is too old or missing])
fi
])
# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_MKDIR_P
# ---------------
# Check for `mkdir -p'.
AC_DEFUN([AM_PROG_MKDIR_P],
[AC_PREREQ([2.60])dnl
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
dnl while keeping a definition of mkdir_p for backward compatibility.
dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
dnl Makefile.ins that do not define MKDIR_P, so we do our own
dnl adjustment using top_builddir (which is defined more often than
dnl MKDIR_P).
AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
case $mkdir_p in
[[\\/$]]* | ?:[[\\/]]*) ;;
*/*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
esac
])
# Helper functions for option handling. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 3
# _AM_MANGLE_OPTION(NAME)
# -----------------------
AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME)
# ------------------------------
# Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS)
# ----------------------------------
# OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS],
[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
# -------------------------------------------
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
# Check to make sure that the build environment is sane. -*- Autoconf -*-
# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
# Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 4
# AM_SANITY_CHECK
# ---------------
AC_DEFUN([AM_SANITY_CHECK],
[AC_MSG_CHECKING([whether build environment is sane])
# Just in case
sleep 1
echo timestamp > conftest.file
# Do `set' in a subshell so we don't clobber the current shell's
# arguments. Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
if test "$[*]" = "X"; then
# -L didn't work.
set X `ls -t $srcdir/configure conftest.file`
fi
rm -f conftest.file
if test "$[*]" != "X $srcdir/configure conftest.file" \
&& test "$[*]" != "X conftest.file $srcdir/configure"; then
# If neither matched, then we have a broken ls. This can happen
# if, for instance, CONFIG_SHELL is bash and it inherits a
# broken ls alias from the environment. This has actually
# happened. Such a system could not be considered "sane".
AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
alias in your environment])
fi
test "$[2]" = conftest.file
)
then
# Ok.
:
else
AC_MSG_ERROR([newly created file is older than distributed files!
Check your system clock])
fi
AC_MSG_RESULT(yes)])
# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# AM_PROG_INSTALL_STRIP
# ---------------------
# One issue with vendor `install' (even GNU) is that you can't
# specify the program used to strip binaries. This is especially
# annoying in cross-compiling environments, where the build's strip
# is unlikely to handle the host's binaries.
# Fortunately install-sh will honor a STRIPPROG variable, so we
# always use install-sh in `make install-strip', and initialize
# STRIPPROG with the value of the STRIP variable (set by the user).
AC_DEFUN([AM_PROG_INSTALL_STRIP],
[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
# Installed binaries are usually stripped using `strip' when the user
# run `make install-strip'. However `strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the `STRIP' environment variable to overrule this program.
dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
if test "$cross_compiling" != no; then
AC_CHECK_TOOL([STRIP], [strip], :)
fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])])
# Copyright (C) 2006 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# _AM_SUBST_NOTMAKE(VARIABLE)
# ---------------------------
# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
# This macro is traced by Automake.
AC_DEFUN([_AM_SUBST_NOTMAKE])
# Check how to create a tarball. -*- Autoconf -*-
# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# serial 2
# _AM_PROG_TAR(FORMAT)
# --------------------
# Check how to create a tarball in format FORMAT.
# FORMAT should be one of `v7', `ustar', or `pax'.
#
# Substitute a variable $(am__tar) that is a command
# writing to stdout a FORMAT-tarball containing the directory
# $tardir.
# tardir=directory && $(am__tar) > result.tar
#
# Substitute a variable $(am__untar) that extract such
# a tarball read from stdin.
# $(am__untar) < result.tar
AC_DEFUN([_AM_PROG_TAR],
[# Always define AMTAR for backward compatibility.
AM_MISSING_PROG([AMTAR], [tar])
m4_if([$1], [v7],
[am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
[m4_case([$1], [ustar],, [pax],,
[m4_fatal([Unknown tar format])])
AC_MSG_CHECKING([how to create a $1 tar archive])
# Loop over all known methods to create a tar archive until one works.
_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
_am_tools=${am_cv_prog_tar_$1-$_am_tools}
# Do not fold the above two line into one, because Tru64 sh and
# Solaris sh will not grok spaces in the rhs of `-'.
for _am_tool in $_am_tools
do
case $_am_tool in
gnutar)
for _am_tar in tar gnutar gtar;
do
AM_RUN_LOG([$_am_tar --version]) && break
done
am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
am__untar="$_am_tar -xf -"
;;
plaintar)
# Must skip GNU tar: if it does not support --format= it doesn't create
# ustar tarball either.
(tar --version) >/dev/null 2>&1 && continue
am__tar='tar chf - "$$tardir"'
am__tar_='tar chf - "$tardir"'
am__untar='tar xf -'
;;
pax)
am__tar='pax -L -x $1 -w "$$tardir"'
am__tar_='pax -L -x $1 -w "$tardir"'
am__untar='pax -r'
;;
cpio)
am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
am__untar='cpio -i -H $1 -d'
;;
none)
am__tar=false
am__tar_=false
am__untar=false
;;
esac
# If the value was cached, stop now. We just wanted to have am__tar
# and am__untar set.
test -n "${am_cv_prog_tar_$1}" && break
# tar/untar a dummy directory, and stop if the command works
rm -rf conftest.dir
mkdir conftest.dir
echo GrepMe > conftest.dir/file
AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
rm -rf conftest.dir
if test -s conftest.tar; then
AM_RUN_LOG([$am__untar <conftest.tar])
grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
fi
done
rm -rf conftest.dir
AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
AC_MSG_RESULT([$am_cv_prog_tar_$1])])
AC_SUBST([am__tar])
AC_SUBST([am__untar])
]) # _AM_PROG_TAR
m4_include([acinclude.m4])

@ -0,0 +1,4 @@
#!/bin/sh
# Prepare a new checked-out source tree for configuration
make -f admin/Makefile.common cvs

@ -0,0 +1,310 @@
/* config.h.in. Generated from configure.in by autoheader. */
/* Define to the name of the file that communication with gdb should be logged
to; undefine it for no logging */
#undef GDB_TRANSCRIPT
/* Define to 1 if you have the <Carbon/Carbon.h> header file. */
#undef HAVE_CARBON_CARBON_H
/* Define if you have the CoreAudio API */
#undef HAVE_COREAUDIO
/* Define to 1 if you have the <crt_externs.h> header file. */
#undef HAVE_CRT_EXTERNS_H
/* Defines if your system has the crypt function */
#undef HAVE_CRYPT
/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
*/
#undef HAVE_DIRENT_H
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if you have the <fnmatch.h> header file. */
#undef HAVE_FNMATCH_H
/* Define if you have openpty */
#undef HAVE_FUNC_OPENPTY
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define if you have libjpeg */
#undef HAVE_LIBJPEG
/* Define if you have libpng */
#undef HAVE_LIBPNG
/* Define if you have a working libpthread (will enable threaded code) */
#undef HAVE_LIBPTHREAD
/* Define to 1 if you have the <libutil.h> header file. */
#undef HAVE_LIBUTIL_H
/* Define if you have libz */
#undef HAVE_LIBZ
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `mkfifo' function. */
#undef HAVE_MKFIFO
/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
#undef HAVE_NDIR_H
/* Define if your system needs _NSGetEnviron to set up the environment */
#undef HAVE_NSGETENVIRON
/* Define if placement new works */
#undef HAVE_PLACEMENT_NEW
/* Define to 1 if you have the <pty.h> header file. */
#undef HAVE_PTY_H
/* Define to 1 if you have the `putenv' function. */
#undef HAVE_PUTENV
/* Define if you have res_init */
#undef HAVE_RES_INIT
/* Define if you have the res_init prototype */
#undef HAVE_RES_INIT_PROTO
/* Define to 1 if you have the `setpgid' function. */
#undef HAVE_SETPGID
/* Define if you have a STL implementation by SGI */
#undef HAVE_SGI_STL
/* Define to 1 if you have the `snprintf' function. */
#undef HAVE_SNPRINTF
/* Define to 1 if you have the `socket' function. */
#undef HAVE_SOCKET
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define if you have strlcat */
#undef HAVE_STRLCAT
/* Define if you have the strlcat prototype */
#undef HAVE_STRLCAT_PROTO
/* Define if you have strlcpy */
#undef HAVE_STRLCPY
/* Define if you have the strlcpy prototype */
#undef HAVE_STRLCPY_PROTO
/* Define to 1 if you have the <sysent.h> header file. */
#undef HAVE_SYSENT_H
/* Define to 1 if you have the <sys/bitypes.h> header file. */
#undef HAVE_SYS_BITYPES_H
/* Define to 1 if you have the <sys/cdefs.h> header file. */
#undef HAVE_SYS_CDEFS_H
/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
*/
#undef HAVE_SYS_DIR_H
/* Define to 1 if you have the <sys/ioctl.h> header file. */
#undef HAVE_SYS_IOCTL_H
/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
*/
#undef HAVE_SYS_NDIR_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/time.h> header file. */
#undef HAVE_SYS_TIME_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the <util.h> header file. */
#undef HAVE_UTIL_H
/* Define to 1 if you have the `vsnprintf' function. */
#undef HAVE_VSNPRINTF
/* Suffix for lib directories */
#undef KDELIBSUFF
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define how to invoke ps */
#undef PS_COMMAND
/* The size of `char *', as computed by sizeof. */
#undef SIZEOF_CHAR_P
/* The size of `int', as computed by sizeof. */
#undef SIZEOF_INT
/* The size of `long', as computed by sizeof. */
#undef SIZEOF_LONG
/* The size of `short', as computed by sizeof. */
#undef SIZEOF_SHORT
/* The size of `size_t', as computed by sizeof. */
#undef SIZEOF_SIZE_T
/* The size of `unsigned long', as computed by sizeof. */
#undef SIZEOF_UNSIGNED_LONG
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
#undef TIME_WITH_SYS_TIME
/* Version number of package */
#undef VERSION
/* Define if you want to see voluminous trace output */
#undef WANT_TRACE_OUTPUT
/* Defined if compiling without arts */
#undef WITHOUT_ARTS
/*
* jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
* headers and I'm too lazy to write a configure test as long as only
* unixware is related
*/
#ifdef _UNIXWARE
#define HAVE_BOOLEAN
#endif
/*
* AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
* that defines bzero.
*/
#if defined(_AIX)
#include <strings.h>
#endif
#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
# include <sys/time.h>
# include <crt_externs.h>
# define environ (*_NSGetEnviron())
#endif
#if !defined(HAVE_RES_INIT_PROTO)
#ifdef __cplusplus
extern "C" {
#endif
int res_init(void);
#ifdef __cplusplus
}
#endif
#endif
#if !defined(HAVE_STRLCAT_PROTO)
#ifdef __cplusplus
extern "C" {
#endif
unsigned long strlcat(char*, const char*, unsigned long);
#ifdef __cplusplus
}
#endif
#endif
#if !defined(HAVE_STRLCPY_PROTO)
#ifdef __cplusplus
extern "C" {
#endif
unsigned long strlcpy(char*, const char*, unsigned long);
#ifdef __cplusplus
}
#endif
#endif
/*
* On HP-UX, the declaration of vsnprintf() is needed every time !
*/
#if !defined(HAVE_VSNPRINTF) || defined(hpux)
#if __STDC__
#include <stdarg.h>
#include <stdlib.h>
#else
#include <varargs.h>
#endif
#ifdef __cplusplus
extern "C"
#endif
int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
#ifdef __cplusplus
extern "C"
#endif
int snprintf(char *str, size_t n, char const *fmt, ...);
#endif
#if defined(__SVR4) && !defined(__svr4__)
#define __svr4__ 1
#endif
/* type to use in place of socklen_t if not defined */
#undef kde_socklen_t
/* type to use in place of socklen_t if not defined (deprecated, use
kde_socklen_t) */
#undef ksize_t

36413
configure vendored

File diff suppressed because it is too large Load Diff

@ -0,0 +1,3 @@
./admin/configure.in.min
configure.in.in
configure.in.mid

@ -0,0 +1,241 @@
dnl =======================================================
dnl FILE: ./admin/configure.in.min
dnl =======================================================
dnl This file is part of the KDE libraries/packages
dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org)
dnl This file is free software; you can redistribute it and/or
dnl modify it under the terms of the GNU Library General Public
dnl License as published by the Free Software Foundation; either
dnl version 2 of the License, or (at your option) any later version.
dnl This library is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
dnl Library General Public License for more details.
dnl You should have received a copy of the GNU Library General Public License
dnl along with this library; see the file COPYING.LIB. If not, write to
dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
dnl Boston, MA 02110-1301, USA.
# Original Author was Kalle@kde.org
# I lifted it in some mater. (Stephan Kulow)
# I used much code from Janos Farkas
dnl Process this file with autoconf to produce a configure script.
AC_INIT(acinclude.m4) dnl a source file from your sub dir
dnl This is so we can use kde-common
AC_CONFIG_AUX_DIR(admin)
dnl This ksh/zsh feature conflicts with `cd blah ; pwd`
unset CDPATH
dnl Checking host/target/build systems, for make, install etc.
AC_CANONICAL_SYSTEM
dnl Perform program name transformation
AC_ARG_PROGRAM
dnl Automake doc recommends to do this only here. (Janos)
AM_INIT_AUTOMAKE(kdbg, 2.2.2) dnl searches for some needed programs
KDE_SET_PREFIX
dnl generate the config header
AM_CONFIG_HEADER(config.h) dnl at the distribution this done
dnl Checks for programs.
AC_CHECK_COMPILERS
AC_ENABLE_SHARED(yes)
AC_ENABLE_STATIC(no)
KDE_PROG_LIBTOOL
dnl for NLS support. Call them in this order!
dnl WITH_NLS is for the po files
AM_KDE_WITH_NLS
dnl KDE_USE_QT
AC_PATH_KDE
dnl =======================================================
dnl FILE: configure.in.in
dnl =======================================================
#MIN_CONFIG
dnl PACKAGE set before
KDE_CREATE_SUBDIRSLIST
AC_CONFIG_FILES([ Makefile ])
AC_CONFIG_FILES([ kdbg/Makefile ])
AC_CONFIG_FILES([ kdbg/doc/Makefile ])
AC_CONFIG_FILES([ kdbg/doc/de/Makefile ])
AC_CONFIG_FILES([ kdbg/doc/en/Makefile ])
AC_CONFIG_FILES([ kdbg/doc/ru/Makefile ])
AC_CONFIG_FILES([ kdbg/pics/Makefile ])
AC_CONFIG_FILES([ kdbg/testprogs/Makefile ])
AC_CONFIG_FILES([ kdbg/typetables/Makefile ])
AC_CONFIG_FILES([ po/Makefile ])
dnl Checks for header files.
AC_LANG_C dnl switch to C
AC_HEADER_DIRENT dnl check for dirent.h
AC_HEADER_STDC dnl check for other stdc headers. More traditional ;)
dnl check for some more header files. You can remove some of
dnl them, if you want to. But it doesn't hurt
AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/cdefs.h)
AC_CHECK_HEADERS(fnmatch.h sysent.h strings.h sys/stat.h)
AC_CHECK_HEADERS(sys/ioctl.h pty.h libutil.h util.h)
dnl Checks for libraries.
AC_CHECK_LIB(socket, socket, [LIBSOCKET="-lsocket -lnsl"]) dnl for Solaris' X11
AC_SUBST(LIBSOCKET)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_TIME
dnl Checks for library functions.
AC_CHECK_FUNCS(setpgid putenv socket vsnprintf mkfifo)
dnl pseudo tty support in glibc2
AC_SEARCH_LIBS(openpty, util,
AC_DEFINE_UNQUOTED(HAVE_FUNC_OPENPTY, 1, [Define if you have openpty]))
dnl Check whether we want much debugging output
AH_TEMPLATE([WANT_TRACE_OUTPUT],
[Define if you want to see voluminous trace output])
AC_MSG_CHECKING([whether kdbg should generate lots of trace output])
dnl Default is no trace output
AC_ARG_ENABLE(lots-a-trace,
[ --enable-lots-a-trace generate lots of trace output [default=no]],
WANT_TRACE_OUTPUT=$enableval, WANT_TRACE_OUTPUT=no)
AC_MSG_RESULT($WANT_TRACE_OUTPUT)
if test "x$WANT_TRACE_OUTPUT" = "xyes"; then
AC_DEFINE_UNQUOTED(WANT_TRACE_OUTPUT)
fi
dnl Check whether test programs should be compiled
dnl Default is not to compile them
AC_ARG_ENABLE(testprogs,
[ --enable-testprogs compile test programs [default=no]],
[buildtestprogs=$enableval],[buildtestprogs=no])
AM_CONDITIONAL(BUILDTESTPROGS,test "x$buildtestprogs" = "xyes")
dnl write a notice into the log
echo "build test programs: $buildtestprogs" >&5
dnl Check where the communication with gdb should be logged
AC_MSG_CHECKING([where communication with gdb should be logged])
dnl Default is ./gdb-transcript until kdbg is released
AC_ARG_WITH(transcript,
[ --with-transcript=file log communication with gdb [default=not logged]],
GDB_TRANSCRIPT=$withval, GDB_TRANSCRIPT=no)
if test "x$GDB_TRANSCRIPT" = "xyes"; then
GDB_TRANSCRIPT="./gdb-transcript"
fi
if test "x$GDB_TRANSCRIPT" = "xno"; then
GDB_TRANSCRIPT="not logged"
else
dnl add quotes
GDB_TRANSCRIPT=\"$GDB_TRANSCRIPT\"
AC_DEFINE_UNQUOTED(GDB_TRANSCRIPT, $GDB_TRANSCRIPT,
[Define to the name of the file that communication with gdb
should be logged to; undefine it for no logging])
fi
AC_MSG_RESULT($GDB_TRANSCRIPT)
dnl Check whether placement new works
AH_TEMPLATE([HAVE_PLACEMENT_NEW],[Define if placement new works])
AC_LANG_CPLUSPLUS
AC_MSG_CHECKING(whether placement new is available)
AC_CACHE_VAL(ac_cv_have_placement_new,
[
AC_TRY_COMPILE([
#include <new>
],
[
int ii;
new(&ii) int;
],
ac_cv_have_placement_new=yes,
ac_cv_have_placement_new=no)
])
AC_MSG_RESULT($ac_cv_have_placement_new)
if eval "test \"`echo `$ac_cv_have_placement_new\" = yes"; then
AC_DEFINE(HAVE_PLACEMENT_NEW)
fi
dnl -----------------
AC_PATH_PROG(PS_COMMAND, ps)
if test -n "$PS_COMMAND"; then
AC_MSG_CHECKING(for suitable ps invocation)
PS_COMMAND="$PS_COMMAND -eo pid,ppid,uid,vsz,etime,time,args"
if $PS_COMMAND > /dev/null 2>&1; then
# works in principle; check output: extract first line, but avoid 'head -1'
set x `$PS_COMMAND | (read firstline; echo "$firstline")`
if test "$*" = "x PID PPID UID VSZ ELAPSED TIME COMMAND"; then
: # fine
else
PS_COMMAND="" # not suitable
fi
else
PS_COMMAND="" # not suitable
fi
if test -n "$PS_COMMAND"; then
AC_MSG_RESULT($PS_COMMAND)
PS_COMMAND=\"`echo $PS_COMMAND | sed -e 's/ /", "/g'`\"
AC_DEFINE_UNQUOTED(PS_COMMAND, $PS_COMMAND,
[Define how to invoke ps])
else
AC_MSG_RESULT([not suitable])
fi
fi
AM_CONDITIONAL(HAVE_PS_COMMAND, test -n "$PS_COMMAND")
AC_OUTPUT
# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure
if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then
# And if so, warn when they don't match
if test "$kde_libs_prefix" != "$given_prefix"; then
# And if kde doesn't know about the prefix yet
echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null
if test $? -ne 0; then
echo ""
echo "Warning: you chose to install this package in $given_prefix,"
echo "but KDE was found in $kde_libs_prefix."
echo "For this to work, you will need to tell KDE about the new prefix, by ensuring"
echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix"
echo "Then restart KDE."
echo ""
fi
fi
fi
if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then
echo ""
echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility"
echo "was not included. Therefore, GCC symbol visibility support remains disabled."
echo ""
echo "For better performance, consider including the Qt visibility supporting patch"
echo "located at:"
echo ""
echo "http://bugs.kde.org/show_bug.cgi?id=109386"
echo ""
echo "and recompile all of Qt and KDE. Note, this is entirely optional and"
echo "everything will continue to work just fine without it."
echo ""
fi
if test "$all_tests" = "bad"; then
if test ! "$cache_file" = "/dev/null"; then
echo ""
echo "Please remove the file $cache_file after changing your setup"
echo "so that configure will find the changes next time."
echo ""
fi
else
echo ""
echo "Good - your configure finished. Start make now"
echo ""
fi

@ -0,0 +1,4 @@
#MIN_CONFIG
AM_INIT_AUTOMAKE(kdbg, 2.2.2)

@ -0,0 +1,115 @@
dnl Checks for header files.
AC_LANG_C dnl switch to C
AC_HEADER_DIRENT dnl check for dirent.h
AC_HEADER_STDC dnl check for other stdc headers. More traditional ;)
dnl check for some more header files. You can remove some of
dnl them, if you want to. But it doesn't hurt
AC_CHECK_HEADERS(fcntl.h sys/time.h unistd.h sys/cdefs.h)
AC_CHECK_HEADERS(fnmatch.h sysent.h strings.h sys/stat.h)
AC_CHECK_HEADERS(sys/ioctl.h pty.h libutil.h util.h)
dnl Checks for libraries.
AC_CHECK_LIB(socket, socket, [LIBSOCKET="-lsocket -lnsl"]) dnl for Solaris' X11
AC_SUBST(LIBSOCKET)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_TIME
dnl Checks for library functions.
AC_CHECK_FUNCS(setpgid putenv socket vsnprintf mkfifo)
dnl pseudo tty support in glibc2
AC_SEARCH_LIBS(openpty, util,
AC_DEFINE_UNQUOTED(HAVE_FUNC_OPENPTY, 1, [Define if you have openpty]))
dnl Check whether we want much debugging output
AH_TEMPLATE([WANT_TRACE_OUTPUT],
[Define if you want to see voluminous trace output])
AC_MSG_CHECKING([whether kdbg should generate lots of trace output])
dnl Default is no trace output
AC_ARG_ENABLE(lots-a-trace,
[ --enable-lots-a-trace generate lots of trace output [default=no]],
WANT_TRACE_OUTPUT=$enableval, WANT_TRACE_OUTPUT=no)
AC_MSG_RESULT($WANT_TRACE_OUTPUT)
if test "x$WANT_TRACE_OUTPUT" = "xyes"; then
AC_DEFINE_UNQUOTED(WANT_TRACE_OUTPUT)
fi
dnl Check whether test programs should be compiled
dnl Default is not to compile them
AC_ARG_ENABLE(testprogs,
[ --enable-testprogs compile test programs [default=no]],
[buildtestprogs=$enableval],[buildtestprogs=no])
AM_CONDITIONAL(BUILDTESTPROGS,test "x$buildtestprogs" = "xyes")
dnl write a notice into the log
echo "build test programs: $buildtestprogs" >&5
dnl Check where the communication with gdb should be logged
AC_MSG_CHECKING([where communication with gdb should be logged])
dnl Default is ./gdb-transcript until kdbg is released
AC_ARG_WITH(transcript,
[ --with-transcript=file log communication with gdb [default=not logged]],
GDB_TRANSCRIPT=$withval, GDB_TRANSCRIPT=no)
if test "x$GDB_TRANSCRIPT" = "xyes"; then
GDB_TRANSCRIPT="./gdb-transcript"
fi
if test "x$GDB_TRANSCRIPT" = "xno"; then
GDB_TRANSCRIPT="not logged"
else
dnl add quotes
GDB_TRANSCRIPT=\"$GDB_TRANSCRIPT\"
AC_DEFINE_UNQUOTED(GDB_TRANSCRIPT, $GDB_TRANSCRIPT,
[Define to the name of the file that communication with gdb
should be logged to; undefine it for no logging])
fi
AC_MSG_RESULT($GDB_TRANSCRIPT)
dnl Check whether placement new works
AH_TEMPLATE([HAVE_PLACEMENT_NEW],[Define if placement new works])
AC_LANG_CPLUSPLUS
AC_MSG_CHECKING(whether placement new is available)
AC_CACHE_VAL(ac_cv_have_placement_new,
[
AC_TRY_COMPILE([
#include <new>
],
[
int ii;
new(&ii) int;
],
ac_cv_have_placement_new=yes,
ac_cv_have_placement_new=no)
])
AC_MSG_RESULT($ac_cv_have_placement_new)
if eval "test \"`echo `$ac_cv_have_placement_new\" = yes"; then
AC_DEFINE(HAVE_PLACEMENT_NEW)
fi
dnl -----------------
AC_PATH_PROG(PS_COMMAND, ps)
if test -n "$PS_COMMAND"; then
AC_MSG_CHECKING(for suitable ps invocation)
PS_COMMAND="$PS_COMMAND -eo pid,ppid,uid,vsz,etime,time,args"
if $PS_COMMAND > /dev/null 2>&1; then
# works in principle; check output: extract first line, but avoid 'head -1'
set x `$PS_COMMAND | (read firstline; echo "$firstline")`
if test "$*" = "x PID PPID UID VSZ ELAPSED TIME COMMAND"; then
: # fine
else
PS_COMMAND="" # not suitable
fi
else
PS_COMMAND="" # not suitable
fi
if test -n "$PS_COMMAND"; then
AC_MSG_RESULT($PS_COMMAND)
PS_COMMAND=\"`echo $PS_COMMAND | sed -e 's/ /", "/g'`\"
AC_DEFINE_UNQUOTED(PS_COMMAND, $PS_COMMAND,
[Define how to invoke ps])
else
AC_MSG_RESULT([not suitable])
fi
fi
AM_CONDITIONAL(HAVE_PS_COMMAND, test -n "$PS_COMMAND")

@ -0,0 +1,67 @@
%define name kdbg
%define version 2.0.0
%define release 1.kde2
%define prefix /usr
%define builddir $RPM_BUILD_DIR/%{name}-%{version}
Summary: KDbg - KDE Debugging GUI around gdb
Name: %{name}
Version: %{version}
Release: %{release}
Prefix: %{prefix}
Group: X11/KDE/Development
Copyright: GPL
Distribution: RedHat 7.0
Vendor: Johannes Sixt <j6t@kdbg.org>
Packager: Ullrich von Bassewitz <uz@musoftware.de>
Source: %{name}-%{version}.tar.gz
URL: http://www.kdbg.org/
Requires: kdelibs >= 2.0
BuildRoot: /tmp/build-%{name}-%{version}
%description
KDbg is a graphical user interface to gdb, the GNU debugger. It provides
an intuitive interface for setting breakpoints, inspecting variables, and
stepping through code.
%prep
rm -rf $RPM_BUILD_ROOT
rm -rf %{builddir}
%setup
touch `find . -type f`
%build
if [ -z "$KDEDIR" ]; then
export KDEDIR=%{prefix}
fi
CXXFLAGS="$RPM_OPT_FLAGS" CFLAGS="$RPM_OPT_FLAGS" ./configure \
--prefix=$KDEDIR
make
%install
if [ -z "$KDEDIR" ]; then
export KDEDIR=%{prefix}
fi
rm -rf $RPM_BUILD_ROOT
make DESTDIR=$RPM_BUILD_ROOT install-strip
cd $RPM_BUILD_ROOT
find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > \
$RPM_BUILD_DIR/file.list.%{name}
find . -type f | sed -e 's,^\.,\%attr(-\,root\,root) ,' \
-e '/\/config\//s|^|%config|' >> \
$RPM_BUILD_DIR/file.list.%{name}
find . -type l | sed 's,^\.,\%attr(-\,root\,root) ,' >> \
$RPM_BUILD_DIR/file.list.%{name}
echo "%docdir $KDEDIR/share/doc/HTML" >> $RPM_BUILD_DIR/file.list.%{name}
%clean
rm -rf $RPM_BUILD_ROOT
rm -rf %{builddir}
rm -f $RPM_BUILD_DIR/file.list.%{name}
%files -f ../file.list.%{name}

@ -0,0 +1,98 @@
# set the include path for X, qt and KDE
INCLUDES= $(all_includes)
# claim, which subdirectories you want to install
SUBDIRS = doc pics typetables testprogs
####### This part is very kdbg specific
# you can add here more. This one gets installed
bin_PROGRAMS = kdbg
# Which sources should be compiled for kdbg.
kdbg_SOURCES = \
pgmargs.cpp \
pgmargsbase.ui \
procattach.cpp \
procattachbase.ui \
debugger.cpp \
programconfig.cpp \
dbgdriver.cpp \
gdbdriver.cpp \
xsldbgdriver.cpp \
brkpt.cpp \
exprwnd.cpp \
regwnd.cpp \
memwindow.cpp \
threadlist.cpp \
sourcewnd.cpp \
winstack.cpp \
ttywnd.cpp \
typetable.cpp \
prefdebugger.cpp \
prefmisc.cpp \
pgmsettings.cpp \
mainwndbase.cpp \
dbgmainwnd.cpp \
main.cpp
# the library search path
kdbg_LDFLAGS = \
$(all_libraries) $(KDE_RPATH)
# the libraries to link against.
kdbg_LDADD = $(LIB_KIO)
# this option you can leave out. Just, if you use "make dist", you need it
noinst_HEADERS = \
pgmargs.h \
procattach.h \
debugger.h \
programconfig.h \
dbgdriver.h \
gdbdriver.h \
xsldbgdriver.h \
brkpt.h \
exprwnd.h \
regwnd.h \
memwindow.h \
threadlist.h \
sourcewnd.h \
winstack.h \
ttywnd.h \
typetable.h \
prefdebugger.h \
prefmisc.h \
pgmsettings.h \
mainwndbase.h \
dbgmainwnd.h \
envvar.h \
commandids.h \
mydebug.h
kdbg_METASOURCES = AUTO
# if you "make clean", this files get removed. If you want to remove
# them while "make distclean", use DISTCLEANFILES
CLEANFILES = $(kdbg_METASOURCES)
xdg_apps_DATA = kdbg.desktop
configdir = $(kde_confdir)
config_DATA = kdbgrc
rcdir = $(kde_datadir)/kdbg
rc_DATA = kdbgui.rc
# Make messages.po and move it to $(top_srcdir)/po. "make merge" there.
# the -x is for skipping messages already translated in kdelibs
# Messages are generated in the source directory so that file names
# mentioned in the .pot file are not prefixed by $(srcdir).
messages:
cd $(srcdir) && \
extractrc *.rc *.ui > rc.cpp && \
LIST=`find . -name \*.h -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.C` && \
$(XGETTEXT) -C -ki18n -kI18N_NOOP -x $(includedir)/kde.pot \
$$LIST && mv messages.po $(top_srcdir)/po/kdbg.pot; \
rm -f rc.cpp
EXTRA_DIST = kdbg.desktop kdbgrc

File diff suppressed because it is too large Load Diff

@ -0,0 +1,513 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#include <kapplication.h>
#include <klocale.h> /* i18n */
#include <kiconloader.h>
#include <ksimpleconfig.h>
#include <qdialog.h>
#include <qkeycode.h>
#include <qpainter.h>
#include <qlabel.h>
#include <qbitmap.h>
#include "debugger.h"
#include "brkpt.h"
#include "dbgdriver.h"
#include <ctype.h>
#include <list>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "mydebug.h"
class BreakpointItem : public QListViewItem, public Breakpoint
{
public:
BreakpointItem(QListView* list, const Breakpoint& bp);
void updateFrom(const Breakpoint& bp);
void display(); /* sets icon and visible texts */
bool enabled() const { return Breakpoint::enabled; }
};
BreakpointTable::BreakpointTable(QWidget* parent, const char* name) :
QWidget(parent, name),
m_debugger(0),
m_bpEdit(this, "bpedit"),
m_list(this, "bptable"),
m_btAddBP(this, "addbp"),
m_btAddWP(this, "addwp"),
m_btRemove(this, "remove"),
m_btEnaDis(this, "enadis"),
m_btViewCode(this, "view"),
m_btConditional(this, "conditional"),
m_layout(this, 8),
m_listandedit(8),
m_buttons(8)
{
m_bpEdit.setMinimumSize(m_bpEdit.sizeHint());
connect(&m_bpEdit, SIGNAL(returnPressed()), this, SLOT(addBP()));
initListAndIcons();
connect(&m_list, SIGNAL(currentChanged(QListViewItem*)), SLOT(updateUI()));
// double click on item is same as View code
connect(&m_list, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(viewBP()));
// need mouse button events
m_list.viewport()->installEventFilter(this);
m_btAddBP.setText(i18n("Add &Breakpoint"));
m_btAddBP.setMinimumSize(m_btAddBP.sizeHint());
connect(&m_btAddBP, SIGNAL(clicked()), this, SLOT(addBP()));
m_btAddWP.setText(i18n("Add &Watchpoint"));
m_btAddWP.setMinimumSize(m_btAddWP.sizeHint());
connect(&m_btAddWP, SIGNAL(clicked()), this, SLOT(addWP()));
m_btRemove.setText(i18n("&Remove"));
m_btRemove.setMinimumSize(m_btRemove.sizeHint());
connect(&m_btRemove, SIGNAL(clicked()), this, SLOT(removeBP()));
// the Enable/Disable button changes its label
m_btEnaDis.setText(i18n("&Disable"));
// make a dummy button to get the size of the alternate label
{
QSize size = m_btEnaDis.sizeHint();
QPushButton dummy(this);
dummy.setText(i18n("&Enable"));
QSize sizeAlt = dummy.sizeHint();
if (sizeAlt.width() > size.width())
size.setWidth(sizeAlt.width());
if (sizeAlt.height() > size.height())
size.setHeight(sizeAlt.height());
m_btEnaDis.setMinimumSize(size);
}
connect(&m_btEnaDis, SIGNAL(clicked()), this, SLOT(enadisBP()));
m_btViewCode.setText(i18n("&View Code"));
m_btViewCode.setMinimumSize(m_btViewCode.sizeHint());
connect(&m_btViewCode, SIGNAL(clicked()), this, SLOT(viewBP()));
m_btConditional.setText(i18n("&Conditional..."));
m_btConditional.setMinimumSize(m_btConditional.sizeHint());
connect(&m_btConditional, SIGNAL(clicked()), this, SLOT(conditionalBP()));
m_layout.addLayout(&m_listandedit, 10);
m_layout.addLayout(&m_buttons);
m_listandedit.addWidget(&m_bpEdit);
m_listandedit.addWidget(&m_list, 10);
m_buttons.addWidget(&m_btAddBP);
m_buttons.addWidget(&m_btAddWP);
m_buttons.addWidget(&m_btRemove);
m_buttons.addWidget(&m_btEnaDis);
m_buttons.addWidget(&m_btViewCode);
m_buttons.addWidget(&m_btConditional);
m_buttons.addStretch(10);
m_layout.activate();
resize(350, 300);
m_bpEdit.setFocus();
}
BreakpointTable::~BreakpointTable()
{
}
void BreakpointTable::updateBreakList()
{
std::list<BreakpointItem*> deletedItems;
for (QListViewItem* it = m_list.firstChild(); it != 0; it = it->nextSibling()) {
deletedItems.push_back(static_cast<BreakpointItem*>(it));
}
// get the new list
for (KDebugger::BrkptROIterator bp = m_debugger->breakpointsBegin(); bp != m_debugger->breakpointsEnd(); ++bp)
{
// look up this item
for (std::list<BreakpointItem*>::iterator o = deletedItems.begin(); o != deletedItems.end(); ++o)
{
if ((*o)->id == bp->id) {
(*o)->updateFrom(*bp);
deletedItems.erase(o); /* don't delete */
goto nextItem;
}
}
// not in the list; add it
new BreakpointItem(&m_list, *bp);
nextItem:;
}
// delete all untouched breakpoints
while (!deletedItems.empty()) {
delete deletedItems.front();
deletedItems.pop_front();
}
}
BreakpointItem::BreakpointItem(QListView* list, const Breakpoint& bp) :
QListViewItem(list),
Breakpoint(bp)
{
display();
}
void BreakpointItem::updateFrom(const Breakpoint& bp)
{
Breakpoint::operator=(bp); /* assign new values */
display();
}
void BreakpointTable::addBP()
{
// set a breakpoint at the specified text
QString bpText = m_bpEdit.text();
bpText = bpText.stripWhiteSpace();
if (m_debugger->isReady())
{
Breakpoint* bp = new Breakpoint;
bp->text = bpText;
m_debugger->setBreakpoint(bp, false);
}
}
void BreakpointTable::addWP()
{
// set a watchpoint for the specified expression
QString wpExpr = m_bpEdit.text();
wpExpr = wpExpr.stripWhiteSpace();
if (m_debugger->isReady()) {
Breakpoint* bp = new Breakpoint;
bp->type = Breakpoint::watchpoint;
bp->text = wpExpr;
m_debugger->setBreakpoint(bp, false);
}
}
void BreakpointTable::removeBP()
{
BreakpointItem* bp = static_cast<BreakpointItem*>(m_list.currentItem());
if (bp != 0) {
m_debugger->deleteBreakpoint(bp->id);
// note that bp may be deleted by now
// (if bp was an orphaned breakpoint)
}
}
void BreakpointTable::enadisBP()
{
BreakpointItem* bp = static_cast<BreakpointItem*>(m_list.currentItem());
if (bp != 0) {
m_debugger->enableDisableBreakpoint(bp->id);
}
}
void BreakpointTable::viewBP()
{
BreakpointItem* bp = static_cast<BreakpointItem*>(m_list.currentItem());
if (bp == 0)
return;
emit activateFileLine(bp->fileName, bp->lineNo, bp->address);
}
void BreakpointTable::updateUI()
{
bool enableChkpt = m_debugger->canChangeBreakpoints();
m_btAddBP.setEnabled(enableChkpt);
m_btAddWP.setEnabled(enableChkpt);
BreakpointItem* bp = static_cast<BreakpointItem*>(m_list.currentItem());
m_btViewCode.setEnabled(bp != 0);
if (bp == 0) {
enableChkpt = false;
} else {
if (bp->enabled()) {
m_btEnaDis.setText(i18n("&Disable"));
} else {
m_btEnaDis.setText(i18n("&Enable"));
}
}
m_btRemove.setEnabled(enableChkpt);
m_btEnaDis.setEnabled(enableChkpt);
m_btConditional.setEnabled(enableChkpt);
}
bool BreakpointTable::eventFilter(QObject* ob, QEvent* ev)
{
if (ev->type() == QEvent::MouseButtonPress)
{
QMouseEvent* mev = static_cast<QMouseEvent*>(ev);
if (mev->button() == MidButton) {
// enable or disable the clicked-on item
BreakpointItem* bp =
static_cast<BreakpointItem*>(m_list.itemAt(mev->pos()));
if (bp != 0)
{
m_debugger->enableDisableBreakpoint(bp->id);
}
return true;
}
}
return QWidget::eventFilter(ob, ev);
}
class ConditionalDlg : public QDialog
{
public:
ConditionalDlg(QWidget* parent);
~ConditionalDlg();
void setCondition(const QString& text) { m_condition.setText(text); }
QString condition() { return m_condition.text(); }
void setIgnoreCount(uint count);
uint ignoreCount();
protected:
QLabel m_conditionLabel;
QLineEdit m_condition;
QLabel m_ignoreLabel;
QLineEdit m_ignoreCount;
QPushButton m_buttonOK;
QPushButton m_buttonCancel;
QVBoxLayout m_layout;
QGridLayout m_inputs;
QHBoxLayout m_buttons;
};
void BreakpointTable::conditionalBP()
{
BreakpointItem* bp = static_cast<BreakpointItem*>(m_list.currentItem());
if (bp == 0)
return;
/*
* Important: we must not keep a pointer to the Breakpoint around,
* since it may vanish while the modal dialog is open through other
* user interactions (like clicking at the breakpoint in the source
* window)!
*/
int id = bp->id;
ConditionalDlg dlg(this);
dlg.setCondition(bp->condition);
dlg.setIgnoreCount(bp->ignoreCount);
if (dlg.exec() != QDialog::Accepted)
return;
QString conditionInput = dlg.condition();
int ignoreCount = dlg.ignoreCount();
m_debugger->conditionalBreakpoint(id, conditionInput, ignoreCount);
}
void BreakpointTable::initListAndIcons()
{
m_list.addColumn(i18n("Location"), 220);
m_list.addColumn(i18n("Address"), 65);
m_list.addColumn(i18n("Hits"), 30);
m_list.addColumn(i18n("Ignore"), 30);
m_list.addColumn(i18n("Condition"), 200);
m_list.setMinimumSize(200, 100);
m_list.setSorting(-1);
// add pixmaps
QPixmap brkena = UserIcon("brkena.xpm");
QPixmap brkdis = UserIcon("brkdis.xpm");
QPixmap watchena = UserIcon("watchena.xpm");
QPixmap watchdis = UserIcon("watchdis.xpm");
QPixmap brktmp = UserIcon("brktmp.xpm");
QPixmap brkcond = UserIcon("brkcond.xpm");
QPixmap brkorph = UserIcon("brkorph.xpm");
/*
* There are 32 different pixmaps: The basic enabled or disabled
* breakpoint, plus an optional overlaid brktmp icon plus an optional
* overlaid brkcond icon, plus an optional overlaid brkorph icon. Then
* the same sequence for watchpoints.
*/
m_icons.resize(32);
QPixmap canvas(16,16);
for (int i = 0; i < 32; i++) {
{
QPainter p(&canvas);
// clear canvas
p.fillRect(0,0, canvas.width(),canvas.height(), cyan);
// basic icon
if (i & 1) {
p.drawPixmap(1,1, (i & 8) ? watchena : brkena);
} else {
p.drawPixmap(1,1, (i & 8) ? watchdis : brkdis);
}
// temporary overlay
if (i & 2) {
p.drawPixmap(1,1, brktmp);
}
// conditional overlay
if (i & 4) {
p.drawPixmap(1,1, brkcond);
}
// orphan overlay
if (i & 16) {
p.drawPixmap(1,1, brkorph);
}
}
canvas.setMask(canvas.createHeuristicMask());
m_icons[i] = canvas;
}
}
void BreakpointItem::display()
{
BreakpointTable* lb = static_cast<BreakpointTable*>(listView()->parent());
/* breakpoint icon code; keep order the same as in BreakpointTable::initListAndIcons */
int code = enabled() ? 1 : 0;
if (temporary)
code += 2;
if (!condition.isEmpty() || ignoreCount > 0)
code += 4;
if (type == watchpoint)
code += 8;
if (isOrphaned())
code += 16;
setPixmap(0, lb->m_icons[code]);
// more breakpoint info
if (!location.isEmpty()) {
setText(0, location);
} else if (!Breakpoint::text.isEmpty()) {
setText(0, Breakpoint::text);
} else if (!fileName.isEmpty()) {
// use only the file name portion
QString file = fileName;
int slash = file.findRev('/');
if (slash >= 0) {
file = file.mid(slash+1);
}
// correct zero-based line-numbers
setText(0, file + ":" + QString::number(lineNo+1));
} else {
setText(0, "*" + address.asString());
}
int c = 0;
setText(++c, address.asString());
QString tmp;
if (hitCount == 0) {
setText(++c, QString());
} else {
tmp.setNum(hitCount);
setText(++c, tmp);
}
if (ignoreCount == 0) {
setText(++c, QString());
} else {
tmp.setNum(ignoreCount);
setText(++c, tmp);
}
if (condition.isEmpty()) {
setText(++c, QString());
} else {
setText(++c, condition);
}
}
ConditionalDlg::ConditionalDlg(QWidget* parent) :
QDialog(parent, "conditional", true),
m_conditionLabel(this, "condLabel"),
m_condition(this, "condition"),
m_ignoreLabel(this, "ignoreLabel"),
m_ignoreCount(this, "ignoreCount"),
m_buttonOK(this, "ok"),
m_buttonCancel(this, "cancel"),
m_layout(this, 10),
m_inputs(2, 2, 10),
m_buttons(4)
{
QString title = kapp->caption();
title += i18n(": Conditional breakpoint");
setCaption(title);
m_conditionLabel.setText(i18n("&Condition:"));
m_conditionLabel.setMinimumSize(m_conditionLabel.sizeHint());
m_ignoreLabel.setText(i18n("Ignore &next hits:"));
m_ignoreLabel.setMinimumSize(m_ignoreLabel.sizeHint());
m_condition.setMinimumSize(150, 24);
m_condition.setMaxLength(10000);
m_condition.setFrame(true);
m_ignoreCount.setMinimumSize(150, 24);
m_ignoreCount.setMaxLength(10000);
m_ignoreCount.setFrame(true);
m_conditionLabel.setBuddy(&m_condition);
m_ignoreLabel.setBuddy(&m_ignoreCount);
m_buttonOK.setMinimumSize(100, 30);
connect(&m_buttonOK, SIGNAL(clicked()), SLOT(accept()));
m_buttonOK.setText(i18n("OK"));
m_buttonOK.setDefault(true);
m_buttonCancel.setMinimumSize(100, 30);
connect(&m_buttonCancel, SIGNAL(clicked()), SLOT(reject()));
m_buttonCancel.setText(i18n("Cancel"));
m_layout.addLayout(&m_inputs);
m_inputs.addWidget(&m_conditionLabel, 0, 0);
m_inputs.addWidget(&m_condition, 0, 1);
m_inputs.addWidget(&m_ignoreLabel, 1, 0);
m_inputs.addWidget(&m_ignoreCount, 1, 1);
m_inputs.setColStretch(1, 10);
m_layout.addLayout(&m_buttons);
m_layout.addStretch(10);
m_buttons.addStretch(10);
m_buttons.addWidget(&m_buttonOK);
m_buttons.addSpacing(40);
m_buttons.addWidget(&m_buttonCancel);
m_buttons.addStretch(10);
m_layout.activate();
m_condition.setFocus();
resize(400, 100);
}
ConditionalDlg::~ConditionalDlg()
{
}
uint ConditionalDlg::ignoreCount()
{
bool ok;
QString input = m_ignoreCount.text();
uint result = input.toUInt(&ok);
return ok ? result : 0;
}
void ConditionalDlg::setIgnoreCount(uint count)
{
QString text;
// set empty if ignore count is zero
if (count > 0) {
text.setNum(count);
}
m_ignoreCount.setText(text);
}
#include "brkpt.moc"

@ -0,0 +1,75 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#ifndef BRKPT_H
#define BRKPT_H
#include <qlistview.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qvaluevector.h>
class KDebugger;
class BreakpointItem;
class BreakpointTable : public QWidget
{
Q_OBJECT
public:
BreakpointTable(QWidget* parent, const char* name);
~BreakpointTable();
void setDebugger(KDebugger* deb) { m_debugger = deb; }
protected:
KDebugger* m_debugger;
QLineEdit m_bpEdit;
QListView m_list;
QPushButton m_btAddBP;
QPushButton m_btAddWP;
QPushButton m_btRemove;
QPushButton m_btEnaDis;
QPushButton m_btViewCode;
QPushButton m_btConditional;
QHBoxLayout m_layout;
QVBoxLayout m_listandedit;
QVBoxLayout m_buttons;
QValueVector<QPixmap> m_icons;
void insertBreakpoint(int num, bool temp, bool enabled, QString location,
QString fileName = 0, int lineNo = -1,
int hits = 0, uint ignoreCount = 0,
QString condition = QString());
void initListAndIcons();
virtual bool eventFilter(QObject* ob, QEvent* ev);
friend class BreakpointItem;
signals:
/**
* This signal is emitted when the user wants to go to the source code
* where the current breakpoint is in.
*
* @param file specifies the file; this is not necessarily a full path
* name, and if it is relative, you won't know relative to what, you
* can only guess.
* @param lineNo specifies the line number (0-based!).
* @param address specifies the exact address of the breakpoint.
*/
void activateFileLine(const QString& file, int lineNo, const DbgAddr& address);
public slots:
virtual void addBP();
virtual void addWP();
virtual void removeBP();
virtual void enadisBP();
virtual void viewBP();
virtual void conditionalBP();
void updateUI();
void updateBreakList();
};
#endif // BRKPT_H

@ -0,0 +1,14 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#ifndef COMMANDIDS_H
#define COMMANDIDS_H
// statusbar ids
#define ID_STATUS_MSG 191
#define ID_STATUS_BUSY 192
#define ID_STATUS_ACTIVE 193
#endif // COMMANDIDS_H

@ -0,0 +1,527 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#include "dbgdriver.h"
#include "exprwnd.h"
#include <qstringlist.h>
#include <ctype.h>
#include <stdlib.h> /* strtol, atoi */
#include <algorithm>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "mydebug.h"
#include <assert.h>
DebuggerDriver::DebuggerDriver() :
KProcess(),
m_state(DSidle),
m_output(0),
m_outputLen(0),
m_outputAlloc(0),
m_activeCmd(0),
m_promptMinLen(0),
m_promptLastChar('\0')
{
m_outputAlloc = 4000;
m_output = new char[m_outputAlloc];
m_prompt[0] = '\0';
// Derived classes can set either m_prompt or m_promptRE.
// If m_promptRE is set, it must include the '$' at the end.
// m_promptLastChar and m_promptMinLen must also be set.
// debugger process
connect(this, SIGNAL(receivedStdout(KProcess*,char*,int)),
SLOT(slotReceiveOutput(KProcess*,char*,int)));
connect(this, SIGNAL(wroteStdin(KProcess*)), SLOT(slotCommandRead(KProcess*)));
connect(this, SIGNAL(processExited(KProcess*)), SLOT(slotExited(KProcess*)));
}
DebuggerDriver::~DebuggerDriver()
{
delete[] m_output;
flushHiPriQueue();
flushLoPriQueue();
}
int DebuggerDriver::commSetupDoneC()
{
TRACE(__PRETTY_FUNCTION__);
if (!KProcess::commSetupDoneC())
return 0;
close(STDERR_FILENO);
return dup2(STDOUT_FILENO, STDERR_FILENO) != -1;
}
bool DebuggerDriver::startup(QString cmdStr)
{
// clear command queues
delete m_activeCmd;
m_activeCmd = 0;
flushHiPriQueue();
flushLoPriQueue();
m_state = DSidle;
// debugger executable
if (cmdStr.isEmpty())
cmdStr = defaultInvocation();
QStringList cmd = QStringList::split(' ', cmdStr);
clearArguments();
for (QStringList::iterator i = cmd.begin(); i != cmd.end(); ++i) {
*this << *i;
}
if (!start(KProcess::NotifyOnExit,
KProcess::Communication(KProcess::Stdin|KProcess::Stdout))) {
return false;
}
// open log file
if (!m_logFile.isOpen() && !m_logFileName.isEmpty()) {
m_logFile.setName(m_logFileName);
m_logFile.open(IO_WriteOnly);
}
// these must be set by derived classes in their constructor
assert(m_promptMinLen > 0); // _must_ have a prompt
assert(m_promptLastChar != '\0'); // last char _must_ be fixed
assert(m_prompt[0] == '\0' || strlen(m_prompt) == m_promptMinLen);
// either a prompt or a regexp
assert(m_prompt[0] != '\0' && m_promptMinLen < sizeof(m_prompt) ||
!m_promptRE.isEmpty() && m_promptRE.isValid());
return true;
}
void DebuggerDriver::slotExited(KProcess*)
{
static const char txt[] = "\n====== debugger exited ======\n";
if (m_logFile.isOpen()) {
m_logFile.writeBlock(txt,sizeof(txt)-1);
}
// reset state
m_state = DSidle;
// empty buffer
m_outputLen = 0;
*m_output = '\0';
}
CmdQueueItem* DebuggerDriver::executeCmdString(DbgCommand cmd,
QString cmdString, bool clearLow)
{
// place a new command into the high-priority queue
CmdQueueItem* cmdItem = new CmdQueueItem(cmd, cmdString);
m_hipriCmdQueue.push(cmdItem);
if (clearLow) {
if (m_state == DSrunningLow) {
// take the liberty to interrupt the running command
m_state = DSinterrupted;
kill(SIGINT);
ASSERT(m_activeCmd != 0);
TRACE(QString().sprintf("interrupted the command %d",
(m_activeCmd ? m_activeCmd->m_cmd : -1)));
delete m_activeCmd;
m_activeCmd = 0;
}
flushLoPriQueue();
}
// if gdb is idle, send it the command
if (m_state == DSidle) {
ASSERT(m_activeCmd == 0);
writeCommand();
}
return cmdItem;
}
bool CmdQueueItem::IsEqualCmd::operator()(CmdQueueItem* cmd) const
{
return cmd->m_cmd == m_cmd && cmd->m_cmdString == m_str;
}
CmdQueueItem* DebuggerDriver::queueCmdString(DbgCommand cmd,
QString cmdString, QueueMode mode)
{
// place a new command into the low-priority queue
std::list<CmdQueueItem*>::iterator i;
CmdQueueItem* cmdItem = 0;
switch (mode) {
case QMoverrideMoreEqual:
case QMoverride:
// check whether gdb is currently processing this command
if (m_activeCmd != 0 &&
m_activeCmd->m_cmd == cmd && m_activeCmd->m_cmdString == cmdString)
{
return m_activeCmd;
}
// check whether there is already the same command in the queue
i = find_if(m_lopriCmdQueue.begin(), m_lopriCmdQueue.end(), CmdQueueItem::IsEqualCmd(cmd, cmdString));
if (i != m_lopriCmdQueue.end()) {
// found one
cmdItem = *i;
if (mode == QMoverrideMoreEqual) {
// All commands are equal, but some are more equal than others...
// put this command in front of all others
m_lopriCmdQueue.erase(i);
m_lopriCmdQueue.push_front(cmdItem);
}
break;
} // else none found, so add it
// drop through
case QMnormal:
cmdItem = new CmdQueueItem(cmd, cmdString);
m_lopriCmdQueue.push_back(cmdItem);
}
// if gdb is idle, send it the command
if (m_state == DSidle) {
ASSERT(m_activeCmd == 0);
writeCommand();
}
return cmdItem;
}
// dequeue a pending command, make it the active one and send it to gdb
void DebuggerDriver::writeCommand()
{
// ASSERT(m_activeCmd == 0);
assert(m_activeCmd == 0);
// first check the high-priority queue - only if it is empty
// use a low-priority command.
CmdQueueItem* cmd;
DebuggerState newState = DScommandSent;
if (!m_hipriCmdQueue.empty()) {
cmd = m_hipriCmdQueue.front();
m_hipriCmdQueue.pop();
} else if (!m_lopriCmdQueue.empty()) {
cmd = m_lopriCmdQueue.front();
m_lopriCmdQueue.pop_front();
newState = DScommandSentLow;
} else {
// nothing to do
m_state = DSidle; /* is necessary if command was interrupted earlier */
return;
}
m_activeCmd = cmd;
TRACE("in writeCommand: " + cmd->m_cmdString);
const char* str = cmd->m_cmdString;
writeStdin(const_cast<char*>(str), cmd->m_cmdString.length());
// write also to log file
if (m_logFile.isOpen()) {
m_logFile.writeBlock(str, cmd->m_cmdString.length());
m_logFile.flush();
}
m_state = newState;
}
void DebuggerDriver::flushLoPriQueue()
{
while (!m_lopriCmdQueue.empty()) {
delete m_lopriCmdQueue.back();
m_lopriCmdQueue.pop_back();
}
}
void DebuggerDriver::flushHiPriQueue()
{
while (!m_hipriCmdQueue.empty()) {
delete m_hipriCmdQueue.front();
m_hipriCmdQueue.pop();
}
}
void DebuggerDriver::flushCommands(bool hipriOnly)
{
flushHiPriQueue();
if (!hipriOnly) {
flushLoPriQueue();
}
}
void DebuggerDriver::slotCommandRead(KProcess*)
{
TRACE(__PRETTY_FUNCTION__);
// there must be an active command which is not yet commited
ASSERT(m_state == DScommandSent || m_state == DScommandSentLow);
ASSERT(m_activeCmd != 0);
ASSERT(!m_activeCmd->m_committed);
// commit the command
m_activeCmd->m_committed = true;
// now the debugger is officially working on the command
m_state = m_state == DScommandSent ? DSrunning : DSrunningLow;
// set the flag that reflects whether the program is really running
switch (m_activeCmd->m_cmd) {
case DCrun: case DCcont: case DCnext: case DCstep: case DCfinish: case DCuntil:
emit inferiorRunning();
break;
default:
break;
}
// re-receive delayed output
while (!m_delayedOutput.empty()) {
QByteArray delayed = m_delayedOutput.front();
m_delayedOutput.pop();
slotReceiveOutput(0, const_cast<char*>(delayed.data()), delayed.size());
}
}
void DebuggerDriver::slotReceiveOutput(KProcess*, char* buffer, int buflen)
{
/*
* The debugger should be running (processing a command) at this point.
* If it is not, it is still idle because we haven't received the
* wroteStdin signal yet, in which case there must be an active command
* which is not commited.
*/
if (m_state == DScommandSent || m_state == DScommandSentLow) {
ASSERT(m_activeCmd != 0);
ASSERT(!m_activeCmd->m_committed);
/*
* We received output before we got signal wroteStdin. Collect this
* output, it will be re-sent by commandRead when it gets the
* acknowledgment for the uncommitted command.
*/
m_delayedOutput.push(QByteArray().duplicate(buffer, buflen));
return;
}
// write to log file (do not log delayed output - it would appear twice)
if (m_logFile.isOpen()) {
m_logFile.writeBlock(buffer, buflen);
m_logFile.flush();
}
/*
* gdb sometimes produces stray output while it's idle. This happens if
* it receives a signal, most prominently a SIGCONT after a SIGTSTP:
* The user haltet kdbg with Ctrl-Z, then continues it with "fg", which
* also continues gdb, which repeats the prompt!
*/
if (m_activeCmd == 0 && m_state != DSinterrupted) {
// ignore the output
TRACE("ignoring stray output: " + QString::fromLatin1(buffer, buflen));
return;
}
ASSERT(m_state == DSrunning || m_state == DSrunningLow || m_state == DSinterrupted);
ASSERT(m_activeCmd != 0 || m_state == DSinterrupted);
// collect output until next prompt string is found
// accumulate it
if (m_outputLen + buflen >= m_outputAlloc) {
/*
* Must enlarge m_output: double it. Note: That particular
* sequence of commandes here ensures exception safety.
*/
int newSize = m_outputAlloc * 2;
char* newBuf = new char[newSize];
memcpy(newBuf, m_output, m_outputLen);
delete[] m_output;
m_output = newBuf;
m_outputAlloc = newSize;
}
memcpy(m_output+m_outputLen, buffer, buflen);
m_outputLen += buflen;
m_output[m_outputLen] = '\0';
/*
* If there's a prompt string in the collected output, it must be at
* the very end. In order to quickly find out whether there is a prompt
* string, we check whether the last character of m_output is identical
* to the last character of the prompt string. Only if it is, we check
* for the full prompt string.
*
* Note: Using the regular expression here is most expensive, because
* it translates m_output to a QString each time.
*
* Note: It could nevertheless happen that a character sequence that is
* equal to the prompt string appears at the end of the output,
* although it is very, very unlikely (namely as part of a string that
* lingered in gdb's output buffer due to some timing/heavy load
* conditions for a very long time such that that buffer overflowed
* exactly at the end of the prompt string look-a-like).
*/
int promptStart = -1;
if (m_output[m_outputLen-1] == m_promptLastChar &&
m_outputLen >= m_promptMinLen)
{
// this is a candidate for a prompt at the end,
// now see if there really is
if (m_prompt[0] != '\0') {
if (strncmp(m_output+m_outputLen-m_promptMinLen,
m_prompt, m_promptMinLen) == 0)
{
promptStart = m_outputLen-m_promptMinLen;
}
} else {
QString output = QString::fromLatin1(m_output, m_outputLen);
#if QT_VERSION >= 300
promptStart = m_promptRE.search(output);
#else
promptStart = m_promptRE.match(output);
#endif
}
}
if (promptStart >= 0)
{
// found prompt!
// terminate output before the prompt
m_output[promptStart] = '\0';
/*
* We've got output for the active command. But if it was
* interrupted, ignore it.
*/
if (m_state != DSinterrupted) {
/*
* m_state shouldn't be DSidle while we are parsing the output
* so that all commands produced by parse() go into the queue
* instead of being written to gdb immediately.
*/
ASSERT(m_state != DSidle);
CmdQueueItem* cmd = m_activeCmd;
m_activeCmd = 0;
commandFinished(cmd);
delete cmd;
}
// empty buffer
m_outputLen = 0;
*m_output = '\0';
// also clear delayed output if interrupted
if (m_state == DSinterrupted) {
m_delayedOutput = std::queue<QByteArray>();
}
/*
* We parsed some output successfully. Unless there's more delayed
* output, the debugger must be idle now, so send down the next
* command.
*/
if (m_delayedOutput.empty()) {
if (m_hipriCmdQueue.empty() && m_lopriCmdQueue.empty()) {
// no pending commands
m_state = DSidle;
emit enterIdleState();
} else {
writeCommand();
}
}
}
}
void DebuggerDriver::dequeueCmdByVar(VarTree* var)
{
if (var == 0)
return;
std::list<CmdQueueItem*>::iterator i = m_lopriCmdQueue.begin();
while (i != m_lopriCmdQueue.end()) {
if ((*i)->m_expr != 0 && var->isAncestorEq((*i)->m_expr)) {
// this is indeed a critical command; delete it
TRACE("removing critical lopri-cmd: " + (*i)->m_cmdString);
delete *i;
m_lopriCmdQueue.erase(i++);
} else
++i;
}
}
QString DebuggerDriver::editableValue(VarTree* value)
{
// by default, let the user edit what is visible
return value->value();
}
StackFrame::~StackFrame()
{
delete var;
}
DbgAddr::DbgAddr(const QString& aa) :
a(aa)
{
cleanAddr();
}
/*
* We strip off the leading 0x and any leading zeros.
*/
void DbgAddr::cleanAddr()
{
if (a.isEmpty())
return;
while (a[0] == '0' || a[0] == 'x') {
a.remove(0, 1);
}
}
void DbgAddr::operator=(const QString& aa)
{
a = aa;
fnoffs = QString();
cleanAddr();
}
/* Re-attach 0x in front of the address */
QString DbgAddr::asString() const
{
if (a.isEmpty())
return QString();
else
return "0x" + a;
}
bool operator==(const DbgAddr& a1, const DbgAddr& a2)
{
return QString::compare(a1.a, a2.a) == 0;
}
bool operator>(const DbgAddr& a1, const DbgAddr& a2)
{
if (a1.a.length() > a2.a.length())
return true;
if (a1.a.length() < a2.a.length())
return false;
return QString::compare(a1.a, a2.a) > 0;
}
Breakpoint::Breakpoint() :
id(0),
type(breakpoint),
temporary(false),
enabled(true),
ignoreCount(0),
hitCount(0),
lineNo(0)
{ }
#include "dbgdriver.moc"

@ -0,0 +1,622 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#ifndef DBGDRIVER_H
#define DBGDRIVER_H
#include <qfile.h>
#include <qregexp.h>
#include <qcstring.h>
#include <kprocess.h>
#include <queue>
#include <list>
class VarTree;
class ExprValue;
class ExprWnd;
class KDebugger;
class QStringList;
/**
* A type representing an address.
*/
struct DbgAddr
{
QString a;
QString fnoffs;
DbgAddr() { }
DbgAddr(const QString& aa);
DbgAddr(const DbgAddr& src) : a(src.a), fnoffs(src.fnoffs) { }
void operator=(const QString& aa);
void operator=(const DbgAddr& src) { a = src.a; fnoffs = src.fnoffs; }
QString asString() const;
bool isEmpty() const { return a.isEmpty(); }
protected:
void cleanAddr();
};
bool operator==(const DbgAddr& a1, const DbgAddr& a2);
bool operator>(const DbgAddr& a1, const DbgAddr& a2);
enum DbgCommand {
DCinitialize,
DCtty,
DCexecutable,
DCtargetremote,
DCcorefile,
DCattach,
DCinfolinemain,
DCinfolocals,
DCinforegisters,
DCexamine,
DCinfoline,
DCdisassemble,
DCsetargs,
DCsetenv,
DCunsetenv,
DCsetoption, /* debugger options */
DCcd,
DCbt,
DCrun,
DCcont,
DCstep,
DCstepi,
DCnext,
DCnexti,
DCfinish,
DCuntil, /* line number is zero-based! */
DCkill,
DCbreaktext,
DCbreakline, /* line number is zero-based! */
DCtbreakline, /* line number is zero-based! */
DCbreakaddr,
DCtbreakaddr,
DCwatchpoint,
DCdelete,
DCenable,
DCdisable,
DCprint,
DCprintDeref,
DCprintStruct,
DCprintQStringStruct,
DCframe,
DCfindType,
DCinfosharedlib,
DCthread,
DCinfothreads,
DCinfobreak,
DCcondition,
DCsetpc,
DCignore,
DCprintWChar,
DCsetvariable
};
enum RunDevNull {
RDNstdin = 0x1, /* redirect stdin to /dev/null */
RDNstdout = 0x2, /* redirect stdout to /dev/null */
RDNstderr = 0x4 /* redirect stderr to /dev/null */
};
/**
* How the memory dump is formated. The lowest 4 bits define the size of
* the entities. The higher bits define how these are formatted. Note that
* not all combinations make sense.
*/
enum MemoryDumpType {
// sizes
MDTbyte = 0x1,
MDThalfword = 0x2,
MDTword = 0x3,
MDTgiantword = 0x4,
MDTsizemask = 0xf,
// formats
MDThex = 0x10,
MDTsigned = 0x20,
MDTunsigned = 0x30,
MDToctal = 0x40,
MDTbinary = 0x50,
MDTaddress = 0x60,
MDTchar = 0x70,
MDTfloat = 0x80,
MDTstring = 0x90,
MDTinsn = 0xa0,
MDTformatmask = 0xf0
};
struct Breakpoint;
/**
* Debugger commands are placed in a queue. Only one command at a time is
* sent down to the debugger. All other commands in the queue are retained
* until the sent command has been processed by gdb. The debugger tells us
* that it's done with the command by sending the prompt. The output of the
* debugger is parsed at that time. Then, if more commands are in the
* queue, the next one is sent to the debugger.
*/
struct CmdQueueItem
{
DbgCommand m_cmd;
QString m_cmdString;
bool m_committed; /* just a debugging aid */
// remember which expression when printing an expression
VarTree* m_expr;
ExprWnd* m_exprWnd;
// remember file position
QString m_fileName;
int m_lineNo;
// the breakpoint info
Breakpoint* m_brkpt;
int m_existingBrkpt;
// whether command was emitted due to direct user request (only set when relevant)
bool m_byUser;
CmdQueueItem(DbgCommand cmd, const QString& str) :
m_cmd(cmd),
m_cmdString(str),
m_committed(false),
m_expr(0),
m_exprWnd(0),
m_lineNo(0),
m_brkpt(0),
m_existingBrkpt(0),
m_byUser(false)
{ }
struct IsEqualCmd
{
IsEqualCmd(DbgCommand cmd, const QString& str) : m_cmd(cmd), m_str(str) { }
bool operator()(CmdQueueItem*) const;
DbgCommand m_cmd;
const QString& m_str;
};
};
/**
* The information about a breakpoint that is parsed from the list of
* breakpoints.
*/
struct Breakpoint
{
int id; /* gdb's number */
enum Type {
breakpoint, watchpoint
} type;
bool temporary;
bool enabled;
QString location;
QString text; /* text if set using DCbreaktext */
DbgAddr address; /* exact address of breakpoint */
QString condition; /* condition as printed by gdb */
int ignoreCount; /* ignore next that may hits */
int hitCount; /* as reported by gdb */
// the following items repeat the location, but in a better usable way
QString fileName;
int lineNo; /* zero-based line number */
Breakpoint();
bool isOrphaned() const { return id < 0; }
};
/**
* Information about a stack frame.
*/
struct FrameInfo
{
QString fileName;
int lineNo; /* zero-based line number */
DbgAddr address; /* exact address of PC */
};
/**
* The information about a stack frame as parsed from the backtrace.
*/
struct StackFrame : FrameInfo
{
int frameNo;
ExprValue* var; /* more information if non-zero */
StackFrame() : var(0) { }
~StackFrame();
};
/**
* The information about a thread as parsed from the threads list.
*/
struct ThreadInfo : FrameInfo
{
int id; /* gdb's number */
QString threadName; /* the SYSTAG */
QString function; /* where thread is halted */
bool hasFocus; /* the thread whose stack we are watching */
};
/**
* Register information
*/
struct RegisterInfo
{
QString regName;
QString rawValue;
QString cookedValue; /* may be empty */
QString type; /* of vector register if not empty */
};
/**
* Disassembled code
*/
struct DisassembledCode
{
DbgAddr address;
QString code;
};
/**
* Memory contents
*/
struct MemoryDump
{
DbgAddr address;
QString dump;
};
/**
* This is an abstract base class for debugger process.
*
* This class represents the debugger program. It provides the low-level
* interface to the commandline debugger. As such it implements the
* commands and parses the output.
*/
class DebuggerDriver : public KProcess
{
Q_OBJECT
public:
DebuggerDriver();
virtual ~DebuggerDriver() = 0;
virtual QString driverName() const = 0;
/**
* Returns the default command string to invoke the debugger driver.
*/
virtual QString defaultInvocation() const = 0;
/**
* Returns a list of options that can be turned on and off.
*/
virtual QStringList boolOptionList() const = 0;
virtual bool startup(QString cmdStr);
void setLogFileName(const QString& fname) { m_logFileName = fname; }
protected:
QString m_runCmd;
enum DebuggerState {
DSidle, /* gdb waits for input */
DSinterrupted, /* a command was interrupted */
DSrunningLow, /* gdb is running a low-priority command */
DSrunning, /* gdb waits for program */
DScommandSent, /* command has been sent, we wait for wroteStdin signal */
DScommandSentLow /* low-prioritycommand has been sent */
};
DebuggerState m_state;
public:
bool isIdle() const { return m_state == DSidle; }
/**
* Tells whether a high prority command would be executed immediately.
*/
bool canExecuteImmediately() const { return m_hipriCmdQueue.empty(); }
protected:
char* m_output; /* normal gdb output */
size_t m_outputLen; /* amount of data so far accumulated in m_output */
size_t m_outputAlloc; /* space available in m_output */
std::queue<QByteArray> m_delayedOutput; /* output colleced while we have receivedOutput */
/* but before signal wroteStdin arrived */
public:
/**
* Enqueues a high-priority command. High-priority commands are
* executed before any low-priority commands. No user interaction is
* possible as long as there is a high-priority command in the queue.
*/
virtual CmdQueueItem* executeCmd(DbgCommand,
bool clearLow = false) = 0;
virtual CmdQueueItem* executeCmd(DbgCommand, QString strArg,
bool clearLow = false) = 0;
virtual CmdQueueItem* executeCmd(DbgCommand, int intArg,
bool clearLow = false) = 0;
virtual CmdQueueItem* executeCmd(DbgCommand, QString strArg, int intArg,
bool clearLow = false) = 0;
virtual CmdQueueItem* executeCmd(DbgCommand, QString strArg1, QString strArg2,
bool clearLow = false) = 0;
virtual CmdQueueItem* executeCmd(DbgCommand, int intArg1, int intArg2,
bool clearLow = false) = 0;
enum QueueMode {
QMnormal, /* queues the command last */
QMoverride, /* removes an already queued command */
QMoverrideMoreEqual /* ditto, also puts the command first in the queue */
};
/**
* Enqueues a low-priority command. Low-priority commands are executed
* after any high-priority commands.
*/
virtual CmdQueueItem* queueCmd(DbgCommand,
QueueMode mode) = 0;
virtual CmdQueueItem* queueCmd(DbgCommand, QString strArg,
QueueMode mode) = 0;
virtual CmdQueueItem* queueCmd(DbgCommand, int intArg,
QueueMode mode) = 0;
virtual CmdQueueItem* queueCmd(DbgCommand, QString strArg, int intArg,
QueueMode mode) = 0;
virtual CmdQueueItem* queueCmd(DbgCommand, QString strArg1, QString strArg2,
QueueMode mode) = 0;
/**
* Flushes the command queues.
* @param hipriOnly if true, only the high priority queue is flushed.
*/
virtual void flushCommands(bool hipriOnly = false);
/**
* Terminates the debugger process.
*/
virtual void terminate() = 0;
/**
* Terminates the debugger process, but also detaches any program that
* it has been attached to.
*/
virtual void detachAndTerminate() = 0;
/**
* Interrupts the debuggee.
*/
virtual void interruptInferior() = 0;
/**
* Specifies the command that prints the QString data.
*/
virtual void setPrintQStringDataCmd(const char* cmd) = 0;
/**
* Parses the output as an array of QChars.
*/
virtual ExprValue* parseQCharArray(const char* output, bool wantErrorValue, bool qt3like) = 0;
/**
* Parses a back-trace (the output of the DCbt command).
*/
virtual void parseBackTrace(const char* output, std::list<StackFrame>& stack) = 0;
/**
* Parses the output of the DCframe command;
* @param frameNo Returns the frame number.
* @param file Returns the source file name.
* @param lineNo The zero-based line number.
* @param address Returns the exact address.
* @return false if the frame could not be parsed successfully. The
* output values are undefined in this case.
*/
virtual bool parseFrameChange(const char* output, int& frameNo,
QString& file, int& lineNo, DbgAddr& address) = 0;
/**
* Parses a list of breakpoints.
* @param output The output of the debugger.
* @param brks The list of new #Breakpoint objects. The list
* must initially be empty.
* @return False if there was an error before the first breakpoint
* was found. Even if true is returned, #brks may be empty.
*/
virtual bool parseBreakList(const char* output, std::list<Breakpoint>& brks) = 0;
/**
* Parses a list of threads.
* @param output The output of the debugger.
* @return The new thread list. There is no indication if there was
* a parse error.
*/
virtual std::list<ThreadInfo> parseThreadList(const char* output) = 0;
/**
* Parses the output when the program stops to see whether this it
* stopped due to a breakpoint.
* @param output The output of the debugger.
* @param id Returns the breakpoint id.
* @param file Returns the file name in which the breakpoint is.
* @param lineNo Returns the zero-based line number of the breakpoint.
* @param address Returns the address of the breakpoint.
* @return False if there was no breakpoint.
*/
virtual bool parseBreakpoint(const char* output, int& id,
QString& file, int& lineNo, QString& address) = 0;
/**
* Parses the output of the DCinfolocals command.
* @param output The output of the debugger.
* @param newVars Receives the parsed variable values. The values are
* simply append()ed to the supplied list.
*/
virtual void parseLocals(const char* output, std::list<ExprValue*>& newVars) = 0;
/**
* Parses the output of a DCprint or DCprintStruct command.
* @param output The output of the debugger.
* @param wantErrorValue Specifies whether the error message should be
* provided as the value of a NKplain variable. If this is false,
* 0 is returned if the printed value is an error message.
* @return the parsed value. It is 0 if there was a parse error
* or if the output is an error message and #wantErrorValue
* is \c false. The returned object's text() is undefined.
*/
virtual ExprValue* parsePrintExpr(const char* output, bool wantErrorValue) = 0;
/**
* Parses the output of the DCcd command.
* @return false if the message is an error message.
*/
virtual bool parseChangeWD(const char* output, QString& message) = 0;
/**
* Parses the output of the DCexecutable command.
* @return false if an error occured.
*/
virtual bool parseChangeExecutable(const char* output, QString& message) = 0;
/**
* Parses the output of the DCcorefile command.
* @return false if the core file was not loaded successfully.
*/
virtual bool parseCoreFile(const char* output) = 0;
enum StopFlags {
SFrefreshSource = 1, /* refresh of source code is needed */
SFrefreshBreak = 2, /* refresh breakpoints */
SFrefreshThreads = 4, /* refresh thread list */
SFprogramActive = 128 /* program remains active */
};
/**
* Parses the output of commands that execute (a piece of) the program.
* @return The inclusive OR of zero or more of the StopFlags.
*/
virtual uint parseProgramStopped(const char* output, QString& message) = 0;
/**
* Parses the output of the DCsharedlibs command.
*/
virtual QStringList parseSharedLibs(const char* output) = 0;
/**
* Parses the output of the DCfindType command.
* @return true if a type was found.
*/
virtual bool parseFindType(const char* output, QString& type) = 0;
/**
* Parses the output of the DCinforegisters command.
*/
virtual std::list<RegisterInfo> parseRegisters(const char* output) = 0;
/**
* Parses the output of the DCinfoline command. Returns false if the
* two addresses could not be found.
*/
virtual bool parseInfoLine(const char* output,
QString& addrFrom, QString& addrTo) = 0;
/**
* Parses the ouput of the DCdisassemble command.
*/
virtual std::list<DisassembledCode> parseDisassemble(const char* output) = 0;
/**
* Parses a memory dump. Returns an empty string if no error was found;
* otherwise it contains an error message.
*/
virtual QString parseMemoryDump(const char* output, std::list<MemoryDump>& memdump) = 0;
/**
* Parses the output of the DCsetvariable command. Returns an empty
* string if no error was found; otherwise it contains an error
* message.
*/
virtual QString parseSetVariable(const char* output) = 0;
/**
* Returns a value that the user can edit.
*/
virtual QString editableValue(VarTree* value);
protected:
/** Removes all commands from the low-priority queue. */
void flushLoPriQueue();
/** Removes all commands from the high-priority queue. */
void flushHiPriQueue();
std::queue<CmdQueueItem*> m_hipriCmdQueue;
std::list<CmdQueueItem*> m_lopriCmdQueue;
/**
* The active command is kept separately from other pending commands.
*/
CmdQueueItem* m_activeCmd;
/**
* Helper function that queues the given command string in the
* low-priority queue.
*/
CmdQueueItem* queueCmdString(DbgCommand cmd, QString cmdString,
QueueMode mode);
/**
* Helper function that queues the given command string in the
* high-priority queue.
*/
CmdQueueItem* executeCmdString(DbgCommand cmd, QString cmdString,
bool clearLow);
void writeCommand();
virtual void commandFinished(CmdQueueItem* cmd) = 0;
protected:
/** @internal */
virtual int commSetupDoneC();
char m_prompt[10];
size_t m_promptMinLen;
char m_promptLastChar;
QRegExp m_promptRE;
// log file
QString m_logFileName;
QFile m_logFile;
public slots:
void dequeueCmdByVar(VarTree* var);
protected slots:
virtual void slotReceiveOutput(KProcess*, char* buffer, int buflen);
virtual void slotCommandRead(KProcess*);
virtual void slotExited(KProcess*);
signals:
/**
* This signal is emitted when the output of a command has been fully
* collected and is ready to be interpreted.
*/
void commandReceived(CmdQueueItem* cmd, const char* output);
/**
* This signal is emitted when the debugger recognizes that a specific
* location in a file ought to be displayed.
*
* Gdb's --fullname option supports this for the step, next, frame, and
* run commands (and possibly others).
*
* @param file specifies the file; this is not necessarily a full path
* name, and if it is relative, you won't know relative to what, you
* can only guess.
* @param lineNo specifies the line number (0-based!) (this may be
* negative, in which case the file should be activated, but the line
* should NOT be changed).
* @param address specifies the exact address of the PC or is empty.
*/
void activateFileLine(const QString& file, int lineNo, const DbgAddr& address);
/**
* This signal is emitted when a command that starts the inferior has
* been submitted to the debugger.
*/
void inferiorRunning();
/**
* This signal is emitted when all output from the debugger has been
* consumed and no more commands are in the queues.
*/
void enterIdleState();
};
#endif // DBGDRIVER_H

@ -0,0 +1,876 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#include <kapplication.h>
#include <klocale.h> /* i18n */
#include <kmessagebox.h>
#include <kconfig.h>
#include <kstatusbar.h>
#include <kiconloader.h>
#include <kstdaccel.h>
#include <kstdaction.h>
#include <kaction.h>
#include <kpopupmenu.h>
#include <kfiledialog.h>
#include <kprocess.h>
#include <kkeydialog.h>
#include <kanimwidget.h>
#include <kwin.h>
#include <qlistbox.h>
#include <qfileinfo.h>
#include "dbgmainwnd.h"
#include "debugger.h"
#include "commandids.h"
#include "winstack.h"
#include "brkpt.h"
#include "threadlist.h"
#include "memwindow.h"
#include "ttywnd.h"
#include "procattach.h"
#include "dbgdriver.h"
#include "mydebug.h"
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
DebuggerMainWnd::DebuggerMainWnd(const char* name) :
KDockMainWindow(0, name),
DebuggerMainWndBase()
{
QPixmap p;
KDockWidget* dw0 = createDockWidget("Source", p, 0, i18n("Source"));
m_filesWindow = new WinStack(dw0, "files");
dw0->setWidget(m_filesWindow);
dw0->setDockSite(KDockWidget::DockCorner);
dw0->setEnableDocking(KDockWidget::DockNone);
setView(dw0);
setMainDockWidget(dw0);
KDockWidget* dw1 = createDockWidget("Stack", p, 0, i18n("Stack"));
m_btWindow = new QListBox(dw1, "backtrace");
dw1->setWidget(m_btWindow);
KDockWidget* dw2 = createDockWidget("Locals", p, 0, i18n("Locals"));
m_localVariables = new ExprWnd(dw2, i18n("Variable"), "locals");
dw2->setWidget(m_localVariables);
KDockWidget* dw3 = createDockWidget("Watches", p, 0, i18n("Watches"));
m_watches = new WatchWindow(dw3, "watches");
dw3->setWidget(m_watches);
KDockWidget* dw4 = createDockWidget("Registers", p, 0, i18n("Registers"));
m_registers = new RegisterView(dw4, "registers");
dw4->setWidget(m_registers);
KDockWidget* dw5 = createDockWidget("Breakpoints", p, 0, i18n("Breakpoints"));
m_bpTable = new BreakpointTable(dw5, "breakpoints");
dw5->setWidget(m_bpTable);
KDockWidget* dw6 = createDockWidget("Output", p, 0, i18n("Output"));
m_ttyWindow = new TTYWindow(dw6, "output");
dw6->setWidget(m_ttyWindow);
KDockWidget* dw7 = createDockWidget("Threads", p, 0, i18n("Threads"));
m_threads = new ThreadList(dw7, "threads");
dw7->setWidget(m_threads);
KDockWidget* dw8 = createDockWidget("Memory", p, 0, i18n("Memory"));
m_memoryWindow = new MemoryWindow(dw8, "memory");
dw8->setWidget(m_memoryWindow);
setupDebugger(this, m_localVariables, m_watches->watchVariables(), m_btWindow);
m_bpTable->setDebugger(m_debugger);
m_memoryWindow->setDebugger(m_debugger);
setStandardToolBarMenuEnabled(true);
initKAction();
initToolbar(); // kind of obsolete?
connect(m_watches, SIGNAL(addWatch()), SLOT(slotAddWatch()));
connect(m_watches, SIGNAL(deleteWatch()), m_debugger, SLOT(slotDeleteWatch()));
connect(m_watches, SIGNAL(textDropped(const QString&)), SLOT(slotAddWatch(const QString&)));
connect(&m_filesWindow->m_findDlg, SIGNAL(closed()), SLOT(updateUI()));
connect(m_filesWindow, SIGNAL(newFileLoaded()),
SLOT(slotNewFileLoaded()));
connect(m_filesWindow, SIGNAL(toggleBreak(const QString&,int,const DbgAddr&,bool)),
this, SLOT(slotToggleBreak(const QString&,int,const DbgAddr&,bool)));
connect(m_filesWindow, SIGNAL(enadisBreak(const QString&,int,const DbgAddr&)),
this, SLOT(slotEnaDisBreak(const QString&,int,const DbgAddr&)));
connect(m_debugger, SIGNAL(activateFileLine(const QString&,int,const DbgAddr&)),
m_filesWindow, SLOT(activate(const QString&,int,const DbgAddr&)));
connect(m_debugger, SIGNAL(executableUpdated()),
m_filesWindow, SLOT(reloadAllFiles()));
connect(m_debugger, SIGNAL(updatePC(const QString&,int,const DbgAddr&,int)),
m_filesWindow, SLOT(updatePC(const QString&,int,const DbgAddr&,int)));
// value popup communication
connect(m_filesWindow, SIGNAL(initiateValuePopup(const QString&)),
m_debugger, SLOT(slotValuePopup(const QString&)));
connect(m_debugger, SIGNAL(valuePopup(const QString&)),
m_filesWindow, SLOT(slotShowValueTip(const QString&)));
// disassembling
connect(m_filesWindow, SIGNAL(disassemble(const QString&, int)),
m_debugger, SLOT(slotDisassemble(const QString&, int)));
connect(m_debugger, SIGNAL(disassembled(const QString&,int,const std::list<DisassembledCode>&)),
m_filesWindow, SLOT(slotDisassembled(const QString&,int,const std::list<DisassembledCode>&)));
connect(m_filesWindow, SIGNAL(moveProgramCounter(const QString&,int,const DbgAddr&)),
m_debugger, SLOT(setProgramCounter(const QString&,int,const DbgAddr&)));
// program stopped
connect(m_debugger, SIGNAL(programStopped()), SLOT(slotProgramStopped()));
connect(&m_backTimer, SIGNAL(timeout()), SLOT(slotBackTimer()));
// tab width
connect(this, SIGNAL(setTabWidth(int)), m_filesWindow, SIGNAL(setTabWidth(int)));
// connect breakpoint table
connect(m_bpTable, SIGNAL(activateFileLine(const QString&,int,const DbgAddr&)),
m_filesWindow, SLOT(activate(const QString&,int,const DbgAddr&)));
connect(m_debugger, SIGNAL(updateUI()), m_bpTable, SLOT(updateUI()));
connect(m_debugger, SIGNAL(breakpointsChanged()), m_bpTable, SLOT(updateBreakList()));
connect(m_debugger, SIGNAL(breakpointsChanged()), m_bpTable, SLOT(updateUI()));
connect(m_debugger, SIGNAL(registersChanged(const std::list<RegisterInfo>&)),
m_registers, SLOT(updateRegisters(const std::list<RegisterInfo>&)));
connect(m_debugger, SIGNAL(memoryDumpChanged(const QString&, const std::list<MemoryDump>&)),
m_memoryWindow, SLOT(slotNewMemoryDump(const QString&, const std::list<MemoryDump>&)));
connect(m_debugger, SIGNAL(saveProgramSpecific(KConfigBase*)),
m_memoryWindow, SLOT(saveProgramSpecific(KConfigBase*)));
connect(m_debugger, SIGNAL(restoreProgramSpecific(KConfigBase*)),
m_memoryWindow, SLOT(restoreProgramSpecific(KConfigBase*)));
// thread window
connect(m_debugger, SIGNAL(threadsChanged(const std::list<ThreadInfo>&)),
m_threads, SLOT(updateThreads(const std::list<ThreadInfo>&)));
connect(m_threads, SIGNAL(setThread(int)),
m_debugger, SLOT(setThread(int)));
// view menu changes when docking state changes
connect(dockManager, SIGNAL(change()), SLOT(updateUI()));
// popup menu of the local variables window
connect(m_localVariables, SIGNAL(contextMenuRequested(QListViewItem*, const QPoint&, int)),
this, SLOT(slotLocalsPopup(QListViewItem*, const QPoint&)));
restoreSettings(kapp->config());
updateUI();
m_bpTable->updateUI();
}
DebuggerMainWnd::~DebuggerMainWnd()
{
saveSettings(kapp->config());
// must delete m_debugger early since it references our windows
delete m_debugger;
m_debugger = 0;
delete m_memoryWindow;
delete m_threads;
delete m_ttyWindow;
delete m_bpTable;
delete m_registers;
delete m_watches;
delete m_localVariables;
delete m_btWindow;
delete m_filesWindow;
}
void DebuggerMainWnd::initKAction()
{
// file menu
KAction* open = KStdAction::open(this, SLOT(slotFileOpen()),
actionCollection());
open->setText(i18n("&Open Source..."));
KStdAction::close(m_filesWindow, SLOT(slotClose()), actionCollection());
(void)new KAction(i18n("&Reload Source"), "reload", 0, m_filesWindow,
SLOT(slotFileReload()), actionCollection(),
"file_reload");
(void)new KAction(i18n("&Executable..."), "execopen", 0, this,
SLOT(slotFileExe()), actionCollection(),
"file_executable");
m_recentExecAction = new KRecentFilesAction(i18n("Recent E&xecutables"), 0,
this, SLOT(slotRecentExec(const KURL&)),
actionCollection(), "file_executable_recent");
(void)new KAction(i18n("&Core dump..."), 0, this, SLOT(slotFileCore()),
actionCollection(), "file_core_dump");
KStdAction::quit(kapp, SLOT(closeAllWindows()), actionCollection());
// settings menu
(void)new KAction(i18n("This &Program..."), 0, this,
SLOT(slotFileProgSettings()), actionCollection(),
"settings_program");
(void)new KAction(i18n("&Global Options..."), 0, this,
SLOT(slotFileGlobalSettings()), actionCollection(),
"settings_global");
KStdAction::keyBindings(this, SLOT(slotConfigureKeys()), actionCollection());
KStdAction::showStatusbar(this, SLOT(slotViewStatusbar()), actionCollection());
// view menu
(void)new KToggleAction(i18n("&Find"), "find", CTRL+Key_F, m_filesWindow,
SLOT(slotViewFind()), actionCollection(),
"view_find");
(void)KStdAction::findNext(m_filesWindow, SLOT(slotFindForward()), actionCollection(), "view_findnext");
(void)KStdAction::findPrev(m_filesWindow, SLOT(slotFindBackward()), actionCollection(), "view_findprev");
i18n("Source &code");
struct { QString text; QWidget* w; QString id; } dw[] = {
{ i18n("Stac&k"), m_btWindow, "view_stack"},
{ i18n("&Locals"), m_localVariables, "view_locals"},
{ i18n("&Watched expressions"), m_watches, "view_watched_expressions"},
{ i18n("&Registers"), m_registers, "view_registers"},
{ i18n("&Breakpoints"), m_bpTable, "view_breakpoints"},
{ i18n("T&hreads"), m_threads, "view_threads"},
{ i18n("&Output"), m_ttyWindow, "view_output"},
{ i18n("&Memory"), m_memoryWindow, "view_memory"}
};
for (unsigned i = 0; i < sizeof(dw)/sizeof(dw[0]); i++) {
KDockWidget* d = dockParent(dw[i].w);
(void)new KToggleAction(dw[i].text, 0, d, SLOT(changeHideShowState()),
actionCollection(), dw[i].id);
}
// execution menu
KAction* a = new KAction(i18n("&Run"), "pgmrun", Key_F5, m_debugger,
SLOT(programRun()), actionCollection(), "exec_run");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
a = new KAction(i18n("Step &into"), "pgmstep", Key_F8, m_debugger,
SLOT(programStep()), actionCollection(),
"exec_step_into");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
a = new KAction(i18n("Step &over"), "pgmnext", Key_F10, m_debugger,
SLOT(programNext()), actionCollection(),
"exec_step_over");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
a = new KAction(i18n("Step o&ut"), "pgmfinish", Key_F6, m_debugger,
SLOT(programFinish()), actionCollection(),
"exec_step_out");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
a = new KAction(i18n("Run to &cursor"), Key_F7, this,
SLOT(slotExecUntil()), actionCollection(),
"exec_run_to_cursor");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
a = new KAction(i18n("Step i&nto by instruction"), "pgmstepi",
SHIFT+Key_F8, m_debugger, SLOT(programStepi()),
actionCollection(), "exec_step_into_by_insn");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
a = new KAction(i18n("Step o&ver by instruction"), "pgmnexti",
SHIFT+Key_F10, m_debugger, SLOT(programNexti()),
actionCollection(), "exec_step_over_by_insn");
connect(a, SIGNAL(activated()), this, SLOT(intoBackground()));
(void)new KAction(i18n("&Program counter to current line"), 0,
m_filesWindow, SLOT(slotMoveProgramCounter()),
actionCollection(), "exec_movepc");
(void)new KAction(i18n("&Break"), 0, m_debugger,
SLOT(programBreak()), actionCollection(),
"exec_break");
(void)new KAction(i18n("&Kill"), 0, m_debugger,
SLOT(programKill()), actionCollection(),
"exec_kill");
(void)new KAction(i18n("Re&start"), 0, m_debugger,
SLOT(programRunAgain()), actionCollection(),
"exec_restart");
(void)new KAction(i18n("A&ttach..."), 0, this,
SLOT(slotExecAttach()), actionCollection(),
"exec_attach");
(void)new KAction(i18n("&Arguments..."), 0, this,
SLOT(slotExecArgs()), actionCollection(),
"exec_arguments");
// breakpoint menu
(void)new KAction(i18n("Set/Clear &breakpoint"), "brkpt", Key_F9,
m_filesWindow, SLOT(slotBrkptSet()), actionCollection(),
"breakpoint_set");
(void)new KAction(i18n("Set &temporary breakpoint"), SHIFT+Key_F9,
m_filesWindow, SLOT(slotBrkptSetTemp()), actionCollection(),
"breakpoint_set_temporary");
(void)new KAction(i18n("&Enable/Disable breakpoint"), CTRL+Key_F9,
m_filesWindow, SLOT(slotBrkptEnable()), actionCollection(),
"breakpoint_enable");
// only in popup menus
(void)new KAction(i18n("Watch Expression"), 0, this,
SLOT(slotLocalsToWatch()), actionCollection(),
"watch_expression");
(void)new KAction(i18n("Edit Value"), Key_F2, this,
SLOT(slotEditValue()), actionCollection(),
"edit_value");
// all actions force an UI update
QValueList<KAction*> actions = actionCollection()->actions();
QValueList<KAction*>::Iterator it = actions.begin();
for (; it != actions.end(); ++it) {
connect(*it, SIGNAL(activated()), this, SLOT(updateUI()));
}
createGUI("kdbgui.rc");
}
void DebuggerMainWnd::initToolbar()
{
KToolBar* toolbar = toolBar("mainToolBar");
toolbar->insertAnimatedWidget(ID_STATUS_BUSY,
actionCollection()->action("exec_break"), SLOT(activate()),
"pulse", -1);
toolbar->alignItemRight(ID_STATUS_BUSY, true);
m_animRunning = false;
KStatusBar* statusbar = statusBar();
statusbar->insertItem(m_statusActive, ID_STATUS_ACTIVE);
m_lastActiveStatusText = m_statusActive;
statusbar->insertItem("", ID_STATUS_MSG); /* message pane */
// reserve some translations
i18n("Restart");
i18n("Core dump");
}
bool DebuggerMainWnd::queryClose()
{
if (m_debugger != 0) {
m_debugger->shutdown();
}
return true;
}
// instance properties
void DebuggerMainWnd::saveProperties(KConfig* config)
{
// session management
QString executable = "";
if (m_debugger != 0) {
executable = m_debugger->executable();
}
config->writeEntry("executable", executable);
}
void DebuggerMainWnd::readProperties(KConfig* config)
{
// session management
QString execName = config->readEntry("executable");
TRACE("readProperties: executable=" + execName);
if (!execName.isEmpty()) {
debugProgram(execName, "");
}
}
const char WindowGroup[] = "Windows";
const char RecentExecutables[] = "RecentExecutables";
const char LastSession[] = "LastSession";
void DebuggerMainWnd::saveSettings(KConfig* config)
{
KConfigGroupSaver g(config, WindowGroup);
writeDockConfig(config);
fixDockConfig(config, false); // downgrade
m_recentExecAction->saveEntries(config, RecentExecutables);
KConfigGroupSaver g2(config, LastSession);
config->writeEntry("Width0Locals", m_localVariables->columnWidth(0));
config->writeEntry("Width0Watches", m_watches->columnWidth(0));
DebuggerMainWndBase::saveSettings(config);
}
void DebuggerMainWnd::restoreSettings(KConfig* config)
{
KConfigGroupSaver g(config, WindowGroup);
fixDockConfig(config, true); // upgrade
readDockConfig(config);
// Workaround bug #87787: KDockManager stores the titles of the KDockWidgets
// in the config files, although they are localized:
// If the user changes the language, the titles remain in the previous language.
struct { QString text; QWidget* w; } dw[] = {
{ i18n("Stack"), m_btWindow },
{ i18n("Locals"), m_localVariables },
{ i18n("Watches"), m_watches },
{ i18n("Registers"), m_registers },
{ i18n("Breakpoints"), m_bpTable },
{ i18n("Threads"), m_threads },
{ i18n("Output"), m_ttyWindow },
{ i18n("Memory"), m_memoryWindow }
};
for (int i = 0; i < int(sizeof(dw)/sizeof(dw[0])); i++)
{
KDockWidget* w = dockParent(dw[i].w);
w->setTabPageLabel(dw[i].text);
// this actually changes the captions in the tabs:
QEvent ev(QEvent::CaptionChange);
w->event(&ev);
}
m_recentExecAction->loadEntries(config, RecentExecutables);
KConfigGroupSaver g2(config, LastSession);
int w;
w = config->readNumEntry("Width0Locals", -1);
if (w >= 0 && w < 30000)
m_localVariables->setColumnWidth(0, w);
w = config->readNumEntry("Width0Watches", -1);
if (w >= 0 && w < 30000)
m_watches->setColumnWidth(0, w);
DebuggerMainWndBase::restoreSettings(config);
emit setTabWidth(m_tabWidth);
}
void DebuggerMainWnd::updateUI()
{
KToggleAction* viewFind =
static_cast<KToggleAction*>(actionCollection()->action("view_find"));
viewFind->setChecked(m_filesWindow->m_findDlg.isVisible());
viewFind->setEnabled(m_filesWindow->hasWindows());
actionCollection()->action("breakpoint_set")->setEnabled(m_debugger->canChangeBreakpoints());
actionCollection()->action("breakpoint_set_temporary")->setEnabled(m_debugger->canChangeBreakpoints());
actionCollection()->action("breakpoint_enable")->setEnabled(m_debugger->canChangeBreakpoints());
dockUpdateHelper("view_breakpoints", m_bpTable);
dockUpdateHelper("view_stack", m_btWindow);
dockUpdateHelper("view_locals", m_localVariables);
dockUpdateHelper("view_watched_expressions", m_watches);
dockUpdateHelper("view_registers", m_registers);
dockUpdateHelper("view_threads", m_threads);
dockUpdateHelper("view_memory", m_memoryWindow);
dockUpdateHelper("view_output", m_ttyWindow);
// AB: maybe in mainwndbase.cpp?
actionCollection()->action("file_executable")->setEnabled(m_debugger->isIdle());
actionCollection()->action("settings_program")->setEnabled(m_debugger->haveExecutable());
actionCollection()->action("file_core_dump")->setEnabled(m_debugger->canStart());
actionCollection()->action("file_close")->setEnabled(m_filesWindow->hasWindows());
actionCollection()->action("file_reload")->setEnabled(m_filesWindow->hasWindows());
actionCollection()->action("exec_step_into")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_step_into_by_insn")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_step_over")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_step_over_by_insn")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_step_out")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_run_to_cursor")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_movepc")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_restart")->setEnabled(m_debugger->canSingleStep());
actionCollection()->action("exec_attach")->setEnabled(m_debugger->isReady());
actionCollection()->action("exec_run")->setEnabled(m_debugger->canStart() || m_debugger->canSingleStep());
actionCollection()->action("exec_kill")->setEnabled(m_debugger->haveExecutable() && m_debugger->isProgramActive());
actionCollection()->action("exec_break")->setEnabled(m_debugger->isProgramRunning());
actionCollection()->action("exec_arguments")->setEnabled(m_debugger->haveExecutable());
actionCollection()->action("edit_value")->setEnabled(m_debugger->canSingleStep());
// animation
KAnimWidget* w = toolBar("mainToolBar")->animatedWidget(ID_STATUS_BUSY);
if (m_debugger->isIdle()) {
if (m_animRunning) {
w->stop();
m_animRunning = false;
}
} else {
if (!m_animRunning) {
w->start();
m_animRunning = true;
}
}
// update statusbar
QString newStatus;
if (m_debugger->isProgramActive())
newStatus = m_statusActive;
if (newStatus != m_lastActiveStatusText) {
statusBar()->changeItem(newStatus, ID_STATUS_ACTIVE);
m_lastActiveStatusText = newStatus;
}
}
void DebuggerMainWnd::dockUpdateHelper(QString action, QWidget* w)
{
KToggleAction* item =
static_cast<KToggleAction*>(actionCollection()->action(action));
bool canChange = canChangeDockVisibility(w);
item->setEnabled(canChange);
item->setChecked(canChange && isDockVisible(w));
}
void DebuggerMainWnd::updateLineItems()
{
m_filesWindow->updateLineItems(m_debugger);
}
void DebuggerMainWnd::slotAddWatch()
{
if (m_debugger != 0) {
QString t = m_watches->watchText();
m_debugger->addWatch(t);
}
}
void DebuggerMainWnd::slotAddWatch(const QString& text)
{
if (m_debugger != 0) {
m_debugger->addWatch(text);
}
}
void DebuggerMainWnd::slotNewFileLoaded()
{
// updates program counter in the new file
if (m_debugger != 0)
m_filesWindow->updateLineItems(m_debugger);
}
KDockWidget* DebuggerMainWnd::dockParent(QWidget* w)
{
while ((w = w->parentWidget()) != 0) {
if (w->isA("KDockWidget"))
return static_cast<KDockWidget*>(w);
}
return 0;
}
bool DebuggerMainWnd::isDockVisible(QWidget* w)
{
KDockWidget* d = dockParent(w);
return d != 0 && d->mayBeHide();
}
bool DebuggerMainWnd::canChangeDockVisibility(QWidget* w)
{
KDockWidget* d = dockParent(w);
return d != 0 && (d->mayBeHide() || d->mayBeShow());
}
// upgrades the entries from version 0.0.4 to 0.0.5 and back
void DebuggerMainWnd::fixDockConfig(KConfig* c, bool upgrade)
{
static const char dockGroup[] = "dock_setting_default";
if (!c->hasGroup(dockGroup))
return;
static const char oldVersion[] = "0.0.4";
static const char newVersion[] = "0.0.5";
const char* from = upgrade ? oldVersion : newVersion;
const char* to = upgrade ? newVersion : oldVersion;
QMap<QString,QString> e = c->entryMap(dockGroup);
if (e["Version"] != from)
return;
KConfigGroupSaver g(c, dockGroup);
c->writeEntry("Version", to);
TRACE(upgrade ? "upgrading dockconfig" : "downgrading dockconfig");
// turn all orientation entries from 0 to 1 and from 1 to 0
QMap<QString,QString>::Iterator i;
for (i = e.begin(); i != e.end(); ++i)
{
if (i.key().right(12) == ":orientation") {
TRACE("upgrading " + i.key() + " old value: " + *i);
int orientation = c->readNumEntry(i.key(), -1);
if (orientation >= 0) { // paranoia
c->writeEntry(i.key(), 1 - orientation);
}
}
}
}
TTYWindow* DebuggerMainWnd::ttyWindow()
{
return m_ttyWindow;
}
bool DebuggerMainWnd::debugProgram(const QString& exe, const QString& lang)
{
// check the file name
QFileInfo fi(exe);
bool success = fi.isFile();
if (!success)
{
QString msg = i18n("`%1' is not a file or does not exist");
KMessageBox::sorry(this, msg.arg(exe));
}
else
{
success = DebuggerMainWndBase::debugProgram(fi.absFilePath(), lang, this);
}
if (success)
{
m_recentExecAction->addURL(KURL(fi.absFilePath()));
// keep the directory
m_lastDirectory = fi.dirPath(true);
m_filesWindow->setExtraDirectory(m_lastDirectory);
// set caption to basename part of executable
QString caption = fi.fileName();
setCaption(caption);
}
else
{
m_recentExecAction->removeURL(KURL(fi.absFilePath()));
}
return success;
}
void DebuggerMainWnd::slotNewStatusMsg()
{
newStatusMsg(statusBar());
}
void DebuggerMainWnd::slotFileGlobalSettings()
{
int oldTabWidth = m_tabWidth;
doGlobalOptions(this);
if (m_tabWidth != oldTabWidth) {
emit setTabWidth(m_tabWidth);
}
}
void DebuggerMainWnd::slotDebuggerStarting()
{
DebuggerMainWndBase::slotDebuggerStarting();
}
void DebuggerMainWnd::slotToggleBreak(const QString& fileName, int lineNo,
const DbgAddr& address, bool temp)
{
// lineNo is zero-based
if (m_debugger != 0) {
m_debugger->setBreakpoint(fileName, lineNo, address, temp);
}
}
void DebuggerMainWnd::slotEnaDisBreak(const QString& fileName, int lineNo,
const DbgAddr& address)
{
// lineNo is zero-based
if (m_debugger != 0) {
m_debugger->enableDisableBreakpoint(fileName, lineNo, address);
}
}
QString DebuggerMainWnd::createOutputWindow()
{
QString tty = DebuggerMainWndBase::createOutputWindow();
if (!tty.isEmpty()) {
connect(m_outputTermProc, SIGNAL(processExited(KProcess*)),
SLOT(slotTermEmuExited()));
}
return tty;
}
void DebuggerMainWnd::slotTermEmuExited()
{
shutdownTermWindow();
}
void DebuggerMainWnd::slotProgramStopped()
{
// when the program stopped, move the window to the foreground
if (m_popForeground) {
// unfortunately, this requires quite some force to work :-(
KWin::raiseWindow(winId());
KWin::forceActiveWindow(winId());
}
m_backTimer.stop();
}
void DebuggerMainWnd::intoBackground()
{
if (m_popForeground) {
m_backTimer.start(m_backTimeout, true); /* single-shot */
}
}
void DebuggerMainWnd::slotBackTimer()
{
lower();
}
void DebuggerMainWnd::slotRecentExec(const KURL& url)
{
QString exe = url.path();
debugProgram(exe, "");
}
QString DebuggerMainWnd::makeSourceFilter()
{
QString f;
f = m_sourceFilter + " " + m_headerFilter + i18n("|All source files\n");
f += m_sourceFilter + i18n("|Source files\n");
f += m_headerFilter + i18n("|Header files\n");
f += i18n("*|All files");
return f;
}
/*
* Pop up the context menu in the locals window
*/
void DebuggerMainWnd::slotLocalsPopup(QListViewItem*, const QPoint& pt)
{
QPopupMenu* popup =
static_cast<QPopupMenu*>(factory()->container("popup_locals", this));
if (popup == 0) {
return;
}
if (popup->isVisible()) {
popup->hide();
} else {
popup->popup(pt);
}
}
/*
* Copies the currently selected item to the watch window.
*/
void DebuggerMainWnd::slotLocalsToWatch()
{
VarTree* item = m_localVariables->selectedItem();
if (item != 0 && m_debugger != 0) {
QString text = item->computeExpr();
m_debugger->addWatch(text);
}
}
/*
* Starts editing a value in a value display
*/
void DebuggerMainWnd::slotEditValue()
{
// does one of the value trees have the focus
QWidget* f = kapp->focusWidget();
ExprWnd* wnd;
if (f == m_localVariables) {
wnd = m_localVariables;
} else if (f == m_watches->watchVariables()) {
wnd = m_watches->watchVariables();
} else {
return;
}
if (m_localVariables->isEditing() ||
m_watches->watchVariables()->isEditing())
{
return; /* don't edit twice */
}
VarTree* expr = wnd->currentItem();
if (expr != 0 && m_debugger != 0 && m_debugger->canSingleStep())
{
TRACE("edit value");
// determine the text to edit
QString text = m_debugger->driver()->editableValue(expr);
wnd->editValue(expr, text);
}
}
void DebuggerMainWnd::slotFileOpen()
{
// start browsing in the active file's directory
// fall back to last used directory (executable)
QString dir = m_lastDirectory;
QString fileName = m_filesWindow->activeFileName();
if (!fileName.isEmpty()) {
QFileInfo fi(fileName);
dir = fi.dirPath();
}
fileName = myGetFileName(i18n("Open"),
dir,
makeSourceFilter(), this);
if (!fileName.isEmpty())
{
QFileInfo fi(fileName);
m_lastDirectory = fi.dirPath();
m_filesWindow->setExtraDirectory(m_lastDirectory);
m_filesWindow->activateFile(fileName);
}
}
void DebuggerMainWnd::slotFileExe()
{
if (m_debugger->isIdle())
{
// open a new executable
QString executable = myGetFileName(i18n("Select the executable to debug"),
m_lastDirectory, 0, this);
if (executable.isEmpty())
return;
debugProgram(executable, "");
}
}
void DebuggerMainWnd::slotFileCore()
{
if (m_debugger->canStart())
{
QString corefile = myGetFileName(i18n("Select core dump"),
m_lastDirectory, 0, this);
if (!corefile.isEmpty()) {
m_debugger->useCoreFile(corefile, false);
}
}
}
void DebuggerMainWnd::slotFileProgSettings()
{
if (m_debugger != 0) {
m_debugger->programSettings(this);
}
}
void DebuggerMainWnd::slotViewStatusbar()
{
if (statusBar()->isVisible())
statusBar()->hide();
else
statusBar()->show();
setSettingsDirty();
}
void DebuggerMainWnd::slotExecUntil()
{
if (m_debugger != 0)
{
QString file;
int lineNo;
if (m_filesWindow->activeLine(file, lineNo))
m_debugger->runUntil(file, lineNo);
}
}
void DebuggerMainWnd::slotExecAttach()
{
#ifdef PS_COMMAND
ProcAttachPS dlg(this);
// seed filter with executable name
QFileInfo fi = m_debugger->executable();
dlg.filterEdit->setText(fi.fileName());
#else
ProcAttach dlg(this);
dlg.setText(m_debugger->attachedPid());
#endif
if (dlg.exec()) {
m_debugger->attachProgram(dlg.text());
}
}
void DebuggerMainWnd::slotExecArgs()
{
if (m_debugger != 0) {
m_debugger->programArgs(this);
}
}
void DebuggerMainWnd::slotConfigureKeys()
{
KKeyDialog::configure(actionCollection(), this);
}
#include "dbgmainwnd.moc"

@ -0,0 +1,113 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#ifndef DBGMAINWND_H
#define DBGMAINWND_H
#include <qtimer.h>
#include <kdockwidget.h>
#include "mainwndbase.h"
#include "regwnd.h"
class KRecentFilesAction;
class WinStack;
class QListBox;
class QCString;
class ExprWnd;
class BreakpointTable;
class ThreadList;
class MemoryWindow;
struct DbgAddr;
class DebuggerMainWnd : public KDockMainWindow, public DebuggerMainWndBase
{
Q_OBJECT
public:
DebuggerMainWnd(const char* name);
~DebuggerMainWnd();
bool debugProgram(const QString& exe, const QString& lang);
protected:
// session properties
virtual void saveProperties(KConfig*);
virtual void readProperties(KConfig*);
// settings
void saveSettings(KConfig*);
void restoreSettings(KConfig*);
void initToolbar();
void initKAction();
// view windows
WinStack* m_filesWindow;
QListBox* m_btWindow;
ExprWnd* m_localVariables;
WatchWindow* m_watches;
RegisterView* m_registers;
BreakpointTable* m_bpTable;
TTYWindow* m_ttyWindow;
ThreadList* m_threads;
MemoryWindow* m_memoryWindow;
QTimer m_backTimer;
// recent execs in File menu
KRecentFilesAction* m_recentExecAction;
protected:
virtual bool queryClose();
virtual TTYWindow* ttyWindow();
virtual QString createOutputWindow();
KDockWidget* dockParent(QWidget* w);
bool isDockVisible(QWidget* w);
bool canChangeDockVisibility(QWidget* w);
void dockUpdateHelper(QString action, QWidget* w);
void fixDockConfig(KConfig* c, bool upgrade);
QString makeSourceFilter();
// to avoid flicker when the status bar is updated,
// we store the last string that we put there
QString m_lastActiveStatusText;
bool m_animRunning;
signals:
void setTabWidth(int tabWidth);
public slots:
virtual void updateUI();
virtual void updateLineItems();
void slotAddWatch();
void slotAddWatch(const QString& text);
void slotNewFileLoaded();
void slotNewStatusMsg();
void slotDebuggerStarting();
void slotToggleBreak(const QString&, int, const DbgAddr&, bool);
void slotEnaDisBreak(const QString&, int, const DbgAddr&);
void slotTermEmuExited();
void slotProgramStopped();
void slotBackTimer();
void slotRecentExec(const KURL& url);
void slotLocalsPopup(QListViewItem*, const QPoint& pt);
void slotLocalsToWatch();
void slotEditValue();
void slotFileOpen();
void slotFileExe();
void slotFileCore();
void slotFileGlobalSettings();
void slotFileProgSettings();
void slotViewStatusbar();
void slotExecUntil();
void slotExecAttach();
void slotExecArgs();
void intoBackground();
void slotConfigureKeys();
};
#endif // DBGMAINWND_H

File diff suppressed because it is too large Load Diff

@ -0,0 +1,556 @@
/*
* Copyright Johannes Sixt
* This file is licensed under the GNU General Public License Version 2.
* See the file COPYING in the toplevel directory of the source directory.
*/
#ifndef DEBUGGER_H
#define DEBUGGER_H
#include <qtimer.h>
#include <qdict.h>
#include <qstringlist.h>
#include "envvar.h"
#include "exprwnd.h" /* some compilers require this */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
class ExprWnd;
class VarTree;
struct ExprValue;
class ProgramTypeTable;
class KTreeViewItem;
class KConfig;
class KConfigBase;
class ProgramConfig;
class QListBox;
class RegisterInfo;
class ThreadInfo;
class DebuggerDriver;
class CmdQueueItem;
class Breakpoint;
struct DisassembledCode;
struct MemoryDump;
struct DbgAddr;
class KProcess;
class KDebugger : public QObject
{
Q_OBJECT
public:
KDebugger(QWidget* parent, /* will be used as the parent for dialogs */
ExprWnd* localVars,
ExprWnd* watchVars,
QListBox* backtrace);
~KDebugger();
/**
* This function starts to debug the specified executable using the
* specified driver. If a program is currently being debugged, it is
* terminated first. Ownership of driver is taken if and only if
* true is returned.
*
* @return false if an error occurs.
*/
bool debugProgram(const QString& executable,
DebuggerDriver* driver);
/**
* Uses the specified core to debug the active program.
* @param batch tells whether the core file was given on the
* command line.
*/
void useCoreFile(QString corefile, bool batch);
/**
* Overrides the program argument in the per-program config
* with a new value.
*/
void overrideProgramArguments(const QString& args);
/**
* Uses the specified pid to attach to the active program.
*/
void setAttachPid(const QString& pid);
/**
* Attaches to the specified process and debugs it.
*/
void attachProgram(const QString& pid);
/**
* Returns the file name of the per-program config file for the
* specified program.
*/
static QString getConfigForExe(const QString& exe);
/**
* The driver name entry in the per-program config file.
*/
static const char DriverNameEntry[];
public slots:
/**
* Runs the program or continues it if it is stopped at a breakpoint.
*/
void programRun();
/**
* Restarts the debuggee.
*/
void programRunAgain();
/**
* Performs a single-step, possibly stepping into a function call.
* If byInsn is true, a step by instruction is performed.
*/
void programStep();
/**
* Performs a single-step, stepping over a function call.
* If byInsn is true, a step by instruction is performed.
*/
void programNext();
/**
* Performs a single-step by instruction, possibly stepping into a
* function call.
*/
void programStepi();
/**
* Performs a single-step by instruction, stepping over a function
* call.
*/
void programNexti();
/**
* Runs the program until it returns from the current function.
*/
void programFinish();
/**
* Kills the program (removes it from memory).
*/
void programKill();
/**
* Interrupts the program if it is currently running.
*/
void programBreak();
/**
* Moves the program counter to the specified line.
* If an address is given, it is moved to the address.
*/
void setProgramCounter(const QString&, int, const DbgAddr&);
public:
/**
* Queries the user for program arguments.
*/
void programArgs(QWidget* parent);
/**
* Queries the user for program settings: Debugger command, terminal
* emulator.
*/
void programSettings(QWidget* parent);
/**
* Setup remote debugging device
*/
void setRemoteDevice(const QString& remoteDevice) { m_remoteDevice = remoteDevice; }
/**
* Run the debuggee until the specified line in the specified file is
* reached.
*
* @return false if the command was not executed, e.g. because the
* debuggee is running at the moment.
*/
bool runUntil(const QString& fileName, int lineNo);
/**
* Set a breakpoint.
*
* @param fileName The source file in which to set the breakpoint.
* @param lineNo The zero-based line number.
* @param address The exact address of the breakpoint.
* @param temporary Specifies whether this is a temporary breakpoint
* @return false if the command was not executed, e.g. because the
* debuggee is running at the moment.
*/
bool setBreakpoint(QString fileName, int lineNo,
const DbgAddr& address, bool temporary);
/**
* Set a breakpoint.
*
* @param bp Describes the breakpoint.
* @param queueOnly If false, the breakpoint is set using a high-priority command.
*/
void setBreakpoint(Breakpoint* bp, bool queueOnly);
/**
* Enable or disable a breakpoint at the specified location.
*
* @param fileName The source file in which the breakpoint is.
* @param lineNo The zero-based line number.
* @param address The exact address of the breakpoint.
* @return false if the command was not executed, e.g. because the
* debuggee is running at the moment.
*/
bool enableDisableBreakpoint(QString fileName, int lineNo,
const DbgAddr& address);
/**
* Enables or disables the specified breakpoint.
*
* @return false if the command was not executed, e.g. because the
* debuggee is running at the moment.
*/
bool enableDisableBreakpoint(int id)
{ return enableDisableBreakpoint(breakpointById(id)); }
/**
* Removes the specified breakpoint. Note that if bp is an orphaned
* breakpoint, then bp is an invalid pointer if (and only if) this
* function returns true.
*
* @return false if the command was not executed, e.g. because the
* debuggee is running at the moment.
*/
bool deleteBreakpoint(int id)
{ return deleteBreakpoint(breakpointById(id)); }
/**
* Changes the specified breakpoint's condition and ignore count.
*
* @return false if the command was not executed, e.g. because the
* debuggee is running at the moment.
*/
bool conditionalBreakpoint(int id,
const QString& condition,
int ignoreCount)
{ return conditionalBreakpoint(breakpointById(id), condition, ignoreCount); }
/**
* Tells whether one of the single stepping commands can be invoked
* (step, next, finish, until, also run).
*/
bool canSingleStep();
/**
* Tells whether a breakpoints can be set, deleted, enabled, or disabled.
*/
bool canChangeBreakpoints();
/**
* Tells whether a the program is loaded, but not active.
*/
bool canStart();
/**
* Add a watch expression.
*/
void addWatch(const QString& expr);
/**
* Retrieves the current status message.
*/
const QString& statusMessage() const { return m_statusMessage; }
/**
* Is the debugger ready to receive another high-priority command?
*/
bool isReady() const;
/**
* Is the debuggee running (not just active)?
*/
bool isProgramRunning() { return m_haveExecutable && m_programRunning; }
/**
* Do we have an executable set?
*/
bool haveExecutable() { return m_haveExecutable; }
/**
* Is the debuggee active, i.e. was it started by the debugger?
*/
bool isProgramActive() { return m_programActive; }
/**
* Is the debugger driver idle?
*/
bool isIdle() const;
/* The list of breakpoints. */
typedef std::list<Breakpoint>::const_iterator BrkptROIterator;
BrkptROIterator breakpointsBegin() const { return m_brkpts.begin(); }
BrkptROIterator breakpointsEnd() const { return m_brkpts.end(); }
const QString& executable() const { return m_executable; }
/**
* Terminal emulation level.
*/
enum TTYLevel {
ttyNone = 0, /* ignore output, input triggers EOF */
ttySimpleOutputOnly = 1, /* minmal output emulation, input triggers EOF */
ttyFull = 7 /* program needs full emulation */
};
/**
* Returns the level of terminal emulation requested by the inferior.
*/
TTYLevel ttyLevel() const { return m_ttyLevel; }
/** Sets the terminal that is to be used by the debugger. */
void setTerminal(const QString& term) { m_inferiorTerminal = term; }
/** Returns the debugger driver. */
DebuggerDriver* driver() { return m_d; }
/** Returns the pid that the debugger is currently attached to. */
const QString& attachedPid() const { return m_attachedPid; }
/**
* The memory at that the expression evaluates to is watched. Can be
* empty. Triggers a redisplay even if the expression did not change.
*/
void setMemoryExpression(const QString& memexpr);
/**
* Sets how the watched memory location is displayed.
* Call setMemoryExpression() to force a redisplay.
*/
void setMemoryFormat(unsigned format) { m_memoryFormat = format; }
// settings
void saveSettings(KConfig*);
void restoreSettings(KConfig*);
protected:
QString m_inferiorTerminal;
QString m_debuggerCmd; /* per-program setting */
TTYLevel m_ttyLevel; /* level of terminal emulation */
bool startDriver();
void stopDriver();
void writeCommand();
QStringList m_watchEvalExpr; /* exprs to evaluate for watch window */
std::list<Breakpoint> m_brkpts;
QString m_memoryExpression; /* memory location to watch */
unsigned m_memoryFormat; /* how that output should look */
protected slots:
void parse(CmdQueueItem* cmd, const char* output);
protected:
void handleRunCommands(const char* output);
void updateAllExprs();
void updateProgEnvironment(const QString& args, const QString& wd,
const QDict<EnvVar>& newVars,
const QStringList& newOptions);
void parseLocals(const char* output, std::list<ExprValue*>& newVars);
void handleLocals(const char* output);
bool handlePrint(CmdQueueItem* cmd, const char* output);
bool handlePrintDeref(CmdQueueItem* cmd, const char* output);
void handleBacktrace(const char* output);
void handleFrameChange(const char* output);
void handleFindType(CmdQueueItem* cmd, const char* output);
void handlePrintStruct(CmdQueueItem* cmd, const char* output);
void handleSharedLibs(const char* output);
void handleRegisters(const char* output);
void handleMemoryDump(const char* output);
void handleInfoLine(CmdQueueItem* cmd, const char* output);
void handleDisassemble(CmdQueueItem* cmd, const char* output);
void handleThreadList(const char* output);
void handleSetPC(const char* output);
void handleSetVariable(CmdQueueItem* cmd, const char* output);
void evalExpressions();
void evalInitialStructExpression(VarTree* var, ExprWnd* wnd, bool immediate);
void evalStructExpression(VarTree* var, ExprWnd* wnd, bool immediate);
void dereferencePointer(ExprWnd* wnd, VarTree* var, bool immediate);
void determineType(ExprWnd* wnd, VarTree* var);
void queueMemoryDump(bool immediate);
CmdQueueItem* loadCoreFile();
void openProgramConfig(const QString& name);
typedef std::list<Breakpoint>::iterator BrkptIterator;
BrkptIterator breakpointByFilePos(QString file, int lineNo,
const DbgAddr& address);
BrkptIterator breakpointById(int id);
CmdQueueItem* executeBreakpoint(const Breakpoint* bp, bool queueOnly);
void newBreakpoint(CmdQueueItem* cmd, const char* output);
void updateBreakList(const char* output);
bool stopMayChangeBreakList() const;
void saveBreakpoints(ProgramConfig* config);
void restoreBreakpoints(ProgramConfig* config);
bool enableDisableBreakpoint(BrkptIterator bp);
bool deleteBreakpoint(BrkptIterator bp);
bool conditionalBreakpoint(BrkptIterator bp,
const QString& condition,
int ignoreCount);
bool m_haveExecutable; /* has an executable been specified */
bool m_programActive; /* is the program active (possibly halting in a brkpt)? */
bool m_programRunning; /* is the program executing (not stopped)? */
bool m_sharedLibsListed; /* do we know the shared libraries loaded by the prog? */
QString m_executable;
QString m_corefile;
QString m_attachedPid; /* user input of attaching to pid */
QString m_programArgs;
QString m_remoteDevice;
QString m_programWD; /* working directory of gdb */
QDict<EnvVar> m_envVars; /* environment variables set by user */
QStringList m_boolOptions; /* boolean options */
QStringList m_sharedLibs; /* shared libraries used by program */
ProgramTypeTable* m_typeTable; /* known types used by the program */
ProgramConfig* m_programConfig; /* program-specific settings (brkpts etc) */
void saveProgramSettings();
void restoreProgramSettings();
QString readDebuggerCmd();
// debugger process
DebuggerDriver* m_d;
bool m_explicitKill; /* whether we are killing gdb ourselves */
QString m_statusMessage;
protected slots:
void gdbExited(KProcess*);
void slotInferiorRunning();
void backgroundUpdate();
void gotoFrame(int);
void slotExpanding(QListViewItem*);
void slotDeleteWatch();
void slotValuePopup(const QString&);
void slotDisassemble(const QString&, int);
void slotValueEdited(VarTree*, const QString&);
public slots:
void setThread(int);
void shutdown();
signals:
/**
* This signal is emitted before the debugger is started. The slot is
* supposed to set up m_inferiorTerminal.
*/
void debuggerStarting();
/**
* This signal is emitted whenever a part of the debugger needs to
* highlight the specfied source code line (e.g. when the program
* stops).
*
* @param file specifies the file; this is not necessarily a full path
* name, and if it is relative, you won't know relative to what, you
* can only guess.
* @param lineNo specifies the line number (0-based!) (this may be
* negative, in which case the file should be activated, but the line
* should NOT be changed).
* @param address specifies the exact address of the PC or is empty.
*/
void activateFileLine(const QString& file, int lineNo, const DbgAddr& address);
/**
* This signal indicates that the program counter has changed.
*
* @param filename specifies the filename where the program stopped
* @param lineNo specifies the line number (zero-based); it can be -1
* if it is unknown
* @param address specifies the address that the instruction pointer
* points to.
* @param frameNo specifies the frame number: 0 is the innermost frame,
* positive numbers are frames somewhere up the stack (indicates points
* where a function was called); the latter cases should be indicated
* differently in the source window.
*/
void updatePC(const QString& filename, int lineNo,
const DbgAddr& address, int frameNo);
/**
* This signal is emitted when gdb detects that the executable has been
* updated, e.g. recompiled. (You usually need not handle this signal
* if you are the editor which changed the executable.)
*/
void executableUpdated();
/**
* Indicates that a new status message is available.
*/
void updateStatusMessage();
/**
* Indicates that the internal state of the debugger has changed, and
* that this will very likely have an impact on the UI.
*/
void updateUI();
/**
* Indicates that the list of breakpoints has possibly changed.
*/
void breakpointsChanged();
/**
* Indicates that the register values have possibly changed.
*/
void registersChanged(const std::list<RegisterInfo>&);
/**
* Indicates that the list of threads has possibly changed.
*/
void threadsChanged(const std::list<ThreadInfo>&);
/**
* Indicates that the value for a value popup is ready.
*/
void valuePopup(const QString&);
/**
* Provides the disassembled code of the location given by file and
* line number (zero-based).
*/
void disassembled(const QString& file, int line, const std::list<DisassembledCode>& code);
/**
* Indicates that the program has stopped for any reason: by a
* breakpoint, by a signal that the debugger driver caught, by a single
* step instruction.
*/
void programStopped();
/**
* Indicates that a new memory dump output is ready.
* @param msg is an error message or empty
* @param memdump is the memory dump
*/
void memoryDumpChanged(const QString&, const std::list<MemoryDump>&);
/**
* Gives other objects a chance to save program specific settings.
*/
void saveProgramSpecific(KConfigBase* config);
/**
* Gives other objects a chance to restore program specific settings.
*/
void restoreProgramSpecific(KConfigBase* config);
protected:
ExprWnd& m_localVariables;
ExprWnd& m_watchVariables;
QListBox& m_btWindow;
// implementation helpers
protected:
QWidget* parentWidget() { return static_cast<QWidget*>(parent()); }
};
#endif // DEBUGGER_H

@ -0,0 +1,3 @@
# add here all the languages, you have docu for
SUBDIRS = de en ru

@ -0,0 +1,721 @@
# Makefile.in generated by automake 1.10.1 from Makefile.am.
# KDE tags expanded automatically by am_edit - $Revision: 483858 $
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = kdbg/doc
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
#>- RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
#>- html-recursive info-recursive install-data-recursive \
#>- install-dvi-recursive install-exec-recursive \
#>- install-html-recursive install-info-recursive \
#>- install-pdf-recursive install-ps-recursive install-recursive \
#>- installcheck-recursive installdirs-recursive pdf-recursive \
#>- ps-recursive uninstall-recursive
#>+ 7
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
install-html-recursive install-info-recursive \
install-pdf-recursive install-ps-recursive install-recursive \
installcheck-recursive installdirs-recursive pdf-recursive \
ps-recursive uninstall-recursive nmcheck-recursive bcheck-recursive
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
#>+ 1
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
ARTSCCONFIG = @ARTSCCONFIG@
AUTOCONF = @AUTOCONF@
AUTODIRS = @AUTODIRS@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CONF_FILES = @CONF_FILES@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DCOPIDL = @DCOPIDL@
DCOPIDL2CPP = @DCOPIDL2CPP@
DCOPIDLNG = @DCOPIDLNG@
DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@
KCONFIG_COMPILER = @KCONFIG_COMPILER@
KDECONFIG = @KDECONFIG@
KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@
KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
KDE_INCLUDES = @KDE_INCLUDES@
KDE_LDFLAGS = @KDE_LDFLAGS@
KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@
KDE_MT_LIBS = @KDE_MT_LIBS@
KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@
KDE_PLUGIN = @KDE_PLUGIN@
KDE_RPATH = @KDE_RPATH@
KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
KDE_USE_FPIE = @KDE_USE_FPIE@
KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@
KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@
KDE_USE_PIE = @KDE_USE_PIE@
KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
LDFLAGS = @LDFLAGS@
LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@
LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@
LIBCOMPAT = @LIBCOMPAT@
LIBCRYPT = @LIBCRYPT@
LIBDL = @LIBDL@
LIBJPEG = @LIBJPEG@
LIBOBJS = @LIBOBJS@
LIBPNG = @LIBPNG@
LIBPTHREAD = @LIBPTHREAD@
LIBRESOLV = @LIBRESOLV@
LIBS = @LIBS@
LIBSM = @LIBSM@
LIBSOCKET = @LIBSOCKET@
LIBTOOL = @LIBTOOL@
LIBUCB = @LIBUCB@
LIBUTIL = @LIBUTIL@
LIBZ = @LIBZ@
LIB_KAB = @LIB_KAB@
LIB_KABC = @LIB_KABC@
LIB_KDECORE = @LIB_KDECORE@
LIB_KDED = @LIB_KDED@
LIB_KDEPIM = @LIB_KDEPIM@
LIB_KDEPRINT = @LIB_KDEPRINT@
LIB_KDEUI = @LIB_KDEUI@
LIB_KDNSSD = @LIB_KDNSSD@
LIB_KFILE = @LIB_KFILE@
LIB_KFM = @LIB_KFM@
LIB_KHTML = @LIB_KHTML@
LIB_KIMPROXY = @LIB_KIMPROXY@
LIB_KIO = @LIB_KIO@
LIB_KJS = @LIB_KJS@
LIB_KNEWSTUFF = @LIB_KNEWSTUFF@
LIB_KPARTS = @LIB_KPARTS@
LIB_KSPELL = @LIB_KSPELL@
LIB_KSYCOCA = @LIB_KSYCOCA@
LIB_KUNITTEST = @LIB_KUNITTEST@
LIB_KUTILS = @LIB_KUTILS@
LIB_POLL = @LIB_POLL@
LIB_QPE = @LIB_QPE@
LIB_QT = @LIB_QT@
LIB_SMB = @LIB_SMB@
LIB_X11 = @LIB_X11@
LIB_XEXT = @LIB_XEXT@
LIB_XRENDER = @LIB_XRENDER@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MAKEKDEWIDGETS = @MAKEKDEWIDGETS@
MCOPIDL = @MCOPIDL@
MEINPROC = @MEINPROC@
MKDIR_P = @MKDIR_P@
MOC = @MOC@
MSGFMT = @MSGFMT@
NOOPT_CFLAGS = @NOOPT_CFLAGS@
NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
PS_COMMAND = @PS_COMMAND@
QTE_NORTTI = @QTE_NORTTI@
QT_INCLUDES = @QT_INCLUDES@
QT_LDFLAGS = @QT_LDFLAGS@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TOPSUBDIRS = @TOPSUBDIRS@
UIC = @UIC@
UIC_TR = @UIC_TR@
USER_INCLUDES = @USER_INCLUDES@
USER_LDFLAGS = @USER_LDFLAGS@
USE_EXCEPTIONS = @USE_EXCEPTIONS@
USE_RTTI = @USE_RTTI@
USE_THREADS = @USE_THREADS@
VERSION = @VERSION@
WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@
XGETTEXT = @XGETTEXT@
XMKMF = @XMKMF@
XMLLINT = @XMLLINT@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_INCLUDES = @X_INCLUDES@
X_LDFLAGS = @X_LDFLAGS@
X_PRE_LIBS = @X_PRE_LIBS@
X_RPATH = @X_RPATH@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
all_includes = @all_includes@
all_libraries = @all_libraries@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
kde_appsdir = @kde_appsdir@
kde_bindir = @kde_bindir@
kde_confdir = @kde_confdir@
kde_datadir = @kde_datadir@
kde_htmldir = @kde_htmldir@
kde_icondir = @kde_icondir@
kde_includes = @kde_includes@
kde_kcfgdir = @kde_kcfgdir@
kde_libraries = @kde_libraries@
kde_libs_htmldir = @kde_libs_htmldir@
kde_libs_prefix = @kde_libs_prefix@
kde_locale = @kde_locale@
kde_mimedir = @kde_mimedir@
kde_moduledir = @kde_moduledir@
kde_qtver = @kde_qtver@
kde_servicesdir = @kde_servicesdir@
kde_servicetypesdir = @kde_servicetypesdir@
kde_sounddir = @kde_sounddir@
kde_styledir = @kde_styledir@
kde_templatesdir = @kde_templatesdir@
kde_wallpaperdir = @kde_wallpaperdir@
kde_widgetdir = @kde_widgetdir@
kdeinitdir = @kdeinitdir@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
qt_includes = @qt_includes@
qt_libraries = @qt_libraries@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
x_includes = @x_includes@
x_libraries = @x_libraries@
xdg_appsdir = @xdg_appsdir@
xdg_directorydir = @xdg_directorydir@
xdg_menudir = @xdg_menudir@
# add here all the languages, you have docu for
SUBDIRS = de en ru
#>- all: all-recursive
#>+ 1
all: docs-am all-recursive
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
#>- @for dep in $?; do \
#>- case '$(am__configure_deps)' in \
#>- *$$dep*) \
#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
#>- && exit 0; \
#>- exit 1;; \
#>- esac; \
#>- done; \
#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kdbg/doc/Makefile'; \
#>- cd $(top_srcdir) && \
#>- $(AUTOMAKE) --gnu kdbg/doc/Makefile
#>+ 12
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kdbg/doc/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu kdbg/doc/Makefile
cd $(top_srcdir) && perl admin/am_edit -padmin kdbg/doc/Makefile.in
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
$(RECURSIVE_CLEAN_TARGETS):
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
empty_fix=.; \
else \
include_option=--include; \
empty_fix=; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
distdir=`$(am__cd) $(distdir) && pwd`; \
top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$$top_distdir" \
distdir="$$distdir/$$subdir" \
am__remove_distdir=: \
am__skip_length_check=: \
distdir) \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-recursive
all-am: Makefile
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
#>- clean: clean-recursive
#>+ 1
clean: kde-rpo-clean clean-recursive
#>- clean-am: clean-generic clean-libtool mostlyclean-am
#>+ 1
clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am
distclean: distclean-recursive
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-recursive
dvi-am:
html: html-recursive
info: info-recursive
info-am:
install-data-am:
install-dvi: install-dvi-recursive
install-exec-am:
install-html: install-html-recursive
install-info: install-info-recursive
install-man:
install-pdf: install-pdf-recursive
install-ps: install-ps-recursive
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am:
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \
install-strip
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am check check-am clean clean-generic clean-libtool \
ctags ctags-recursive distclean distclean-generic \
distclean-libtool distclean-tags distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-dvi install-dvi-am install-exec \
install-exec-am install-html install-html-am install-info \
install-info-am install-man install-pdf install-pdf-am \
install-ps install-ps-am install-strip installcheck \
installcheck-am installdirs installdirs-am maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
uninstall uninstall-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
#>+ 2
KDE_DIST=Makefile.in Makefile.am
#>+ 2
docs-am:
#>+ 15
force-reedit:
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kdbg/doc/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu kdbg/doc/Makefile
cd $(top_srcdir) && perl admin/am_edit -padmin kdbg/doc/Makefile.in
#>+ 21
clean-bcheck:
rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
bcheck: bcheck-recursive
bcheck-am:
@for i in ; do \
if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
echo "$$i"; \
if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
rm -f $$i.bchecktest.cc; exit 1; \
fi ; \
echo "" >> $$i.bchecktest.cc.class; \
perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
rm -f a.out; \
fi ; \
done
#>+ 3
final:
$(MAKE) all-am
#>+ 3
final-install:
$(MAKE) install-am
#>+ 3
no-final:
$(MAKE) all-am
#>+ 3
no-final-install:
$(MAKE) install-am
#>+ 3
kde-rpo-clean:
-rm -f *.rpo
#>+ 3
nmcheck:
nmcheck-am: nmcheck

@ -0,0 +1,27 @@
html_DATA = \
argspwdenv.html \
breakptlist.html \
globaloptions.html \
howdoi.html \
localvars.html \
memory.html \
pgmoutput.html \
pgmsettings.html \
registers.html \
sourcecode.html \
stack.html \
threads.html \
tips.html \
watches.html \
index.html
htmldir = $(kde_htmldir)/de/kdbg
EXTRA_DIST = $(html_DATA)
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(htmldir)
cd $(DESTDIR)$(htmldir) && ln -s -f ../../en/kdbg/types.html .
uninstall-local:
-rm -f $(DESTDIR)$(htmldir)/types.html

@ -0,0 +1,609 @@
# Makefile.in generated by automake 1.10.1 from Makefile.am.
# KDE tags expanded automatically by am_edit - $Revision: 483858 $
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = kdbg/doc/de
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
$(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(htmldir)"
htmlDATA_INSTALL = $(INSTALL_DATA)
DATA = $(html_DATA)
#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
#>+ 1
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
ARTSCCONFIG = @ARTSCCONFIG@
AUTOCONF = @AUTOCONF@
AUTODIRS = @AUTODIRS@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CONF_FILES = @CONF_FILES@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DCOPIDL = @DCOPIDL@
DCOPIDL2CPP = @DCOPIDL2CPP@
DCOPIDLNG = @DCOPIDLNG@
DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@
KCONFIG_COMPILER = @KCONFIG_COMPILER@
KDECONFIG = @KDECONFIG@
KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@
KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@
KDE_INCLUDES = @KDE_INCLUDES@
KDE_LDFLAGS = @KDE_LDFLAGS@
KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@
KDE_MT_LIBS = @KDE_MT_LIBS@
KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@
KDE_PLUGIN = @KDE_PLUGIN@
KDE_RPATH = @KDE_RPATH@
KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@
KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@
KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@
KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@
KDE_USE_FPIE = @KDE_USE_FPIE@
KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@
KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@
KDE_USE_PIE = @KDE_USE_PIE@
KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@
LDFLAGS = @LDFLAGS@
LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@
LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@
LIBCOMPAT = @LIBCOMPAT@
LIBCRYPT = @LIBCRYPT@
LIBDL = @LIBDL@
LIBJPEG = @LIBJPEG@
LIBOBJS = @LIBOBJS@
LIBPNG = @LIBPNG@
LIBPTHREAD = @LIBPTHREAD@
LIBRESOLV = @LIBRESOLV@
LIBS = @LIBS@
LIBSM = @LIBSM@
LIBSOCKET = @LIBSOCKET@
LIBTOOL = @LIBTOOL@
LIBUCB = @LIBUCB@
LIBUTIL = @LIBUTIL@
LIBZ = @LIBZ@
LIB_KAB = @LIB_KAB@
LIB_KABC = @LIB_KABC@
LIB_KDECORE = @LIB_KDECORE@
LIB_KDED = @LIB_KDED@
LIB_KDEPIM = @LIB_KDEPIM@
LIB_KDEPRINT = @LIB_KDEPRINT@
LIB_KDEUI = @LIB_KDEUI@
LIB_KDNSSD = @LIB_KDNSSD@
LIB_KFILE = @LIB_KFILE@
LIB_KFM = @LIB_KFM@
LIB_KHTML = @LIB_KHTML@
LIB_KIMPROXY = @LIB_KIMPROXY@
LIB_KIO = @LIB_KIO@
LIB_KJS = @LIB_KJS@
LIB_KNEWSTUFF = @LIB_KNEWSTUFF@
LIB_KPARTS = @LIB_KPARTS@
LIB_KSPELL = @LIB_KSPELL@
LIB_KSYCOCA = @LIB_KSYCOCA@
LIB_KUNITTEST = @LIB_KUNITTEST@
LIB_KUTILS = @LIB_KUTILS@
LIB_POLL = @LIB_POLL@
LIB_QPE = @LIB_QPE@
LIB_QT = @LIB_QT@
LIB_SMB = @LIB_SMB@
LIB_X11 = @LIB_X11@
LIB_XEXT = @LIB_XEXT@
LIB_XRENDER = @LIB_XRENDER@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
MAKEKDEWIDGETS = @MAKEKDEWIDGETS@
MCOPIDL = @MCOPIDL@
MEINPROC = @MEINPROC@
MKDIR_P = @MKDIR_P@
MOC = @MOC@
MSGFMT = @MSGFMT@
NOOPT_CFLAGS = @NOOPT_CFLAGS@
NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
PS_COMMAND = @PS_COMMAND@
QTE_NORTTI = @QTE_NORTTI@
QT_INCLUDES = @QT_INCLUDES@
QT_LDFLAGS = @QT_LDFLAGS@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TOPSUBDIRS = @TOPSUBDIRS@
UIC = @UIC@
UIC_TR = @UIC_TR@
USER_INCLUDES = @USER_INCLUDES@
USER_LDFLAGS = @USER_LDFLAGS@
USE_EXCEPTIONS = @USE_EXCEPTIONS@
USE_RTTI = @USE_RTTI@
USE_THREADS = @USE_THREADS@
VERSION = @VERSION@
WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@
XGETTEXT = @XGETTEXT@
XMKMF = @XMKMF@
XMLLINT = @XMLLINT@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_INCLUDES = @X_INCLUDES@
X_LDFLAGS = @X_LDFLAGS@
X_PRE_LIBS = @X_PRE_LIBS@
X_RPATH = @X_RPATH@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
all_includes = @all_includes@
all_libraries = @all_libraries@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = $(kde_htmldir)/de/kdbg
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
kde_appsdir = @kde_appsdir@
kde_bindir = @kde_bindir@
kde_confdir = @kde_confdir@
kde_datadir = @kde_datadir@
kde_htmldir = @kde_htmldir@
kde_icondir = @kde_icondir@
kde_includes = @kde_includes@
kde_kcfgdir = @kde_kcfgdir@
kde_libraries = @kde_libraries@
kde_libs_htmldir = @kde_libs_htmldir@
kde_libs_prefix = @kde_libs_prefix@
kde_locale = @kde_locale@
kde_mimedir = @kde_mimedir@
kde_moduledir = @kde_moduledir@
kde_qtver = @kde_qtver@
kde_servicesdir = @kde_servicesdir@
kde_servicetypesdir = @kde_servicetypesdir@
kde_sounddir = @kde_sounddir@
kde_styledir = @kde_styledir@
kde_templatesdir = @kde_templatesdir@
kde_wallpaperdir = @kde_wallpaperdir@
kde_widgetdir = @kde_widgetdir@
kdeinitdir = @kdeinitdir@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
qt_includes = @qt_includes@
qt_libraries = @qt_libraries@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
x_includes = @x_includes@
x_libraries = @x_libraries@
xdg_appsdir = @xdg_appsdir@
xdg_directorydir = @xdg_directorydir@
xdg_menudir = @xdg_menudir@
html_DATA = \
argspwdenv.html \
breakptlist.html \
globaloptions.html \
howdoi.html \
localvars.html \
memory.html \
pgmoutput.html \
pgmsettings.html \
registers.html \
sourcecode.html \
stack.html \
threads.html \
tips.html \
watches.html \
index.html
EXTRA_DIST = $(html_DATA)
#>- all: all-am
#>+ 1
all: docs-am all-am
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
#>- @for dep in $?; do \
#>- case '$(am__configure_deps)' in \
#>- *$$dep*) \
#>- cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
#>- && exit 0; \
#>- exit 1;; \
#>- esac; \
#>- done; \
#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kdbg/doc/de/Makefile'; \
#>- cd $(top_srcdir) && \
#>- $(AUTOMAKE) --gnu kdbg/doc/de/Makefile
#>+ 12
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kdbg/doc/de/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu kdbg/doc/de/Makefile
cd $(top_srcdir) && perl admin/am_edit -padmin kdbg/doc/de/Makefile.in
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
install-htmlDATA: $(html_DATA)
@$(NORMAL_INSTALL)
test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)"
@list='$(html_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(htmlDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(htmldir)/$$f'"; \
$(htmlDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(htmldir)/$$f"; \
done
uninstall-htmlDATA:
@$(NORMAL_UNINSTALL)
@list='$(html_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(htmldir)/$$f'"; \
rm -f "$(DESTDIR)$(htmldir)/$$f"; \
done
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(DATA)
installdirs:
for dir in "$(DESTDIR)$(htmldir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
#>- clean: clean-am
#>+ 1
clean: kde-rpo-clean clean-am
#>- clean-am: clean-generic clean-libtool mostlyclean-am
#>+ 1
clean-am: clean-bcheck clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am: install-data-local install-htmlDATA
install-dvi: install-dvi-am
install-exec-am:
install-html: install-html-am
install-info: install-info-am
install-man:
install-pdf: install-pdf-am
install-ps: install-ps-am
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-htmlDATA uninstall-local
.MAKE: install-am install-strip
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
distclean distclean-generic distclean-libtool distdir dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-data-local install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-htmlDATA install-info install-info-am \
install-man install-pdf install-pdf-am install-ps \
install-ps-am install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
ps ps-am uninstall uninstall-am uninstall-htmlDATA \
uninstall-local
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(htmldir)
cd $(DESTDIR)$(htmldir) && ln -s -f ../../en/kdbg/types.html .
uninstall-local:
-rm -f $(DESTDIR)$(htmldir)/types.html
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
#>+ 2
KDE_DIST=stack.html memory.html index.html watches.html sourcecode.html howdoi.html pgmsettings.html globaloptions.html pgmoutput.html Makefile.in threads.html argspwdenv.html localvars.html registers.html breakptlist.html tips.html Makefile.am
#>+ 2
docs-am:
#>+ 15
force-reedit:
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu kdbg/doc/de/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu kdbg/doc/de/Makefile
cd $(top_srcdir) && perl admin/am_edit -padmin kdbg/doc/de/Makefile.in
#>+ 21
clean-bcheck:
rm -f *.bchecktest.cc *.bchecktest.cc.class a.out
bcheck: bcheck-am
bcheck-am:
@for i in ; do \
if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \
echo "int main() {return 0;}" > $$i.bchecktest.cc ; \
echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \
echo "$$i"; \
if ! $(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) --dump-class-hierarchy -c $$i.bchecktest.cc; then \
rm -f $$i.bchecktest.cc; exit 1; \
fi ; \
echo "" >> $$i.bchecktest.cc.class; \
perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \
rm -f a.out; \
fi ; \
done
#>+ 3
final:
$(MAKE) all-am
#>+ 3
final-install:
$(MAKE) install-am
#>+ 3
no-final:
$(MAKE) all-am
#>+ 3
no-final-install:
$(MAKE) install-am
#>+ 3
kde-rpo-clean:
-rm -f *.rpo
#>+ 3
nmcheck:
nmcheck-am: nmcheck

@ -0,0 +1,50 @@
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Mozilla/4.74 [en] (X11; U; Linux 2.2.16-SMP i686) [Netscape]">
<meta name="Author" content="Johannes Sixt">
<title>KDbg - Benutzerhandbuch - Argumente, Arbeitsverzeichnis, Umgebungsvariablen</title>
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#0000EF" vlink="#51188E" alink="#FF0000">
<a href="index.html">Inhalt</a>
<h3>
<a NAME="Environment"></a>Programmargumente, Arbeitsverzeichnis, Umgebungsvariablen
setzen</h3>
Mit <i>Ausf&uuml;hren|Argumente</i> &ouml;ffnen Sie einen Dialog, in dem
Sie Programmargumente, das Arbeitsverzeichnis sowie Umgebungsvariablen
setzen k&ouml;nnen.
<h3>
Programmargumente</h3>
In der obersten Eingabezeile k&ouml;nnen Sie die Programmargumente eingeben,
die an das Programm &uuml;bergeben werden sollen. Diese werden beim n&auml;chsten
Programmstart verwendet.
<h3>
Arbeitsverzeichnis</h3>
Im Eingabefeld darunter k&ouml;nnen Sie das Arbeitsverzeichnis angeben.
Dieses wird sofort an gdb &uuml;bergeben, sobald Sie <i>OK</i> dr&uuml;cken.
Das Programm verwendet das neue Arbeitsverzeichnis allerdings erst beim
n&auml;chsten Start.
<p>Das Arbeitsverzeichnis gilt auch f&uuml;r gdb selbst! Das angegebene
Arbeitsverzeichnis wird sofort an gdb weitergegeben, d.h. gdb wird die
neue Einstellung verwenden, sobald Sie <i>OK</i> dr&uuml;cken. Das kann
einen Einfluss darauf haben, ob gdb Quellcodedateien findet.
<h3>
Umgebungsvariablen</h3>
Im Bereich f&uuml;r Umgebungsvariablen k&ouml;nnen Sie einen Ausdruck in
der Form
<tt>VARIABLE=Wert</tt> eingeben und dann <i>&Auml;ndern</i> klicken,
um der Umgebungsvariablen <tt>VARIABLE</tt> einen <tt>Wert</tt> zuzuweisen.
Um eine Variable zu entfernen, w&auml;hlen Sie diese zuerst aus der Liste
darunter aus und klicken dan <i>L&ouml;schen</i>. Um einen Wert zu &auml;ndern,
geben Sie einfach den neuen Wert ein und klicken <i>&Auml;ndern</i>. Wenn
Sie den Namen der Variable &auml;ndern und <i>&Auml;ndern</i> clicken,
erzeugen Sie eine neue Variable! Die neuen Umgebungsvariablen werden erst
beim n&auml;chsten Programmstart verwendet.
<p>Wenn Sie glibc2 unter Linux verwenden, ist es sehr wichtig, dass Sie
der Umgebungsvariablen <tt>LD_BIND_NOW</tt> den Wert <tt>1</tt> zuweisen.
Wenn diese Variable nicht gesetzt ist, k&ouml;nnen solche Funktionen nicht
betreten werden, die von der Bibliothek <tt>libc</tt> und anderen Shared
Libraries importiert werden.
</body>
</html>

@ -0,0 +1,82 @@
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Mozilla/4.74 [en] (X11; U; Linux 2.2.16-SMP i686) [Netscape]">
<meta name="Author" content="Johannes Sixt">
<title>KDbg - Benutzerhandbuch - Haltepunkte</title>