Einstieg in CMake

Die ersten Folien zielen auf die Arbeit auf der Kommandozeile, wie es unter Linux üblich ist. Windows-Spezifische Herangehensweisen sind auf den hinteren Folien zu finden.

Zum Betrachten der nächsten Seite "Bild ab" drücken oder nach unten scrollen.

Motivation

Eine typische Entwicklungsumgebung (IntelliJ für Java):

Quellen werden irgendwie "magisch" übersetzt.

Projekt definieren

cmake definiert ein Projekt unabhängig von der Entwicklungsumgebung. Ziel ist in der Regel C/C++. Auch andere Programmiersprachen werden mehr oder weniger gut unterstützt. Ähnliche Ansätze gibt es für viele Programmiersprachen: ant, gradle, maven, scons, meson, automake,…

Geschieht in einer einfachen Textdatei mit dem Namen CMakeLists.txt.

Vereinfachtes Beispiel:

add_executable(myexecutable src/mysource.cpp)

Vollständiges Beispiel:

cmake_minimum_required(VERSION 3.1) 
project(myproject)
add_executable(myexecutable src/mysource.cpp)

myexecutable ist der Name der Anwendung und das Ziel für die Übersetzung der Quellen.

Baudateien generieren

Aufruf von cmake:

cmake -S ordner/meines/codes -B ordner/für/baudateien

Merke: Es wird der Ordner ausgewählt, wo die CMakeLists.txt enthalten ist, nicht die CMakeLists.txt selbst.

Ausgaben (Beispiel):

-- The CXX compiler identification is GNU 11.4.0
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: ordner/für/baudateien

Hierfür gibt es mit cmake-gui auch eine graphische Benutzeroberfläche.

Projekt übersetzen

Aufruf:

cmake --build ordner/für/baudateien

Ausgaben:

[ 50%] Building CXX object CMakeFiles/myexecutable.dir/mysource.cpp.o
[100%] Linking CXX executable myexecutable
[100%] Built target myexecutable

Diese Funktionalität ist in cmake-gui nicht enthalten.

Kompilat ausführen

Aufruf:

ordner/für/baudateien/myexecutable 

Ausgabe:

Halo, I bims!

Mehrere Quelltextdateien

Ein Ziel kann aus mehreren Quellen bestehen:

add_executable(myexecutable src/mysource.cpp src/additionalsource.cpp)

Alternativ ist es möglich, alle Dateien in einem Ordner für ein Ziel zu verwenden:

file(GLOB SOURCE_FILES src/*)
add_executable(myexecutable ${SOURCE_FILES})

Letzteres wird als schlechter Stil angesehen, weil aus der CMakeLists.txt nicht mehr explizit hervorgeht, welche Dateien beteiligt sind. Kommen neue Dateien hinzu, muss manuell eine Neukonfiguration des Projektes angestoßen werden.

Detaileinstellungen

Ein Ziel kann Einstellungen haben, zum Beispiel kann die Sprachversion auf C++20 gesetzt werden:

set_property(TARGET myexecutable PROPERTY CXX_STANDARD 20)

Zur Übersicht hier nochmal die ganze CMakeLists.txt:

cmake_minimum_required(VERSION 3.1) 
project(myproject)
file(GLOB SOURCE_FILES src/*)
add_executable(myexecutable ${SOURCE_FILES})
set_property(TARGET myexecutable PROPERTY CXX_STANDARD 20)

Besonders Interessierte können Details über das Verhalten der Befehle in der Dokumentation nachlesen: cmake_minimum_required(…), project(…), file(GLOB …), add_executable(…), CXX_STANDARD

Vielseitigkeit

Ein mit cmake definiertes Projekt ist nicht nur in einer Entwicklungsumgebung nutzbar, sondern in vielen:

Natürlich kann auch weiterhin mit jedem Text-Editor und auf der Kommandozeile gearbeitet werden.

Beispiel für Aufruf von make auf Linux:

make -C ordner/für/baudateien

Entwicklungsumgebung (Beispiel)

Der Entwicklungsprozess bleibt gleich, doch welche Quellen wie übersetzt werden, ist in der CMakeLists.txt klar definiert.