Difference between revisions of "Development/Tutorials/CMake (de)"

Jump to: navigation, search
(Linux, BSD, and other Unix Systems)
 
(18 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{Template:I18n/Language Navigation Bar|Development/Tutorials/CMake}}
+
 
 +
 
 +
{{TutorialBrowser (de)|
 +
 
 +
series=Grundlagen|
 +
 
 +
name=CMake|
 +
 
 +
}}
  
 
== Zusammenfassung ==
 
== Zusammenfassung ==
Line 5: Line 13:
  
 
== Einführung ==
 
== Einführung ==
CMake liest Script Dateien ein und gibt Eingabedateien für das native Buildsystem der Platform auf der es läuft aus. Es kann GNU Makefiles, KDevelop Projekt Dateien, XCode Projekt Dateien und Visual Studio Projekt Dateien ausgeben.  
+
CMake liest Script Dateien ein und gibt Eingabedateien für das native Buildsystem der Platform auf der es läuft aus. Es kann GNU Makefiles, KDevelop Projekt Dateien, Eclipse Projekt Dateien, XCode Projekt Dateien und Visual Studio Projekt Dateien ausgeben.  
  
 
CMake ist freie Software, die unter einer BSD-artigen Lizenz veröffentlicht wird. Entwickelt wird es von [http://www.kitware.com Kitware Inc.]
 
CMake ist freie Software, die unter einer BSD-artigen Lizenz veröffentlicht wird. Entwickelt wird es von [http://www.kitware.com Kitware Inc.]
Line 20: Line 28:
 
Es gibt auch eine [http://www.cmake.org/mailman/listinfo/cmake CMake Mailing List].
 
Es gibt auch eine [http://www.cmake.org/mailman/listinfo/cmake CMake Mailing List].
  
== Warum CMake benutzen ? ==
+
== Warum man CMake benutzen sollte ==
CMake ist nach einer Entscheidung im März 2006 das offizielle Werkzeug von KDE 4, vorwiegend aus technischen Vorteilen gegenüber den älteren KDE Werkzeugen automake und unsermake:
+
CMake ist nach einer Entscheidung im März 2006 das offizielle Werkzeug von KDE 4, vorwiegend aus technischen Vorteilen gegenüber den älteren KDE Werkzeugen ''automake'' und ''unsermake'':
  
 
* CMake wird unabhänging von KDE entwickelt und kann auch von anderen Projekten benutzt werden.
 
* CMake wird unabhänging von KDE entwickelt und kann auch von anderen Projekten benutzt werden.
* Die Übersetzungszeit ist sehr viel kürzer, hauptsächlich weil die libtool nicht mehr benutzt wird.  
+
* Die Übersetzungszeit verkürzt sich durch CMake, hauptsächlich weil ''libtool'' nicht mehr benutzt wird.  
 
* Die CMake-Dateien sind einfacher zu schreiben.
 
* Die CMake-Dateien sind einfacher zu schreiben.
  
 
== Wie man KDE mit Hilfe von CMake übersetzt==
 
== Wie man KDE mit Hilfe von CMake übersetzt==
  
=== CMake runterladen und installieren ===
+
=== CMake herunterladen und installieren ===
 +
 
 
==== Linux, BSD und andere Unix Systeme ====
 
==== Linux, BSD und andere Unix Systeme ====
 
Die neuste Version von CMake kann von [http://www.cmake.org/HTML/Download.html] heruntergeladen werden.
 
Die neuste Version von CMake kann von [http://www.cmake.org/HTML/Download.html] heruntergeladen werden.
  
 
Einmal heruntergeladen, muss es entpackt und übersetzt werden:
 
Einmal heruntergeladen, muss es entpackt und übersetzt werden:
<code>
+
<syntaxhighlight lang="text">
 
$ mkdir cmake-build
 
$ mkdir cmake-build
 
$ cd cmake-build
 
$ cd cmake-build
Line 40: Line 49:
 
$ make
 
$ make
 
$ make install
 
$ make install
</code>
+
</syntaxhighlight>
  
 
Standardmäßig wird CMake in /usr/local installiert, daher muss /usr/local/bin in Pfad für ausführbare Dateien stehen. Um das Installationspräfix zu ändern  (z.B. in /usr in debian), muss die '--prefix=PATH' Option zum bootstrap Kommando hinzugefügt werden.
 
Standardmäßig wird CMake in /usr/local installiert, daher muss /usr/local/bin in Pfad für ausführbare Dateien stehen. Um das Installationspräfix zu ändern  (z.B. in /usr in debian), muss die '--prefix=PATH' Option zum bootstrap Kommando hinzugefügt werden.
Line 49: Line 58:
 
Neuste Version von CMake von [http://www.cmake.org/HTML/Download.html hier] herunterladen.
 
Neuste Version von CMake von [http://www.cmake.org/HTML/Download.html hier] herunterladen.
  
Dann den Cmake-installer aufrufen
+
Dann den Cmake-Installer aufrufen
  
 
Standardmäßig wird CMake in C:\$(Program Files)\CMake 2.4 installiert.
 
Standardmäßig wird CMake in C:\$(Program Files)\CMake 2.4 installiert.
Line 55: Line 64:
 
Möchte man die aktuelle Entwicklerversion von CMake benutzen, findet man [http://cmake.org/HTML/Download.html#cvs hier] eine Anleitung.
 
Möchte man die aktuelle Entwicklerversion von CMake benutzen, findet man [http://cmake.org/HTML/Download.html#cvs hier] eine Anleitung.
  
=== Run CMake ===
+
=== CMake ausführen===
  
 
==== Linux, BSD, and other Unix Systems ====
 
==== Linux, BSD, and other Unix Systems ====
Line 61: Line 70:
  
 
Hat man zum Beispiel  kdelibs/ in ~/src/kdelibs/, dann ruft man folgende Befehle auf:
 
Hat man zum Beispiel  kdelibs/ in ~/src/kdelibs/, dann ruft man folgende Befehle auf:
<code>
+
<syntaxhighlight lang="text">
 
$ ls
 
$ ls
 
kdelibs/
 
kdelibs/
Line 67: Line 76:
 
$ cd kdelibs-build
 
$ cd kdelibs-build
 
$ cmake ../kdelibs
 
$ cmake ../kdelibs
</code>
+
</syntaxhighlight>
Das wird die Makefiles erzeugen, die zum Übersetzen von kdelibs in kdelibs-build benötigt werden.
+
Das wird die Makefiles im Verzeichnis kdelibs-build erzeugen, die zum Übersetzen von kdelibs benötigt werden.
  
 
==== Windows ====
 
==== Windows ====
You have to run CMake so that it generates the build files for your system. Both in-source and out-of-source builds are supported by CMake, but currently in-source builds are prevented by the KDE implementation.
+
Um die Build-Dateien für das System zu erzeugen, muss CMake aufgerufen werden. Sowohl Übersetzungsvorgänge innerhalb des Codes als auch in einem gesonderten werden von CMake unterstützt, wobei KDE derzeit einen Übersetzungsvorgang innerhalb des Quellcodes verbietet.  
  
So, let's say you have kdelibs\ in c:\daten\kde4, then do the following:
+
Hat man zum Beispiel  kdelibs\ in c:\daten\kde4, dann ruft man folgende Befehle auf:
<code>
+
<syntaxhighlight lang="text">
 
c:\daten\kde4> cd kdelibs\win
 
c:\daten\kde4> cd kdelibs\win
 
c:\daten\kde4> cmake
 
c:\daten\kde4> cmake
Line 83: Line 92:
 
c:\daten\kde4> cd kdelibs-build
 
c:\daten\kde4> cd kdelibs-build
 
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs
 
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs
</code>
+
</syntaxhighlight>
  
This will generated the Makefiles for building kdelibs\ in kdelibs-build\. See [[KDE On Windows]] for more informations about compiling KDE on Windows.
+
Dadurch werden die Makefiles, um kdelibs\ zu erzeugen in kdelibs-build angelegt. Siehe auch [[KDE On Windows]] für mehr Informationen über das Übersetzen von KDE unter Windows.
  
==== KDevelop Project Files ====
+
==== Projektdateien für KDevelop ====
If you prefer project files for KDevelop (which will basically be Makefiles accompanied by some extra files for KDevelop), run it like this:
+
Benötigen Sie Projektdateien für KDevelop (was einfache Makefile mit einigen zusätzlichen Extradateien für KDevelop sind), rufen Sie folgenden Befehl auf:
<code>
+
<syntaxhighlight lang="text">
 
$ cmake ../kdelibs -GKDevelop3
 
$ cmake ../kdelibs -GKDevelop3
</code>
+
</syntaxhighlight>
Use 'cmake -h' to find out which generators CMake supports and the other options.
+
Mit 'cmake -h' kann man herausfinden, welche Generatoren CMake unterstützt und welche weiteren Optionen es gibt.
  
==== CMake and Qt4 ====
+
==== CMake und Qt4 ====
To locate Qt 4, CMake searches for qmake in your execute path. CMake does ''not'' use the QTDIR environment variable. So make sure that the first qmake found in the execution path is the one you like to use.
+
Um Qt 4 zu finden sucht CMake nach qmake im Pfad für ausführbare Dateien. CMake benutzt ''nicht'' die QTDIR Umgebungsvariable. Daher müssen Sie sicherstellen, dass das erste qmake, welches im Pfad gefunden wird dasjenige ist, welches benutzt werden soll (also bei Parallelinstallationen von Qt3 und Qt4 entsprechend Qt4 zuerst gefunden wird).
  
==== More Details ====
+
==== Mehr Details ====
When CMake has finished, it will have created a file called "CMakeCache.txt". This file contains all the settings CMake has detected on your system. If you want to run CMake with another generator or you want CMake to detect everything again, delete this file.
+
Wenn CMake seine Arbeit beendet hat, existiert eine Datei namens "CMakeCache.txt". Diese Datei enthält alle Einstellungen, die von CMake auf dem System entdeckt worden sind. Soll CMake mit einem anderen Generator aufgerufen werden oder das System neu untersucht werden, löschen Sie diese Datei.
 +
Wenn CMake etwas nicht findet, aber Sie wissen, dass es auf Ihrem System ist, können Sie CMake manuell mitteilen, wo man es findet. CMake benutzt Variablen um diese Information zu speichern und zwar in der eben erwähnten CMakeCache.txt Datei. Es gibt drei Möglichkeiten, diese Variablen manuell einzustellen:
  
If CMake didn't find something, but you know it is somewere on your box, you can tell CMake manually where to find it.  CMake uses variables to store this information.  These variables are cached in the already mentioned file CMakeCache.txt.  You have three options to adjust these variables manually:
+
* CMake den korrekten Wert über die Kommandozeile mitteilen:
* tell CMake the correct value via the command line: cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value
+
cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value
* use ccmake, which provides a curses based GUI to adjust the CMake variables (run: ccmake ../kdelibs)
+
* ccmake benutzen, welches eine auf curses basierende GUI aufruft, um CMake Variablen zu setzen ((run: ccmake ../kdelibs)
* edit the file CMakeCache.txt directly (not recommended)
+
* Die Datei CMakeCache.txt direkt bearbeiten (wird nicht empfohlen)
  
You should run "ccmake ../kdelibs" at least once so that you get an impression which variables CMake uses. Press "T" to see also the "advanced" variables. So, if CMake didn't find something, start ccmake and adjust it manually.
+
Sie sollten "ccmake ../kdelibs" mindesten einmal aufrufen, so dass Sie einen Eindruck bekommen, welche Variable CMake benutzt. Drücken Sie "T" um die "fortgeschrittenen" Variablen zu sehen. Wenn also CMake etwas bestimmtes nicht von sich aus findet, rufen Sie ccmake auf und stellen Sie es von Hand ein.
  
==== Command Line Variables ====
+
==== Kommandozeilenvariablen ====
  
Some cmake command line variables you may want to set:
+
Folgende cmake Kommandozeilenvariablen könnten für Sie von Interesse sein:
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 is the equivalent to ./configure --prefix=/opt/kde4
+
* '''CMAKE_INSTALL_PREFIX''': cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 entspricht dem früheren ./configure --prefix=/opt/kde4
* '''CMAKE_BUILD_TYPE''': decide which type of build you want. You can chose between "debugfull", "debug", "profile", "relwithdebinfo" and "release". The default is "relwithdebinfo" (-O2 -g). See FindKDE4Internal.cmake for details.
+
* '''CMAKE_BUILD_TYPE''': Hier kann man sich aussuchen, welche Debug-Informationen erzeugt werden sollen. Folgende Möglichkeiten stehen zur Auswahl: "debugfull", "debug", "profile", "relwithdebinfo", "release". Voreinstellung ist "relwithdebinfo" (-O2 -g). Weitere Details befinden sich im Artikel [[Development/CMake/Build_Types|CMake Build Types]].
* '''KDE4_BUILD_TESTS=ON''': creates Makefiles with build test programs and also provides 'test' targets
+
* '''KDE4_BUILD_TESTS=ON''': erzeugt Makefiles die zusätzliche Testprogramme erzeugen und auch das Ziel 'test' zur Verfügung stellen.
* '''KDE4_TEST_OUTPUT=xml''': Unit tests using the QTestLib framework will create xml formatted logfiles.
+
* '''KDE4_TEST_OUTPUT=xml''': Unit tests, die das QTestLib Framework benutzen werden xml-formatierte Logfiles erzeugen.
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Build KDE without any multimedia (audio and video) support.
+
* '''KDE4_DISABLE_MULTIMEDIA=ON''': Erzeugt KDE ohne jegliche Multimediaunterstützung (Audio und Video)
* '''RPATH_STYLE''': This is not available anymore. By default everything will be built with RPATH set correctly. If you don't want RPATH at all, set CMAKE_SKIP_RPATH to TRUE.
+
* '''RPATH_STYLE''': Diese Kommandozeilenoption gibt es nicht mehr. Per Voreinstllung wird alles mit einem korrekten RPATH erzeugt. Möchten Sie RPATH nicht, setzten Sie CMAKE_SKIP_RPATH auf TRUE.
* '''BUILD_foo=OFF''': disables the build for the project in subdirectory 'foo'.
+
* '''BUILD_foo=OFF''': Schaltet die Erzeugung im Unterverzeichnis 'foo' ab.
* '''WITH_foo''': there are several options, e.g. WITH_CUPS or WITH_Jasper. If you disable them, cmake will not even try to find this package. If it is enabled, cmake will try to find it. If it fails with this, you can still adjust it manually as described above.
+
* '''WITH_foo''': Hier gibt es mehrere Möglichkeiten, z.B. WITH_CUPS oder WITH_Jasper. Wenn Sie diese Punkte ausschalten, wird CMake nicht versuchen, die Pakete zu finden, ansonsten sucht CMake danach. Schlägt das Fehl, kann man wie oben beschrieben manuell nachhelfen.
  
=== Environment Variables ===
+
=== Umgebungsvariablen ===
If you have headers and libraries installed in non-standard locations that cmake cannot find (e.g., fink on Mac OSX installs to /sw), then set the following as environment variables. Despite the similar naming convention, these will not work as arguments on the cmake command line:
+
Wenn sich Header oder Bibliotheken an einem nicht-standarisierten Ort befinden, den CMake nicht findenkann (so wird zum Beispiel fink auf Mac OSX in /sw installiert), kann man folgendende Umgebungsvariablen setzen. Trotz der ähnlichen Namensgebung, funktionieren diese nicht als Kommandozeilenparameter für CMake:  
* '''CMAKE_INCLUDE_PATH''', eg. export CMAKE_INCLUDE_PATH=/sw/include
+
* '''CMAKE_LIBRARY_PATH''', eg. export CMAKE_LIBRARY_PATH=/sw/lib
+
  
For more information on variables, see [http://www.cmake.org/Wiki/CMake_Useful_Variables this cmake.org wiki page]
+
* '''CMAKE_INCLUDE_PATH''', Beispiel: export CMAKE_INCLUDE_PATH=/sw/include
 +
* '''CMAKE_LIBRARY_PATH''', Beispiel: export CMAKE_LIBRARY_PATH=/sw/lib
  
=== Going Further ===
+
Mehr Informationen über Umgebungsvariablen
If cmake finishes with "Generating done" then there was no errors, but if it finishes with "Configuring done" then there was errors that you have to fix. Once cmake finishes successfully, run your buildtool (i.e. make, KDevelop, XCode or MSVC) and build and wait until it has finished.  Then "make install".  
+
[http://www.cmake.org/Wiki/CMake_Useful_Variables hier]
  
If you got a failure that says something like
+
=== Nach dem Aufruf von CMake ===
<code>
+
Schließt cmake mit der Meldung "Generating done" ab, gab es keine Fehler. Schließt es jedoch mit "Configuring done" ab, gab es Fehler, die es zu beheben gilt. Wenn cmake erfolgreich durchgelaufen ist, rufen Sie das entsprechende Werkzeug zur weiteren Bearbeitung auf (z.B. make, KDevelop, XCode oder MSVC). Das Ziel wird erzeugt, warten Sie bis die Erzeugung abgeschlossen ist. Anschließend können Sie z.B. "make install" aufrufen.
 +
 
 +
Gibt es eine Fehlermeldung der Art
 +
<syntaxhighlight lang="text">
 
CMake Error: This project requires some variables to be set,
 
CMake Error: This project requires some variables to be set,
 
and cmake can not find them.
 
and cmake can not find them.
 
Please set the following variables:
 
Please set the following variables:
 
X11_XTest_LIB (ADVANCED)
 
X11_XTest_LIB (ADVANCED)
</code>
+
</syntaxhighlight>
then you may have a missing library (or other dependency). To find
+
kann es an einer fehlenden Bibliothek oder anderen Abhängigkeit liegen. Um herauszufinden, welche Bibliothek, suchen Sie im Verzeichnis cmake/modules nach der Variable, die cmake nicht finden kann. Im obigen Beispiel ist das
out which library, search in the cmake/modules directory for
+
<syntaxhighlight lang="text">
the variable that cmake can't find. In the example above, it is
+
<code>
+
 
FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})
 
FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})
</code>
+
</syntaxhighlight>
So the missing library is Xtst. You then need to find it (perhaps installing a libXtst-devel library) and re-run cmake.
+
Also fehlt die Biblothek Xtst. Diese muss ggf. nachinstalliert werden oder der Pfad dahin angegeben werden (s.o.). Anschließend rufen Sie cmake erneut auf.
  
== Using CMake for a Simple Application ==
+
== CMake für eine einfache Applikation anwenden ==
  
Here's the most simple CMakeLists.txt:
+
Die einfachste CMakeLists.txt Datei ist folgende:
<code>
+
<syntaxhighlight lang="text">
 
add_executable(hello main.cpp)
 
add_executable(hello main.cpp)
</code>
+
</syntaxhighlight>
This will create an executable named "hello" (or "hello.exe" under Windows) from the source file main.cpp. You can mix C and C++ files as you want. You can have multiple executables and libraries in one CMakeLists.txt. The same source file can be used in multiple targets, it will be compiled for each target independently from the other targets. Probably the most important part of the cmake language are the variables:
+
Dadurch wird aus der Quelldatei "main.cpp" eine ausführbare Datei namens "hello" (oder "hello.exe" unter Windows) erzeugt. C und C++ Dateien können vermischt werden, wenn das gewünscht wird. Es kann mehrere ausführbare Dateien und/oder Bibliotheken in einer CMakeLists.txt Datei geben. Die selbe Quelldatei kann in mehreren Zielen benutzt werden, es wird für jedes Ziel unabhängig von anderen Zielen erzeugt. Der vielleicht interessanteste Teil an der CMake-Sprache sind die Variablen:
<code>
+
<syntaxhighlight lang="text">
 
SET( MY_SOURCES main.cpp widget.cpp)
 
SET( MY_SOURCES main.cpp widget.cpp)
 
MESSAGE(STATUS "my sources: ${MY_SOURCES}")
 
MESSAGE(STATUS "my sources: ${MY_SOURCES}")
</code>
+
</syntaxhighlight>
So, use the SET() command to set the value of a variable. If you list more than one string, the variable will be a list.   A list is a list of strings separated by semicolons. If you set it to only one item, it will have just that value. To get the value of a variable, use ${VAR}.
+
Mit dem SET() Kommando werden die Werte von Variblen gesetzt. Wenn Sie mehr als eine Zeichenkette übergeben, wird die Variable als Liste gesetzt. Eine Liste ist eine Liste von Zeichenketten, die durch Semikolon getrennt sind. Haben Sie nur einen Eintrag, wird die Variable nur auf diesen einen Wert gesetzt. Um den Wert einer Variable zu ermitteln, benutzen Sie ${VAR}. Eine Liste kann mit FOREACH() iteriert werden:
You can iterate over a list using FOREACH():
+
<syntaxhighlight lang="text">
<code>
+
 
FOREACH(next_ITEM ${MY_SOURCES})
 
FOREACH(next_ITEM ${MY_SOURCES})
 
   MESSAGE(STATUS "next item: ${next_ITEM}")
 
   MESSAGE(STATUS "next item: ${next_ITEM}")
 
ENDFOREACH(next_ITEM ${MY_SOURCES})
 
ENDFOREACH(next_ITEM ${MY_SOURCES})
</code>
+
</syntaxhighlight>
The commands in CMake are case-insensitive.  Names of variables and names of parameter are case-sensitive.
+
Groß- und Kleinschreibung wird in CMake Kommandos ignoriert, jedoch in Variablen und den Namen von Parametern unterschieden.
  
You can also test for various things:
+
Man kann auch auf verschiedene Werte testen:
<code>
+
<syntaxhighlight lang="text">
 
IF (UNIX)
 
IF (UNIX)
 
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
 
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
Line 173: Line 182:
 
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
 
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
 
ENDIF (MSVC)
 
ENDIF (MSVC)
</code>
+
</syntaxhighlight>
In this second example  you can see also how to append items to a list.
+
Das zweite Beispiel zeigt gleichzeitig, wie man Einträge zu einer Liste hinzufügt.
  
In the cmake Wiki there is also a [http://www.cmake.org/Wiki/HowToBuildKDE4Software  tutorial] on using cmake to build KDE 4 software. It is recommended reading.
+
Es gibt auch in der CMake Wiki eine lesenswerte [http://www.cmake.org/Wiki/HowToBuildKDE4Software  Anleitung], die erläutert, wie man cmake benutzt, um KDE 4 Software zu erzeugen.  
  
== Using CMake for a KDE Project ==
+
== CMake für ein KDE 4 Projekt benutzen ==
  
Here's a basic CMakeList file that builds a small KDE 4 project:
+
Folgendes Beispiel demonstriert eine einfache CMakeList.txt Datei für ein kleines KDE 4 Projekt:
<code>
+
<syntaxhighlight lang="text">
 
PROJECT(kde4project)
 
PROJECT(kde4project)
 
FIND_PACKAGE(KDE4 REQUIRED)
 
FIND_PACKAGE(KDE4 REQUIRED)
Line 191: Line 200:
  
 
TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
 
TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )
</code>
+
</syntaxhighlight>
  
Variables, macros and other useful information specific to KDE can be found at the [[Development/KDE and CMake Together]] page.
+
Variablen, Makros und andere nützliche Informationen spezifisch für KDE kann unter [[Development/CMake/Addons for KDE]] gefunden werden.
  
== Extending CMake ==
+
== CMake erweitern ==
CMake can be extended using cmake scripts. CMake comes with a number of scripts; under UNIX they are by default installed to /usr/local/share/CMake/Modules/. The KDE libraries install also a set of cmake modules into share/apps/cmake/modules/. The files located there will be preferred over the ones in the system global cmake module path.
+
CMake kann mit cmake-Skripten erweitert werden. Es werden eine Reihe von Scripten mitgeliefert, die unter UNIX standardmäßig unter /usr/local/share/CMake/Modules/ installiert werden. Die KDE-Bibliotheken installieren selber einen Satz CMake-Module nach share/apps/cmake/modules/. Die Dateien dort werden denjenigen im globalen Modulpfad von cmake vorgezogen.
For detecting software packages there are FindFOO.cmake files, see [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware here] for more information.
+
You can also write macros in CMake. They are powerful enough to do most things you will need to build software, but they are not intended to be used as a general purpose programming language.
+
  
== Converting autotools-based KDE software to CMake ==
+
Um Software-Pakete zu finden, gibt es FindFOO.cmake Dateien, siehe [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware hier] für weitere Informationen.
In kdesdk/cmake/ you can find a script am2cmake . This is a ruby script, so you need to have ruby installed. Run am2cmake in the toplevel directory of your sources:
+
Sie können auch Makros in CMake schreiben. Diese sind mächtig genug, die meisten Dinge zu erledigen, die Sie benötigen, um Software zu erstellen, sind jedoch nicht dazu konzipiert, als allgemeine Programmiersprache zu dienen.
<code>
+
 
 +
== autotools-basierte KDE Software nach CMake konvertieren ==
 +
In kdesdk/cmake/ gibt es ein Skript namens am2cmake. Da es sich um ein Ruby-Script handelt, muss ruby installiert sein. Rufen Sie am2cmake im obersten Verzeichnis ihres Projektes auf:
 +
<syntaxhighlight lang="text">
 
$ cd src/mykooltool/
 
$ cd src/mykooltool/
 
$ am2cmake --kde4
 
$ am2cmake --kde4
</code>
+
</syntaxhighlight>
Don't forget the switch "--kde4", otherwise it won't generate files suitable for KDE 4 software. The converted files 'may' work as they are, but complicated projects will require some additional editing.
+
Vergessen Sie nicht den Schalter "--kde4", sonst werden keine für KDE 4 Software passenden Dateien erzeugt. Die erzeugten Dateien 'könnten' so wie sind funktieren, doch bei komplizierteren Projekten wird in der Regel zusätzliche Bearbeitung notwendig sein.
 +
 
 +
Es könnte sein, dass
 +
* mit INCLUDE_DIRECTORIES() weitere benötigte Verzeichnisse hinzugefügt werden müssen
 +
* mit TARGET_LINK_LIBRARIES() zusätzliche Bibliotheken angeben werden müssen, die mit dem Projekt verlinkt werden müssen.
 +
* mit ADD_DEFINITIONS() zusätzliche Compiler-Schalter gesetzt werden müssen
 +
* einige zusätzliche "configure" Prüfungen gesetzt werden müssen, siehe auch [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] und [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]
 +
* Sie sich den sog. "convenience libraries" von libtool gesondert annehmen müssen. Diese werden von cmake nicht unterstützt, statt dessen wird eine Datei namens ConvenienceLibs.cmake created erzeugt. In dieser Datei finden Sie für jede einzelne "convenience library" eine einzelne Variable, welche alle Quelldateien für diese Bibliothek beinhaltet. Für Ziele, die mit diesen Bibliotheken verlinkt werden, fügen Sie einfach die Variable zu den Quellen hinzu.
 +
* Eine Datei namens AdditionalInfo.txt wird erzeugt. Hier werden alle *.in und *.in.in Dateien des Projektes aufgelistet. Die Aufgaben in diesen Dateien müssen von Hand nach cmake konvertiert werden.
  
You may have to:
+
== Häufig gestellte Fragen (FAQs) ==
* add more include direcories, using INCLUDE_DIRECTORIES()
+
* add more link libraries, using TARGET_LINK_LIBRARIES()
+
* add some compile switches, using ADD_DEFINITIONS()
+
* add some "configure" checks, see [http://www.cmake.org/Wiki/CMake_HowToDoPlatformChecks How To Do Platform Checks] and [http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware How To Find Installed Software]
+
* take special care of former libtool convenience libraries. They are not supported by cmake, instead there will be a file ConvenienceLibs.cmake created.  In this file you will find for every convenience lib a variable, which contains all source files of this convenience lib.  For the targets which linked to this convenience lib, just add the variable to the sources.
+
* a file AdditionalInfo.txt will be created.  There you will see all *.in and *.in.in files of your project. The stuff done in these files will have to be converted manually to cmake.
+
  
== Frequently Asked Questions ==
+
=== Wie kann ich meinem bevorzugten Editor beibringen, die CMake Syntax hevorzuheben?  ===
 +
Lesen Sie [http://www.cmake.org/Wiki/CMake_Editors_Support CMake Editors Support]. Hier wird beschrieben, wie man Emacs (auch XEmacs), VIM, Kate, KWrite, and KDevelop anpasst.
  
=== How can I teach my favorite editor about CMake syntax and indentation ? ===
+
=== Ich benötige einige Dateien, welche während des Übersetzens erzeugt werden. Wie bewerkstellige ich das? ===
Read the CMake Wiki section [http://www.cmake.org/Wiki/CMake_Editors_Support CMake Editors Support]It describes how to setup Emacs (XEmacs works too), VIM, Kate, KWrite, and KDevelop.
+
Fügen Sie ADD_CUSTOM_COMMAND() hinzu. Das wird im CMake wiki erklärt: [http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F How can I generate a source file during the build]
  
=== I need to generate some files during the build. How do I do this ? ===
+
=== Ich benötige ausführbare Dateien, die im späteren Übersetzungsvorgang bestimmte Dateien erzeugen. Wie mache ich das? ===
Use ADD_CUSTOM_COMMAND(). It's explained here in the CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_generate_a_source_file_during_the_build.3F  How can I generate a source file during the build]
+
Nehmen wir an die ausführbare Datei heißt genembed. Benutzen Sie KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources}) um diese ausführbare Datei zu erzeugen. Die RUN_UNINSTALLED Option ist wichtig, da die ausführbare Datei vom build Verzeichnis aus aufgerufen wird und Bibliotheken in diesem Verzeichnis benötigt. Um das zu bewerkstelligen, wird die ausführbare Datei mit einem entsprechend gesetztem RPATH kompiliert, und ein Wrapper Shell Skript erzeugt, welches genau so heißt wie die ausführbare Datei nur mit der Endung ".sh". Diese Script setzt die Variable LD_LIBRARY_PATH und ruft die eigentliche ausführbare Datei auf
  
=== I need to build an executable which is used later on during the build to generate files. How do I do this ? ===
+
Benutzen Sie dieses Script im oben beschriebenen ADD_CUSTOM_COMMAND(). Sie könnnen den Namen und den Pfad ermittelt, indem Sie die Eigenschaft WRAPPER_SCRIPT abfragen. Das hier ist ein vollständiges Beispiel aus  kdelibs/kstyles/keramik/ :
Let's say the executable is called genembed. Then use KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources})to create the executable. The RUN_UNINSTALLED option is important, because the executable has to run from the build dir and has to link to the libraries in the builddir. To achieve this, the executable is compiled with RPATH set accordingly and a wrapper shell script, named just like the executable but with the suffix ".sh" is created. This shell scripts sets up LD_LIBRARY_PATH and the calls the actual executable.
+
<syntaxhighlight lang="text">
Use this wrapper shell script in the ADD_CUSTOM_COMMAND() as described above.
+
You can find out the name and exact location by querying the property WRAPPER_SCRIPT. Here's a full example taken from kdelibs/kstyles/keramik/ :
+
<code>
+
 
# build the executable
 
# build the executable
 
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})
 
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})
Line 241: Line 251:
 
   DEPENDS genembed ${keramikPics}
 
   DEPENDS genembed ${keramikPics}
 
)
 
)
</code>
+
</syntaxhighlight>
  
As you can see genembed is also listed as a dependency, this means cmake knows that it has to build the executable genembed before executing this rule.
+
Wie Sie sehen, ist genembed auch als Abhängigkeit gelistet. Das heißt, dass cmake weiß, daß es diese Datei erzeugen muss, bevor diese Regel aushgeführt wird.
  
=== I don't want to set the -DCMAKE_INSTALL_PREFIX command line option.  Does cmake support the KDEDIR environment variable? ===
+
=== Ich möchte statt der -DCMAKE_INSTALL_PREFIX Kommandozeilenoptionen lieber die KDEDIR Umgebungsvariable benutzen. Wird das von CMake unterstützt? ===
No. $KDEDIR is deprecated in KDE 4.
+
Nein. $KDEDIR ist in KDE4 veraltet.
  
=== Why do i get compile errors like /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'? ===
+
=== Warum bekomme ich Compilerfehler wie /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'? ===
A: If you have an old Qt4 version in your qt/lib directory you must delete the old (4.0.1) files.
+
A: Wenn Sie eine alte Qt4 Version im qt/lib Verzeichnis installiert haben, müssen die alten (4.0.1) Dateien gelöscht werden.
  
=== How do I tell cmake to create noisy makefiles?  I want to see the exact commands that are run during the make process. ===
+
=== Wie kann ich cmake anweisen, mehr Makefiles mit mehr Ausgaben zu erzeugen. Ich möchte genau sehen, welche Kommandos während des Make-Prozesses ausgeführt werden ===
Pass the VERBOSE variable to make, i.e.
+
Übergeben Sie einfach die VERBOSE Variable zu make, z.B.
<code>
+
<syntaxhighlight lang="text">
 
% make VERBOSE=1
 
% make VERBOSE=1
</code>
+
</syntaxhighlight>
or
+
oder
<code>
+
<syntaxhighlight lang="text">
 
% VERBOSE=1 make
 
% VERBOSE=1 make
</code>
+
</syntaxhighlight>
  
For more details see the CMake wiki: [http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?]
+
Nähere Informationen können dem Artikel [http://www.cmake.org/Wiki/CMake_FAQ#Is_there_an_option_to_produce_more_.27verbose.27_compiling.3F Is there an option to produce more 'verbose' compiling?] entnommen werden.
  
=== There is no 'make distclean' target in the generated Makefiles. How do I clean up everything, including the cache files? ===
+
=== Es gibt kein 'make distclean' Ziel in den erzeugten Makefiles. Wie kann ich das Projekt einschließlich der Cache-Dateien komplett neu erzeugen? ===
Simply remove the build directory, or just the contents of the build directory.
+
Entfernen Sie einfach das build Verzeichnis oder den Inhalt dieses Verzeichnisses.
  
 
[[Category:Programming]]
 
[[Category:Programming]]
 
[[Category:Tutorial]]
 
[[Category:Tutorial]]
 
[[Category:FAQs]]
 
[[Category:FAQs]]

Latest revision as of 15:31, 14 July 2012


CMake
Anleitungsserie   Grundlagen
Voriges Kapitel   None
Nächstes Kapitel   n/a
Weiterführende Texte   n/a
Navigation   Deutsche Startseite

Contents

[edit] Zusammenfassung

CMake ist das Build-System, das KDE benutzt. Diese Anleitung beschreibt, wie man CMake benutzt und wie man die Projektdateien schreibt.

[edit] Einführung

CMake liest Script Dateien ein und gibt Eingabedateien für das native Buildsystem der Platform auf der es läuft aus. Es kann GNU Makefiles, KDevelop Projekt Dateien, Eclipse Projekt Dateien, XCode Projekt Dateien und Visual Studio Projekt Dateien ausgeben.

CMake ist freie Software, die unter einer BSD-artigen Lizenz veröffentlicht wird. Entwickelt wird es von Kitware Inc.

Hier einige Links, wo man etwas über CMake im Allgemeinen lernen kann (meist englisch):

Es gibt auch eine CMake Mailing List.

[edit] Warum man CMake benutzen sollte

CMake ist nach einer Entscheidung im März 2006 das offizielle Werkzeug von KDE 4, vorwiegend aus technischen Vorteilen gegenüber den älteren KDE Werkzeugen automake und unsermake:

  • CMake wird unabhänging von KDE entwickelt und kann auch von anderen Projekten benutzt werden.
  • Die Übersetzungszeit verkürzt sich durch CMake, hauptsächlich weil libtool nicht mehr benutzt wird.
  • Die CMake-Dateien sind einfacher zu schreiben.

[edit] Wie man KDE mit Hilfe von CMake übersetzt

[edit] CMake herunterladen und installieren

[edit] Linux, BSD und andere Unix Systeme

Die neuste Version von CMake kann von [1] heruntergeladen werden.

Einmal heruntergeladen, muss es entpackt und übersetzt werden:

$ mkdir cmake-build
$ cd cmake-build
$ ../bootstrap
$ make
$ make install

Standardmäßig wird CMake in /usr/local installiert, daher muss /usr/local/bin in Pfad für ausführbare Dateien stehen. Um das Installationspräfix zu ändern (z.B. in /usr in debian), muss die '--prefix=PATH' Option zum bootstrap Kommando hinzugefügt werden.

Möchte man die aktuelle Entwicklerversion von CMake benutzen, findet man hier eine Anleitung.

[edit] Windows

Neuste Version von CMake von hier herunterladen.

Dann den Cmake-Installer aufrufen

Standardmäßig wird CMake in C:\$(Program Files)\CMake 2.4 installiert.

Möchte man die aktuelle Entwicklerversion von CMake benutzen, findet man hier eine Anleitung.

[edit] CMake ausführen

[edit] Linux, BSD, and other Unix Systems

Um die Build-Dateien für das System zu erzeugen, muss CMake aufgerufen werden. Sowohl Übersetzungsvorgänge innerhalb des Codes als auch in einem gesonderten werden von CMake unterstützt, wobei KDE derzeit einen Übersetzungsvorgang innerhalb des Quellcodes verbietet.

Hat man zum Beispiel kdelibs/ in ~/src/kdelibs/, dann ruft man folgende Befehle auf:

$ ls
kdelibs/
$ mkdir kdelibs-build
$ cd kdelibs-build
$ cmake ../kdelibs

Das wird die Makefiles im Verzeichnis kdelibs-build erzeugen, die zum Übersetzen von kdelibs benötigt werden.

[edit] Windows

Um die Build-Dateien für das System zu erzeugen, muss CMake aufgerufen werden. Sowohl Übersetzungsvorgänge innerhalb des Codes als auch in einem gesonderten werden von CMake unterstützt, wobei KDE derzeit einen Übersetzungsvorgang innerhalb des Quellcodes verbietet.

Hat man zum Beispiel kdelibs\ in c:\daten\kde4, dann ruft man folgende Befehle auf:

c:\daten\kde4> cd kdelibs\win
c:\daten\kde4> cmake
c:\daten\kde4> make 
c:\daten\kde4> make install
c:\daten\kde4> cd ..
c:\daten\kde4> mkdir kdelibs-build
c:\daten\kde4> cd kdelibs-build
c:\daten\kde4\kdelibs-build> cmake ..\kdelibs

Dadurch werden die Makefiles, um kdelibs\ zu erzeugen in kdelibs-build angelegt. Siehe auch KDE On Windows für mehr Informationen über das Übersetzen von KDE unter Windows.

[edit] Projektdateien für KDevelop

Benötigen Sie Projektdateien für KDevelop (was einfache Makefile mit einigen zusätzlichen Extradateien für KDevelop sind), rufen Sie folgenden Befehl auf:

$ cmake ../kdelibs -GKDevelop3

Mit 'cmake -h' kann man herausfinden, welche Generatoren CMake unterstützt und welche weiteren Optionen es gibt.

[edit] CMake und Qt4

Um Qt 4 zu finden sucht CMake nach qmake im Pfad für ausführbare Dateien. CMake benutzt nicht die QTDIR Umgebungsvariable. Daher müssen Sie sicherstellen, dass das erste qmake, welches im Pfad gefunden wird dasjenige ist, welches benutzt werden soll (also bei Parallelinstallationen von Qt3 und Qt4 entsprechend Qt4 zuerst gefunden wird).

[edit] Mehr Details

Wenn CMake seine Arbeit beendet hat, existiert eine Datei namens "CMakeCache.txt". Diese Datei enthält alle Einstellungen, die von CMake auf dem System entdeckt worden sind. Soll CMake mit einem anderen Generator aufgerufen werden oder das System neu untersucht werden, löschen Sie diese Datei. Wenn CMake etwas nicht findet, aber Sie wissen, dass es auf Ihrem System ist, können Sie CMake manuell mitteilen, wo man es findet. CMake benutzt Variablen um diese Information zu speichern und zwar in der eben erwähnten CMakeCache.txt Datei. Es gibt drei Möglichkeiten, diese Variablen manuell einzustellen:

  • CMake den korrekten Wert über die Kommandozeile mitteilen:

cmake ../kdelibs -DNAME_OF_THE_VARIABLE=value

  • ccmake benutzen, welches eine auf curses basierende GUI aufruft, um CMake Variablen zu setzen ((run: ccmake ../kdelibs)
  • Die Datei CMakeCache.txt direkt bearbeiten (wird nicht empfohlen)

Sie sollten "ccmake ../kdelibs" mindesten einmal aufrufen, so dass Sie einen Eindruck bekommen, welche Variable CMake benutzt. Drücken Sie "T" um die "fortgeschrittenen" Variablen zu sehen. Wenn also CMake etwas bestimmtes nicht von sich aus findet, rufen Sie ccmake auf und stellen Sie es von Hand ein.

[edit] Kommandozeilenvariablen

Folgende cmake Kommandozeilenvariablen könnten für Sie von Interesse sein:

  • CMAKE_INSTALL_PREFIX: cmake ../kdelibs -DCMAKE_INSTALL_PREFIX=/opt/kde4 entspricht dem früheren ./configure --prefix=/opt/kde4
  • CMAKE_BUILD_TYPE: Hier kann man sich aussuchen, welche Debug-Informationen erzeugt werden sollen. Folgende Möglichkeiten stehen zur Auswahl: "debugfull", "debug", "profile", "relwithdebinfo", "release". Voreinstellung ist "relwithdebinfo" (-O2 -g). Weitere Details befinden sich im Artikel CMake Build Types.
  • KDE4_BUILD_TESTS=ON: erzeugt Makefiles die zusätzliche Testprogramme erzeugen und auch das Ziel 'test' zur Verfügung stellen.
  • KDE4_TEST_OUTPUT=xml: Unit tests, die das QTestLib Framework benutzen werden xml-formatierte Logfiles erzeugen.
  • KDE4_DISABLE_MULTIMEDIA=ON: Erzeugt KDE ohne jegliche Multimediaunterstützung (Audio und Video)
  • RPATH_STYLE: Diese Kommandozeilenoption gibt es nicht mehr. Per Voreinstllung wird alles mit einem korrekten RPATH erzeugt. Möchten Sie RPATH nicht, setzten Sie CMAKE_SKIP_RPATH auf TRUE.
  • BUILD_foo=OFF: Schaltet die Erzeugung im Unterverzeichnis 'foo' ab.
  • WITH_foo: Hier gibt es mehrere Möglichkeiten, z.B. WITH_CUPS oder WITH_Jasper. Wenn Sie diese Punkte ausschalten, wird CMake nicht versuchen, die Pakete zu finden, ansonsten sucht CMake danach. Schlägt das Fehl, kann man wie oben beschrieben manuell nachhelfen.

[edit] Umgebungsvariablen

Wenn sich Header oder Bibliotheken an einem nicht-standarisierten Ort befinden, den CMake nicht findenkann (so wird zum Beispiel fink auf Mac OSX in /sw installiert), kann man folgendende Umgebungsvariablen setzen. Trotz der ähnlichen Namensgebung, funktionieren diese nicht als Kommandozeilenparameter für CMake:

  • CMAKE_INCLUDE_PATH, Beispiel: export CMAKE_INCLUDE_PATH=/sw/include
  • CMAKE_LIBRARY_PATH, Beispiel: export CMAKE_LIBRARY_PATH=/sw/lib

Mehr Informationen über Umgebungsvariablen hier

[edit] Nach dem Aufruf von CMake

Schließt cmake mit der Meldung "Generating done" ab, gab es keine Fehler. Schließt es jedoch mit "Configuring done" ab, gab es Fehler, die es zu beheben gilt. Wenn cmake erfolgreich durchgelaufen ist, rufen Sie das entsprechende Werkzeug zur weiteren Bearbeitung auf (z.B. make, KDevelop, XCode oder MSVC). Das Ziel wird erzeugt, warten Sie bis die Erzeugung abgeschlossen ist. Anschließend können Sie z.B. "make install" aufrufen.

Gibt es eine Fehlermeldung der Art

CMake Error: This project requires some variables to be set,
and cmake can not find them.
Please set the following variables:
X11_XTest_LIB (ADVANCED)

kann es an einer fehlenden Bibliothek oder anderen Abhängigkeit liegen. Um herauszufinden, welche Bibliothek, suchen Sie im Verzeichnis cmake/modules nach der Variable, die cmake nicht finden kann. Im obigen Beispiel ist das

FIND_LIBRARY(X11_XTest_LIB Xtst ${X11_LIB_SEARCH_PATH})

Also fehlt die Biblothek Xtst. Diese muss ggf. nachinstalliert werden oder der Pfad dahin angegeben werden (s.o.). Anschließend rufen Sie cmake erneut auf.

[edit] CMake für eine einfache Applikation anwenden

Die einfachste CMakeLists.txt Datei ist folgende:

add_executable(hello main.cpp)

Dadurch wird aus der Quelldatei "main.cpp" eine ausführbare Datei namens "hello" (oder "hello.exe" unter Windows) erzeugt. C und C++ Dateien können vermischt werden, wenn das gewünscht wird. Es kann mehrere ausführbare Dateien und/oder Bibliotheken in einer CMakeLists.txt Datei geben. Die selbe Quelldatei kann in mehreren Zielen benutzt werden, es wird für jedes Ziel unabhängig von anderen Zielen erzeugt. Der vielleicht interessanteste Teil an der CMake-Sprache sind die Variablen:

SET( MY_SOURCES main.cpp widget.cpp)
MESSAGE(STATUS "my sources: ${MY_SOURCES}")

Mit dem SET() Kommando werden die Werte von Variblen gesetzt. Wenn Sie mehr als eine Zeichenkette übergeben, wird die Variable als Liste gesetzt. Eine Liste ist eine Liste von Zeichenketten, die durch Semikolon getrennt sind. Haben Sie nur einen Eintrag, wird die Variable nur auf diesen einen Wert gesetzt. Um den Wert einer Variable zu ermitteln, benutzen Sie ${VAR}. Eine Liste kann mit FOREACH() iteriert werden:

FOREACH(next_ITEM ${MY_SOURCES})
   MESSAGE(STATUS "next item: ${next_ITEM}")
ENDFOREACH(next_ITEM ${MY_SOURCES})

Groß- und Kleinschreibung wird in CMake Kommandos ignoriert, jedoch in Variablen und den Namen von Parametern unterschieden.

Man kann auch auf verschiedene Werte testen:

IF (UNIX)
   MESSAGE(STATUS "This is UNIX (including OS X and CygWin)")
ENDIF (UNIX)
 
IF (MSVC)
   SET(MY_SRCS ${MY_SRCS} winextra.cpp)
ENDIF (MSVC)

Das zweite Beispiel zeigt gleichzeitig, wie man Einträge zu einer Liste hinzufügt.

Es gibt auch in der CMake Wiki eine lesenswerte Anleitung, die erläutert, wie man cmake benutzt, um KDE 4 Software zu erzeugen.

[edit] CMake für ein KDE 4 Projekt benutzen

Folgendes Beispiel demonstriert eine einfache CMakeList.txt Datei für ein kleines KDE 4 Projekt:

PROJECT(kde4project)
FIND_PACKAGE(KDE4 REQUIRED)
INCLUDE_DIRECTORIES( ${KDE4_INCLUDES} )
 
SET(KDE4ProjectSources kde4mainapp.cpp someclass.cpp someotherclass.cpp)
 
KDE4_ADD_EXECUTABLE(kde4project ${KDE4ProjectSources} )
 
TARGET_LINK_LIBRARIES(kde4project ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} )

Variablen, Makros und andere nützliche Informationen spezifisch für KDE kann unter Development/CMake/Addons for KDE gefunden werden.

[edit] CMake erweitern

CMake kann mit cmake-Skripten erweitert werden. Es werden eine Reihe von Scripten mitgeliefert, die unter UNIX standardmäßig unter /usr/local/share/CMake/Modules/ installiert werden. Die KDE-Bibliotheken installieren selber einen Satz CMake-Module nach share/apps/cmake/modules/. Die Dateien dort werden denjenigen im globalen Modulpfad von cmake vorgezogen.

Um Software-Pakete zu finden, gibt es FindFOO.cmake Dateien, siehe hier für weitere Informationen. Sie können auch Makros in CMake schreiben. Diese sind mächtig genug, die meisten Dinge zu erledigen, die Sie benötigen, um Software zu erstellen, sind jedoch nicht dazu konzipiert, als allgemeine Programmiersprache zu dienen.

[edit] autotools-basierte KDE Software nach CMake konvertieren

In kdesdk/cmake/ gibt es ein Skript namens am2cmake. Da es sich um ein Ruby-Script handelt, muss ruby installiert sein. Rufen Sie am2cmake im obersten Verzeichnis ihres Projektes auf:

$ cd src/mykooltool/
$ am2cmake --kde4

Vergessen Sie nicht den Schalter "--kde4", sonst werden keine für KDE 4 Software passenden Dateien erzeugt. Die erzeugten Dateien 'könnten' so wie sind funktieren, doch bei komplizierteren Projekten wird in der Regel zusätzliche Bearbeitung notwendig sein.

Es könnte sein, dass

  • mit INCLUDE_DIRECTORIES() weitere benötigte Verzeichnisse hinzugefügt werden müssen
  • mit TARGET_LINK_LIBRARIES() zusätzliche Bibliotheken angeben werden müssen, die mit dem Projekt verlinkt werden müssen.
  • mit ADD_DEFINITIONS() zusätzliche Compiler-Schalter gesetzt werden müssen
  • einige zusätzliche "configure" Prüfungen gesetzt werden müssen, siehe auch How To Do Platform Checks und How To Find Installed Software
  • Sie sich den sog. "convenience libraries" von libtool gesondert annehmen müssen. Diese werden von cmake nicht unterstützt, statt dessen wird eine Datei namens ConvenienceLibs.cmake created erzeugt. In dieser Datei finden Sie für jede einzelne "convenience library" eine einzelne Variable, welche alle Quelldateien für diese Bibliothek beinhaltet. Für Ziele, die mit diesen Bibliotheken verlinkt werden, fügen Sie einfach die Variable zu den Quellen hinzu.
  • Eine Datei namens AdditionalInfo.txt wird erzeugt. Hier werden alle *.in und *.in.in Dateien des Projektes aufgelistet. Die Aufgaben in diesen Dateien müssen von Hand nach cmake konvertiert werden.

[edit] Häufig gestellte Fragen (FAQs)

[edit] Wie kann ich meinem bevorzugten Editor beibringen, die CMake Syntax hevorzuheben?

Lesen Sie CMake Editors Support. Hier wird beschrieben, wie man Emacs (auch XEmacs), VIM, Kate, KWrite, and KDevelop anpasst.

[edit] Ich benötige einige Dateien, welche während des Übersetzens erzeugt werden. Wie bewerkstellige ich das?

Fügen Sie ADD_CUSTOM_COMMAND() hinzu. Das wird im CMake wiki erklärt: How can I generate a source file during the build

[edit] Ich benötige ausführbare Dateien, die im späteren Übersetzungsvorgang bestimmte Dateien erzeugen. Wie mache ich das?

Nehmen wir an die ausführbare Datei heißt genembed. Benutzen Sie KDE4_ADD_EXECUTABLE(foo RUN_UNINSTALLED ${fooSources}) um diese ausführbare Datei zu erzeugen. Die RUN_UNINSTALLED Option ist wichtig, da die ausführbare Datei vom build Verzeichnis aus aufgerufen wird und Bibliotheken in diesem Verzeichnis benötigt. Um das zu bewerkstelligen, wird die ausführbare Datei mit einem entsprechend gesetztem RPATH kompiliert, und ein Wrapper Shell Skript erzeugt, welches genau so heißt wie die ausführbare Datei nur mit der Endung ".sh". Diese Script setzt die Variable LD_LIBRARY_PATH und ruft die eigentliche ausführbare Datei auf

Benutzen Sie dieses Script im oben beschriebenen ADD_CUSTOM_COMMAND(). Sie könnnen den Namen und den Pfad ermittelt, indem Sie die Eigenschaft WRAPPER_SCRIPT abfragen. Das hier ist ein vollständiges Beispiel aus kdelibs/kstyles/keramik/ :

# build the executable
KDE4_ADD_EXECUTABLE(genembed RUN_UNINSTALLED ${genembed_SRCS})
 
# get the name of the generated wrapper script (which sets up LD_LIBRARY_PATH)
GET_TARGET_PROPERTY(GENEMBED_EXECUTABLE genembed WRAPPER_SCRIPT)
 
# and the custom command
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/keramikrc.h
  COMMAND ${GENEMBED_EXECUTABLE} --file ${CMAKE_CURRENT_BINARY_DIR}/keramikPics.txt > \
  ${CMAKE_CURRENT_BINARY_DIR}/pixmaps.keramik
  DEPENDS genembed ${keramikPics}
)

Wie Sie sehen, ist genembed auch als Abhängigkeit gelistet. Das heißt, dass cmake weiß, daß es diese Datei erzeugen muss, bevor diese Regel aushgeführt wird.

[edit] Ich möchte statt der -DCMAKE_INSTALL_PREFIX Kommandozeilenoptionen lieber die KDEDIR Umgebungsvariable benutzen. Wird das von CMake unterstützt?

Nein. $KDEDIR ist in KDE4 veraltet.

[edit] Warum bekomme ich Compilerfehler wie /usr/lib/qt4/include/QtCore/qstring.h:536: undefined reference to `QString::fromLatin1_helper(char const*, int)'?

A: Wenn Sie eine alte Qt4 Version im qt/lib Verzeichnis installiert haben, müssen die alten (4.0.1) Dateien gelöscht werden.

[edit] Wie kann ich cmake anweisen, mehr Makefiles mit mehr Ausgaben zu erzeugen. Ich möchte genau sehen, welche Kommandos während des Make-Prozesses ausgeführt werden

Übergeben Sie einfach die VERBOSE Variable zu make, z.B.

% make VERBOSE=1

oder

% VERBOSE=1 make

Nähere Informationen können dem Artikel Is there an option to produce more 'verbose' compiling? entnommen werden.

[edit] Es gibt kein 'make distclean' Ziel in den erzeugten Makefiles. Wie kann ich das Projekt einschließlich der Cache-Dateien komplett neu erzeugen?

Entfernen Sie einfach das build Verzeichnis oder den Inhalt dieses Verzeichnisses.


This page was last modified on 14 July 2012, at 15:31. This page has been accessed 30,719 times. Content is available under Creative Commons License SA 3.0 as well as the GNU Free Documentation License 1.2.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V.Legal