bazelrc 구성 파일 작성

문제 신고 소스 보기 Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel은 다양한 옵션을 허용합니다. 일부 옵션은 자주 변경되는 반면 (예: --subcommands) 다른 옵션은 여러 빌드에서 동일하게 유지됩니다 (예: --package_path). 모든 빌드(및 기타 명령어)에 이러한 변경되지 않는 옵션을 지정하지 않으려면 .bazelrc라는 구성 파일에서 옵션을 지정하면 됩니다.

.bazelrc 파일은 어디에 있나요?

Bazel은 다음 위치에서 선택적 구성 파일을 아래에 표시된 순서로 찾습니다. 옵션은 이 순서대로 해석되므로 충돌이 발생하면 이후 파일의 옵션이 이전 파일의 값을 재정의할 수 있습니다. 이러한 파일 중 어떤 파일이 로드되는지 제어하는 모든 옵션은 시작 옵션입니다. 즉, bazel 뒤에 명령어 (build, test 등) 앞에 있어야 합니다.

  1. --nosystem_rc가 없는 경우 시스템 RC 파일

    경로:

    • Linux/macOS/Unix의 경우: /etc/bazel.bazelrc
    • Windows의 경우: %ProgramData%\bazel.bazelrc

    이 파일이 없으면 오류가 아닙니다.

    다른 시스템 지정 위치가 필요한 경우 //src/main/cpp:option_processor에서 BAZEL_SYSTEM_BAZELRC_PATH 값을 재정의하여 맞춤 Bazel 바이너리를 빌드해야 합니다. 시스템 지정 위치에는 Unix의 ${VAR_NAME} 또는 Windows의 %VAR_NAME%와 같은 환경 변수 참조가 포함될 수 있습니다.

  2. --noworkspace_rc가 없는 경우 작업공간 RC 파일

    경로: 워크스페이스 디렉터리의 .bazelrc (기본 MODULE.bazel 파일 옆)

    이 파일이 없으면 오류가 아닙니다.

  3. --nohome_rc가 없는 경우 홈 RC 파일

    경로:

    • Linux/macOS/Unix의 경우: $HOME/.bazelrc
    • Windows: %USERPROFILE%\.bazelrc(있는 경우) 또는 %HOME%/.bazelrc

    이 파일이 없으면 오류가 아닙니다.

  4. --bazelrc=file로 지정된 경우 사용자 지정 RC 파일

    이 플래그는 선택사항이지만 여러 번 지정할 수도 있습니다.

    /dev/null는 더 이상 모든 --bazelrc가 무시됨을 나타냅니다. 이는 출시 빌드와 같이 사용자 rc 파일 검색을 사용 중지하는 데 유용합니다.

    예를 들면 다음과 같습니다.

    --bazelrc=x.rc --bazelrc=y.rc --bazelrc=/dev/null --bazelrc=z.rc
    
    • x.rcy.rc이 읽힙니다.
    • 이전 /dev/null로 인해 z.rc이 무시됩니다.

이 선택적 구성 파일 외에도 Bazel은 전역 rc 파일을 찾습니다. 자세한 내용은 전역 bazelrc 섹션을 참고하세요.

.bazelrc 문법 및 의미론

모든 UNIX 'rc' 파일과 마찬가지로 .bazelrc 파일은 줄 기반 문법이 있는 텍스트 파일입니다. 빈 줄과 #로 시작하는 줄 (주석)은 무시됩니다. 각 줄에는 단어 시퀀스가 포함되며, 이 시퀀스는 Bourne 셸과 동일한 규칙에 따라 토큰화됩니다.

가져오기

import 또는 try-import로 시작하는 행은 특별합니다. 이를 사용하여 다른 'rc' 파일을 로드합니다. 작업공간 루트를 기준으로 하는 경로를 지정하려면 import %workspace%/path/to/bazelrc를 작성합니다.

importtry-import의 차이점은 import된 파일이 누락되거나 읽을 수 없는 경우 Bazel이 실패하지만 try-import된 파일의 경우 그렇지 않다는 것입니다.

가져오기 우선순위:

  • 가져온 파일의 옵션은 가져오기 문장 앞에 지정된 옵션보다 우선 적용됩니다.
  • import 문 뒤에 지정된 옵션은 가져온 파일의 옵션보다 우선 적용됩니다.
  • 나중에 가져온 파일의 옵션이 먼저 가져온 파일의 옵션보다 우선 적용됩니다.

옵션 기본값

bazelrc의 대부분의 줄은 기본 옵션 값을 정의합니다. 각 줄의 첫 번째 단어는 이러한 기본값이 적용되는 시점을 지정합니다.

  • startup: 명령어 앞에 표시되며 bazel help startup_options에 설명된 시작 옵션입니다.
  • common: 이를 지원하는 모든 Bazel 명령어에 적용해야 하는 옵션입니다. 명령어가 이 방식으로 지정된 옵션을 지원하지 않는 경우 다른 Bazel 명령어 일부에 유효한 한 옵션은 무시됩니다. 이는 옵션 이름에만 적용됩니다. 현재 명령어가 지정된 이름의 옵션을 허용하지만 지정된 값을 지원하지 않는 경우 실패합니다.
  • always: 모든 Bazel 명령어에 적용되는 옵션입니다. 명령어가 이 방식으로 지정된 옵션을 지원하지 않으면 실패합니다.
  • command: 옵션이 적용되는 Bazel 명령어(예: build 또는 query)입니다. 이러한 옵션은 지정된 명령어에서 상속받는 모든 명령어에도 적용됩니다. 예를 들어 testbuild에서 상속됩니다.

