O que esse projeto está tentando fazer por mim?
Primeiro, forneça aos usuários do Bazel cruzamento de preenchimento automático para a família C Language (C ++, C, Objective-C, Objective-C ++ e Cuda) e, assim, tornar o desenvolvimento mais eficiente e divertido!
De maneira mais geral, a exportação do Bazel cria ações no formato compile_commands.json que permite ótimas ferramentas dissociadas do Bazel.

▲ extratos compile_commands.json , permitindo que clangd premiendo o seu editor ▼

Muito ótimo com apenas bordas ásperas muito pequenas. Usamos isso todos os dias e amamos.
Se não houver hábitos há algum tempo, é por estabilidade, não por negligência. Isso está em uso diário dentro de Hedron.
Para o uso diário, recomendamos usar isso em vez dos adaptadores IDE específicos da plataforma (como Tulsi ou o plug-in ASWB/Clion na medida em que funciona), exceto os momentos em que você precisa de algum recurso específico do editor (por exemplo, o próximo editor de interface da Apple) que nunca será apoiado em um editor de plataformas da Apple.
Existem muitas pessoas usando esta ferramenta. Isso inclui grandes empresas e projetos com pilhas complicadas, como na robótica.
Estamos incluindo algumas coisas que eles disseram. Esperamos que eles lhe dêem confiança suficiente para experimentar essa ferramenta!
"Obrigado por uma ferramenta incrível! Super fácil de configurar e usar." - Um engenheiro de robótica na Boston Dynamics
"Obrigado por mostrar muito rigor no que, de outra forma, seria apenas um projeto de ferramentas desinteressante. Isso definitivamente parece uma passagem do momento de bastão/tocha. Meus melhores votos de tudo o que você faz na vida". - Autor da melhor ferramenta anterior deste tipo
Tempo básico de configuração: 10m
Olá, usuário do Bazel?. Vamos configurar rapidamente com algumas ferramentas impressionantes para a família de idiomas C.
Há um monte de texto aqui, mas apenas porque estamos tentando soletrar as coisas e facilitar as coisas. Se você tiver problemas, informe -nos; Adoraríamos sua ajuda para tornar as coisas ainda mais completas e mais completas - e adoraríamos ajudá -lo!
Copie isso no seu MODULE.bazel , certificando -se de atualizar para a última confirmação de acordo com as instruções abaixo.
# 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 isso na parte superior do seu arquivo WORKSPACE do Bazel, certificando -se de atualizar para a última confirmação de acordo com as instruções abaixo. Colocá -lo no topo impedirá que outras ferramentas derrubem qualquer uma de suas dependências com versões antigas; Prometemos manter as versões de dependência atualizadas.
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 ()As melhorias vêm com frequência, por isso recomendamos manter-se atualizado.
Recomendamos fortemente que você configure renovados (ou similares) em algum momento para manter essa dependência (e outros) atualizados por padrão. [Não somos afiliados à reforma ou algo assim, mas achamos incrível. Ele observa novas versões e envia o PRS para revisão ou testes automatizados. É gratuito e fácil de configurar. Tem sido surpreendentemente útil em nossa base de código e trabalhamos com o maravilhoso mantenedor para tornar as coisas ótimas para uso da Bazel. E é usado em repositórios oficiais de Bazel.] Aqui está um exemplo de configuração de renovatação de um de nossos projetos, na esperança de que ele economize seu tempo.
Caso contrário, talvez volte a esta etapa mais tarde ou assista a este repositório para atualizações. [Ou ei, talvez nos dê uma estrela rápida, enquanto você está pensando em assistir.] Como Abseil, vivemos na cabeça; O mais recente comprometimento com o ramo principal é o compromisso que você deseja. Portanto, não confie nas notificações de liberação; Use renovar ou pesquisar manualmente para novos começos.
Vamos gerar um arquivo compile_commands.json na raiz do espaço de trabalho Bazel.
Esse arquivo descreve como o Bazel está compilando todos os arquivos (objetivos-) C (++) ou CUDA. Com os comandos de compilação em um formato comum, as ferramentas independentes do sistema de construção (por exemplo, clangd preenchimento automático, revestimento de clang-tidy etc.), podem começar a trabalhar.
Vamos funcionar e depois passar para a próxima seção enquanto ele se afasta. Mas, no futuro, toda vez que você deseja ferramentas (como o AutoComplete) para ver novas alterações no arquivo de BUILD , execute o comando que você escolheu abaixo! Clangd pegará automaticamente as alterações.
Nesse caso, apenas bazel run @hedron_compile_commands//:refresh_all
Nota: Você precisa bazel run esta ferramenta, não apenas bazel build -la.
--config=my_important_flags_or_toolchains --compilation_mode=dbg , que você aplica manualmente a todas as suas construções durante o desenvolvimento?É bastante importante que você forneça as mesmas bandeiras do Bazel ao executar essa ferramenta também, para que possamos entender com precisão a construção, onde os arquivos estão sendo gerados etc.
Anexe, por exemplo -- --config=my_important_flags_or_toolchains --compilation_mode=dbg para o acima, ou quaisquer sinalizadores que você normalmente construa durante o desenvolvimento.
NOTA: O extra -- não é um erro de digitação e funciona para passar as bandeiras para essa ferramenta quando é executado e não quando construir. Seu comando deve parecer:
bazel run @hedron_compile_commands//:refresh_all -- --config=my_important_flags_or_toolchains --compilation_mode=dbg
Nesse caso, você pode especificar facilmente os alvos de saída de nível superior em que está trabalhando e os sinalizadores necessários para construí-los.
Abra um arquivo BUILD - recomendamos usar (ou criar) //BUILD - e adicionar 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 obter mais detalhes sobre refresh_compile_commands , consulte os documentos na parte superior de refresh_compile_commands.bzl ).
Finalmente, você bazel run :refresh_compile_commands
ccls ou outra ferramenta que, diferentemente clangd , não quer ou precisa de cabeçalhos em compile_commands.json ? Semelhante ao acima, usaremos refresh_compile_commands para configuração, mas em vez de definir targets , set exclude_headers = "all" .
compile_commands.json está demorando um pouco para gerar: Adicionar exclude_external_sources = True e exclude_headers = "external" pode ajudar, com algumas compensações.
Por enquanto, sugerimos continuar a configurar clangd (abaixo). Posteriormente, se você seu projeto provar ser grande o suficiente para estender a capacidade de clangd e/ou essa ferramenta para indexar rapidamente, dê uma olhada nos documentos no topo de refresh_compile_commands.bzl para obter instruções sobre como ajustar esses sinalizadores e outros.
compile_commands.json Vamos instalar e configurar a extensão 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.cpptoolsEm seguida, abra as configurações do usuário do VSCode, para que as coisas sejam configuradas automaticamente para todos os projetos que você abrir.
Pesquise por "Clangd".
Adicione as três entradas separadas a seguir para "clangd.arguments" :
--header-insertion=never
--compile-commands-dir= ${workspaceFolder} /
--query-driver= ** (Basta copiar cada um como escrito; o vscode expandirá corretamente ${workspaceFolder} para cada espaço de trabalho.)
clangd interrogue os invólucros do compilador da Bazel para descobrir quais cabeçalhos do sistema estão incluídos por padrão.WORKSPACE do Bazel for um subdiretório do seu projeto, mude --compile-commands-dir para apontar para esse subdiretório, substituindo os sinalizadores em suas configurações de espaço de trabalho . Você precisará re-especificar todos os sinalizadores quando substituir, porque as configurações da área de trabalho substituem todos os sinalizadores nas configurações do usuário.Ligue: Clangd: Verifique as atualizações
clangd da Apple destinado ao Xcode. Embora possamos fazer grandes esforços para alternar problemas na versão atual do clangd , removemos essas soluções alternativas quando clangd os corrige a montante. Isso mantém o código simples e a velocidade de desenvolvimento rapidamente! Se ativar as atualizações automáticas não solicitarem que você faça o download do Binário do Servidor clangd real, pressione (CMD/Ctrl+Shift+P)-> Download do servidor de idiomas.
Pode ser necessário recarregar o VSCode posteriormente [(CMD/Ctrl+Shift+P)-> Recarregar] para o plug-in carregar. O download clangd deve solicitar que você faça isso quando for concluído.
... e gostaria que essas configurações fossem aplicadas automaticamente aos seus colegas de equipe, também adicione as configurações às configurações do espaço de trabalho do VSCODE e verifique .vscode/settings.json no controle de origem.
Se você estiver usando outro editor, precisará seguir as mesmas etapas difíceis que acima: Obtenha a versão mais recente do Clangd configurada para estender o editor e, em seguida, fornecer os mesmos sinalizadores que o VSCODE. Sabemos que as pessoas tiveram um tempo fácil configurando essa ferramenta com outros editores, como o Emacs e o VIM+YouCompleteme (YCM), por exemplo.
Depois de conseguir criar outro editor-ou configurar clang-tidy , ou, de outra forma, ver qualquer coisa que pudesse melhorar esse leitura-nós o adoraríamos se você retribuísse e contribuísse com o que sabe! Basta editar este README.md no github e arquivar um PR :)
Agora você deve estar pronto para ir! Maneira de fazer isso através da configuração.
Deve haver um arquivo compile_commands.json na raiz do seu espaço de trabalho, permitindo que seu editor forneça um ótimo preenchimento automático baseado em clang. E você deve saber qual alvo para bazel run para atualizar esse preenchimento automático, quando você faz alterações no arquivo BUILD grande o suficiente para exigir uma atualização.
Nos bastidores, esse arquivo compile_commands.json contém entradas descrevendo todos os comandos usados para criar todos os arquivos de origem em seu projeto. E, por enquanto, também há uma entrada por cabeçalho, descrevendo uma maneira de ser compilada. (Isso também lhe dá um ótimo preenchimento automático nos arquivos do cabeçalho, para que você não precise pensar na maior ponta de clangd ). Fundamentalmente, todos esses comandos foram suficientemente desbrafados para ferramentas de clang (ou você!) Para entendê-los.
Usamos essa ferramenta todos os dias para desenvolver uma biblioteca de plataformas cruzadas para iOS e Android no macOS. Espere a conclusão do Android na fonte do Android, MacOS no macOS, iOS no iOS etc. As pessoas também o usam no Linux/Ubuntu e Windows.
Todos os recursos usuais do Clangd devem funcionar. CMD/CTRL+Clique em Navegação (ou opção Se você alterou os pedidos de chave), renomeamento inteligente, preenchimento automático, destacando etc. Tudo o que você espera em um IDE deve estar lá (porque a maioria dos bons IDEs é apoiada por clangd ). Como princípio geral: se você está escolhendo ferramentas que precisam entender uma linguagem de programação, deseja que ela seja baseada em um front -end do compilador para esse idioma, que Clangd faz como parte do projeto LLVM/CLANG.
Tudo também deve funcionar para arquivos gerados, embora você precise executar uma compilação para que o arquivo gerado exista. Se você estiver usando isso com execução ou cache remoto, provavelmente precisará usar --remote_download_regex para puxar o cabeçalho e os arquivos de origem e evitar erros no editor, agora que construíram sem os bytes ( --remote_download_toplevel ) é o padrão Bazel. Se você trabalha com isso, adoraríamos que você devolvesse e registrasse um PR adicionando boas instruções para todos os outros -ou pelo menos compartilharem o que você aprendeu em um problema. Você também desejará puxar os arquivos de dependência .D em sem janelas; Eles nos deixaram encontrar cabeçalhos muito mais rápidos quando estão disponíveis como um cache. Agradecemos se você também verificar se eles teriam que eles estão puxados para baixo, mesmo sem ( --noexperimental_inmemory_dotd_files ). Obrigado por ajudar!
Caso contrário, temos problemas de autopiliação para as arestas que conhecemos e estamos rastreando. Gostaríamos muito de ouvir de você sobre o que você está vendo, bom e ruim. Adicione as coisas se encontrar mais arestas e informe -nos se precisar de ajuda ou mais recursos.
Por outro lado, se você configurou as coisas e eles estão trabalhando bem, ainda gostaríamos de ouvir você. Por favor, arquive uma "não emissão" na guia Questões que descrevem seu sucesso! Gostaríamos muito de ouvir no que você está trabalhando, em quais plataformas você está usando e o que você está achando mais útil. E talvez também jogue uma estrela em nossa direção, para que sabemos que foi útil para você.
Também gostaríamos de trabalhar com você sobre contribuições e melhorias, é claro! A configuração de desenvolvimento é fácil, não onerosa; Temos um ótimo documento para guiá -lo rapidamente a poder fazer as alterações necessárias. A base de código é super limpa e amigável. Entrar no código é uma maneira divertida e eficiente de obter as melhorias que você deseja.
Se você está usando o Bazel para a família C Language, provavelmente também deseja algumas de nossas outras ferramentas, como ...
Procurando detalhes da implementação em vez disso? Quer mergulhar na base de código? Consulte ImplementationReadMe.md.
Mantenedor Bazel/Blaze lendo isso? Se você estiver interessado em integrar isso às ferramentas oficiais do Bazel, informe -nos em um problema ou email e vamos conversar! Adoramos usar o Bazel e gostaríamos de ajudar.