Wo ist die Jpeg-Bibliothek?
Der Kern des Find-Jpeg-Moduls besteht aus den Befehlen »FIND_PATH()« und »FIND_LIBRARY()« in den Zeilen 10 und 12. Außer ihnen bietet Cmake noch »FIND_FILE()« und »FIND_PROGRAM()«. Diese vier Befehle sollen Dateien, Libraries und Programme in systemspezifischen Verzeichnissen finden. Beispielsweise sucht unter Linux der Aufruf »FIND_LIBRARY()« in Zeile 12 unter anderem in den Verzeichnissen »/lib«, »/usr/lib« und »/usr/local/lib«. Das Ergebnis gibt Cmake in der Variablen »JPEG_LIBRARY« zurück.
Der Abschnitt von Zeile 14 bis 19 in Listing 6 setzt die Ergebnisvariable »JPEG_FOUND«. Über sie kann die aufrufende »CMakeLists.txt« testen, ob die Jpeg-Library gefunden wurde, und gegebenenfalls zusätzliche Quelldateien des aktuellen Projekts kompilieren. Da in »CMakeLists.txt« das Schlüsselwort »REQUIRED« steht, bricht das Modul mit einer Fehlermeldung ab, falls die Jpeg-Library fehlt.
Auf unterschiedlichen Systemen besitzen C-Typen häufig verschiedene Größen, Header und weitere Details können sich unterscheiden. Soll Software trotzdem auf all diesen Systemen kompilieren und laufen, müssen diese Punkte vor Beginn des Buildvorgangs getestet werden. Die Listings 7a bis 7d zeigen ein komplettes Beispiel, das die Existenz der Header »stdio.h« und »blub.h« überprüft. Mit den Ergebnissen dieser Tests erzeugt Cmake aus »config.h.in« einen Header »config.h«, der dann die gewünschten Informationen enthält und in den Quelldateien benutzt wird.
Listing 7a: Header-Test in »CMakeLists.txt«
|
01 include(CheckIncludeFiles)
02
03 check_include_files(stdio.h HAVE_STDIO_H)
04 check_include_files(blub.h HAVE_BLUB_H)
05
06 set(V_MAJOR 1)
07 set(V_MINOR 0)
08 set(V_PATCH 2)
09
10 configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
11
12 include_directories(${CMAKE_CURRENT_BINARY_DIR})
13 add_executable(configtest main.c)
|
Listing 7b: Header-Vorlage »config.h.in«
|
01 #cmakedefine HAVE_STDIO_H 1
02 #cmakedefine HAVE_BLUB_H 1
03 #define VERSION_MAJOR ${V_MAJOR}
04 #define VERSION_MINOR ${V_MINOR}
05 #define VERSION_PATCH ${V_PATCH}
|
Listing 7c: Generierter Header »config.h«
|
01 #define HAVE_STDIO_H 1
02 /* #undef HAVE_BLUB_H 1 */
03 #define VERSION_MAJOR 1
04 #define VERSION_MINOR 0
05 #define VERSION_PATCH 2
|
Listing 7d: Benutzung von »config.h«
|
01 #include <config.h>
02
03 int main()
04 {
05 #ifdef HAVE_STDIO_H
06 printf("version is %d.%d.%dn", VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH);
07 #ifndef HAVE_BLUB_H
08 printf("no blub.h foundn");
09 #endif
10 #endif
11 return 0;
12 }
|
Namenskonventionen
Zeile 1 von Listing 7a bindet ein Cmake-Modul namens »CheckIncludeFiles« ein. Cmake hängt automatisch die Endung ».cmake« an, die zugehörige Datei heißt also »CheckIncludeFiles.cmake«. Die Datei gehört zur Cmake-Standardinstallation und stellt das Makro »check_include_files()« bereit. Diese Namensgebungskonvention wird überall eingehalten: Der Dateiname wird in Höckerschreibweise (Camel Case) geschrieben, die enthaltenen Funktionen haben den gleichen Namen, allerdings im C-Stil, also jeweils durch Unterstriche verbundene Wörter.
Der Aufruf von »check_include_files()« in Zeile 3 bewirkt, dass Cmake durch das Kompilieren eines kleinen Testprogramms testet, ob der Header »stdio.h« vorhanden ist. Das Ergebnis schreibt es dann in die Variable »HAVE_STDIO_H«. Das Gleiche gilt für den Header »blub.h« in Zeile 4. In den Zeilen 6, 7 und 8 trägt das Skript die dreiteilige Versionsnummer 1.0.2 in entsprechende Variablen ein.
Der Befehl »configure_file()« in Zeile 10 liest die Datei »config.h.in« ein, nimmt Ersetzungen vor und schreibt den modifizierten Inhalt in die Datei »${CMAKE_CURRENT_BINARY_DIR}/config.h«. Die Anweisung »configure_file()« ersetzt alle Cmake-Variablen, also »${V_MAJOR}«, »${V_MINOR}« sowie »${V_PATCH}« durch ihren Wert. Zusätzlich ersetzt das Skript »#cmakedefine« durch »#define«, wenn die entsprechende Variable »TRUE« ist, bei »FALSE« durch ein auskommentiertes »#undef«.
So lassen sich Header erzeugen, die genau die jeweiligen Systemeigenschaften beschreiben und damit die Grundlage für portable Programme bilden. Die Anweisung »check_include_files()« ist natürlich nicht das einzige von Cmake bereitgestellte Makro. Es gibt Makros für viele Zwecke: zum Überprüfen von Variablengrößen oder der Member-Variablen von Strukturen, der Compiler-Optionen und einige andere Zwecke.
| Whitepaper |
|
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele
Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.
Download PDF (Registrierung erforderlich)
|
|
The Role of Open Source in Data Integration
Obwohl in den letzten Jahren viele technische Fortschritte erzielt werden konnten, verfügen die meisten Datenintegrationsprozesse nach wie vor nur über eine sehr begrenzte Automatisierung. Das vorliegende White Paper von dem Industry Analyst Mark Madson wird zunächst ein grundlegendes Verständnis von Daten Integration vermitteln, die Vorzüge von Open Source Lösungen für Daten Integration erläutern und Ihnen professionelle Empfehlungen geben, damit Sie Ihre Integrationsjobs noch einfacher und produktiver gestalten können.
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.
|