BazelCon 2022 findet vom 16. bis 17. November in New York und online statt.
Jetzt anmelden

Variablen erstellen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Variablen vom Typ „Selbermachen“ sind eine spezielle Klasse von erweiterbaren Stringvariablen, die für Attribute verfügbar sind, die als & machen gekennzeichnet sind.

Sie können beispielsweise verwendet werden, um bestimmte Toolchain-Pfade in von Nutzern erstellte Build-Aktionen einzufügen.

Memcache bietet sowohl vordefinierte Variablen, die für alle Ziele verfügbar sind, als auch benutzerdefinierte Variablen, die in Abhängigkeitszielen definiert sind und nur für Ziele, die von ihnen abhängen.

Der Grund für den Begriff „Marke“ ist historisch: Die Syntax und Semantik dieser Variablen waren ursprünglich für den Abgleich mit GNU Make vorgesehen.

Verwenden

Mit &true gekennzeichnete Attribute unterliegen, um die Variable Variable(n) ändern zu können, kann folgendermaßen auf die Variable FOO festlegen:

my_attr = "prefix $(FOO) suffix"

Mit anderen Worten: Jeder Teilstring, der mit $(FOO) übereinstimmt, wird auf den Wert FOO erweitert. Wenn dieser Wert "bar" ist, wird der endgültige String:

my_attr = "prefix bar suffix"

Wenn FOO keiner Variable entspricht, die dem verarbeitenden Ziel bekannt ist, schlägt {5/} mit einem Fehler fehl.

Für Variablen, deren Namen keine Buchstaben sind, z. B. @, kann als Referenz auch nur ein Dollarzeichen ohne Klammern verwendet werden. Beispiel:

my_attr = "prefix $@ suffix"

Schreiben Sie $ als String-Literal, um die Maximierung der Variable zu verhindern, und schreiben Sie $$.

Vordefinierte Variablen

Auf vordefinierte Variablen kann die Variable von jedem Attribut verwiesen werden, das mit & zur Variable > Ersatz versehen ist.

Führen Sie den folgenden Befehl aus, um eine Liste dieser Variablen und ihrer Werte für eine bestimmte Gruppe von Build-Optionen aufzurufen:

bazel info --show_make_env [build options]

und sehen Sie sich die Ausgabezeilen mit Großbuchstaben an.

Beispiel für vordefinierte Variablen

Variablen für die Toolchain-Option

Pfadvariablen

  • BINDIR: Die Basis der generierten Binärstruktur für die Zielarchitektur.

    Beachten Sie, dass eine andere Baumstruktur für Programme verwendet werden kann, die während des Builds auf der Hostarchitektur ausgeführt werden, um die Crosskompilierung zu unterstützen.

    Wenn Sie ein Tool in einem genrule ausführen möchten, wird empfohlen, den Pfad $(execpath toolname) zu erhalten, wobei toolname im Attribut tools von genrule aufgeführt sein muss.

  • GENDIR: Die Basis der generierten Codestruktur für die Zielarchitektur.

Variablen der Maschinenarchitektur

  • TARGET_CPU: Die CPU der Zielarchitektur, z.B. k8.

Vordefinierte Variablenregelvariablen

Die folgenden Attribute sind speziell für das Attribut cmd von genrule verfügbar und sind im Allgemeinen wichtig für die Funktionsweise dieses Attributs.

Beispiel für vordefinierte Variablen für Gengen

  • OUTS: Die Liste outs von genrule. Wenn du nur eine Ausgabedatei hast, kannst du auch $@ verwenden.
  • SRCS: Die srcs-Liste von genrule bzw. die Pfadnamen der Dateien, die den Labels in der Liste srcs entsprechen. Wenn Sie nur eine Quelldatei haben, können Sie auch $< verwenden.
  • <: SRCS, wenn es sich um eine einzelne Datei handelt. Ansonsten wird ein Build-Fehler ausgelöst.
  • @: OUTS, wenn es sich um eine einzelne Datei handelt. Ansonsten wird ein Build-Fehler ausgelöst.
  • RULEDIR: Das Ausgabeverzeichnis des Ziels, d. h. das Verzeichnis, das dem Namen des Pakets mit dem Ziel in der Baumstruktur genfiles oder bin entspricht. Für //my/pkg:my_genrule endet dies immer in my/pkg, auch wenn die Ausgaben von //my/pkg:my_genrule in Unterverzeichnissen liegen.

  • @D: Das Ausgabeverzeichnis. Wenn outs einen Eintrag enthält, wird dies auf das Verzeichnis mit dieser Datei erweitert. Bei mehreren Einträgen wird dies in das Stammverzeichnis des Pakets in der Baumstruktur genfiles erweitert, auch wenn sich alle Ausgabedateien im selben Unterverzeichnis befinden.

    Hinweis: Verwenden Sie RULEDIR über @D, da RULEDIR eine einfachere Semantik hat und sich auf die gleiche Weise verhält, unabhängig von der Anzahl der Ausgabedateien.

    Wenn die Genrule temporäre Zwischendateien generieren muss, z. B. infolge eines anderen Tools wie einem Compiler, sollte versucht werden, diese in @D zu schreiben (obwohl auch /tmp beschreibbar ist) und sie vor Abschluss zu entfernen.

    Besonders vermieden wird das Schreiben in Verzeichnisse, die Eingaben enthalten. Sie können sich in schreibgeschützten Dateisystemen befinden. Andernfalls würde die Quellstruktur in den Papierkorb verschoben.

