이 섹션에서는 여러 함수 또는 빌드 규칙에 공통적으로 적용되는 다양한 용어와 개념을 정의합니다.
목차
- Bourne 셸 토큰화
- 라벨 확장
- 대부분의 빌드 규칙에 의해 정의되는 일반적인 속성
- 모든 빌드 규칙에 공통적인 속성
- 모든 테스트 규칙에 공통적인 속성(*_test)
- 모든 바이너리 규칙에 공통된 속성 (*_binary)
- 구성 가능한 속성
- 암시적 출력 타겟
Bourne 셸 토큰화
일부 규칙의 특정 문자열 속성은 Bourne 셸의 토큰화 규칙에 따라 여러 단어로 분할됩니다. 따옴표가 없는 공백은 단어를 구분하고, 단일 및 이중 따옴표 문자와 백슬래시는 토큰화를 방지하는 데 사용됩니다.
이러한 토큰화에 적용되는 속성은 이 문서의 정의에서 명시적으로 표시됩니다.
'Make' 변수 확장 및 Bourne 셸 토큰화에 적용되는 속성은 일반적으로 컴파일러 및 기타 도구에 임의의 옵션을 전달하는 데 사용됩니다. 이러한 속성의 예로는 cc_library.copts
및 java_library.javacopts
가 있습니다.
이러한 대체 항목을 함께 사용하면 단일 문자열 변수를 구성별 옵션 단어 목록으로 확장할 수 있습니다.
라벨 확장
극소수 규칙의 일부 문자열 속성은 라벨이 확장될 수 있습니다. 이러한 문자열이 //mypkg:target
와 같이 유효한 하위 문자열로 유효한 라벨을 포함하고 있고 이 라벨이 현재 규칙의 선행 조건으로 선언된 경우 대상
//mypkg:target
이 나타내는 파일의 경로 이름으로 확장됩니다.
예를 들어 genrule.cmd
및 cc_binary.linkopts
속성이 있습니다. 세부정보는 상대 라벨이 확장되는지, 여러 파일로 확장되는 라벨이 처리되는 방식 등과 같은 문제에 따라 각 사례마다 크게 다를 수 있습니다. 세부정보는 규칙 속성 문서를 참고하세요.
대부분의 빌드 규칙에서 정의하는 일반적인 속성
이 섹션에서는 많은 빌드 규칙에 의해 정의되지만 일부만 정의되는 속성을 설명합니다.
속성 | 설명 |
---|---|
data |
라벨 목록. 기본값은 런타임 시 이 규칙에 필요한 파일입니다. 파일 또는 규칙 타겟을 나열할 수 있습니다. 일반적으로 모든 타겟을 허용합니다.
새 규칙은 런타임 시 다른 입력을 사용할 수 있는 입력을 처리하는 경우 |
deps |
라벨 목록입니다. 기본값은
이 타겟의 종속 항목입니다. 일반적으로 규칙 대상만 나열해야 합니다. 일부 규칙에서는 파일을 언어별 규칙은 일반적으로 나열된 타겟을 특정 제공업체가 있는 타겟으로 제한합니다.
|
licenses |
문자열 목록, 비구성 가능. 기본값은 이 특정 타겟에 사용할 라이선스 유형 문자열 목록입니다. 이는 Bazel에서 더 이상 사용하지 않는 지원 중단된 라이선스 API의 일부입니다. 사용하지 마세요. |
srcs |
라벨 목록입니다. 기본값은
이 규칙에 의해 처리되거나 포함된 파일 일반적으로 파일을 직접 나열하지만 기본 출력을 포함하도록 규칙 타겟(예: 언어별 규칙에 따라 나열된 파일의 파일 확장자가 특정 확장자가어야 하는 경우가 많습니다. |
모든 빌드 규칙에 공통적인 속성
이 섹션에서는 모든 빌드 규칙에 암시적으로 추가되는 속성을 설명합니다.
속성 | 설명 |
---|---|
compatible_with |
기본 지원 환경 외에 이 대상을 빌드할 수 있는 환경 목록입니다. 이는 Bazel의 제약 조건 시스템의 일부로, 사용자가 서로 종속될 수 있는 타겟과 종속될 수 없는 타겟을 선언할 수 있습니다. 예를 들어 외부에 배포할 수 있는 바이너리는 회사 기밀 코드가 포함된 라이브러리에 종속되어서는 안 됩니다. 자세한 내용은 ConstraintSemantics를 참고하세요. |
deprecation |
문자열, 구성 불가, 기본값은 이 타겟과 관련된 설명 경고 메시지입니다. 이는 일반적으로 타겟이 더 이상 사용되지 않거나, 다른 규칙에 의해 대체되었거나, 패키지에만 해당하거나, 어떤 이유로든 유해한 것으로 간주된다는 것을 사용자에게 알리는 데 사용됩니다. 메시지를 피하기 위해 어떤 변경사항이 필요한지 쉽게 찾을 수 있도록 웹페이지, 버그 번호, 예시 이전 CL과 같은 참조를 포함하는 것이 좋습니다. 대체로 사용할 수 있는 새 타겟이 있는 경우 이전 타겟의 모든 사용자를 이전하는 것이 좋습니다.
이 속성은 빌드되는 방식에는 영향을 미치지 않지만 빌드 도구의 진단 출력에는 영향을 줄 수 있습니다. 패키지 내 종속 항목은 이 경고의 적용을 받지 않으므로 예를 들어 지원 중단된 규칙의 테스트를 빌드해도 경고가 발생하지 않습니다. 지원 중단된 타겟이 다른 지원 중단된 타겟에 종속된 경우 경고 메시지가 표시되지 않습니다. 사용자가 사용을 중지하면 타겟을 삭제할 수 있습니다. |
distribs |
문자열 목록입니다. 구성 불가. 기본값은 이 특정 타겟에 사용할 배포 메서드 문자열의 목록입니다. 이는 Bazel에서 더 이상 사용하지 않는 지원 중단된 라이선스 API의 일부입니다. 사용하지 마세요. |
exec_compatible_with |
라벨 목록입니다. 구성할 수 없음. 기본값은
이 타겟의 실행 플랫폼에 있어야 하는 |
exec_properties |
문자열 사전입니다. 기본값은 이 타겟에 대해 선택된 플랫폼의 키가 플랫폼 수준 속성과 타겟 수준 속성에 모두 있는 경우 값은 타겟에서 가져옵니다. |
features |
기능 문자열 목록입니다. 기본값은 기능은 타겟에서 사용 설정하거나 사용 중지할 수 있는 문자열 태그입니다. 특성의 의미는 규칙 자체에 따라 다릅니다. 이 |
restricted_to |
라벨 목록입니다. 구성할 수 없음. 기본값은 기본 지원 환경 대신 이 대상을 빌드할 수 있는 환경 목록입니다.
이는 Bazel의 제약 조건 시스템의 일부입니다. 자세한 내용은 |
tags |
문자열 목록입니다. 구성 불가. 기본값은
태그는 모든 규칙에 사용할 수 있습니다. 테스트의 태그와
Bazel은 테스트 또는
테스트의 태그는 일반적으로 디버그 및 출시 프로세스에서 테스트의 역할을 주석으로 추가하는 데 사용됩니다. 일반적으로 태그는 런타임 주석 기능이 없는 C++ 및 Python 테스트에 가장 유용합니다. 태그 및 크기 요소를 사용하면 코드베이스 체크인 정책을 기반으로 테스트 모음을 유연하게 조합할 수 있습니다.
Bazel은 테스트 규칙의
|
target_compatible_with |
라벨 목록입니다. 기본값은
이 타겟이 호환되는 것으로 간주되려면 타겟 플랫폼에 있어야 하는 호환되지 않는 타겟에 전이적으로 의존하는 타겟 자체는 호환되지 않는 것으로 간주됩니다. 또한 빌드 및 테스트 시 건너뜁니다. 빈 목록 (기본값)은 타겟이 모든 플랫폼과 호환됨을 나타냅니다.
작업공간 규칙을 제외한 모든 규칙에서 이 속성을 지원합니다.
일부 규칙의 경우 이 속성은 영향을 미치지 않습니다. 예를 들어
호환되지 않는 타겟 건너뛰기에 관한 자세한 내용은 플랫폼 페이지를 참고하세요. |
testonly |
불리언. 구성 불가. 테스트 및 테스트 모음 타겟을 제외하고 기본값은
이와 마찬가지로
테스트 ( 이 속성은 타겟이 프로덕션으로 출시되는 바이너리에 포함되어서는 안 된다는 것을 의미합니다. testonly는 런타임이 아닌 빌드 시간에 적용되며 종속 항목 트리를 통해 바이럴 방식으로 전파되므로 신중하게 적용해야 합니다. 예를 들어 단위 테스트에 유용한 스텁과 가짜는 프로덕션에 출시될 동일한 바이너리가 포함된 통합 테스트에도 유용할 수 있으므로 testonly로 표시해서는 안 됩니다. 반대로, 조건부로 정상 동작을 재정의하기 때문에 링크하는 것조차 위험한 규칙은 반드시 testonly로 표시해야 합니다. |
toolchains |
라벨 목록입니다. 구성할 수 없음. 기본값은
이 타겟이 액세스할 수 있는 Make 변수의 타겟 집합입니다. 이러한 대상은
이는 플랫폼 종속 구성의 규칙 구현에서 사용하는 도구 모음 확인 개념과는 다릅니다. 이 속성을 사용하여 타겟이 사용할 특정 |
visibility |
라벨 목록. 구성할 수 없음. 기본값은 package의
타겟의 |
모든 테스트 규칙에 공통적인 속성(*_test)
이 섹션에서는 모든 테스트 규칙에 공통적인 속성을 설명합니다.
속성 | 설명 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
문자열 목록. $(location) 및 "Makevariable" 대체 및 Bourne 셸 토큰화가 적용됩니다. 기본값은 Bazel이
이 인수는 |
||||||||||||||||||||
env |
문자열 사전. 값에는 $(location) 및 "Make 변수" 대체가 적용됩니다. 기본값은
이 속성은 |
||||||||||||||||||||
env_inherit |
문자열 목록. 기본값은
이 속성은 |
||||||||||||||||||||
size |
문자열 테스트 타겟의 '무거움': 실행하는 데 필요한 시간/리소스입니다. 단위 테스트는 '소형', 통합 테스트는 '중형'으로, 엔드 투 엔드 테스트는 '대규모' 또는 '대규모'로 간주됩니다. Bazel은 크기를 사용하여 기본 시간 제한을 결정하며, 이 시간 제한은 테스트 크기는 다음과 같은 기본 시간 제한 및 가정된 최대 로컬 리소스 사용량에 해당합니다.
테스트를 스패닝할 때 환경 변수 |
||||||||||||||||||||
timeout |
문자열 반환 전에 테스트가 실행될 것으로 예상되는 시간입니다.
테스트의 크기 속성은 리소스 추정치를 제어하지만 테스트의 제한 시간은 독립적으로 설정할 수 있습니다. 명시적으로 지정하지 않으면 제한 시간은 테스트 크기를 기준으로 합니다. 테스트 시간 제한은
위와 다른 경우에는
테스트를 스패닝할 때 환경 변수 |
||||||||||||||||||||
flaky |
불리언. 구성 불가. 기본값은 테스트가 불안정하다고 표시합니다. 이 옵션을 설정하면 테스트를 최대 세 번 실행하고 매번 실패하는 경우에만 실패로 표시합니다. 기본적으로 이 속성은 False로 설정되며 테스트는 한 번만 실행됩니다. 일반적으로 이 속성의 사용은 권장되지 않습니다. 어설션이 유지되면 테스트가 안정적으로 통과해야 합니다. |
||||||||||||||||||||
shard_count |
50 이하의 비음수 정수입니다. 기본값은 테스트를 실행하는 데 사용할 병렬 샤드의 수를 지정합니다. 이 값을 설정하면 테스트를 실행할 병렬 샤드 수를 결정하는 데 사용되는 모든 휴리스틱이 재정의됩니다. 일부 테스트 규칙의 경우 샤딩을 사용 설정하려면 이 매개변수가 필요할 수 있습니다. 테스트 샤딩이 사용 설정된 경우 테스트를 스패닝할 때 환경 변수 샤딩을 사용하려면 테스트 실행기에서 테스트 샤딩 프로토콜을 지원해야 합니다. 그렇지 않으면 모든 샤드에서 모든 테스트를 실행할 가능성이 가장 높으며 이는 원치 않는 실행입니다. 샤딩에 관한 자세한 내용은 테스트 백과사전의 테스트 샤딩을 참고하세요. |
||||||||||||||||||||
local |
불리언. 구성 불가. 기본값은 샌드박스 처리 없이 로컬에서 테스트를 실행하도록 강제합니다. 이 값을 True로 설정하는 것은 'local'을 태그( |
모든 바이너리 규칙에 공통적인 속성(*_binary)
이 섹션에서는 모든 바이너리 규칙에 공통적인 속성을 설명합니다.
속성 | 설명 |
---|---|
args |
문자열 목록입니다. $(location) 및 'Make variable' 대체, Bourne 셸 토큰화가 적용됩니다. 구성 불가. 기본값은
참고: Bazel 외부에서 타겟을 실행하면(예: |
env |
문자열 사전입니다. 값은 $(location) 및 'Make variable' 대체의 영향을 받습니다. 기본값은 타겟이
이 속성은
참고: Bazel 외부에서 대상을 실행할 때는 (예: |
output_licenses |
문자열 목록입니다. 기본값은 이 바이너리가 생성하는 출력 파일의 라이선스입니다. 이는 Bazel에서 더 이상 사용하지 않는 지원 중단된 라이선스 API의 일부입니다. 사용하지 마세요. |
구성 가능한 속성
대부분의 속성은 '구성 가능'합니다. 즉, 타겟이 다른 방식으로 빌드될 때 값이 변경될 수 있습니다. 특히 구성 가능한 속성은 Bazel 명령줄에 전달된 플래그 또는 대상을 요청하는 다운스트림 종속 항목에 따라 다를 수 있습니다. 예를 들어 여러 플랫폼 또는 컴파일 모드의 타겟을 맞춤설정하는 데 사용할 수 있습니다.
다음 예에서는 다양한 타겟 아키텍처에 대해 서로 다른 소스를 선언합니다. bazel build :multiplatform_lib --cpu x86
를 실행하면 x86_impl.cc
를 사용하여 타겟이 빌드되지만 --cpu arm
를 대체하면 대신 arm_impl.cc
가 사용됩니다.
cc_library( name = "multiplatform_lib", srcs = select({ ":x86_mode": ["x86_impl.cc"], ":arm_mode": ["arm_impl.cc"] }) ) config_setting( name = "x86_mode", values = { "cpu": "x86" } ) config_setting( name = "arm_mode", values = { "cpu": "arm" } )
select()
함수는 타겟 구성이 충족하는 config_setting
또는 constraint_value
기준에 따라 구성 가능한 속성의 여러 대체 값 중에서 선택합니다.
Bazel은 매크로를 처리한 후 규칙을 처리하기 전에 (기술적으로는
로드 및 분석 단계 사이) 구성 가능한 속성을 평가합니다.
select()
평가 전에 이루어지는 모든 처리는 select()
가 선택하는 브랜치를 알 수 없습니다. 예를 들어 매크로는 선택한 브랜치를 기반으로 동작을 변경할 수 없으며 bazel query
는 타겟의 구성 가능한 종속 항목에 관해 보수적으로 추측할 수만 있습니다. 규칙 및 매크로와 함께 select()
를 사용하는 방법에 관한 자세한 내용은
이 FAQ를 참고하세요.
문서에서 nonconfigurable
로 표시된 속성은 이 기능을 사용할 수 없습니다. 일반적으로 속성은 구성할 수 없습니다. Bazel이 select()
확인 방법을 결정하려면 먼저 이 값을 내부적으로 알아야 하기 때문입니다.
자세한 개요는 구성 가능한 빌드 속성을 참고하세요.
암시적 출력 타겟
C++의 암시적 출력은 지원 중단되었습니다. 가능하면 다른 언어로 사용하지 마세요. 아직 지원 중단 경로는 없지만 결국 지원 중단될 예정입니다.
BUILD 파일에서 빌드 규칙을 정의하면 패키지에 이름이 지정된 새 규칙 타겟을 명시적으로 선언하는 것입니다. 또한 많은 빌드 규칙 함수는 하나 이상의 출력 파일 타겟을 암시적으로 포함하며, 이러한 타겟의 콘텐츠와 의미는 규칙에 따라 다릅니다.
예를 들어 java_binary(name='foo', ...)
규칙을 명시적으로 선언하면 출력 파일 타겟 foo_deploy.jar
도 동일한 패키지의 구성원으로 암시적으로 선언됩니다.
이 특정 타겟은 배포에 적합한 독립형 Java 보관 파일입니다.
암시적 출력 타겟은 전역 타겟 그래프의 퍼스트 클래스 멤버입니다. 다른 타겟과 마찬가지로, 최상위 빌드 명령어에 지정되었거나 다른 빌드 타겟에 필요한 기본 요건인 경우 필요에 따라 빌드됩니다. 이는 BUILD 파일에서 종속 항목으로 참조될 수 있으며 bazel query
과 같은 분석 도구의 출력에서 확인할 수 있습니다.
각 빌드 규칙의 경우 규칙 문서에 해당 유형의 규칙 선언에 따른 암시적 출력의 이름과 콘텐츠를 자세히 설명하는 특수 섹션이 포함되어 있습니다.
빌드 시스템에서 사용하는 두 네임스페이스 간에 중요한 차이점이 있습니다. 라벨은 규칙 또는 파일일 수 있는 타겟을 식별하며, 파일 타겟은 소스 (또는 입력) 파일 타겟과 파생 (또는 출력) 파일 타겟으로 나눌 수 있습니다. 이러한 항목은 BUILD 파일에서 언급하거나 명령줄에서 빌드하거나 bazel query
를 사용하여 검사할 수 있습니다. 이것이 대상 네임스페이스입니다. 각 파일 타겟은 디스크의 하나의 실제 파일('파일 시스템 네임스페이스')에 해당합니다. 각 규칙 타겟은 디스크의 0개, 1개 또는 그 이상의 실제 파일에 해당할 수 있습니다.
디스크에 상응하는 타겟이 없는 파일이 있을 수 있습니다. 예를 들어 C++ 컴파일 중에 생성된 .o
객체 파일은 BUILD 파일 내부 또는 명령줄에서 참조할 수 없습니다.
이렇게 하면 빌드 도구가 작업을 실행하는 방식에 관한 특정 구현 세부정보를 숨길 수 있습니다. 자세한 내용은 BUILD 개념 참조를 참고하세요.