플랫폼

문제 신고 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

Bazel은 다양한 하드웨어, 운영체제, 시스템 구성 등 다양한 버전의 빌드 도구를 사용하여 사용할 수 있습니다 Bazel은 이러한 복잡성을 관리할 수 있도록 제약 조건플랫폼의 정의에 따라 1, 2, 3, 1, 3, 1, 7, 7, .7, 7, 7, 7, 7화를 보입니다. 제약 조건은 빌드 또는 CPU 아키텍처, 현재 상태 또는 CPU 시간 등 프로덕션 환경은 다를 수 있습니다. GPU 또는 시스템이 설치된 컴파일러의 버전이 없는 경우입니다. 플랫폼은 이러한 제약조건에 대해 이름이 지정된 선택 모음, 이는 특정 특정 환경에서 사용할 수 있는 리소스를 제공합니다

환경을 플랫폼으로 모델링하면 Bazel이 자동으로 적절한 도구 모음 빌드 작업에 사용됩니다 플랫폼을 config_setting 구성 가능한 속성을 쓰는 규칙이 있습니다.

Bazel은 플랫폼이 지원할 수 있는 세 가지 역할을 인식합니다.

  • Host: Bazel 자체가 실행되는 플랫폼입니다.
  • 실행 - 빌드 도구가 빌드 작업을 실행하는 플랫폼입니다. 중간 및 최종 출력을 생성합니다.
  • 타겟 - 최종 출력이 상주하고 실행되는 플랫폼입니다.

Bazel은 플랫폼과 관련하여 다음과 같은 빌드 시나리오를 지원합니다.

  • 단일 플랫폼 빌드 (기본값) - 호스트, 실행, 대상 플랫폼 동일합니다. 예를 들어, Intel x64 CPU입니다.

  • 크로스 컴파일 빌드 - 호스트와 실행 플랫폼은 동일하지만 타겟 플랫폼이 다릅니다 예를 들어 macOS에서 iOS 앱을 빌드하고 (MacBook Pro에서 실행 중임)

  • 멀티 플랫폼 빌드 - 호스트, 실행, 대상 플랫폼이 모두 다릅니다.

제약조건 및 플랫폼 정의

플랫폼에 대해 가능한 선택 공간은 constraint_settingBUILD 파일 내 constraint_value 규칙 constraint_setting는 새 측정기준을 만들고, constraint_value는 지정된 측정기준에 새 값을 만듭니다. 함께하면 enum과 가능한 값을 효과적으로 정의합니다. 예를 들어 BUILD 파일의 스니펫이 시스템의 glibc 버전에 관한 제약 조건을 도입함 두 개의 값을 가질 수 있습니다.

constraint_setting(name = "glibc_version")

constraint_value(
    name = "glibc_2_25",
    constraint_setting = ":glibc_version",
)

constraint_value(
    name = "glibc_2_26",
    constraint_setting = ":glibc_version",
)

제약조건 및 제약조건의 값은 살펴보겠습니다 이는 라벨에 의해 참조되며 일반적인 공개 상태에 따라 달라집니다. 제어 공개 상태가 허용되는 경우 이에 대한 자체 가치를 정의하는 것입니다

platform 규칙은 제약 조건 값을 선택할 수 있습니다. 이 linux_x86라는 플랫폼을 만들고 x86_64 아키텍처에서 Linux 운영체제를 실행하는 glibc 버전 2.25 Bazel의 기본 제공 제약 조건에 대한 자세한 내용은 아래를 참조하세요.

platform(
    name = "linux_x86",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:x86_64",
        ":glibc_2_25",
    ],
)

일반적으로 유용한 제약 조건 및 플랫폼

생태계의 일관성을 유지하기 위해 Bazel팀은 가장 많이 사용되는 CPU 아키텍처 및 운영체제에 대한 제약 조건 정의 있습니다 이것들은 모두 https://github.com/bazelbuild/platforms.

Bazel에는 다음과 같은 특수 플랫폼 정의가 포함됩니다. @local_config_platform//:host 자동 감지된 호스트 플랫폼 값입니다. Bazel이 실행 중인 시스템에서 자동으로 감지된 플랫폼을 나타냅니다.

빌드의 플랫폼 지정

다음을 사용하여 빌드의 호스트 및 대상 플랫폼을 지정할 수 있습니다. 명령줄 플래그:

  • --host_platform - 기본값은 @bazel_tools//platforms:host_platform입니다.
  • --platforms - 기본값은 @bazel_tools//platforms:target_platform입니다.

호환되지 않는 타겟 건너뛰기

특정 대상 플랫폼용으로 빌드할 때는 타켓팅할 수 있습니다. 예: Windows 기기 드라이버가 컴퓨터에 빌드될 때 많은 컴파일러 오류를 //...가 있는 Linux 머신 사용 target_compatible_with 드림 속성을 사용하여 코드에 있는 대상 플랫폼 제약 조건을 Bazel에 알립니다.