Vordefinierte Quell-/Ausgabepfadvariablen

Die vordefinierten Variablen execpath, execpaths, rootpath, rootpaths, location und locations verwenden Labelparameter (z.B. $(execpath //foo:bar)) und ersetzen die durch dieses Label angegebenen Dateipfade.

Bei Quelldateien ist dies der Pfad im Verhältnis zum Stammverzeichnis Ihres Arbeitsbereichs. Wenn es sich um eine Ausgabe von Regeln handelt, ist dies der Ausgabepfad der Datei (siehe Erläuterung der Ausgabedateien unten).

Beispiel für vordefinierte Pfadvariablen

  • execpath: Gibt den Pfad unter dem execroot an, in dem Istio Build-Aktionen ausführt.

    Im obigen Beispiel führt Istio alle Build-Aktionen in dem Verzeichnis aus, das durch den Symlink bazel-myproject in Ihrem Stammverzeichnis des Arbeitsbereichs verknüpft ist. Die Quelldatei empty.source ist unter dem Pfad bazel-myproject/testapp/empty.source verknüpft. Der Ausführungspfad, also der untergeordnete Pfad unter dem Stammverzeichnis, ist testapp/empty.source. Dies ist der Pfad, mit dem Build-Aktionen die Datei finden können.

    Ausgabedateien werden ähnlich bereitgestellt, aber auch mit dem Präfix bazel-out/cpu-compilation_mode/bin versehen (oder für bestimmte Ausgaben: bazel-out/cpu-compilation_mode/genfiles oder für die Ausgaben von Hosttools: bazel-out/host/bin). Im obigen Beispiel ist //testapp:app ein Hosttool, da es im Attribut show_app_output von tools angezeigt wird. Daher wird die Ausgabedatei app in bazel-myproject/bazel-out/host/bin/testapp/app geschrieben. Der Ausführungspfad ist daher bazel-out/host/bin/testapp/app. Mit diesem zusätzlichen Präfix ist es möglich, dasselbe Ziel für zwei verschiedene CPUs im selben Build zu erstellen, ohne dass die Ergebnisse gegenseitig entstehen.

    Das an diese Variable übergebene Label muss genau eine Datei darstellen. Bei Labels für Quelldateien gilt dies automatisch. Bei Labels für Regeln müssen Sie über die Regel genau eine Ausgabe generieren. Wenn dieser Wert „false“ ist oder das Label fehlerhaft ist, schlägt der Build mit einem Fehler fehl.

  • rootpath: Gibt den Runfiles-Pfad an, den ein erstelltes Binärprogramm zum Finden der Abhängigkeiten zur Laufzeit verwenden kann.

    Dies ist mit execpath identisch, entfernt aber die oben beschriebenen Ausgabepräfixe. Im obigen Beispiel verwenden sowohl empty.source als auch app reine arbeitskontextbezogene Pfade: testapp/empty.source und testapp/app.

    Es gelten dieselben Nur-Ausgabe-Anforderungen wie für execpath.

  • location: Ein Synonym für execpath oder rootpath, je nachdem, welches Attribut maximiert wird. Dies ist ein altes Pre-Starlark-Verhalten, das nur empfohlen wird, wenn Sie genau wissen, was es für die jeweilige Regel bewirkt. Weitere Informationen finden Sie unter #2475.

execpaths, rootpaths und locations sind die Pluralvarianten von execpath, rootpath bzw. location. Sie unterstützen Labels, die mehrere Ausgaben erzeugen. In diesem Fall wird jede Ausgabe durch ein Leerzeichen getrennt aufgeführt. Zero-Ausgabe-Regeln und fehlerhafte Labels führen zu Build-Fehlern.

Alle Labels, auf die verwiesen wird, müssen im srcs für das übernehmende Ziel, in den Ausgabedateien oder in deps angezeigt werden. Andernfalls schlägt der Build fehl. C++-Ziele können auch auf Labels in data verweisen.

Labels müssen nicht in kanonischer Form vorliegen: foo, :foo und //somepkg:foo sind in Ordnung.

Benutzerdefinierte Variablen

Benutzerdefinierte „Make“-Variablen können von allen Attributen verwendet werden, die als &Subjekt; Variable ersetzen, aber nur für Ziele, die von anderen Zielen abhängen, die diese Variablen definieren.

Als Best Practice sollten alle Variablen benutzerdefiniert sein, es sei denn, es ist ein wirklich guter Grund, sie in Kern-Back-Ends zu integrieren. So muss Istio möglicherweise teure Abhängigkeiten nicht laden, damit Variablen bereitgestellt werden können, die Tarts verbrauchen.

C++-Toolchain-Variablen

Die folgenden Definitionen sind in Regeln für die C++-Toolchain definiert und für alle Regeln verfügbar, die toolchains = ["@bazel_tools//tools/cpp:current_cc_toolchain"] festlegen (oder "@bazel_tools//tools/cpp:current_cc_host_toolchain" für das Äquivalent der Host-Toolchain). Einige Regeln wie java_binary enthalten die C++-Toolchain implizit in ihrer Regeldefinition. Sie übernehmen diese Variablen automatisch.

Die integrierten C++-Regeln sind deutlich komplexer als der Compiler „&%“ ausführen. Zur Unterstützung von Kompilierungsmodi, die so vielfältig sind wie *SAN, ThinLTO, mit/ohne Module und sorgfältig optimierte Binärprogramme zur gleichen Zeit wie bei schnellen Tests auf mehreren Plattformen, werden die integrierten Regeln umgangen, um sicherzustellen, dass für jede potenziell intern generierte Aktion die richtigen Eingaben, Ausgaben und Befehlszeilen-Flags festgelegt werden.

Diese Variablen sind ein Fallback-Mechanismus, der von Sprachexperten in seltenen Fällen verwendet werden kann. Wenn Sie versucht haben, diese zu verwenden, wenden Sie sich zuerst an die Istio-Entwickler.

  • ABI: Die C++-ABI-Version.
  • AR: Der Befehl „&art“ vom Crosstool.
  • C_COMPILER: Die C/C++-Compiler-ID, z.B. llvm.
  • CC: Der Compiler-C- und C++-Compiler-Befehl.

    Wir empfehlen dringend die Verwendung von CC_FLAGS in Kombination mit CC. Zu beachten ist, dass dies auf eigenes Risiko erfolgt.

  • CC_FLAGS: Eine Mindestanzahl von Flags für den C/C++-Compiler, die von Genrules verwendet werden können. Insbesondere enthält es Flags zur Auswahl der richtigen Architektur, wenn CC mehrere Architekturen unterstützt.
  • NM: Der Befehl „&mn“ aus Crosstool.
  • OBJCOPY: Der Objcopy-Befehl aus derselben Suite wie der C/C++-Compiler.
  • STRIP: Der Strip-Befehl aus derselben Suite wie der C/C++-Compiler.

Java-Toolchain-Variablen

Die folgenden Definitionen sind in den Java-Toolchain-Regeln definiert und stehen für alle Regeln zur Verfügung, die toolchains = ["@bazel_tools//tools/jdk:current_java_runtime"] festlegen (oder "@bazel_tools//tools/jdk:current_host_java_runtime" für das Äquivalent der Host-Toolchain).

Die meisten Tools im SE3 sollten nicht direkt verwendet werden. Die integrierten Java-Regeln verwenden wesentlich komplexere Ansätze für die Kompilierung und Paketerstellung von Java als Upstream-Tools, die sich ausdrücken können, wie Schnittstellenbehälter, Header-Jars und hochoptimierte Jar-Verpackungen und -Zusammenführung.

Diese Variablen sind ein Fallback-Mechanismus, der von Sprachexperten in seltenen Fällen verwendet werden kann. Wenn Sie versucht haben, diese zu verwenden, wenden Sie sich zuerst an die Istio-Entwickler.

  • JAVA: Der Befehl „"java"“ (eine virtuelle Java-Maschine). Vermeiden Sie nach Möglichkeit eine java_binary-Regel. Kann ein relativer Pfad sein. Wenn Sie Verzeichnisse ändern müssen, bevor java aufgerufen wird, müssen Sie das Arbeitsverzeichnis erfassen, bevor Sie es ändern.
  • JAVABASE: Das Basisverzeichnis, das die Java-Dienstprogramme enthält. Kann ein relativer Pfad sein. Sie hat ein Unterverzeichnis und das Unterverzeichnis.

Starlark-definierte Variablen

Autoren und Regel-Writer können vollständig benutzerdefinierte Variablen definieren, indem sie einen TemplateVariableInfo-Anbieter zurückgeben. Alle Regeln, die auf diese über das Attribut toolchains abhängen, können dann ihre Werte lesen:

Beispiel für Starlark-definierte Variablen