Gravar arquivos de configuração bazelrc

O Bazel aceita muitas opções. Algumas opções variam com frequência (por exemplo, --subcommands), enquanto outras permanecem as mesmas em vários builds (como --package_path). Para evitar especificar essas opções inalteradas para cada build e outros comandos, especifique opções em um arquivo de configuração chamado .bazelrc.

Onde estão os arquivos .bazelrc?

O Bazel procura arquivos de configuração opcionais nos locais abaixo, na ordem mostrada abaixo. As opções são interpretadas nessa ordem, portanto, opções em arquivos posteriores podem substituir um valor de um arquivo anterior se surgir um conflito. Todas as opções que controlam quais arquivos são carregados são opções de inicialização, o que significa que elas precisam ocorrer após bazel e antes do comando (build, test etc.).

  1. O arquivo RC do sistema, a menos que --nosystem_rc esteja presente.

    Caminho:

    • No Linux/macOS/Unixes: /etc/bazel.bazelrc
    • No Windows: %ProgramData%\bazel.bazelrc

    Não haverá erro se o arquivo não existir.

    Se outro local especificado pelo sistema for necessário, crie um binário Bazel personalizado, substituindo o valor BAZEL_SYSTEM_BAZELRC_PATH em //src/main/cpp:option_processor. O local especificado pelo sistema pode conter referências de variáveis de ambiente, como ${VAR_NAME} no Unix ou %VAR_NAME% no Windows.

  2. O arquivo RC do espaço de trabalho, a menos que --noworkspace_rc esteja presente.

    Caminho: .bazelrc no diretório do espaço de trabalho (ao lado do arquivo WORKSPACE principal).

    Não haverá erro se o arquivo não existir.

  3. O arquivo RC da casa, a menos que --nohome_rc esteja presente.

    Caminho:

    • No Linux/macOS/Unixes: $HOME/.bazelrc
    • No Windows: %USERPROFILE%\.bazelrc, se houver, ou %HOME%/.bazelrc.

    Não haverá erro se o arquivo não existir.

  4. O arquivo RC especificado pelo usuário, se especificado com --bazelrc=file

    Essa sinalização é opcional, mas também pode ser especificada várias vezes.

    /dev/null indica que todos os outros --bazelrcs serão ignorados, o que é útil para desativar a pesquisa de um arquivo rc do usuário, como em builds de lançamento.

    Exemplo:

    --bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
    
    • x.rc e y.rc foram lidos.
    • O z.rc é ignorado devido ao /dev/null anterior.

Além desse arquivo de configuração opcional, o Bazel procura um arquivo rc global. Para mais detalhes, consulte a seção bazelrc global.

Sintaxe e semântica de .bazelrc

Como todos os arquivos "rc" do UNIX, o .bazelrc é um arquivo de texto com uma gramática baseada em linhas. Linhas vazias e linhas que começam com # (comentários) são ignoradas. Cada linha contém uma sequência de palavras, que são tokenizadas de acordo com as mesmas regras do shell Bourne.

Importações

As linhas que começam com import ou try-import são especiais: use-as para carregar outros arquivos "rc". Para especificar um caminho relativo à raiz do espaço de trabalho, escreva import %workspace%/path/to/bazelrc.

A diferença entre import e try-import é que o Bazel falha se o arquivo import está ausente (ou não pode ser lido), mas não para um arquivo com try-import.

Precedência de importação:

  • As opções no arquivo importado têm precedência sobre as opções especificadas antes da instrução de importação.
  • As opções especificadas após a instrução de importação têm precedência sobre as opções no arquivo importado.
  • As opções nos arquivos importados posteriormente têm precedência em relação aos arquivos importados anteriormente.

Padrões da opção

A maioria das linhas de um bazelrc define valores de opção padrão. A primeira palavra em cada linha especifica quando esses padrões são aplicados:

  • startup: opções de inicialização, que vão antes do comando e são descritas em bazel help startup_options.
  • common: opções que se aplicam a todos os comandos do Bazel.
  • command: comando do Bazel, como build ou query, a que as opções se aplicam. Essas opções também se aplicam a todos os comandos herdados do comando especificado. Por exemplo, test herda de build.

Cada uma dessas linhas pode ser usada mais de uma vez, e os argumentos que seguem a primeira palavra são combinados como se tivessem aparecido em uma única linha. Os usuários do CVS, outra ferramenta com uma interface de linha de comando "Canivete suíço", vão encontrar a sintaxe semelhante à de .cvsrc. Por exemplo, as linhas:

build --test_tmpdir=/tmp/foo --verbose_failures
build --test_tmpdir=/tmp/bar

