Was versucht dieses Projekt für mich zu tun?
Geben Sie zunächst Bazel-Benutzer plattformübergreifend für die C-Sprachfamilie (C ++, C, Objective-C, Objective-C ++ und CUDA) an und machen Sie die Entwicklung dadurch effizienter und unterhaltsamer!
Im Allgemeinen bauen Bazel -Aktionen in das Format compile_commands.json auf, das ein großartiges Werkzeug ermöglicht, das aus dem Bazel entkoppelt ist.

▲ Extracts compile_commands.json und ermöglicht clangd automatische Vervollständigung in Ihrem Editor ▼

Ziemlich großartig mit nur sehr kleinen rauen Kanten. Wir benutzen das jeden Tag und lieben es.
Wenn es seit einiger Zeit nicht mehr begangen hat, liegt es an Stabilität, nicht vernachlässigt. Dies ist im täglichen Gebrauch innerhalb von Hedron.
Für den täglichen Gebrauch empfehlen wir, dies zu verwenden, anstatt die plattformspezifischen IDE-Adapter (wie das ASWB/Clion-Plugin in dem Maße, in dem es funktioniert), mit Ausnahme der Zeiten, in denen Sie eine Plattform-editorspezifische Funktion benötigen (z. B. Apple's NextStep Interface Builder), der nie in einem Kreuzplatform-Editor unterstützt werden wird.
Es gibt viele Leute, die dieses Tool verwenden. Dazu gehören große Unternehmen und Projekte mit kniffligen Stapeln, wie in der Robotik.
Wir schließen ein paar Dinge ein, die sie gesagt haben. Wir hoffen, dass sie Ihnen genügend Vertrauen geben, um dieses Tool auch auszuprobieren!
"Danke für ein tolles Werkzeug! Super einfach einzurichten und zu verwenden." - Ein Robotikingenieur bei Boston Dynamics
"Vielen Dank, dass Sie so viel Strenge in einem uninteressanten Tooling -Projekt gezeigt haben. Dies fühlt sich definitiv wie ein Moment des Staffel-/Fackelmoments an. Meine besten Wünsche für alles, was Sie im Leben tun." - Autor des vorherigen besten Tools dieses Typs
Grundlegende Setup -Zeit: 10m
Grüß dich, Bazel -Benutzer? Lassen Sie uns Sie schnell mit einem fantastischen Werkzeug für die C -Sprachfamilie einrichten.
Hier gibt es eine Reihe von Text, aber nur, weil wir versuchen, Dinge zu buchstabieren und sie einfach zu machen. Wenn Sie Probleme haben, lassen Sie es uns wissen. Wir würden Ihre Hilfe lieben, um die Dinge noch besser und vollständiger zu machen - und wir würden Ihnen gerne helfen!
Kopieren Sie dies in Ihr MODULE.bazel und stellen Sie sicher, dass Sie den neuesten Commit gemäß den folgenden Anweisungen aktualisieren.
# Hedron's Compile Commands Extractor for Bazel
# https://github.com/hedronvision/bazel-compile-commands-extractor
bazel_dep ( name = "hedron_compile_commands" , dev_dependency = True )
git_override (
module_name = "hedron_compile_commands" ,
remote = "https://github.com/hedronvision/bazel-compile-commands-extractor.git" ,
commit = "0e990032f3c5a866e72615cf67e5ce22186dcb97" ,
# Replace the commit hash (above) with the latest (https://github.com/hedronvision/bazel-compile-commands-extractor/commits/main).
# Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
) Kopieren Sie dies in Ihre Bazel WORKSPACE -Datei und stellen Sie sicher, dass Sie den neuesten Commit gemäß den folgenden Anweisungen aktualisieren. Wenn Sie es an die Spitze stellen, wird verhindert, dass andere Werkzeuge eine seiner Abhängigkeiten mit alten Versionen verkürzt. Wir versprechen, unsere Abhängigkeitsversionen auf dem neuesten Stand zu halten.
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
# Hedron's Compile Commands Extractor for Bazel
# https://github.com/hedronvision/bazel-compile-commands-extractor
http_archive (
name = "hedron_compile_commands" ,
# Replace the commit hash (0e990032f3c5a866e72615cf67e5ce22186dcb97) in both places (below) with the latest (https://github.com/hedronvision/bazel-compile-commands-extractor/commits/main), rather than using the stale one here.
# Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
url = "https://github.com/hedronvision/bazel-compile-commands-extractor/archive/0e990032f3c5a866e72615cf67e5ce22186dcb97.tar.gz" ,
strip_prefix = "bazel-compile-commands-extractor-0e990032f3c5a866e72615cf67e5ce22186dcb97" ,
# When you first run this tool, it'll recommend a sha256 hash to put here with a message like: "DEBUG: Rule 'hedron_compile_commands' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = ..."
)
load ( "@hedron_compile_commands//:workspace_setup.bzl" , "hedron_compile_commands_setup" )
hedron_compile_commands_setup ()
load ( "@hedron_compile_commands//:workspace_setup_transitive.bzl" , "hedron_compile_commands_setup_transitive" )
hedron_compile_commands_setup_transitive ()
load ( "@hedron_compile_commands//:workspace_setup_transitive_transitive.bzl" , "hedron_compile_commands_setup_transitive_transitive" )
hedron_compile_commands_setup_transitive_transitive ()
load ( "@hedron_compile_commands//:workspace_setup_transitive_transitive_transitive.bzl" , "hedron_compile_commands_setup_transitive_transitive_transitive" )
hedron_compile_commands_setup_transitive_transitive_transitive ()Verbesserungen kommen häufig, daher empfehlen wir, uns auf dem neuesten Stand zu halten.
Wir empfehlen dringend, dass Sie irgendwann Renovat (oder ähnlich) einrichten, um diese Abhängigkeit (und andere) standardmäßig auf dem neuesten Stand zu halten. [Wir sind nicht mit Renovat oder so verbunden, aber wir halten es für großartig. Es beobachtet neue Versionen und sendet Ihnen PRS zur Überprüfung oder automatisierten Tests. Es ist kostenlos und einfach eingerichtet. Es war erstaunlich nützlich in unserer Codebasis, und wir haben mit dem wunderbaren Betreuer zusammengearbeitet, um die Dinge für die Verwendung von Basel hervorragend zu machen. Und es wird in offiziellen Basel -Repositories verwendet.] Hier ist ein Renovate -Konfigurationsbeispiel aus einem unserer Projekte, in der Hoffnung, dass es Ihnen Zeit sparen könnte.
Wenn nicht jetzt, kehren Sie möglicherweise zu diesem Schritt später zurück oder sehen Sie sich dieses Repo nach Updates an. [Oder hey, vielleicht gib uns einen schnellen Stern, während du darüber nachdenkt.] Wie Abseil leben wir am Kopf; Der neueste Verpflichtung zum Hauptzweig ist das gewünschte Commit. Verlassen Sie sich also nicht auf Release -Benachrichtigungen. Verwenden Sie Renovate oder Umfrage manuell für neue Commits.
Wir werden eine Datei compile_commands.json im Stammverschluss des Bazel -Arbeitsbereichs generieren.
Diese Datei beschreibt, wie Bazel alle (objektiv-) C (++) oder CUDA-Dateien kompiliert. Mit den Kompilierungsbefehlen in einem gemeinsamen Format können Sie bausystemunabhängige Werkzeuge (z. clangd Autokaponete, clang-tidy usw.), können an die Arbeit gelangen.
Wir werden es zum Laufen bringen und dann zum nächsten Abschnitt übergehen, während es wegwirft. Aber in Zukunft, jedes Mal, wenn Sie das Werkzeug (wie automatisch vervollständigen) möchten, um Neubau BUILD -Änderungen zu sehen, können Sie den im Folgenden ausgewählten Befehl erneut ausgewählt! Clangd nimmt die Änderungen automatisch auf.
In diesem Fall nur bazel run @hedron_compile_commands//:refresh_all
Hinweis: Sie müssen dieses Tool bazel run , nicht nur bazel build es.
--config=my_important_flags_or_toolchains --compilation_mode=dbg , die Sie bei der Entwicklung manuell für alle Ihre Builds anwenden?Es ist ziemlich wichtig, dass Sie beim Ausführen dieses Tools dieselben Basel -Flags liefern, sodass wir den Build genau verstehen können, wo Dateien generiert werden, usw.
Append, -- --config=my_important_flags_or_toolchains --compilation_mode=dbg
HINWEIS: Das Extra -- ist kein Tippfehler und wirkt, die Flags an dieses Tool zu übergeben, wenn es ausgeführt wird, anstatt wenn es baut. Ihr Befehl sollte aussehen wie:
bazel run @hedron_compile_commands//:refresh_all -- --config=my_important_flags_or_toolchains --compilation_mode=dbg
In diesem Fall können Sie die oberste Ebene, die Ausgabe von Zielen, an denen Sie arbeiten, und die Flaggen, die zum Erstellen benötigt werden, einfach angeben.
Öffnen Sie eine BUILD -Datei - wir empfehlen, die Verwendung (oder das Erstellen) //BUILD zu können - und fügen Sie so etwas hinzu:
load ( "@hedron_compile_commands//:refresh_compile_commands.bzl" , "refresh_compile_commands" )
refresh_compile_commands (
name = "refresh_compile_commands" ,
# Specify the targets of interest.
# For example, specify a dict of targets and any flags required to build.
targets = {
"//:my_output_1" : "--important_flag1 --important_flag2=true" ,
"//:my_output_2" : "" ,
},
# No need to add flags already in .bazelrc. They're automatically picked up.
# If you don't need flags, a list of targets is also okay, as is a single target string.
# Wildcard patterns, like //... for everything, *are* allowed here, just like a build.
# As are additional targets (+) and subtractions (-), like in bazel query https://docs.bazel.build/versions/main/query.html#expressions
# And if you're working on a header-only library, specify a test or binary target that compiles it.
) (Weitere Informationen zu refresh_compile_commands finden Sie in den Dokumenten oben in refresh_compile_commands.bzl .
Schließlich müssen Sie bazel run :refresh_compile_commands
ccls oder einem anderen Tool, das im Gegensatz zu clangd keine Header in compile_commands.json will oder benötigt? Ähnlich wie oben verwenden wir für die Konfiguration refresh_compile_commands , aber anstatt targets festzulegen, setzen Sie exclude_headers = "all" fest.
compile_commands.json eine Weile dauert, um zu generieren: Hinzufügen exclude_external_sources = True und exclude_headers = "external" kann mit einigen Kompromisse helfen.
Im Moment schlagen wir vor, dass wir clangd (unten) fortsetzen müssen. Wenn sich Ihr Projekt danach als groß genug erweist, um die Kapazität von clangd und/oder dieses Tools zum schnellen Index zu erweitern, schauen Sie sich die Dokumente oben auf dem oberen Rand von refresh_compile_commands.bzl an, um Anweisungen zum Einstellen dieser Flaggen und anderen Flaggen zu erhalten.
compile_commands.json Lassen Sie uns die Erweiterung von clangd installiert und konfigurieren lassen.
code --install-extension llvm-vs-code-extensions.vscode-clangd
# We also need make sure that Microsoft's C++ extension is not involved and interfering.
code --uninstall-extension ms-vscode.cpptoolsÖffnen Sie dann VSCODE -Benutzereinstellungen , sodass die Dinge automatisch für alle von Ihnen geöffneten Projekte eingerichtet werden.
Suche nach "klangd".
Fügen Sie den folgenden drei separaten Einträgen zu "clangd.arguments" hinzu:
--header-insertion=never
--compile-commands-dir= ${workspaceFolder} /
--query-driver= ** (Kopieren Sie einfach jeweils wie geschrieben. VSCODE erweitert ${workspaceFolder} für jeden Arbeitsbereich korrekt.)
clangd die Compiler -Verpackungen von Bazel befragen, um herauszufinden, welche Systemheader standardmäßig enthalten sind.WORKSPACE ein Unterverzeichnis Ihres Projekts ist, wechseln Sie --compile-commands-dir um in dieses Unterverzeichnis hinweisen, indem Sie die Flags in Ihren Arbeitsbereicheinstellungen überschreiben. Sie müssen alle Flags neu spezifizieren, wenn Sie überschreiben, da die Arbeitsbereicheinstellungen alle Flags in den Benutzereinstellungen ersetzen.Einschalten: Clangd: Aktualisierungen überprüfen
clangd für Xcode. Während wir in der aktuellen Version von clangd große Anstrengungen unternehmen können, um Probleme mit der Problemumgehung zu erledigen, entfernen wir diese Problemumgehungen, wenn clangd sie stromaufwärts behebt. Dies hält den Code einfach und die Entwicklungsgeschwindigkeit schnell! Wenn Sie automatische Updates einschalten, fordert Sie nicht zum Herunterladen des tatsächlichen clangd -Server-Binärs auf (CMD/Strg+Shift+P)-> Sprachserver herunterladen.
Möglicherweise müssen Sie anschließend VSCODE [(CMD/Strg+Shift+P)-> Reload] neu laden, damit das Plugin geladen werden kann. Der clangd -Download sollte Sie dazu veranlassen, dies zu tun, wenn er abgeschlossen ist.
... und möchte, dass diese Einstellungen automatisch für Ihre Teamkollegen angewendet werden, fügen Sie die Einstellungen auch den Einstellungen für den VSCODE -Arbeitsbereich hinzu und überprüfen Sie .vscode/settings.json in die Quellensteuerung.
Wenn Sie einen anderen Editor verwenden, müssen Sie dieselben groben Schritte wie oben befolgen: Holen Sie sich die neueste Version von Clangd ein, um den Editor zu erweitern und dann dieselben Flags wie VSCODE anzugeben. Wir wissen, dass die Leute es leicht hatten, dieses Tool mit anderen Editoren wie EMACs und VIM+You Completeme (YCM) einzurichten.
Sobald es Ihnen gelungen ist, einen weiteren Redakteur einzurichten-oder clang-tidy einzurichten oder auf andere Weise etwas zu sehen, das diese Readme verbessern könnte-, würden wir es lieben, wenn Sie zurückgeben und beitragen, was Sie wissen! Bearbeiten Sie einfach diese README.md auf GitHub und stellen Sie ein PR ein :)
Sie sollten jetzt bereit sein! Weg, um es durch das Setup zu schaffen.
Es sollte eine compile_commands.json Datei im Root Ihres Arbeitsbereichs geben, sodass Ihr Editor eine großartige, klangbasierte Autokonplete zur Verfügung stellt. Und Sie sollten wissen, welches Ziel für bazel run um diese automatische Vervollständigung zu aktualisieren, wenn Sie BUILD -File -Änderungen groß genug vornehmen, um eine Aktualisierung zu erfordern.
Hinter den Kulissen enthält diese Datei compile_commands.json Einträge, in denen alle Befehle beschrieben werden, mit denen jede Quelldatei in Ihrem Projekt erstellt wird. Und vorerst gibt es auch einen Eintrag pro Header, der eine Möglichkeit beschreibt, wie er zusammengestellt wird. (Dies bringt Ihnen auch eine großartige automatische Vervollständigung in Header -Dateien, sodass Sie nicht über clangd größte raue Kante nachdenken müssen.) Entscheidend ist, dass all diese Befehle für das Clang-Werkzeug (oder Sie!) Ausreichend de-bazeliert wurden, um sie zu verstehen.
Wir verwenden dieses Tool jeden Tag, um eine plattformübergreifende Bibliothek für iOS und Android auf MacOS zu entwickeln. Erwarten Sie die Fertigstellung von Android in Android Source, macOS in macOS, iOS in iOS usw. Die Leute verwenden es auch unter Linux/Ubuntu und Windows.
Alle üblichen Klangfunktionen sollten funktionieren. CMD/STRG+Klicken Sie auf Navigation (oder Option, wenn Sie die Schlüsselbindungen geändert haben), intelligent umbenannt, automatisch vollkommen, hervorgehoben werden usw. Alles, was Sie in einer IDE erwarten, sollte vorhanden sein (da die meisten guten IDEs von clangd unterstützt werden). Als allgemeines Prinzip: Wenn Sie Tooling wählen, das eine Programmiersprache verstehen muss, möchten Sie, dass sie auf einem Compiler -Frontend für diese Sprache basiert, das Clangd als Teil des LLVM/Clang -Projekts tut.
Alles sollte auch für generierte Dateien funktionieren, obwohl Sie möglicherweise einen Build für die zu existierende generierte Datei ausführen müssen. Wenn Sie dies mit Remote-Ausführung oder Cache verwenden, müssen Sie wahrscheinlich --remote_download_toplevel --remote_download_regex verwenden, um die Header- und Quelldateien abzurufen und Fehler zu vermeiden. Wenn Sie dies durcharbeiten, würden wir es lieben, wenn Sie zurückgeben und eine PR einreichen würden, die für alle anderen gute Anweisungen hinzufügen -oder zumindest teilen, was Sie in einem Problem gelernt haben. Sie möchten auch *.d Abhängigkeitsdateien auf Nicht-Windows herunterziehen. Sie lassen uns viel schneller finden, wenn sie als Cache verfügbar sind. Wir würden uns freuen, wenn Sie auch prüfen, ob sie auch ohne heruntergezogen sind ( --noexperimental_inmemory_dotd_files ). Danke, dass du geholfen hast!
Ansonsten haben wir Probleme für die groben Kanten, die wir kennen und die wir kennen und die sie verfolgen, selbstgerichtet. Wir würden gerne dort von Ihnen hören, was Sie sehen, gut und schlecht. Bitte fügen Sie Dinge hinzu, wenn Sie mehr grobe Kanten finden, und teilen Sie uns mit, ob Sie Hilfe oder mehr Funktionen benötigen.
Auf der anderen Seite würden wir immer noch gerne von Ihnen hören, wenn Sie Dinge einrichten und gut arbeiten. Bitte stellen Sie in der Registerkarte "Problemen" ein "Nicht-Ausgabe" ein, in dem Sie Ihren Erfolg beschreiben! Wir würden gerne hören, woran Sie arbeiten, an welchen Plattformen Sie verwenden und was Sie am nützlichsten finden. Und vielleicht werfen wir auch einen Stern auf unseren Weg, damit wir wissen, dass es für Sie hilfreich war.
Wir würden uns natürlich auch gerne mit Ihnen an Beiträgen und Verbesserungen zusammenarbeiten! Das Entwicklungsaufbau ist einfach, nicht belastend. Wir haben einen großartigen Arzt, um Sie schnell dazu zu führen, die Änderungen vorzunehmen, die Sie benötigen. Die Codebasis ist super sauber und freundlich. Das Eintreten in den Code ist eine unterhaltsame und effiziente Möglichkeit, die gewünschten Verbesserungen zu erhalten.
Wenn Sie Basel für die C -Sprachfamilie C verwenden, möchten Sie wahrscheinlich auch einige unserer anderen Werkzeuge, wie ...
Suchen Sie stattdessen nach Implementierungsdetails? Möchten Sie in die Codebasis eintauchen? Siehe ImplementationReadme.md.
Bazel/Blaze -Betreuer Lesen Sie dies? Wenn Sie daran interessiert möchten, dies in offizielle Bazel -Tools zu integrieren, teilen Sie uns es in einem Problem oder einer E -Mail mit und lassen Sie uns sprechen! Wir lieben es, Basel zu benutzen und würde gerne helfen.