함수

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

콘텐츠

패키지

package(default_deprecation, default_testonly, default_visibility, features)

이 함수는 패키지의 모든 후속 규칙에 적용되는 메타데이터를 선언합니다. 패키지 (BUILD 파일) 내에서 최대 한 번 사용됩니다.

package() 함수는 파일 상단의 모든 load() 문 바로 뒤, 규칙 전에 호출해야 합니다.

인수

속성 설명
default_visibility

List of labels; optional

이 패키지에 있는 규칙의 기본 공개 상태입니다.

규칙의 visibility 속성에 달리 지정되지 않은 한 이 패키지의 모든 규칙에는 이 속성에 지정된 공개 상태가 있습니다. 이 속성의 구문에 관한 자세한 내용은 공개 상태 문서를 참조하세요. 패키지 기본 공개 상태는 기본적으로 공개되는 exports_files에 적용되지 않습니다.

default_deprecation

String; optional

이 패키지의 모든 규칙에 적용되는 기본 deprecation 메시지를 설정합니다.

default_testonly

Boolean; optional; default is False except as noted

이 패키지의 모든 규칙에 기본 testonly 속성을 설정합니다.

javatests 아래의 패키지에서 기본값은 1입니다.

features

List strings; optional

이 BUILD 파일의 의미 체계에 영향을 미치는 다양한 플래그를 설정합니다.

이 기능은 주로 일종의 특수 처리가 필요한 패키지에 태그를 지정하기 위해 빌드 시스템을 사용합니다. 빌드 시스템에서 작업 중인 누군가의 명시적인 요청을 받지 않는 한 이 속성을 사용하지 마세요.

아래 선언은 이 패키지의 규칙이 패키지 그룹 //foo:target의 구성원만 볼 수 있음을 선언합니다. 규칙의 개별 공개 상태 선언이 있으면 이 사양을 재정의합니다.
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

이 함수는 패키지 집합을 정의하고 라벨을 집합과 연결합니다. 라벨은 visibility 속성에서 참조할 수 있습니다.

패키지 그룹은 주로 공개 상태 제어에 사용됩니다. 공개적으로 표시되는 대상은 소스 트리의 모든 패키지에서 참조할 수 있습니다. 비공개로 표시되는 타겟은 하위 패키지가 아닌 자체 패키지 내에서만 참조할 수 있습니다. 이러한 극단적인 환경 사이에서 타겟은 자체 패키지와 하나 이상의 패키지 그룹이 설명하는 모든 패키지에 대한 액세스를 허용할 수 있습니다. 공개 상태 시스템에 관한 자세한 설명은 공개 상태 속성을 참고하세요.

지정된 패키지가 packages 속성과 일치하거나 이미 includes 속성에 언급된 다른 패키지 그룹 중 하나에 포함된 경우 그룹에 속한 것으로 간주됩니다.

패키지 그룹은 기술적으로 대상이지만 규칙에 의해 생성되지 않으며 공개 상태 보호도 없습니다.

인수

속성 설명
name

Name; required

이 대상의 고유한 이름입니다.

packages

List of strings; optional

0개 이상의 패키지 사양 목록입니다.

각 패키지 사양 문자열은 다음 형식 중 하나일 수 있습니다.

  1. 저장소가 없는 패키지의 전체 이름으로 이중 슬래시로 시작합니다. 예를 들어, //foo/bar은 이름이 같은 패키지를 지정하며 이 패키지는 패키지 그룹과 같은 저장소에 있습니다.
  2. 위와 같지만 끝에 /...가 있습니다. 예를 들어 //foo/...//foo 집합과 모든 하위 패키지를 지정합니다. //...는 현재 저장소의 모든 패키지를 지정합니다.
  3. public 또는 private 문자열은 각각 모든 패키지를 지정하거나 패키지를 지정하지 않습니다. (이 양식을 사용하려면 --incompatible_package_group_has_public_syntax 플래그를 설정해야 합니다.)

또한 처음 두 종류의 패키지 사양은 -라는 접두사로 무효화될 수 있음을 나타낼 수도 있습니다.

