¿Qué está tratando de hacer este proyecto por mí?
Primero, proporcione a los usuarios de bazel en autocompletación de la plataforma cruzada para la familia del lenguaje C (C ++, C, Objective-C, Objective-C ++ y CUDA), ¡y por lo tanto hacer que el desarrollo sea más eficiente y divertido!
En términos más generales, exportar bazel construye acciones en el formato compile_commands.json que permite que las grandes herramientas se desacople a partir de bazel.

▲ Extrae compile_commands.json , habilitando clangd Autocomplete en su editor ▼

Bastante genial con solo bordes ásperos muy menores. Usamos esto todos los días y lo amamos.
Si no ha habido compromisos en un tiempo, se debe a la estabilidad, no a la negligencia. Esto está en uso diario dentro de Hedron.
Para el uso diario, recomendamos usar esto en lugar de los adaptadores IDE específicos de la plataforma (como Tulsi o el complemento ASWB/Clion en la medida en que funcione), excepto los momentos en que necesita alguna función específica de la plataforma (por ejemplo, el bufinador de interfaz NextStep de Apple) que nunca se admitirá en un editor de platificación cruzada.
Hay muchas personas que usan esta herramienta. Eso incluye grandes empresas y proyectos con pilas difíciles, como en la robótica.
Incluimos un par de cosas que han dicho. ¡Esperamos que también te den suficiente confianza para probar esta herramienta también!
"¡Gracias por una herramienta increíble! Súper fácil de configurar y usar". - Un ingeniero de robótica en Boston Dynamics
"Gracias por mostrar tanto rigor en lo que de otro modo sería solo un proyecto de herramientas poco interesante. Esto definitivamente se siente como un momento de batón/antorcha. Mis mejores deseos para todo lo que haces en la vida". - Autor de la mejor herramienta anterior de este tipo
Tiempo de configuración básica: 10m
¿Hola, usuario de Bazel? Vamos a configurarlo rápido con algunas herramientas increíbles para la familia del idioma C.
Hay un montón de texto aquí, pero solo porque estamos tratando de deletrear cosas y facilitarlas. Si tiene problemas, háganoslo saber; Nos encantaría su ayuda para hacer que las cosas sean aún mejor y más completas, ¡y nos encantaría ayudarlo!
Copie esto en su MODULE.bazel , asegurándose de actualizar la última confirmación según las instrucciones a continuación.
# 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).
) Copie esto en la parte superior de su archivo WORKSPACE de Bazel, asegurándose de actualizar la última confirmación según las instrucciones a continuación. Ponerlo en la parte superior evitará que otras herramientas golpeen cualquiera de sus dependencias con versiones antiguas; Prometemos mantener las versiones de dependencia de nuestras actualizadas.
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 ()Las mejoras vienen con frecuencia, por lo que recomendamos mantenerse al día.
Recomendamos encarecidamente que configure renovado (o similar) en algún momento para mantener esta dependencia (y otras) actualizada por defecto. [No estamos afiliados a renovado ni nada, pero creemos que es increíble. Observa nuevas versiones y le envía PRS para su revisión o pruebas automatizadas. Es gratis y fácil de configurar. Ha sido asombrosamente útil en nuestra base de código, y hemos trabajado con el maravilloso mantenedor para hacer que las cosas sean excelentes para el uso de bazel. Y se usa en repositorios oficiales de bazel.] Aquí hay un ejemplo de configuración de renovado de uno de nuestros proyectos, con la esperanza de que pueda ahorrarle tiempo.
Si no ahora, tal vez vuelva a este paso más tarde, o vea este repositorio para actualizaciones. [O oye, tal vez danos una estrella rápida, mientras estás pensando en mirar.] Como Abseil, vivimos en la cabeza; El último compromiso con la rama principal es el compromiso que desea. Así que no confíes en las notificaciones de liberación; Use renovado o encueste manualmente para nuevos compromisos.
Generaremos un archivo compile_commands.json en la raíz del espacio de trabajo de Bazel.
Ese archivo describe cómo Bazel está compilando todos los archivos (objetivos-) C (++) o CUDA. Con los comandos de compilación en un formato común, las herramientas independientes del sistema de compilación (por ejemplo, clangd AUTOCOMPLETE, clang-tidy LINTING, etc.), pueden llegar a funcionar.
Lo conseguiremos en funcionamiento y luego pasaremos a la siguiente sección mientras se aleja. Pero en el futuro, cada vez que desee herramientas (como autocompletar) para ver los nuevos cambios en el archivo de BUILD , ¡vuelva a ejecutar el comando que elige a continuación! Clangd recogerá automáticamente los cambios.
En ese caso, solo bazel run @hedron_compile_commands//:refresh_all
Nota: Debe bazel run esta herramienta, no solo bazel build .
--config=my_important_flags_or_toolchains --compilation_mode=dbg , que aplica manualmente a todas sus compilaciones mientras se desarrolla?Es bastante importante que también suministre esas mismas banderas de bazel al ejecutar esta herramienta, para que podamos comprender con precisión la compilación, donde se generan archivos, etc.
Append, por ejemplo -- --config=my_important_flags_or_toolchains --compilation_mode=dbg a lo anterior, o cualquier indicador con los que normalmente construya mientras se desarrolla.
Nota: El extra -- no es un error tipográfico y funciona para pasar las banderas a esta herramienta cuando se ejecuta en lugar de cuando se acumula. Tu comando debería verse como:
bazel run @hedron_compile_commands//:refresh_all -- --config=my_important_flags_or_toolchains --compilation_mode=dbg
En ese caso, puede especificar fácilmente los objetivos de salida de nivel superior en los que está trabajando y los indicadores necesarios para construirlos.
Abra un archivo BUILD , recomendamos usar (o crear) //BUILD , y agregar algo como:
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.
) (Para más detalles sobre refresh_compile_commands , mire los documentos en la parte superior de refresh_compile_commands.bzl ).
Finalmente, deberá bazel run :refresh_compile_commands
ccls u otra herramienta que, a diferencia de clangd , no desee o necesite encabezados en compile_commands.json ? Similar a lo anterior, usaremos refresh_compile_commands para la configuración, pero en lugar de configurar targets , establezca exclude_headers = "all" .
compile_commands.json está tardando un tiempo en generar: Agregar exclude_external_sources = True y exclude_headers = "external" puede ayudar, con algunas compensaciones.
Por ahora, sugerimos continuar para configurar clangd (a continuación). Posteriormente, si su proyecto demuestra ser lo suficientemente grande como para que estire la capacidad de clangd y/o esta herramienta para indexar rápidamente, eche un vistazo a los documentos en la parte superior de refresh_compile_commands.bzl para obtener instrucciones sobre cómo sintonizar esas banderas y otros.
compile_commands.json Vamos a instalar y configurar la extensión de clangd .
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.cpptoolsLuego, abra la configuración del usuario de VScode, para que las cosas se configuren automáticamente para todos los proyectos que abra.
Busque "Clangd".
Agregue las siguientes tres entradas separadas a "clangd.arguments" :
--header-insertion=never
--compile-commands-dir= ${workspaceFolder} /
--query-driver= ** (Simplemente copie cada uno como está escrito; VScode se expandirá correctamente ${workspaceFolder} para cada espacio de trabajo).
clangd interrogue a los envoltorios de compiladores de Bazel para determinar qué encabezados del sistema se incluyen de forma predeterminada.WORKSPACE de Bazel es un subdirectorio de su proyecto, cambie --compile-commands-dir para apuntar a ese subdirectorio anulando las banderas en la configuración de su espacio de trabajo . Deberá volver a especificar todas las banderas cuando anule, porque la configuración del espacio de trabajo reemplaza todos los indicadores en la configuración del usuario.Encendido: Clangd: verificar actualizaciones
clangd destinado a Xcode. Si bien podemos y hacemos grandes esfuerzos para solucionar problemas en la versión actual de clangd , eliminamos esas soluciones cuando clangd los arregla aguas arriba. ¡Esto mantiene el código simple y la velocidad de desarrollo rápido! Si activar las actualizaciones automáticas no le solicita que descargue el servidor clangd Binary real, presione (CMD/CTRL+Shift+P)-> Descargar el servidor de idiomas.
Es posible que deba recargar posteriormente VSCODE [(CMD/CTRL+Shift+P)-> Recargar] para que el complemento se cargue. La descarga clangd debería pedirle que lo haga cuando se complete.
... y desea que estas configuraciones se apliquen automáticamente a sus compañeros de equipo, también agregue la configuración a la configuración del espacio de trabajo VSCode y luego verifique .vscode/settings.json en el control de origen.
Si está utilizando otro editor, deberá seguir los mismos pasos aproximados que el anterior: Obtenga la última versión de CLANGD configurada para extender el editor y luego suministrar los mismos indicadores que VScode. Sabemos que las personas han tenido un momento fácil configurando esta herramienta con otros editores, como emacs y Vim+YouCompleteme (YCM), por ejemplo.
Una vez que haya logrado configurar otro editor, o configurar clang-tidy , o haber visto algo que pueda mejorar este Readme, ¡nos encantaría si retribuyera y contribuyas lo que sabes! Simplemente edite este README.md en GitHub y presente un PR :)
¡Ahora deberías estar listo para ir! Manera de pasar a través de la configuración.
Debe haber un archivo compile_commands.json en la raíz de su espacio de trabajo, lo que permite a su editor proporcionar un excelente autocompleto basado en clang. Y debe saber qué objetivo bazel run para actualizar esa autocompletación, cuando hace cambios de archivo BUILD lo suficientemente grandes como para requerir una actualización.
Detrás de escena, ese archivo compile_commands.json contiene entradas que describen todos los comandos utilizados para construir cada archivo fuente de su proyecto. Y, por ahora, también hay una entrada por encabezado, que describe una forma en que se compila. (Esto también le brinda un excelente autocompleto en los archivos de encabezado, por lo que no tiene que pensar en la mayor ventaja rugosa de clangd ). De manera crucial, todos estos comandos han sido suficientemente desbordados para las herramientas de clang (¡o usted!) Para comprenderlos.
Utilizamos esta herramienta todos los días para desarrollar una biblioteca multiplataforma para iOS y Android en macOS. Espere la finalización de Android en Android Source, MacOS en macOS, iOS en iOS, etc. Las personas también lo usan en Linux/Ubuntu y Windows.
Todas las características habituales de Clangd deberían funcionar. CMD/CTRL+Haga clic en Navegación (u opción si ha cambiado las muelles de teclas), renombro inteligente, autocompletar, resaltar, etc. Todo lo que espera en un IDE debería estar allí (porque la mayoría de los buenos ides están respaldados por clangd ). Como principio general: si elige herramientas que necesitan comprender un lenguaje de programación, desea que se base en una frontend del compilador para ese lenguaje, que CLANGD hace como parte del proyecto LLVM/CLANG.
Todo también debería funcionar para archivos generados, aunque es posible que deba ejecutar una compilación para que el archivo generado exista. Si está utilizando esto con ejecución remota o caché, es probable que tenga que usar --remote_download_regex para reducir el encabezado y los archivos de origen y evitar errores en el editor, ahora que se construye sin los bytes ( --remote_download_toplevel ) es el predeterminado de Bazel. Si trabaja en esto, nos encantaría que devuelviera y presente un PR agregando buenas instrucciones para todos los demás, o al menos comparta lo que ha aprendido en un problema. También querrá retirar los archivos de dependencia *.d en no Windows; Nos permitieron encontrar encabezados mucho más rápido cuando están disponibles como caché. Agradecemos si también verificaría para asegurarse de que sean derribados incluso sin ( --noexperimental_inmemory_dotd_files ). ¡Gracias por ayudar!
De lo contrario, tenemos problemas de autodenominado para los bordes ásperos que conocemos y estamos rastreando. Nos encantaría saber de ti allí sobre lo que estás viendo, bueno y malo. Agregue cosas si encuentra más bordes ásperos y háganos saber si necesita ayuda o más funciones.
Por otro lado, si has configurado las cosas y están funcionando bien, todavía nos encantaría saber de ti. ¡POR FAVOR PRESIDE UN "NO ESOMENTO" en la pestaña Temas que describe su éxito! Nos encantaría escuchar en qué estás trabajando, en qué plataformas estás usando y qué estás encontrando más útil. Y tal vez también arroje una estrella a nuestro manera, así que sabemos que fue útil para usted.
¡También nos encantaría trabajar con usted en contribuciones y mejoras, por supuesto! La configuración del desarrollo es fácil, no onerosa; Tenemos un gran documento para guiarlo rápidamente para que pueda hacer los cambios que necesita. La base de código es súper limpia y amigable. Entrar en el código es una forma divertida y eficiente de obtener las mejoras que desea.
Si está utilizando bazel para la familia del idioma C, es probable que también quiera algunas de nuestras otras herramientas, como ...
¿Buscas detalles de implementación en su lugar? ¿Quieres sumergirte en la base de código? Ver implementationReadMe.md.
BAZELL/BLAY MANTENER ¿Leyendo esto? Si estaría interesado en integrar esto en herramientas oficiales de bazel, háganos saber en un problema o correo electrónico, ¡y hablemos! Nos encanta usar Bazel y nos encantaría ayudar.