이러한 각 줄은 두 번 이상 사용할 수 있으며 첫 번째 단어 뒤에 오는 인수는 단일 줄에 표시된 것처럼 결합됩니다. '스위스 군용 나이프' 명령줄 인터페이스가 있는 다른 도구인 CVS 사용자는 .cvsrc와 유사한 문법을 발견할 수 있습니다. 예를 들어 다음과 같은 줄이 있습니다.

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

다음과 같이 결합됩니다.

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

따라서 유효한 플래그는 --verbose_failures--test_tmpdir=/tmp/bar입니다.

옵션 우선순위:

  • 명령줄의 옵션은 항상 rc 파일의 옵션보다 우선 적용됩니다. 예를 들어 rc 파일에는 build -c opt라고 표시되어 있지만 명령줄 플래그는 -c dbg인 경우 명령줄 플래그가 우선 적용됩니다.
  • rc 파일 내에서 우선순위는 구체성에 따라 결정됩니다. 더 구체적인 명령어의 줄이 덜 구체적인 명령어의 줄보다 우선 적용됩니다.

    구체성은 상속으로 정의됩니다. 일부 명령어는 다른 명령어에서 옵션을 상속하여 상속된 명령어가 기본 명령어보다 더 구체적이 됩니다. 예를 들어 testbuild 명령어에서 상속받으므로 모든 bazel build 플래그는 bazel test에 유효하며 동일한 옵션에 관한 test 행이 없는 한 모든 build 행도 bazel test에 적용됩니다. rc 파일에 다음과 같이 표시되는 경우

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

    bazel build //foo-c opt --verbose_failures를 사용하고 bazel test //foo--verbose_failures -c dbg --test_env=PATH를 사용합니다.

    상속 (특이성) 그래프는 다음과 같습니다.

    • 모든 명령어는 common에서 상속됩니다.
    • 다음 명령어는 build에서 상속받으며 build보다 구체적입니다. test, run, clean, mobile-install, info, print_action, config, cquery, aquery
    • coverage, fetch, vendortest에서 상속
  • 동일한 명령어의 옵션을 동일한 구체성으로 지정하는 두 줄은 파일 내에 표시되는 순서대로 파싱됩니다.

  • 이 우선순위 규칙은 파일 순서와 일치하지 않으므로 rc 파일 내에서 우선순위 순서를 따르는 것이 가독성에 도움이 됩니다. 맨 위에서 common 옵션으로 시작하고 파일 하단에서 가장 구체적인 명령어로 끝냅니다. 이렇게 하면 옵션을 읽는 순서가 적용되는 순서와 동일하므로 더 직관적입니다.

rc 파일의 한 줄에 지정된 인수에는 빌드 타겟 이름 등 옵션이 아닌 인수가 포함될 수 있습니다. 이러한 옵션은 동일한 파일에 지정된 옵션과 마찬가지로 명령줄의 형제 옵션보다 우선순위가 낮으며 항상 옵션이 아닌 인수의 명시적 목록 앞에 추가됩니다.

--config

rc 파일은 옵션 기본값을 설정하는 것 외에도 옵션을 그룹화하고 일반적인 그룹화에 대한 축약어를 제공하는 데 사용할 수 있습니다. 명령어에 :name 접미사를 추가하면 됩니다. 이러한 옵션은 기본적으로 무시되지만 명령줄이나 .bazelrc 파일에 --config=name 옵션이 있는 경우 재귀적으로 다른 구성 정의 내부에서도 포함됩니다. command:name로 지정된 옵션은 위에 설명된 우선순서 순서에 따라 해당하는 명령어에 대해서만 확장됩니다.

--config=foo는 구성에 지정된 옵션이 --config=foo 옵션과 동일한 우선순위를 갖도록 rc 파일에 정의된 옵션으로 '자리에서' 확장됩니다.

이 문법은 startup를 사용하여 시작 옵션을 설정하는 데는 적용되지 않습니다. .bazelrc에서 startup:config-name --some_startup_option를 설정하면 무시됩니다.

--enable_platform_specific_config

.bazelrc의 플랫폼별 구성은 --enable_platform_specific_config를 사용하여 자동으로 사용 설정할 수 있습니다. 예를 들어 호스트 OS가 Linux이고 build 명령어가 실행되면 build:linux 구성이 자동으로 사용 설정됩니다. 지원되는 OS 식별자는 linux, macos, windows, freebsd, openbsd입니다. 이 플래그를 사용 설정하면 Linux에서는 --config=linux, Windows에서는 --config=windows를 사용하는 것과 같습니다.

--enable_platform_specific_config를 참고하세요.

다음은 ~/.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

Bazel 동작을 제어하는 기타 파일

.bazelignore

다른 빌드 시스템을 사용하는 관련 프로젝트와 같이 Bazel에서 무시할 디렉터리를 작업공간 내에 지정할 수 있습니다. .bazelignore라는 파일을 작업공간의 루트에 배치하고 Bazel에서 무시할 디렉터리를 한 줄에 하나씩 추가합니다. 항목은 작업공간 루트를 기준으로 합니다.

전역 bazelrc 파일

Bazel은 선택적 bazelrc 파일을 다음 순서대로 읽습니다.

  1. etc/bazel.bazelrc에 있는 시스템 rc 파일입니다.
  2. $workspace/tools/bazel.rc에 있는 작업공간 rc 파일
  3. 홈 rc 파일은 $HOME/.bazelrc에 있습니다.

여기에 나열된 각 bazelrc 파일에는 이를 사용 중지하는 데 사용할 수 있는 상응하는 플래그 (예: --nosystem_rc, --noworkspace_rc, --nohome_rc)가 있습니다. --ignore_all_rc_files 시작 옵션을 전달하여 Bazel이 모든 bazelrc를 무시하도록 할 수도 있습니다.