Vollständige Offenlegung: Ich habe den Globbing-Ansatz ursprünglich wegen seiner Einfachheit bevorzugt, aber im Laufe der Jahre habe ich erkannt, dass das explizite Auflisten der Dateien für große Projekte mit mehreren Entwicklern weniger fehleranfällig ist.
Ursprüngliche Antwort:
Die Vorteile von Globbing sind:
Es ist einfach, neue Dateien hinzuzufügen, da diese nur an einer Stelle aufgelistet sind: auf der Festplatte. Nicht globbing führt zu Duplikaten.
Ihre CMakeLists.txt-Datei wird kürzer. Dies ist ein großes Plus, wenn Sie viele Dateien haben. Wenn Sie nicht globalisieren, verlieren Sie die CMake-Logik in großen Dateilisten.
Die Verwendung von fest codierten Dateilisten bietet folgende Vorteile:
CMake verfolgt die Abhängigkeiten einer neuen Datei auf der Festplatte korrekt. Wenn wir glob verwenden, werden Dateien, die beim ersten Ausführen von CMake nicht globalisiert wurden, nicht erfasst
Sie stellen sicher, dass nur die gewünschten Dateien hinzugefügt werden. Globbing kann Streudateien aufnehmen, die Sie nicht möchten.
Um das erste Problem zu umgehen, können Sie einfach die CMakeLists.txt "berühren", die den Glob ausführt, entweder mit dem Befehl touch oder indem Sie die Datei ohne Änderungen schreiben. Dadurch wird CMake gezwungen, die neue Datei erneut auszuführen und aufzunehmen.
Um das zweite Problem zu beheben, können Sie Ihren Code sorgfältig in Verzeichnissen organisieren, was Sie wahrscheinlich sowieso tun. Im schlimmsten Fall können Sie den list(REMOVE_ITEM)
Befehl verwenden, um die globale Liste der Dateien zu bereinigen:
file(GLOB to_remove file_to_remove.cpp)
list(REMOVE_ITEM list ${to_remove})
Die einzige reale Situation, in der Sie dies beißen kann, ist, wenn Sie so etwas wie git-bisect verwenden , um ältere Versionen Ihres Codes im selben Build-Verzeichnis zu testen . In diesem Fall müssen Sie möglicherweise mehr als erforderlich bereinigen und kompilieren, um sicherzustellen, dass Sie die richtigen Dateien in der Liste erhalten. Dies ist ein solcher Eckfall, bei dem Sie bereits auf den Beinen sind, dass es nicht wirklich ein Problem ist.
Simply "touch" the CMakeLists.txt
Wenn Sie Entwickler sind , ist dies in Ordnung. Für andere, die Ihre Software erstellen, kann es jedoch ein Problem sein, dass Ihr Build nach der Aktualisierung fehlschlägt und sie zu untersuchen sind Warum.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
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 ichcmake
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:
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).
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.
quelle
In CMake 3.12, das
file(GLOB ...)
undfile(GLOB_RECURSE ...)
gewann Befehle eineCONFIGURE_DEPENDS
Option , die Wiederholungen , wenn die glob des Wertänderungen cmake. Da dies der Hauptnachteil des Globbings für Quelldateien war, ist dies jetzt in Ordnung:Einige Leute empfehlen jedoch immer noch, das Durchsuchen von Quellen zu vermeiden. In der Dokumentation heißt es in der Tat :
Persönlich betrachte ich die Vorteile, die Quelldateiliste nicht manuell verwalten zu müssen, um die möglichen Nachteile aufzuwiegen. Wenn Sie zu manuell aufgelisteten Dateien zurückkehren müssen, können Sie dies einfach erreichen, indem Sie einfach die Globbed-Quellliste drucken und wieder einfügen.
quelle
Sie können sicher (und sollten wahrscheinlich) auf Kosten einer zusätzlichen Datei globalisieren, um die Abhängigkeiten zu speichern.
Fügen Sie irgendwo solche Funktionen hinzu:
Und dann los geht's:
Sie karren immer noch wie zuvor um die expliziten Abhängigkeiten (und lösen alle automatisierten Builds aus!), Nur in zwei Dateien anstelle von einer.
Die einzige Änderung in der Prozedur erfolgt, nachdem Sie eine neue Datei erstellt haben. Wenn Sie nicht global arbeiten, besteht der Workflow darin, CMakeLists.txt in Visual Studio zu ändern und neu zu erstellen. Wenn Sie glob ausführen, führen Sie cmake explizit aus - oder berühren Sie einfach CMakeLists.txt.
quelle
make
seltsame Linkerfehler gemeldet hat.Geben Sie jede Datei einzeln an!
Ich verwende eine herkömmliche CMakeLists.txt und ein Python-Skript, um es zu aktualisieren. Ich führe das Python-Skript manuell aus, nachdem ich Dateien hinzugefügt habe.
Siehe meine Antwort hier: https://stackoverflow.com/a/48318388/3929196
quelle