패키지 그룹에는 양수 사양 중 하나와 일치하는 부정적인 패키지가 포함되지 않은 패키지가 포함됩니다. 예를 들어 값 [//foo/..., -//foo/tests/...]에는 //foo/tests의 하위 패키지가 아닌 //foo의 모든 하위 패키지가 포함됩니다. //foo 자체는 포함되지만 //foo/tests 자체는 포함되지 않습니다.

공개 가시성 외에는 현재 저장소 외부에 패키지를 직접 지정할 수 없습니다.

이 속성이 누락된 경우 빈 목록으로 설정하는 것과 같고 private만 포함된 목록으로 설정하는 것과 같습니다.

참고: 사양 //...의 기존 동작은 public과 동일합니다. --incompatible_fix_package_group_reporoot_syntax가 사용 설정되면 이 동작은 사용 중지됩니다.

참고: 이 속성이 bazel query --output=proto (또는 --output=xml)의 일부로 직렬화될 때 --incompatible_package_group_includes_double_slash가 사용 설정되지 않으면 선행 슬래시가 생략됩니다. 예를 들어 //pkg/foo/...\"pkg/foo/...\"로 출력됩니다.

includes

List of labels; optional

이 패키지에 포함된 다른 패키지 그룹

이 속성의 라벨은 다른 패키지 그룹을 참조해야 합니다. 참조된 패키지 그룹의 패키지는 이 패키지 그룹에 속합니다. 이는 전이적입니다. 패키지 그룹 a에 패키지 그룹 b가 포함되어 있고 b에 패키지 그룹 c가 포함되어 있다면 c의 모든 패키지도 a의 구성원이 됩니다.

무효화된 패키지 사양과 함께 사용되는 경우 먼저 각 그룹의 패키지 세트가 독립적으로 계산되고 결과가 함께 결합됩니다. 즉, 한 그룹의 무효화된 사양은 다른 그룹의 사양에 영향을 미치지 않습니다.

다음 package_group 선언은 열대 과일이 포함된 "tropical&quot라는 패키지 그룹을 지정합니다.

package_group(
    name = "tropical",
    packages = [
        "//fruits/mango",
        "//fruits/orange",
        "//fruits/papaya/...",
    ],
)

다음 선언은 가상 애플리케이션의 패키지 그룹을 지정합니다.

package_group(
    name = "fooapp",
    includes = [
        ":controller",
        ":model",
        ":view",
    ],
)

package_group(
    name = "model",
    packages = ["//fooapp/database"],
)

package_group(
    name = "view",
    packages = [
        "//fooapp/swingui",
        "//fooapp/webui",
    ],
)

package_group(
    name = "controller",
    packages = ["//fooapp/algorithm"],
)

Export_files

exports_files([label, ...], visibility, licenses)

exports_files()는 이 패키지에 속한 파일 목록을 다른 패키지로 내보냅니다.

패키지의 BUILD 파일은 exports_files() 문으로 명시적으로 내보낸 경우에만 다른 패키지에 속하는 소스 파일을 직접 참조할 수 있습니다. 파일 공개 상태에 대해 자세히 알아보세요.

기존 동작으로, 규칙 입력으로 언급된 파일도 --incompatible_no_implicit_file_export 플래그가 뒤집힐 때까지 기본 공개 상태로 내보냅니다. 그러나 이 동작은 의존하지 말고 적극적으로 이전해야 합니다.

인수

인수는 현재 패키지 내의 파일 이름 목록입니다. 공개 상태 선언도 지정할 수 있습니다. 이 경우 파일은 지정된 타겟에 표시됩니다. 공개 상태를 지정하지 않으면 package 함수에 패키지 기본 공개 상태가 지정되었더라도 모든 패키지에 파일이 표시됩니다. 라이선스도 지정할 수 있습니다.

다음 예는 다른 패키지(예: 테스트의 data 속성)에서 이를 사용할 수 있도록 test_data 패키지의 텍스트 파일인 golden.txt을 내보냅니다.

# from //test_data/BUILD

exports_files(["golden.txt"])

지구본

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

Glob은 특정 경로 패턴과 일치하는 모든 파일을 찾고 경로 변경 가능하며 정렬된 새 목록을 반환하는 도우미 함수입니다. Glob은 자체 패키지의 파일만 검색하고 소스 파일 (생성된 파일 또는 다른 대상은 제외)만 찾습니다.

파일의 패키지 상대 경로가 include 패턴과 일치하고 exclude 패턴이 하나도 없으면 결과에 소스 파일의 라벨이 포함됩니다.

includeexclude 목록에는 현재 패키지를 기준으로 한 경로 패턴이 포함됩니다. 모든 패턴은 하나 이상의 경로 세그먼트로 구성될 수 있습니다. Unix 경로와 마찬가지로 이러한 세그먼트는 /로 구분됩니다. 세그먼트에는 * 와일드 카드가 포함될 수 있습니다. 이는 경로 구분자 (빈 하위 문자열 포함)의 모든 하위 문자열과 일치하며, 디렉터리 구분 기호 /는 제외됩니다. 이 와일드 카드는 한 경로 세그먼트 내에서 여러 번 사용할 수 있습니다. 또한 ** 와일드 카드는 0개 이상의 전체 경로 세그먼트와 일치할 수 있지만 독립형 경로 세그먼트로 선언해야 합니다.

예:
  • foo/bar.txt은 이 패키지의 foo/bar.txt 파일과 정확히 일치합니다.
  • 파일이 .txt로 끝나는 경우 foo/*.txtfoo/ 디렉터리의 모든 파일과 일치합니다(foo/가 하위 패키지인 경우 제외).
  • foo/a*.htm*foo/ 디렉터리에서 a로 시작하고 임의의 문자열(비어 있을 수 있음)을 가지며 .htm를 포함하며 다른 임의의 문자열(예: foo/axx.htm, foo/a.html 또는 foo/axxx.html)로 끝나는 모든 파일과 일치합니다.
  • **/a.txt은 이 패키지의 모든 하위 디렉터리에 있는 모든 a.txt 파일과 일치합니다.
  • **/bar/**/*.txtxxx/bar/yyy/zzz/a.txt 또는 bar/a.txt(**가 0개의 세그먼트와도 일치함) 또는 bar/zzz/a.txt와 같이 bar라는 호출된 경로의 디렉터리가 하나 이상 있는 경우 이 패키지의 모든 하위 디렉터리에 있는 모든 .txt 파일과 일치합니다.
  • **은 이 패키지의 모든 하위 디렉터리에 있는 모든 파일과 일치합니다.
  • foo**/a.txt은 잘못된 패턴입니다. **은 자체적으로 세그먼트로 서 있어야 하기 때문입니다.

exclude_directories 인수가 사용 설정된 경우 (1로 설정됨) 유형 디렉터리 파일이 결과에서 생략됩니다 (기본값 1).

allow_empty 인수가 False로 설정되면 결과가 비어 있는 목록이 될 경우 glob 함수에서 오류가 발생합니다.

몇 가지 중요한 제한사항과 주의사항이 있습니다.

  1. glob()는 BUILD 파일 평가 중에 실행되므로 glob()는 소스 트리의 파일과만 일치하며 생성된 파일은 아닙니다. 소스 파일과 생성된 파일이 모두 필요한 대상을 빌드하는 경우 생성된 파일 목록을 glob에 명시적으로 추가해야 합니다. :mylib:gen_java_srcs를 사용하는 아래 를 참고하세요.

  2. 규칙의 이름이 일치하는 소스 파일과 동일한 경우 규칙이 해당 파일을 섀도 처리합니다.

    이를 이해하려면 glob()가 경로 목록을 반환하므로 다른 규칙의 속성 (예: srcs = glob(["*.cc"]))에 glob()를 사용하면 일치하는 경로를 명시적으로 나열하는 것과 동일한 효과를 얻을 수 있습니다. 예를 들어 glob()["Foo.java", "bar/Baz.java"]을 생성하지만 패키지 내에 'Foo.java''라는 규칙이 있는 경우(Bazel이 경고를 표시하지만 허용되는 경우) glob()의 소비자는 'Foo.java" 파일 대신 'Foo.java'' 규칙(출력)을 사용합니다. 자세한 내용은 GitHub 문제 #10395를 참조하세요.

  3. Glob은 하위 디렉터리의 파일과 일치할 수 있습니다. 하위 디렉터리 이름은 와일드 카드일 수 있습니다. 하지만...
  4. 라벨은 패키지 경계를 초과할 수 없으며 glob이 하위 패키지의 파일과 일치하지 않습니다.

    예를 들어 x/y가 패키지 (x/y/BUILD 또는 패키지 경로의 다른 위치)로 존재하는 경우 패키지 x의 glob 표현식 **/*.ccx/y/z.cc을 포함하지 않습니다. 즉, glob 표현식의 결과는 실제로 BUILD 파일의 존재에 종속됩니다. 즉, x/y이라는 패키지가 없거나 --deleted_packages 플래그를 사용하여 삭제된 것으로 표시된 경우 동일한 glob 표현식은 x/y/z.cc을 포함합니다.

  5. 위의 제한은 와일드 카드를 사용하는 모든 glob 표현식에 적용됩니다.
  6. 파일 이름이 .로 시작하는 숨겨진 파일은 *** 와일드 카드와 완전히 일치합니다. 숨겨진 파일을 복합 패턴과 일치시키려면 패턴이 .로 시작해야 합니다. 예를 들어 *.*.txt.foo.txt과 일치하지만 *.txt은 일치하지 않습니다. 숨겨진 디렉터리도 같은 방식으로 일치됩니다. 숨겨진 디렉터리에는 입력으로 필요하지 않은 파일이 포함될 수 있으며 이로 인해 불필요한 Glob 파일 수와 메모리 소비가 증가할 수 있습니다. 숨겨진 디렉터리를 제외하려면 '제외' 목록 인수에 추가합니다.
  7. 와일드 카드에는 한 가지 특수한 사례가 있습니다. 즉, "**" 패턴이 패키지의 디렉터리 경로와 일치하지 않습니다. 즉, glob(["**"], exclude_directories = 0)는 모든 파일과 디렉터리를 현재 패키지 아래에 있는 전이 방식으로 엄격히 매칭합니다(물론 하위 패키지 디렉터리에는 들어가지 않음. 그에 관한 이전 메모 참고).

일반적으로 glob 패턴에 단순한 '*'를 사용하는 대신 적절한 확장자 (예: *.html)를 제공해야 합니다. 보다 명시적인 이름은 자체 문서화가 아니며 실수로 백업 파일 또는 emacs/vi/... 자동 저장 파일을 실수로 일치시키지 않도록 해 줍니다.

빌드 규칙을 작성할 때 glob의 요소를 열거할 수 있습니다. 이를 통해 예를 들어 모든 입력에 대해 개별 규칙을 생성할 수 있습니다. 아래의 확장된 glob 예시 섹션을 참조하세요.

Glob 예시

이 디렉터리의 모든 자바 파일과 :gen_java_srcs 규칙으로 생성된 모든 파일로 빌드된 자바 라이브러리를 만듭니다.

java_library(
    name = "mylib",
    srcs = glob(["*.java"]) + [":gen_java_srcs"],
    deps = "...",
)

genrule(
    name = "gen_java_srcs",
    outs = [
        "Foo.java",
        "Bar.java",
    ],
    ...
)

Directory.txt를 제외한 모든 txt 파일을 디렉터리 testdata에 포함합니다. 테스트 데이터의 하위 디렉터리에 있는 파일은 포함되지 않습니다. 이러한 파일을 포함하려면 재귀 glob (**)을 사용합니다.

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(
        ["testdata/*.txt"],
        exclude = ["testdata/experimental.txt"],
    ),
)

재귀 Glob 예시

testdata 디렉터리와 그 하위 디렉터리 (및 하위 디렉터리 등)의 모든 txt 파일에 의존하는지 확인합니다. BUILD 파일이 포함된 하위 디렉터리는 무시됩니다. 위의 제한사항 및 주의사항을 참고하세요.

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(["testdata/**/*.txt"]),
)

