Ich denke darüber nach, ein plattformübergreifendes Projekt von separaten Build-Management-Systemen in Visual C ++, XCode und Makefiles auf CMake umzustellen.
Eine wesentliche Funktion, die ich benötige, ist das automatische Hinzufügen aller Dateien in einem Verzeichnis zu einem Ziel. Dies ist zwar einfach mit make zu tun, mit Visual C ++ und XCode jedoch nicht einfach (korrigieren Sie mich, wenn ich falsch liege). Ist es möglich, dies direkt in CMake zu tun? Wie?
c++
cross-platform
cmake
Martjno
quelle
quelle
Antworten:
Es ist möglich. ZB mit
file(GLOB
:Beachten Sie, dass dies ein manuelles erneutes Ausführen erfordert ,
cmake
wenn eine Quelldatei hinzugefügt oder entfernt wird, da das generierte Build-System nicht weiß, wann CMake zur Regeneration aufgefordert werden soll, und dies bei jedem Build die Build-Zeit verlängern würde.quelle
GLOB
:file(GLOB_RECURSE variable [RELATIVE path] [FOLLOW_SYMLINKS] [globbing expressions]...)
.Die Antwort von Kleist funktioniert sicherlich, aber es gibt eine wichtige Einschränkung:
Wenn Sie eine
Makefile
manuell schreiben , können Sie eineSRCS
Variable mithilfe einer Funktion zum Auswählen aller Dateien.cpp
und.h
Dateien generieren . Wenn eine Quelldatei später hinzugefügt wird, wird sie durch erneutes Ausführen eingeschlossenmake
.CMake (mit einem Befehl wie
file(GLOB ...)
) generiert jedoch explizit eine Dateiliste und platziert sie in der automatisch generiertenMakefile
. Wenn Sie eine neue Quelldatei haben, müssen Sie dieseMakefile
durch erneutes Ausführen neu generierencmake
.Bearbeiten: Das Makefile muss nicht entfernt werden.
quelle
Erweiterung für @Kleist Antwort :
Da CMake 3.12 zusätzliche Option CONFIGURE_DEPENDS wird unterstützt durch Befehle
file(GLOB)
undfile(GLOB_RECURSE)
. Mit dieser Option ist es keine Bedürfnisse zu manuell wieder laufen CMake nach Hinzufügen / Löschen einer Quelldatei in dem Verzeichnis - CMake neu laufen automatisch wird auf der nächsten Erstellen des Projekts.Die Option CONFIGURE_DEPENDS impliziert jedoch, dass das entsprechende Verzeichnis jedes Mal überprüft wird, wenn eine Erstellung angefordert wird, sodass der Erstellungsprozess mehr Zeit in Anspruch nehmen würde als ohne CONFIGURE_DEPENDS .
Selbst mit der verfügbaren Option CONFIGURE_DEPENDS empfiehlt die CMake-Dokumentation immer noch nicht , die Quellen zu verwenden
file(GLOB)
oderfile(GLOB_RECURSE)
zu sammeln.quelle
Warum also nicht Powershell verwenden, um die Liste der Quelldateien für Sie zu erstellen? Schauen Sie sich dieses Skript an
Angenommen, Sie haben einen Ordner mit dieser Struktur
Speichern Sie diese Datei nun beispielsweise als "generateSourceList.ps1" und führen Sie das Skript als aus
Die Datei out.txt enthält
quelle