Der beste Weg, Quelldateien in CMake anzugeben, besteht darin, sie explizit aufzulisten .
Die Entwickler von CMake selbst raten davon ab , Globbing zu verwenden.
Siehe: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
(Wir empfehlen, GLOB nicht zum Sammeln einer Liste von Quelldateien aus Ihrem Quellbaum zu verwenden. Wenn sich beim Hinzufügen oder Entfernen einer Quelle keine CMakeLists.txt-Datei ändert, kann das generierte Build-System nicht wissen, wann CMake zur Neuerstellung aufgefordert werden soll.)
Natürlich möchten Sie vielleicht wissen, was die Nachteile sind - lesen Sie weiter!
Wenn Globbing fehlschlägt:
Der große Nachteil von Globbing ist, dass das Erstellen / Löschen von Dateien das Build-System nicht automatisch aktualisiert.
Wenn Sie die Person sind, die die Dateien hinzufügt, scheint dies ein akzeptabler Kompromiss zu sein. Dies führt jedoch zu Problemen für andere Personen, die Ihren Code erstellen. Sie aktualisieren das Projekt über die Versionskontrolle, führen den Build aus und setzen sich dann mit Ihnen in Verbindung. Sie beschweren sich, dass
"der Build" ist gebrochen".
Um die Sache noch schlimmer zu machen, führt der Fehler normalerweise zu einem Verbindungsfehler, der keine Hinweise auf die Ursache des Problems gibt, und es geht Zeit verloren, das Problem zu beheben.
In einem Projekt, an dem ich gearbeitet habe, haben wir mit dem Globbing begonnen, aber beim Hinzufügen neuer Dateien gab es so viele Beschwerden, dass es Grund genug war, Dateien explizit aufzulisten, anstatt Globbing.
Dies unterbricht auch gängige Git-Workflows
( git bisect
und das Umschalten zwischen Feature-Zweigen).
Daher kann ich dies nicht empfehlen. Die Probleme, die dadurch verursacht werden, überwiegen bei weitem die Bequemlichkeit. Wenn jemand Ihre Software aus diesem Grund nicht erstellen kann, verliert er möglicherweise viel Zeit, um das Problem aufzuspüren oder einfach aufzugeben.
Und noch ein Hinweis: Nur daran zu denken, etwas zu berühren, reicht CMakeLists.txt
nicht immer aus. Bei automatisierten Builds, die Globbing verwenden, musste ich cmake
vor jedem Build ausgeführt werden, da möglicherweise Dateien seit dem letzten Build hinzugefügt / entfernt wurden *.
Ausnahmen von der Regel:
Es gibt Zeiten, in denen Globbing vorzuziehen ist:
- Zum Einrichten von
CMakeLists.txt
Dateien für vorhandene Projekte, die CMake nicht verwenden.
Dies ist ein schneller Weg, um alle Quellen zu referenzieren (sobald das Build-System ausgeführt wird - ersetzen Sie Globbing durch explizite Dateilisten).
- Wenn CMake nicht als primäres Build-System verwendet wird, wenn Sie beispielsweise ein Projekt verwenden, das CMake nicht verwendet, und Sie möchten Ihr eigenes Build-System dafür verwalten.
- Für jede Situation, in der sich die Dateiliste so oft ändert, dass die Pflege unpraktisch wird. In diesem Fall könnte es nützlich sein, aber dann müssen Sie das Ausführen akzeptieren
cmake
, um jedes Mal Build-Dateien zu generieren, um einen zuverlässigen / korrekten Build zu erhalten (was gegen die Absicht von CMake verstößt - die Möglichkeit, die Konfiguration vom Erstellen zu trennen) .
* Ja, ich hätte einen Code schreiben können, um den Baum der Dateien auf der Festplatte vor und nach einem Update zu vergleichen, aber dies ist keine so gute Problemumgehung und etwas Besseres, das dem Build-System überlassen bleibt.