XMake, das LUA-CMake

Die CMake Syntax mag zwar zweckdienlich sein, aber schön ist sie nicht. Es ist keine richtige Programmiersprache, auch wenn es versucht, wie eine auszusehen.

Doch nun kommt XMake … ein CMake Ersatz auf Basis der Scriptsprache Lua.


Problem: Scriptsprachen

Scriptsprachen zur Build-Prozess-Steuerung sind so eine Sache.
Conan setzt auf einem komplizierten Python-Modul auf und braucht je nach Projekt Zusatzbibliotheken um ausgeführt werden zu können.
Das stört sich dann oft auf älteren Systemen mit Python-2 Scripts des OS.

Unix-Shell-Scripts sind wiederum nicht portabel, angefangen bei /bin/sh vs. /bin/bash bis zu den BSD-Shells, und Windows-Batch-Dateien und die verkrüppelte Powershell stellen auch eine andere Gattung dar.

Verdammt! Ich will EINE einfache, portable und systemunabhängige Script-Sprache haben!

Diese Sprache heißt Lua … aber das nur nebenbei.

XMake Einführung

Ich bin eher zufällig über XMake gestoßen, und erfuhr, dass sich jemand die Mühe gemacht hat, Lua für Buildscripts einzusetzen.

Meine Assoziation war: Also ein CMake mit Lua-Syntax.
Das ist nicht ganz richtig, aber auch nicht ganz falsch.

Wer in XMake sein Buildsystem aufsetzen will, platziert in jedem Projektverzeichnis eine Datei namens xmake.lua (ganz genau so wie CMakeLists.txt für CMake) und ruft darin XMake Funktionen auf, die die Statemachine des XMake-Prozesses konfigurieren.

 1target("my_lib")
 2  set_kind("static")
 3  add_files("my_lib.c")
 4target_end()
 5
 6target("my_prog")
 7  set_kind("binary")
 8  add_files("my_prog.c")
 9  add_deps("my_lib")
10  add_links("my_lib")
11target_end()

Es hat sich eingebürgert, dass über Einrückungen zusammengehörende Blöcke optisch sichtbar gemacht werden (wie im Beispiel zwischen target() und target_end()). Notwendig wäre das aber nicht.

Ruft man nun in dem Projektverzeichnis xmake auf, wird eine statische Bibliothek my_lib erstellt und danach das Programm my_prog, welches gegen my_lib linkt.

Jetzt braucht man eigentlich nur noch wissen, dass add_files() auch Wildcards anbietet und dass man aus einer xmake.lua Unterverzeichnisse mit anderen xmake.lua Dateien einbinden kann.

1--root/xmake.lua
2includes("src/lib/lib1")
3includes("src/lib/lib2")
4includes("src/bin/my_project")
1--root/src/bin/my_project
2target("my_project")
3  set_kind("binary")
4  add_files("*.c")
5  add_files("*.cpp")

So kann man nämlich schon viele übliche Projekte mit XMake bauen lassen.

Plattformen und Toolsets

Interessant wird es dann, wann man bei Plattformen ankommt und wenn es um Cross-Compiling geht.

Hierfür stehen dem xmake Tool Parameter zur Verfügung, um z.B. Plattform und Architektur zu setzen, die man in xmake.lua Scripts wieder interpretieren kann:

 1target("my_target")
 2  set_kind("static")
 3  add_files("generic/*.c")
 4  if is_plat("windows") then
 5    add_files("windows/*.c")
 6    if is_arch("x64") then
 7      add_files("windows/x64/*.c")
 8    else
 9      add_files("windows/x86/*.c")
10    end
11  elseif is_plat("linux") then
12    add_files("linux/*.c")
13  end
14target_end()

An der Konsole kann dann per
xmake config -plat=windows -arch=x64 konfiguriert werden, welche Einstellung der folgende Aufruf von
xmake am Ende bauen soll.

Fazit

XMake ist eine neue spannende Welt für mich und ich fange gerade erst an, an der Oberfläche zu kratzen. Es gibt noch viele offene Fragen, wie man “Options”, also Schalter für spezielle Einstellungen gut integrieren kann.
Ein anderer Punkt sind Paketabhängigkeiten, denn XMake kann neben eigenen Repos auch Conan Remotes abrufen und Bibliotheken herunterladen und in den Build Prozess integrieren.

Im GATE Projekt konnte ich bereits einige Standard-Builds mit XMake durchführen und das Ergebnis gefällt mir, weil z.B. für Windows kein msbuild eingesetzt wird, sondern direkt der Compiler und Linker aufgerufen werden.

XMake führt die Builds auch wesentlich schneller aus als CMake, was sich in langsamen Docker-Containern positiv auswirkt.

Ich glaube aber nicht, dass XMake bei mir CMake auf die Schnelle ersetzen wird. Denn wenn es um den Support älterer Hardware oder Compiler geht (z.B.: Watcom), ist CMake dem noch jungen XMake eben 15 Jahre voraus.

Trotzdem liegt in diesem schlanken Projekt natürlich ein großes Potential besonders für neue Projekte.