날짜 비워 두기: BazelCon 2023이 10월 24~25일에 Google 뮌헨에서 열립니다. 자세히 알아보기

BUILD 파일

문제 신고 소스 보기

이전 섹션에서는 패키지, 대상, 라벨, 빌드 종속 항목 그래프를 추상적으로 설명했습니다. 이 섹션에서는 패키지를 정의하는 데 사용되는 구체적인 구문을 설명합니다.

정의상 모든 패키지에는 짧은 프로그램인 BUILD 파일이 포함되어 있습니다.

BUILD 파일은 명령형 언어인 Starlark를 사용하여 평가됩니다.

순차적인 구문 목록으로 해석됩니다.

일반적으로 순서는 중요합니다. 예를 들어 변수를 사용하기 전에 정의해야 합니다. 그러나 대부분의 BUILD 파일은 빌드 규칙 선언으로만 구성되며 이러한 문의 상대적 순서는 중요하지 않습니다. 중요한 것은 선언한 어떤 규칙과 어떤 패키지가 어떤 시간으로 평가되었는지를 결정하는 것입니다.

빌드 규칙 함수(예: cc_library)를 실행하면 그래프에 새 대상이 생성됩니다. 이 타겟은 나중에 라벨을 사용하여 참조할 수 있습니다.

간단한 BUILD 파일에서 규칙 선언은 동작을 변경하지 않고 자유롭게 다시 정렬할 수 있습니다.

코드와 데이터를 명확하게 구분하기 위해 BUILD 파일에는 함수 정의, for 문 또는 if 문이 포함될 수 없습니다 (단, 목록 이해와 if 표현식은 허용됨). 대신 .bzl 파일에서 함수를 선언할 수 있습니다. 또한 *args**kwargs 인수는 BUILD 파일에서 허용되지 않습니다. 대신 모든 인수를 명시적으로 나열합니다.

결정적으로 Starlark의 프로그램은 임의의 I/O를 실행할 수 없습니다. 이러한 불변은 BUILD 파일의 해석을 밀폐식으로 만듭니다. 알려진 입력 세트에만 의존하므로 빌드를 재현할 수 있도록 하는 데 필수적입니다. 자세한 내용은 혈장을 참고하세요.

BUILD 파일은 ASCII 문자만 사용하여 작성해야 하지만 기술적으로 Latin-1 문자 집합을 사용하여 해석됩니다.

BUILD 파일은 기본 코드의 종속 항목이 변경될 때마다 업데이트해야 하므로 일반적으로 한 팀의 여러 사용자가 이 파일을 유지관리합니다. BUILD 파일 작성자는 공개 빌드용인지 여부와 관계없이 각 빌드 대상의 역할을 문서화하고 패키지 자체의 역할을 문서화해야 합니다.

확장 프로그램 로드

Bazel 확장 프로그램은 .bzl으로 끝나는 파일입니다. 확장 프로그램에서 기호를 가져오려면 load 문을 사용합니다.

load("//foo/bar:file.bzl", "some_library")

이 코드는 foo/bar/file.bzl 파일을 로드하고 환경에 some_library 기호를 추가합니다. 이를 통해 새 규칙, 함수, 상수(예: 문자열 또는 목록)를 로드할 수 있습니다. load 호출에 추가 인수를 사용하여 여러 기호를 가져올 수 있습니다. 인수는 문자열 리터럴(변수 없음)이어야 하며 load 문은 최상위 수준에 있어야 하며 함수 본문에는 포함될 수 없습니다.

load의 첫 번째 인수는 .bzl 파일을 식별하는 라벨입니다. 상대 라벨인 경우 현재 bzl 파일이 포함된 패키지 (디렉터리 아님)와 관련하여 확인됩니다. load 문의 상대 라벨은 선행 :를 사용해야 합니다.

load도 별칭을 지원하므로 가져온 기호에 다른 이름을 할당할 수 있습니다.

load("//foo/bar:file.bzl", library_alias = "some_library")

하나의 load 문 내에 여러 별칭을 정의할 수 있습니다. 또한 인수 목록에는 별칭과 일반 기호 이름이 모두 포함될 수 있습니다. 다음 예는 적법한 경우입니다 (따옴표를 사용하는 경우 유의).

load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")

.bzl 파일에서 _로 시작하는 기호는 내보내지지 않으며 다른 파일에서 로드할 수 없습니다.

로드 공개 상태를 사용하여 .bzl 파일을 로드할 수 있는 사용자를 제한할 수 있습니다.

빌드 규칙의 유형

대부분의 빌드 규칙은 계열별로 그룹화되며 언어별로 그룹화됩니다. 예를 들어 cc_binary, cc_library, cc_test는 각각 C++ 바이너리, 라이브러리, 테스트의 빌드 규칙입니다. 다른 언어에서는 프리픽스가 다른(예: 자바의 경우 java_*) 동일한 이름 지정 스키마를 사용합니다. 이러한 함수 중 일부는 백과사전 빌드에 설명되어 있지만 누구나 새 규칙을 만들 수 있습니다.

  • *_binary 규칙은 지정된 언어로 실행 가능한 프로그램을 빌드합니다. 빌드 후 실행 파일은 규칙 라벨의 해당 이름에 있는 빌드 도구의 바이너리 출력 트리에 상주하므로 //my:program$(BINDIR)/my/program에 표시됩니다.

    일부 언어에서는 이러한 규칙에 따라 규칙에 속한 data 속성에 언급된 모든 파일이나 종속 항목의 전이적 폐쇄에 포함된 모든 규칙을 포함하는 runfiles 디렉터리를 생성합니다. 이러한 파일 세트는 프로덕션에 쉽게 배포할 수 있도록 한곳에 수집됩니다.

  • *_test 규칙은 자동 테스트에서 사용되는 *_binary 규칙의 전문 분야입니다. 테스트는 성공 시 0을 반환하는 프로그램입니다.

    바이너리와 마찬가지로 테스트에는 런파일 트리도 있으며 이 파일은 테스트에서 런타임 시 합법적으로 열 수 있는 유일한 파일입니다. 예를 들어 프로그램 cc_test(name='x', data=['//foo:bar'])가 실행 중에 $TEST_SRCDIR/workspace/foo/bar를 열고 읽을 수 있습니다. (각 프로그래밍 언어에는 $TEST_SRCDIR 값에 액세스하기 위한 자체 유틸리티 함수가 있지만 모두 환경 변수를 직접 사용하는 것과 같습니다.) 규칙을 준수하지 않으면 원격 테스트 호스트에서 테스트를 실행할 수 없습니다.

  • *_library 규칙은 지정된 프로그래밍 언어로 별도로 컴파일된 모듈을 지정합니다. 라이브러리는 다른 라이브러리에 종속될 수 있고 바이너리 및 테스트는 예상되는 별도의 컴파일 동작과 함께 라이브러리에 종속될 수 있습니다.

라벨 종속 항목