são combinados como:

build --test_tmpdir=/tmp/foo --verbose_failures --test_tmpdir=/tmp/bar

Assim, as sinalizações efetivas são --verbose_failures e --test_tmpdir=/tmp/bar.

Precedência da opção:

  • As opções na linha de comando sempre têm precedência sobre as dos arquivos rc. Por exemplo, se um arquivo rc indicar build -c opt, mas a sinalização de linha de comando for -c dbg, a sinalização de linha de comando terá precedência.
  • Dentro do arquivo rc, a precedência é regida pela especificidade: as linhas de um comando mais específico têm precedência em relação às linhas de um comando menos específico.

    A especificidade é definida pela herança. Alguns comandos herdam opções de outros comandos, tornando o comando herdado mais específico do que o comando base. Por exemplo, test herda do comando build, de modo que todas as sinalizações bazel build são válidas para bazel test, e todas as linhas build também se aplicam a bazel test, a menos que haja uma linha test para a mesma opção. Se o arquivo rc indicar:

    test -c dbg --test_env=PATH
    build -c opt --verbose_failures
    

    então bazel build //foo usará -c opt --verbose_failures e bazel test //foo usará --verbose_failures -c dbg --test_env=PATH.

    O gráfico de herança (especificidade) é:

    • Todos os comandos são herdados de common
    • Os comandos a seguir herdam de (e são mais específicos) build: test, run, clean, mobile-install, info, print_action, config, cquery e aquery
    • coverage herda de test
  • Duas linhas que especificam opções para um mesmo comando com a mesma especificidade são analisadas na ordem em que aparecem no arquivo.

  • Como essa regra de precedência não corresponde à ordem do arquivo, ela ajudará na legibilidade se você seguir a ordem de precedência nos arquivos rc: começar com as opções common na parte de cima e terminar com os comandos mais específicos na parte de baixo do arquivo. Dessa forma, a ordem em que as opções são lidas é a mesma ordem em que elas são aplicadas, o que é mais intuitivo.

Os argumentos especificados em uma linha de um arquivo rc podem incluir argumentos que não são opções, como os nomes dos destinos de build e assim por diante. Essas, como as opções especificadas nos mesmos arquivos, têm precedência mais baixa do que os irmãos na linha de comando e sempre são anexadas à lista explícita de argumentos que não são de opção.

--config

Além de definir os padrões de opção, o arquivo rc pode ser usado para agrupar opções e fornecer uma abreviação para agrupamentos comuns. Isso é feito adicionando um sufixo :name ao comando. Essas opções são ignoradas por padrão, mas serão incluídas quando a opção --config=name estiver presente, na linha de comando ou em um arquivo .bazelrc, de maneira recursiva, mesmo dentro de outra definição de configuração. As opções especificadas por command:name serão expandidas apenas para comandos aplicáveis, na ordem de precedência descrita acima.

--config=foo se expande para as opções definidas nos arquivos rc "no local", de modo que as opções especificadas para a configuração tenham a mesma precedência que a opção --config=foo.

Essa sintaxe não se estende ao uso de startup para definir opções de inicialização. A configuração de startup:config-name --some_startup_option no .bazelrc será ignorada.

Exemplo

Confira este exemplo do arquivo ~/.bazelrc:

# Bob's Bazel option defaults

startup --host_jvm_args=-XX:-UseParallelGC
import /home/bobs_project/bazelrc
build --show_timestamps --keep_going --jobs 600
build --color=yes
query --keep_going

# Definition of --config=memcheck
build:memcheck --strip=never --test_timeout=3600

Outros arquivos que regem o comportamento do Bazel

.bazelignore

É possível especificar diretórios dentro do espaço de trabalho que você quer que o Bazel ignore, como projetos relacionados que usam outros sistemas de build. Coloque um arquivo chamado .bazelignore na raiz do espaço de trabalho e adicione os diretórios que você quer que o Bazel ignore, um por linha. As entradas são relativas à raiz do espaço de trabalho.

O arquivo bazelrc global

O Bazel lê arquivos bazelrc opcionais nesta ordem: - Arquivo rc-sistema, localizado em etc/bazel.bazelrc. – Arquivo rc do espaço de trabalho, localizado em $workspace/tools/bazel.rc. - Arquivo rc inicial localizado em $HOME/.bazelrc

Cada arquivo bazelrc listado aqui tem uma flag correspondente que pode ser usada para desativá-los (por exemplo, --nosystem_rc, --noworkspace_rc, --nohome_rc). Também é possível fazer com que o Bazel ignore todos os bazelrcs transmitindo a opção de inicialização --ignore_all_rc_files.