Neue Dateien beim Build
Eine der anspruchsvollen Aufgaben eines Buildsystems ist es, erst während des Buildvorgangs neue Dateien zu erzeugen, die es daraufhin kompiliert. Das ist zum Beispiel bei der Arbeit mit dem Corba-IDL-Compiler, dem Metaobject-Compiler »moc« von Qt oder auch mit Flex und Bison notwendig. Zur Demonstration genügt ein triviales Beispiel (Listing 8), das mit dem Befehl »cp« eine Datei erzeugt (nicht portabel).
Listing 8: Dateien erzeugen
|
01 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/generated.h
02 COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/generated.h.source ${CMAKE_CURRENT_BINARY_DIR}/generated.h
03 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/generated.h.source )
04
05 add_executable(hello main.c ${CMAKE_CURRENT_BINARY_DIR}/generated.h)
|
Der Befehl »add_custom_command()« in Zeile 1 spezifiziert eine Anweisung, die die unter »OUTPUT« aufgeführte Datei »generated.h« erzeugen kann, den dazu notwendigen Befehl und von welcher Datei die zu generierende Datei anhängt, wann sie also neu erzeugt werden muss. Wie erwähnt sollten Programmierer Dateien nie im Quelltextbaum, sondern immer im Buildverzeichnis erzeugen, dafür sorgt hier »CMAKE_CURRENT_BINARY_DIR«. Wichtig ist, die generierte Datei zu den Quelldateien für das Target hinzuzufügen. Nur dann erkennt Cmake die Abhängigkeit des Target von der generierten Datei und erzeugt sie gegebenenfalls vor dem Target.
Cmake ist keine komplette Programmiersprache, unterstützt aber Makros, um die Les- und Wartbarkeit zu erhöhen. Die Listings 9a und 9b zeigen ein einfaches Beispiel. Die Zeilen 1 bis 6 (Listing 9a) definieren ein Makro mit dem Namen »print_all_args«, das mindestens ein Argument »_greeting« erwartet. Ruft man es mit mehr Argumenten auf, hilft die spezielle Variable »ARGN« dabei, auf sie zuzugreifen. In den Zeilen 3 bis 5 iteriert eine »foreach()«-Schleife über die zusätzlichen Argumente und gibt sie aus. Die in Zeile 8 definierte Liste dient in Zeile 10 dem Makro als Argument. Viele Dinge lassen sich vereinfachen, indem Entwickler Komplexität in einem Makro verstecken, um sich danach nicht mehr um die Details kümmern zu müssen.
Listing 9a: Makros definiert
|
01 macro(print_all_args _greeting)
02 message(STATUS "${_greeting}")
03 foreach(_currentItem ${ARGN})
04 message(STATUS "current item: ${_currentItem}")
01 endforeach(_currentItem)
06 endmacro(print_all_args)
07
08 set(fooSrcs main.cpp widget.cpp process.cpp)
09
10 print_all_args("Hallo Welt" ${fooSrcs})
|
Listing 9b: Makros angewandt
|
01 ~/src/macrotest$ cmake .
02 -- Hallo Welt
03 -- current item: main.cpp
04 -- current item: widget.cpp
05 -- current item: process.cpp
06 -- Configuring done
07 -- Generating done
08 -- Build files have been written to: ~/src/macrotest
|
Fazit
Der Artikel hat die wichtigsten Features von Cmake vorgestellt, die als Einstieg für eigene Projekte genügen. Nicht zur Sprache kamen zum Beispiel das leistungsfähige und flexible »RPATH«-Handling von Cmake, die Unterstützung von Regular Expressions und das Ausführen von Programmen. Diese Funktionen zusammen ermöglichen es, mit Cmake sehr leistungsfähige Buildskripte zu schreiben. Informationsquellen nennt der Kasten "Dokumentation". Da inzwischen das KDE-Projekt Cmake einsetzt, sind auch im KDE Subversion Repository [2] viele Beispiele für die Benutzung von Cmake zu finden.
Dokumentation
|
|
Cmake bringt eine Manpage mit, die alle Befehle und enthaltenen Module dokumentiert. Die gleiche Dokumentation findet sich noch einmal auf der Cmake-Homepage. Das Cmake-Wiki bietet darüber hinaus eine große Menge an zusätzlichen Informationen: Tutorials, eine Übersicht über Cmake-interne Variablen sowie eine FAQ.
Wenn das alles nicht reicht, gibt es noch die Mailingliste [cmake@cmake.org], auf der auch die Entwickler vertreten sind und Fragen beantworten. Wer Papier bevorzugt, findet im Buchhandel "Mastering Cmake", das auch Themen für Fortgeschrittene erläutert. Eine Vielzahl an Beispielen führt das Subversion-Repository von KDE [2].
|
In Cmake finden die C/C++-Entwickler ein Werkzeug, das den Buildvorgang von einem kaum noch durchschaubaren Mysterium wieder zum alltäglichen Handwerk macht, sodass sie sich wieder voll auf den eigentlichen Code konzentrieren können. Cmake wird aktiv entwickelt und die Entwickler- und Anwendergemeinde wächst rapide. Fast jeden Tag kündigt ein weiteres Projekt an, auf Cmake umzusteigen.
Es lohnt sich für jeden, der die Autotools nicht vollständig beherrscht, in Cmake einzusteigen, um seine Software wieder selbst kompilieren zu können - und das nicht nur unter Linux, sondern sofort auch unter Mac OS X und MS Windows. Viele Anzeichen deuten darauf hin, dass Cmake auf dem besten Weg ist, das neue Standard-Buildsystem für freie Software zu werden. (ofr)
Der Autor
|
|
Alexander Neundorf hat 2002 sein Diplom im Studiengang Ingenieurinformatik an der TU Ilmenau erworben. Seither beschäftigt er sich bei der Jenoptik LOS GmbH als Entwickler mit digitalen Kameras für den professionellen Einsatz. Seit 1998 ist er aktiv am KDE Projekt beteiligt und seit 2006 Maintainer des Cmake-basierten Buildsystems für KDE 4.
|
| Whitepaper |
|
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele (Folge 2)
Der zweite Teil des Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele White Papers beleuchtet anhand weiterer ausgewählter Case Studies die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.
Download PDF (Registrierung erforderlich)
|
|
Usage Landscape Enterprise Open Source Data Integration
Die Nachfrage nach Datenintegrationslösungen für Unternehmen ist zunehmend gestiegen und vor allem das Interesse an Open Source Technologien wird immer größer. Doch wie und von wem werden Open Source Datenintegrationslösungen genutzt und welches Nutzungsverhalten lässt sich daraus ableiten? Das vorliegende White Paper präsentiert die Erfahrungswerte von über 1000 Open Source Nutzern und liefert fundierte Antworten auf diese Fragen.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|