이 페이지에서는 매크로와 규칙을 사용하여 BUILD 언어를 확장하는 방법을 설명합니다.
Bazel 확장자는 .bzl
로 끝나는 파일입니다. 로드 문을 사용하여 확장 프로그램에서 기호를 가져옵니다.
고급 개념을 배우기 전에 먼저 다음을 실행하세요.
BUILD
및.bzl
파일 모두에서 사용되는 Starlark 언어에 대해 알아봅니다.두
BUILD
파일 간에 변수를 공유하는 방법을 알아봅니다.
매크로 및 규칙
매크로는 규칙을 인스턴스화하는 함수입니다. 매크로는 기호 매크로 (Bazel 8의 새로운 기능)와 기존 매크로의 두 가지 유형이 있습니다. 두 가지 버전의 매크로는 다르게 정의되지만 사용자의 관점에서는 거의 동일하게 작동합니다. 매크로는 일부 코드를 재사용할 수 있으므로 BUILD
파일이 너무 반복적이거나 너무 복잡해질 때 유용합니다. 이 함수는 BUILD
파일이 읽히는 즉시 평가됩니다. BUILD
파일의 평가 후 Bazel에는 매크로에 관한 정보가 거의 없습니다. 매크로가 genrule
를 생성하면 Bazel은 BUILD
파일에서 genrule
를 선언한 것처럼 거의 동작합니다. 단, 기호 매크로에 선언된 타겟에는 특별한 공개 시맨틱스가 있습니다. 기호 매크로는 나머지 패키지에서 내부 타겟을 숨길 수 있습니다.
규칙은 매크로보다 강력합니다. Bazel 내부에 액세스하고 진행 상황을 완전히 제어할 수 있습니다. 예를 들어 다른 규칙에 정보를 전달할 수 있습니다.
간단한 로직을 재사용하려면 매크로로 시작합니다. 이전 Bazel 버전을 지원해야 하는 경우가 아니라면 기호 매크로를 사용하는 것이 좋습니다. 매크로가 복잡해지면 규칙으로 만드는 것이 좋습니다. 새로운 언어 지원은 일반적으로 규칙으로 이루어집니다. 규칙은 고급 사용자를 위한 것이며 대부분의 사용자는 규칙을 작성할 필요가 없습니다. 기존 규칙을 로드하고 호출하기만 하면 됩니다.
평가 모델
빌드는 세 단계로 구성됩니다.
로드 단계 먼저 빌드에 필요한 모든 확장 프로그램과 모든
BUILD
파일을 로드하고 평가합니다.BUILD
파일 실행은 규칙을 인스턴스화하기만 합니다. 규칙이 호출될 때마다 그래프에 추가됩니다. 여기에서 매크로가 평가됩니다.분석 단계. 규칙의 코드 (
implementation
함수)가 실행되고 작업이 인스턴스화됩니다. 작업은 'hello.c에서 gcc를 실행하고 hello.o 가져오기'와 같이 입력 집합에서 출력 집합을 생성하는 방법을 설명합니다. 실제 명령어를 실행하기 전에 생성할 파일을 명시적으로 나열해야 합니다. 즉, 분석 단계는 로드 단계에서 생성된 그래프를 사용하여 작업 그래프를 생성합니다.실행 단계. 출력 중 하나 이상이 필요한 경우 작업이 실행됩니다. 파일이 없거나 명령어로 출력을 하나도 생성하지 못하면 빌드가 실패합니다. 이 단계에서 테스트도 실행됩니다.
Bazel은 병렬화를 사용하여 .bzl
파일과 BUILD
파일을 읽고 파싱하고 평가합니다. 파일은 빌드당 최대 한 번 읽히며 평가 결과는 캐시되고 재사용됩니다. 파일은 모든 종속 항목 (load()
문)이 확인된 후에만 평가됩니다. 설계상 .bzl
파일을 로드해도 눈에 띄는 부작용이 없으며 값과 함수만 정의합니다.
Bazel은 영리하게 작동합니다. 종속 항목 분석을 사용하여 로드해야 하는 파일, 분석해야 하는 규칙, 실행해야 하는 작업을 파악합니다. 예를 들어 규칙이 현재 빌드에 필요하지 않은 작업을 생성하면 이러한 작업은 실행되지 않습니다.
확장 프로그램 만들기
일부 코드를 재사용하려면 첫 번째 매크로를 만듭니다. 그런 다음 매크로에 대해 자세히 알아보고 매크로를 사용하여 '맞춤 동사'를 만드는 방법을 알아보세요.
규칙 튜토리얼을 따라 규칙을 시작해 보세요. 다음으로 규칙 개념에 대해 자세히 알아보세요.
아래 두 링크는 자체 확장 프로그램을 작성할 때 매우 유용합니다. 다음 사항을 염두에 두세요.
추가 정보
매크로 및 규칙 외에도 측면 및 저장소 규칙을 작성하는 것이 좋습니다.
Buildifier를 일관되게 사용하여 코드의 형식을 지정하고 린트합니다.
.bzl
스타일 가이드를 따릅니다.코드를 테스트합니다.
사용자를 지원하는 문서를 생성하세요.
코드의 성능을 최적화합니다.
다른 사용자에게 확장 프로그램을 배포합니다.