2016-06-28 12 views
4

Ich beginne ein neues Projekt und muss ein Build-System auswählen. Ich hasse es, jede C++ - Quelldatei manuell zu meinen Erstellungsregeln hinzufügen zu müssen, da dies bis 2016 automatisiert sein sollte und beim Refactoring für zusätzliche Arbeit sorgt (die Klasse in der Kopfzeile und die Quelldatei umbenennen) Systemdatei erstellen ...).Hat Bazel die gleichen Probleme wie CMake mit File Globbing?

ich CMake mit rekursive Datei Globbing, als ich kam in diesem Beitrag zu nutzen begann: Specify source files globally with GLOB?

was darauf schließen lässt, dass Globbing böse ist, weil von CMake mit zwei Phasen (cmake und machen) und bei normalem Gebrauch baut der Benutzer führt nur die zweite Phase erneut aus (make).

Auf den ersten Blick erlaubt Bazel auch Datei-Globbing. Ist es böse mit Bazel zu benutzen? Läuft find über eine Code-Basis wie ein Skalierungsproblem, das Build-Systeme wirklich brauchen, um es zu vermeiden?

Antwort

3

Es sollte gefunden werden, um Glob in Bazel zu verwenden, kann es eine lange Analysephase für große globals verursachen, aber wenn Sie das --watchfs Flag verwenden, wird die Änderung des Dateisystems verfolgt, Dateisystemereignisse zu beobachten, anstatt alle anzugeben Dateien so inkrementelle Build sollte wirklich schnell sein.

+2

Nehmen Sie dies mit einem Körnchen Salz. Dies funktioniert nur so lange, wie Ihre Keulen die Systemgrenzen von Uhren nicht überschreiten. Auf einem Ubuntu ist dies z.B. ~ 8k. – abergmeier

6

Bazel nicht über die in diesem Beitrag genannten Punkte, das heißt:.

(Wir empfehlen nicht GLOB eine Liste der Quelldateien von Quellbaum sammeln mit der Wenn keine CMakeLists.txt Dateiänderungen wenn eine Quelle hinzugefügt oder entfernt wird dann das erzeugte Build-System nicht wissen können, wenn sie auf CMake bitten zu regenerieren.)

Bazel wird immer merken, wenn etwas hinzugefügt, entfernt oder aus der glob der Spielen geändert, und wieder aufzubauen entsprechend . Globbing wird dir mit Bazel niemals veraltete Ergebnisse liefern.

Dort sind ein paar Vorbehalte und Einschränkungen aufgeführt in the build encyclopedia für Globbing, sollten Sie das vor der Verwendung von Globs lesen.

Auch können Sie sehen, was globbed wird eine bazel Abfrage:

bazel query '//path/to/your:target' --output=build 
# /Users/kchodorow/gitroot/path/to/your/BUILD:7:1 
java_library(
    name = "target", 
    srcs = ["//path/to/your:A.java", "//path/to/your:B.java"], 
) 

Dies wird die „bewertet“ glob drucken, so können Sie spielen, um zu sehen, wie Bazel die Eingänge verfolgt.