XMake, das LUA-CMake
« | 22 Jan 2023 | »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.
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.
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.