Ein Projekt anlegen

Um CMake zu ermöglichen unser Projekt zu bauen müssen wir beschreiben wie unser Projekt übersetzt werden muss. Dazu erstellen wir eine Datei mit dem Namen CMakeLists.txt und beschreiben in einer für CMake verständlichen Skriptsprache, alle benötigten Aspekte unseres Programms. Für ein einfache Hello-World Programm (einzige Quelldatei ist main.c) kann diese Datei zum Beispiel so ausschauen:

cmake_minimum_required(VERSION 3.10)
 
project(HelloWorld)
 
add_executable(hello_world main.c)

Das Projekt bauen

Der Vorgang das Projekt nun zu übersetzen besteht aus zwei Schritten:

  1. Erzeugen eines Makefiles mit Cmake
  2. Übersetzen des Projekts mithilfe des Makefiles

Andere Ziele (bspw. Visual Studio Projektdateien) anstelle von Makefiles sind ebenfalls vorhanden.

Dieses Projekt bauen wir wie folgt. Üblicherweise erstellen wir uns im Projektordner einen neuen Ordner build. Dort wechseln wir hinein und führen das CMake-Programm aus:

cmake ..

CMake sucht nun im übergeordneten Verzeichnis (..) nach einer CMakeLists.txt, interpretiert sie, und legt eine Makefile an, die das Projekt entsprechend kompilieren soll. Wenn alles gut läuft, könnte die Ausgabe von CMake folgendermaßen aussehen:

-- The C compiler identification is GNU 12.1.0
-- The CXX compiler identification is GNU 12.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/naums/test/build

Hier wird der C-Compiler erkannt (GCC 12.1.0), ein paar Compilerfeatures probiert und am Ende das Projekt konfiguriert und ein Makefile generiert. Das build-Verzeichnis sieht nun so aus:

$ ls
🗋 cmake_install.cmake  🗋 CMakeCache.txt  🗁 CMakeFiles  🗋 Makefile

Nun führen wir das Makefile normal aus, womit das Projekt übersetzt und gelinkt wird, und wir erhalten eine hello_world Executable.

Die CMakeLists verstehen

Die obige CMakeLists.txt beinhaltet drei Kommandos:

cmake_minimum_required(VERSION 3.10)

Dies gibt die minimale Version von CMake an, mit der dieses CMakefile benutzt werden kann. Das wird vor allem dann interessant, wenn Features aktuellerer CMake-Versionen gebraucht werden. Es bietet sich für persönliche Projekte an, einfach die Version des installierten CMakes zu verwenden, für Projekte mit anderen Entwickler\*innen, sollte sich auf die minimal vorhandene Version über die vorhandenen Linux-Systeme hinweg geeinigt werden. Damit sind aber auch einige der aktuelleren Features ausgeschlossen, weil die mit einem älteren CMake nicht funktionieren.

project(HelloWorld)

Diese Zeile gibt dem Projekt einen beliebigen Projektnamen.

add_executable(hello_world main.c)

Mit add_executable teilen wir CMake mit, dass wir eine ausführbare Datei erstellen wollen. Die hier nennen wir hello_world und sie wird aus der main.c erstellt. CMake weiß bereits, wie es aus einzelnen C-Dateien Programme erstellen kann, sodass es ausreicht CMake die benötigten Dateien mitzuteilen.

Dieses CMake-Projekt ist nicht sonderlich spannend, aber CMake kann noch ziemlich nützlich werden.