Archive:Getting Started/Set up KDE 4 for development (zh CN)
Getting_Started/Set_up_KDE_4_for_development
Languages: عربي | Asturianu | Català | Česky | Kaszëbsczi | Dansk | Deutsch | English | Esperanto | Español | Eesti | فارسی | Suomi | Français | Galego | Italiano | 日本語 | 한국어 | Norwegian | Polski | Português Brasileiro | Română | Русский | Svenska | Slovenčina | Slovenščina | српски | Türkçe | Tiếng Việt | Українська | 简体中文 | 繁體中文
Tutorial Series | 开始 |
Previous | Build KDE 4 |
What's Next | Other development topics |
Further Reading | n/a |
着手KDE4的应用程序和会话Launching KDE 4 apps & sessions
As you start development for KDE 4, there are generally three options available to you:
- You could run KDE 4 apps alongside the other apps in your current desktop environment.
- You could embed a KDE 4 session into your current desktop environment.
- You could run KDE 4 as the only desktop environment on your machine.
All three options are described in the following sections.
Qt: Session management error: Could not open network socket QMutex::lock: Deadlock detected in thread -1241241936or when you run startkde and it stays stuck, read this article for workaround.
Launching KDE 4 apps
Using the normal shell with sux
For this method, the tool sux (http://fgouget.free.fr/sux/sux-readme.shtml) is required. sux is available on most distributions. Otherwise you could rely on the normal shell without sux method below. sux allows you to change to another user with an implicit managing of the X forwarding details (authentication and DISPLAY exporting) in a clean and simple way.
To login, type sux - kde-devel
All environment variables and everything else should be set up correctly by your .bashrc. To start an application, simply type it's name; for example kwrite
- run
unset XDG_DATA_DIRS ; kbuildsycoca4
Using the normal shell without sux
The simplest method to launch KDE 4 applications is using su to login as the kde-devel user and then simply start any KDE 4 application from command line. To login, type
su - kde-devel
and then, after entering your password
export DISPLAY=:0
All environment variables and everything else should be set up correctly by your .bashrc. To start an application, simply type it's name; for example kwrite
- run
unset XDG_DATA_DIRS ; kbuildsycoca4
Using SSH
The simplest way to run a KDE 4 application with SSH in your current desktop environment is to get an X-aware shell prompt as the kde-devel user like this:
ssh -X kde-devel@localhost
Now you can launch KDE apps as usual, for example:
kwrite
The two lines can be conveniently combined:
ssh -X kde-devel@localhost kwrite
Passwordless login
Before anything serious can be done using this method, a passwordless login needs to be set up. To start, run the following command as the regular desktop user:
ssh-keygen -t rsa
Hit enter three times to accept the path of ~/.ssh/id_rsa and an empty passphrase. Now, copy the single line in ~/.ssh/id_rsa.pub that's printed after running this command:
cat ~/.ssh/id_rsa.pub
After that line is copied, ssh back into the kde-devel user and put the copied line in the file $HOME/.ssh/authorized_keys:
ssh -X kde-devel@localhost $HOME/kde/bin/kwrite \ $HOME/.ssh/authorized_keys
Paste in the line, save the file, and quit KWrite. Now try running KWrite again with the same SSH command; you shouldn't have to enter a password anymore:
ssh -X kde-devel@localhost $HOME/kde/bin/kwrite
chmod og-xrw ~/.ssh/id_rsa
(although the file should have these permissions when it is created)
The SSH desktop file
If you want to be able to launch apps more easily than running them with an SSH command from the command line, one way is to create .desktop files that ssh into the other account.
You can start with an existing .desktop file as a template (like one from your desktop) or you can make one from scratch. The main idea is to prefix the command being run with this string:
ssh -X kde-devel@localhost $HOME/kde/bin/
A simple .desktop file that runs KWrite would have the following contents:
[Desktop Entry]
Categories=Qt;KDE;TextEditor;
Comment=
DocPath=kwrite/index.html
Encoding=UTF-8
Exec=ssh -X kde-devel@localhost /home/kde-devel/kde/bin/kwrite %U
GenericName=Text Editor
Icon=kwrite
InitialPreference=8
MimeType=text/plain
Name=KWrite (kde-devel)
Path=
StartupNotify=false
Terminal=false
TerminalOptions=
Type=Application
X-DBUS-StartupType=Multi
X-DCOP-ServiceType=non
X-KDE-StartupNotify=true
X-KDE-SubstituteUID=false
X-KDE-Username=
Launching KDE 4 sessions
Nested KDE 4 session
Instead of using a full-blown new virtual X for developing software you can use Xephyr to embed your KDE 4 session into your working KDE 3 or other X11 environment.
You can also do this with xnest, but as xnest cannot handle extensions like Render many people prefer Xephyr.
If you want to get a minimal KDE session up and running, just launch Xephyr (available in Kubuntu as xserver-xephyr; Gentoo users compile x11-base/xorg-server with USE="kdrive"):
Xephyr :1&
You can now launch KDE:
export DISPLAY=:1 /path/to/kde4/bin/startkde-modified &
startkde-modified is a copy of the startkde-script which includes the following lines on the top:
export KDEDIR=`kde4-config --prefix`
export LD_LIBRARY_PATH=$KDEDIR/lib
export PATH=$KDEDIR/bin/:$PATH
export KDEHOME=~/.kde4
You can also use Xephyr with KDM via the Xdmcp protocol and simply a new KDE 4 session to KDM.
On Kubuntu, you can enable it by changing
[Xdmcp]
- Whether KDM should listen to incoming XDMCP requests.
- Default is true
Enable=false
in /etc/kde3/kdm/kdmrc to
[Xdmcp]
- Whether KDM should listen to incoming XDMCP requests.
- Default is true
Enable=true
and adjust your /etc/kde3/kdm/Xaccess to allow your local machine access. Additionally you should make sure to set up a port blocking policy on all external interfaces for the Xdmcp port if you are doing this on a laptop or a PC in an untrusted environment.
If you are done, simply launch Xephyr:
Xephyr -query localhost :1 -host-cursor -screen 1024x768&
where -host-cursor tries to reuse the host's cursor and -screen sets the screen dimensions.
Note: If you get lots of refused connection errors, you might want to use the -ac option of Xephyr. For example:
Xephyr -ac :1&
Another option to try if you get lots of refused connection errors is you may need to grant assess to your kde-devel user to your X server. As root or using sudo execute:
xhost +local:kde-devel
If you do not have Xephyr, you can also use Xnest:
Xnest -ac :1& export DISPLAY=:1
cleanup confusing sections and fix sections which contain a todo
Sping 00:25, 9 April 2007 (CEST)
I use this for my start script nested_kde4.sh:
#! /bin/bash NESTED_KDE_DISPLAY_BACKUP=$DISPLAY export DISPLAY=:0 Xephyr :1 -screen 1024x768 & export DISPLAY=:1 $HOME/kde/bin/startkde-modified & export DISPLAY=${NESTED_KDE_DISPLAY_BACKUP}
If you run into
"Call to lnusertemp failed (temporary directories full?). Check your installation."
try this:
mkdir /var/tmp/kde-devel-kde4
The above code assumes you work with user kde-devel.
Solitary KDE 4 session
To run a full KDE 4 desktop environment session, you can either start it from the command line as you normally would, with something like this:
X :1 & export DISPLAY=:1 startkde
or you can can add it to your login manager. If you are using KDM (or a compatible login manager) this is done by creating a .desktop file in either `kde-config --prefix`/share/apps/kdm/sessions/ or in /usr/share/xsessions/. The easiest thing to do is to copy an existing kde.desktop file and name it kde4.desktop. Open this new .desktop file in a text editor and change the Exec, TryExec and Name entries to look something like this:
Exec=$HOME/kde/bin/startkde
TryExec=$HOME/kde/bin/startkde
Name=KDE4
Replace $HOME/kde in the example above with the prefix you are installing KDE4 into.
After restarting the login manager (Alt+e in KDM) this new entry should appear in the sessions menu.
Development tasks
KDevelop
This section will explain how to use KDevelop 3.4 to develop KDE 4 applications. If you have any questions, corrections or rants about this section, please post them on the discussion page.
Prerequisites
You need at least KDevelop 3.4 for this, which is still a KDE 3 application. Versions lower than 3.4 do not have Qt 4 support among other things. The KDE 4 version of KDevelop is not yet ready for serious development. You can get KDevelop at the KDevelop homepage. Make sure you install KDevelop like all other KDE 3 applications, not with your kde-devel user.
You also need the lastest GDB version, which is currently 6.6.0.
You need to have the kdelibs API documentation locally, which is described in the build instructions.
You also need ctags, htdig, htmerge and htsearch. valgrind and callgrind can also be useful.
Be sure you followed the steps in the KDE 4 build instructions and have a working KDE 4 environment. Make sure simple KDE 4 applications like Konsole or KWrite can be started from the command line of the kde-devel user without problems.
The following steps are all done with the kde-devel user. You need to login as that user by typing su - kde-devel
.
Setting up the environment
KDevelop has no native support for CMake projects. Fortunately, CMake has the ability to generate KDevelop project files itself. In order to do this, you need to pass the -GKDevelop3 flag to the cmake command. This tells CMake to generate project files for KDevelop alongside the normal makefiles. The best way to do this is to modify your cmakekde function in your .bashrc. Just change
cmake $srcFolder -DCMAKE_INSTALL_PREFIX=$KDEDIR \
-DCMAKE_BUILD_TYPE=debugfull&& \
make && \
make install;
to
cmake $srcFolder -GKDevelop3 -DCMAKE_INSTALL_PREFIX=$KDEDIR \
-DCMAKE_BUILD_TYPE=debugfull&& \
make && \
make install;
After you have done that, re-login so that the changes to the .bashrc file take effect. Then you need to rerun cmakekde in the (root) build directory of the project you want to work on with KDevelop (if you didn't use -GKDevelop3 on the building step). For example, if you want to work on Konsole, which lives in kdebase, you need to run cmakekde in the $KDE_BUILD/KDE/kdebase directory. This unfortunately completely rebuilds everything, but only once when you change the generator.
Since all environment variables of the kde-devel user are KDE 4 specific, these need to be set back to match your KDE 3 environment before starting KDevelop. A simple way to do this is to add the following function to your .bashrc:
function start3app {
mkdir -p /tmp/$USER-kde
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games
export LD_LIBRARY_PATH=
export KDETMP=/tmp/$USER-kde
export KDEVARTMP=/var/tmp/$USER-kde
export KDEHOME=$HOME/.kde
export KDEDIR=/usr
export KDEDIRS=$KDEDIR
export DISPLAY=:0
eval "$@"
source $HOME/.bashrc #Reset environment variables again
}
The PATH and LD_LIBRARY_PATH variables are taken from the KDE 3 user, and they may be different on your system. Type echo $PATH
and echo $LD_LIBRARY_PATH
as normal KDE 3 user to get these values. The above function assumes that KDE 3 is installed in the /usr prefix, as it is the case on Debian-based systems. If your KDE 3 is installed to a different prefix, for example /opt/kde3, you need to change the line setting KDEDIR accordingly.
Now you should be able to start KDevelop by typing start3app kdevelop. Do that now.
Setting up KDevelop
Now that KDevelop has started, you need to adjust a few settings. Go to Settings->Configure KDevelop...->Documentation for this. Remove all entries that are not relevant to KDE 4 coding.
Now click Add... to add the kdelibs API documentation. In this dialog, use the following settings:
- Type: Doxygen Documentation Collection (needs to be set first)
- Location: $KDE_SRC/KDE/kdelibs/kdelibs-apidocs/index.html
Now add the Qt API documentation, using the following settings:
- Type: Qt Documentation Collection (needs to be set first)
- Location: $HOME/qt-copy/doc/html/qt.dcf
After you have added kdelibs and Qt API documentation, make sure all checkboxes (TOC,Index and Search) are enabled. Then, go to the Full Text Search tab and make sure the paths to the htdig, htmerge and htsearch executables are correct. You can then close the settings dialog.
Now it is time to open the project you want to work on by clicking Project->Open Project.... The project files are located in the directory. For example, if you want to work on Konsole, you need to open $KDE_BUILD/KDE/kdebase/apps/konsole/konsole.kdevelop. You now need to adjust a few project-specific settings in Project->Project Options. You need to do this every time you start to work on a different project.
This can have several reasons, it depends on how the CMake files are written. Usually, CMake files which have a project(projectname) statement in them should work fine. Once you are familiar enough with CMake, you can try adding the statement.
A workaround for this is to simply use the KDevelop project file of the parent folder, or even higher. In this case, you need to use the Make Active Directory entry in the context menu of the File Selector sidetab. With this, you can ignore the other unwanted folders when building and installing.
- C++ Support->Code Completion
- Here you need to add code completion databases for Qt and kdelibs, and more if you like, for example you might need a database for kdepimlibs when working on kdepim.
- For kdelibs, click the Add... button and choose KDevelop Custom Directory PCS Importer, then add your KDE include directory ($HOME/kde/include) to the list and proceed. You can use the file selection dialog and the Add button to add it.
- Now, add the database for Qt 4 by selecting KDevelop Qt4 PCS Importer this time. You need to select the Qt 4 include directory, which is $HOME/qt-copy/include.
- C++ Support->Qt Options
- Check Enable Qt options and choose Qt4 as your version. Set the QMake Binary path to $HOME/qt-copy/bin/qmake. Then choose Qt 4 style as Qt include syntax. Use $HOME/qt-copy/bin/designer as Designer Binary. Make sure to use the Change Plugin Paths dialog to add the plugin directory from KDE so you see the KDE widgets when designer is started. To do this add $HOME/kde/lib/kde4/plugins to the lineedit and then click the Add button.
- Run Options
- Make sure you use the correct binary as Executable. For example, if you want to run Konsole, this is $KDE_BUILD/KDE/kdebase/apps/konsole/src/konsole. You should add --nofork to the Debug Arguments or debugging some applications like KMail will not work at all.
- Because the start3app functions changes some environment variables, you need to change them back here so the KDE 4 applications can be run without problems from within KDevelop.
- For some applications, like Konsole, this is not strictly necessary, but others like KMail will crash if you do not change this.
- Simply click the Add / Copy button to add new environment variables. You will need the following, which are the same as in your .bashrc:
Name Value KDEHOME $HOME/.kde4 PATH $QTDIR/bin:$KDEDIR/bin:/usr/local/bin:$PATH LD_LIBRARY_PATH $QTDIR/lib:$KDEDIR/lib:$LD_LIBRARY_PATH KDETMP /tmp/$USER-kde4 KDEVARTMP /var/tmp/$USER-kde4 KDEDIR $HOME/kde KDEDIRS $KDEDIR LD_BIND_NOW 42
- Build Options->Build
- Make sure the correct build directory is selected. Again, for Konsole, this would be $KDE_BUILD/KDE/kdebase/apps/konsole.
- Build Options->Make
- You might want to check Abort on first error. You also might want to add VERBOSE= or VERBOSE=1 to Additional make options to control the level of verbosity for the build process.
- If you have more than one processor or if you have access to an icecream cluster, you might want to check the Run multiple jobs option and set the Number of simultaneous jobs to the number of available processors. This increases the compile speed. It is the same as the -j option for make.
- Formatting
- You should set all options here to match the coding style of the project you are working on.
- CTags->General
- You need to correctly set the Path to ctags binary, which is /usr/bin/ctags on Debian-based systems.
- You probably want to enable the When more than one hit, go directly to the first option.
Now you have finished adjusting your project-specific settings. Now you should remove some plugins you do not need, in Settings->Configure Plugins.... I for example disable the following plugins:
Abbreviation Expansion, Code Snippets, Doxygen Support, Embedded Konsole, File Tree, Final Packaging Support, "Open with" Menu Addon, QuickOpen, Regular Expression Tester, Scripting, Security Checker, Shell Filtering and Insertion, Text Structure and Tools Menu Addition.
You should at least disable the bold ones.
Now, open any source file if none is open already. This will enable the Settings->Configure Editor... entry, where you need to set the tab options to match the tab style used by the project you are working on. The important settings are:
- Appearance->Borders->Show line numbers: Should be checked.
- Appearance->Borders->Show icon border: Should be checked.
- Editing->Tabulators
- Editing->Static Word Wrap->Show marker: Should be checked
- Indentation->Automatic Indentation->Indentation mode: Should be C Style
- Indentation in general
In the mainwindow, click the CTags tab on the bottom tabbar, then click the Regenerate button to create a CTags database for easier source code navigation.
Now you have completed all essential configuration, congratulations!
Using KDevelop
Refer to the KDevelop manual for general help using KDevelop. The following section will only deal with special cases for KDE 4.
Debugging
KDE apps have many symbols, which means that you need a lot of memory to get a decent loading times for debugging. To quote a GDB developer: "I would be reluctant to debug KDE on something with <1GB RAM." If the stepping function of the debugger is slow for you, try the following tips:
- Hide local variables. The Locals part of the variable tab on the left causes a big slowdown when stepping if you have many local variables. Simple collapse the Locals part of the tree, the local variables are then not updated every step. You can still examine variables by using the Evaluate expression function.
- Use the patch at http://bugs.kde.org/show_bug.cgi?id=143977. It prevents the update of the framestack widget at each step, speeding up stepping considerably. The patch introduces some minor glitches, which is why it is not yet commited.
Since this is cumbersome and time consuming, you should create symlinks (ln -s) pointing from the build directory to the installation directory for all affected libraries.
Often, even simple programs use libraries internally, for example the settings dialog of Konsole is really a library.