이 디렉터리에 있는 모든 자바 파일과 모든 하위 디렉터리에서 빌드된 라이브러리를 만듭니다. 단, 경로에 test라는 디렉터리가 포함되어 있습니다. 이 패턴은 가능한 경우 빌드하지 않는 것이 좋습니다. 빌드 증분을 줄여 빌드 시간을 증가시킬 수 있기 때문입니다.

java_library(
    name = "mylib",
    srcs = glob(
        ["**/*.java"],
        exclude = ["**/testing/**"],
    ),
)

펼쳐진 Glob 예시

현재 디렉터리에 파일의 줄 수를 계산하는 *_test.cc에 대한 개별 genrule을 만듭니다.

# Conveniently, the build language supports list comprehensions.
[genrule(
    name = "count_lines_" + f[:-3],  # strip ".cc"
    srcs = [f],
    outs = ["%s-linecount.txt" % f[:-3]],
    cmd = "wc -l $< >$@",
 ) for f in glob(["*_test.cc"])]

위의 BUILD 파일이 //foo 패키지에 있고 패키지에 일치하는 파일 3개(a_test.cc, b_test.cc, c_test.cc)가 포함되어 있는 경우 bazel query '//foo:all'를 실행하면 생성된 모든 규칙이 나열됩니다.