이 특성을 가장 간단하게 사용하는 것은 대상을 단일 플랫폼으로 제한합니다. 이 타겟은 제약이 있습니다 다음 예는 win_driver_lib.cc를 64비트로 제한합니다. 창.

cc_library(
    name = "win_driver_lib",
    srcs = ["win_driver_lib.cc"],
    target_compatible_with = [
        "@platforms//cpu:x86_64",
        "@platforms//os:windows",
    ],
)

:win_driver_lib는 64비트 Windows로 빌드하는 경우에만 호환됩니다. 다른 모든 것과 호환되지 않습니다. 비호환성은 전이적입니다. 모든 대상 호환되지 않는 타겟에 전이적으로 의존하는 타겟도 그 자체로 호환되지 않습니다.

언제 대상을 건너뛰나요?

호환되지 않는 것으로 간주되어 대상 패턴 확장의 일부로 빌드됩니다. 예를 들어 다음 두 줄 호출은 대상 패턴 확장에서 발견된 호환되지 않는 대상을 건너뜁니다.

$ bazel build --platforms=//:myplatform //...
$ bazel build --platforms=//:myplatform //:all

test_suite에서 호환되지 않는 테스트는 마찬가지로 test_suite이 명령줄에 지정된 경우 --expand_test_suites 즉, 명령줄의 test_suite 타겟은 :all처럼 동작하고 ...입니다. --noexpand_test_suites를 사용하면 확장을 방지하고 호환되지 않는 테스트가 있는 test_suite 타겟도 호환되지 않습니다.

명령줄에 호환되지 않는 타겟을 명시적으로 지정하면 오류 메시지 및 빌드 실패가 표시됩니다.

$ bazel build --platforms=//:myplatform //:target_incompatible_with_myplatform
...
ERROR: Target //:target_incompatible_with_myplatform is incompatible and cannot be built, but was explicitly requested.
...
FAILED: Build did NOT complete successfully

더 표현력 있는 제약 조건

제약 조건을 더 유연하게 표현하려면 @platforms//:incompatible 플랫폼이 없는 constraint_value 있습니다.

select()를 다음 제품과 함께 사용하세요. @platforms//:incompatible: 더 복잡한 제한을 표현합니다. 대상 예를 들어 이를 사용하여 기본 OR 로직을 구현합니다. 다음은 라이브러리를 표시합니다. macOS 및 Linux와 호환되지만 다른 플랫폼은 없습니다.

cc_library(
    name = "unixish_lib",
    srcs = ["unixish_lib.cc"],
    target_compatible_with = select({
        "@platforms//os:osx": [],
        "@platforms//os:linux": [],
        "//conditions:default": ["@platforms//:incompatible"],
    }),
)

위의 내용은 다음과 같이 해석될 수 있습니다.

  1. macOS를 타겟팅할 때, 타겟에는 제약 조건이 없습니다.
  2. Linux를 대상으로 하는 경우, 타겟에는 제약 조건이 없습니다.
  3. 그 외의 경우에는 대상에 @platforms//:incompatible 제약조건이 있습니다. 왜냐하면 @platforms//:incompatible이(가) 플랫폼에 속하지 않으므로 타겟은 다음과 같습니다. 호환되지 않는 것으로 간주됩니다.

제약 조건을 더 쉽게 읽을 수 있도록 다음을 사용합니다. skylibselects.with_or()

이와 비슷한 방식으로 역호환성을 표현할 수 있습니다. 다음 예를 참고하세요. ARM을 제외한 모든 항목과 호환되는 라이브러리를 설명합니다.

cc_library(
    name = "non_arm_lib",
    srcs = ["non_arm_lib.cc"],
    target_compatible_with = select({
        "@platforms//cpu:arm": ["@platforms//:incompatible"],
        "//conditions:default": [],
    ],
)

bazel cquery를 사용하여 호환되지 않는 타겟 감지

IncompatiblePlatformProvider 드림 bazel cqueryStarlark 출력 형식을 사용하면 호환되지 않는 타겟을 호환되는 타겟에서 분리합니다

호환되지 않는 타겟을 필터링하는 데 사용할 수 있습니다. 아래 예는 호환되는 타겟의 라벨만 출력합니다. 호환되지 않는 타겟은 출력되지 않습니다.

$ cat example.cquery

def format(target):
  if "IncompatiblePlatformProvider" not in providers(target):
    return target.label
  return ""


$ bazel cquery //... --output=starlark --starlark:file=example.cquery

알려진 문제

호환되지 않는 대상 공개 상태 무시 제한사항을 따릅니다.