2015-09-05 6 views
11

Die CMake doc sagt über den Befehl file GLOB:Warum ist die cmake-Datei GLOB evil?

Wir empfehlen nicht GLOB eine Liste der Quelldateien von Ihrem Quellbaum zu sammeln verwenden. Wenn sich keine CMakeLists.txt-Datei ändert, wenn eine Quelle hinzugefügt oder entfernt wird, kann das generierte Build-System nicht wissen, wann CMake aufgefordert werden soll, neu zu generieren.

Mehrere Diskussionsthreads in der Web-Sekunde, die Quelldateien globb ist böse.

, jedoch wissen, das Build-System zu machen, dass eine Quelle hinzugefügt oder entfernt wurde, ist es ausreichend,

touch CMakeLists.txt 

Recht zu sagen?

Dann ist weniger Aufwand als Bearbeiten CMakeLists.txt zum Einfügen oder Löschen eines Quelldateinamens. Es ist auch nicht schwieriger, sich daran zu erinnern. Daher sehe ich keinen guten Grund, davon abzuraten, file GLOB.

Was ist falsch an diesem Argument?

+1

Siehe auch die Diskussion [hier] (http://stackoverflow.com/questions/30949452/cmake-ninja-attempting-to-compile-deleted-cpp-file/31183245). Wie in meiner Antwort beschrieben, verwende ich einen gemischten Ansatz: listet alle Quelldateien in den 'CMakeLists.txt' Dateien auf (auch weil ich manchmal Quelldateien für verschiedene Buildkonfigurationen handpicke) und global für die Headerdateien (aus Gründen der Bequemlichkeit) habe sie in den VS-Projekten). Und ich schlug einen Workaround für z.B. 'git' mit etwas wie' configure_file ($ {CMAKE_SOURCE_DIR} /. git/index $ {PROJECT_BINARY_DIR} /git_index.tmp) '. – Florian

Antwort

11

Das Problem ist, wenn Sie nicht alleine an einem Projekt arbeiten.

Sagen wir Projektentwickler A und B.

A fügt x.c eine neue Quelldatei. Er ändert nicht CMakeLists.txt und Commits, nachdem er die Implementierung x.c abgeschlossen hat.

Jetzt B hat eine git pull, und da es keine Änderungen an der CMakeLists.txt gewesen sind, wird CMake nicht erneut ausführen und B haben Fehler Linker beim Kompilieren, weil x.c wurde auf seine Quelldateien Liste hinzugefügt.

+0

Guter Punkt, danke. Bevor ich diese Antwort akzeptiere (und möglicherweise über einen Workaround nachdenke), lass mich bitte abwarten, ob noch weitere Probleme auftauchen. –

+0

Sicher, ich denke, dass dies eine ziemlich offene Frage ist und dass mehrere Leute Erfahrungen zum Globbing haben. Leider kenne ich keine Problemumgehung, ich hatte ein ziemlich großes Projekt (> 500 Quelldateien), das ich von Globbing zurück in Dateilisten migriert habe, weil andere Entwickler sich immer darüber beschweren würden, dass der Build auf ihrem Rechner kaputt ging, auch wenn dies nicht der Fall war Pause auf dem CI-Server. –

+1

@ Jean-MichaëlCelerier Problemumgehung # 1: run cmake nach git pull (ernsthaft), Umgehung # 2: schreibe in den 'CMakeLists' das Ergebnis des Globbings in eine Datei (bedingt, wenn es nicht existiert) und lege es ab unter Quellcodeverwaltung. Machen Sie die 'CMakeLists' mit dieser Datei. Wenn Sie eine neue Datei hinzufügen, löschen Sie die Globresult-Datei. –

4

Es ist nicht inhärent böse - es hat Vorteile und Nachteile, in this answer hier auf StackOverflow relativ gut abgedeckt. Aber wenn Sie es achtlos verwenden, könnten Sie am Ende Abhängigkeiten ignorieren und saubere Umbauten großer Teile Ihrer Codebasis erfordern.

Ich bin persönlich dafür, es zu verwenden - in kleineren Projekten oder in bestimmten Unterverzeichnissen in größeren - um zu vermeiden, dass jede Datei manuell in die Build-Dateien eingegeben werden muss. Edit: Meine Präferenz hat sich geändert und ich tendiere derzeit dazu, es zu vermeiden.

+1

Es gibt viele subtile Fälle, die Sie in einigen Fällen clean Build als einzige Rettung tun müssen. Ich glaube nicht, es ist gut für große Projekte – Fei

+0

@Fei: Das hängt davon ab, was Sie zu bauen. In einem großen Projekt haben Sie möglicherweise kleine Teile, für die es Sinn macht, aber sicherlich nicht für das gesamte Projekt. – einpoklum