$ bazel query '//foo:all' | sort
//foo:count_lines_a_test
//foo:count_lines_b_test
//foo:count_lines_c_test

select

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)

select()는 규칙 속성을 구성할 수 있는 도우미 함수입니다. 모든 속성 할당의 거의(오른쪽)를 대체할 수 있으므로 값이 명령줄 Bazel 플래그에 종속됩니다. 예를 들어 이를 통해 플랫폼별 종속 항목을 정의하거나 규칙이 '개발자' 또는 '출시' 모드에서 빌드되었는지에 따라 다른 리소스를 삽입할 수 있습니다.

기본 사용법은 다음과 같습니다.

sh_binary(
    name = "mytarget",
    srcs = select({
        ":conditionA": ["mytarget_a.sh"],
        ":conditionB": ["mytarget_b.sh"],
        "//conditions:default": ["mytarget_default.sh"]
    })
)

이렇게 하면 일반 라벨 목록 할당을 구성 조건에 일치하는 값에 매핑하는 select 호출로 대체하여 sh_binarysrcs 속성을 구성할 수 있습니다. 각 조건은 타겟의 구성이 예상값 세트와 일치하는 경우 config_setting 또는 constraint_value에 대한 라벨 참조입니다. 그러면 mytarget#srcs 값은 현재 호출과 일치하는 라벨 목록이 됩니다.

