bazelrc 구성 파일 작성

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. 작업공간 RC 파일(--noworkspace_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이 모든 bazelrcs를 무시하도록 할 수 있습니다.