참고

  • 호출 시 정확히 하나의 조건이 선택됩니다.
  • 여러 조건이 일치하고 다른 조건이 특화되면 특화가 우선합니다. B가 A와 동일한 플래그 및 제약조건 값을 모두 가지고 있고 추가 플래그 또는 제약조건 값이 있으면 조건 B가 조건 A의 전문 분야로 간주됩니다. 즉, 전문화 해결은 아래 예 2에 표시된 것처럼 주문을 생성하도록 설계되지 않았습니다.
  • 여러 조건이 일치하지만 한 조건이 다른 모든 유형의 특수화가 아닌 경우 Bazel은 오류와 함께 실패합니다.
  • 다른 일치하는 조건이 없으면 특수한 의사 라벨 //conditions:default가 일치하는 것으로 간주됩니다. 이 조건을 생략하면 오류를 피하기 위해 다른 몇 가지 규칙이 일치해야 합니다.
  • select는 더 큰 속성 할당 내에 삽입될 수 있습니다. 따라서 srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})은 유효한 표현식입니다.
  • select는 대부분의 속성을 지원하지만 일부 속성은 작동하지 않습니다. 호환되지 않는 속성은 문서에 nonconfigurable로 표시됩니다.

    하위 패키지

    subpackages(include, exclude=[], allow_empty=True)

    subpackages()는 파일 및 디렉터리 대신 하위 패키지를 나열하는 glob()와 비슷한 도우미 함수입니다. glob()와 동일한 경로 패턴을 사용하며 현재 로드 중인 BUILD 파일의 직접 하위 요소인 모든 하위 패키지와 일치할 수 있습니다. 포함 및 제외 패턴에 대한 자세한 설명과 예시는 glob을 참조하세요.

    반환되는 하위 패키지 목록은 정렬된 순서로 표시되며 exclude의 패턴이 아니라 include의 지정된 패턴과 일치하는 현재 로드 패키지를 기준으로 한 경로를 포함합니다.

    다음 예는 패키지의 모든 직접 하위 패키지를 나열합니다. foo/BUILD

    # The following BUILD files exist:
    # foo/BUILD
    # foo/bar/baz/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs = subpackages(include = ["**"])
    
    # results in subs == ["sub", "bar/baz"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    

    일반적으로 이 함수를 직접 호출하는 대신 사용자가 skylib의 &subpackages 모듈을 사용하는 것이 좋습니다.