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_setting
및
BUILD
파일 내 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에는 다음과 같은 특수 플랫폼 정의가 포함됩니다.
@platforms//host
(별칭은 @bazel_tools//tools:host_platform
). 이것은
자동 감지된 호스트 플랫폼 값 -
Bazel이 실행 중인 시스템에서 자동으로 감지된 플랫폼을 나타냅니다.
빌드의 플랫폼 지정
다음을 사용하여 빌드의 호스트 및 대상 플랫폼을 지정할 수 있습니다. 명령줄 플래그:
--host_platform
- 기본값은@bazel_tools//tools:host_platform
입니다. <ph type="x-smartling-placeholder">- </ph>
- 이 대상은 저장소에서 지원되는
@platforms//host
에 별칭이 지정되어 있습니다. 호스트 OS와 CPU를 탐지하고 플랫폼 타겟을 기록하는 규칙을 사용합니다. @platforms//host:constraints.bzl
도 있습니다. 다른 BUILD에서 사용할 수 있는HOST_CONSTRAINTS
라는 배열 Starlark 파일입니다.
- 이 대상은 저장소에서 지원되는
--platforms
- 호스트 플랫폼으로 기본 설정됨 <ph type="x-smartling-placeholder">- </ph>
- 즉, 다른 플래그가 설정되지 않으면
@platforms//host
은 타겟 플랫폼입니다. --host_platform
가 설정되고--platforms
이 아닌 경우--host_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
다음과 같은 경우 호환되지 않는 명시적 타겟은 자동으로 건너뜁니다.
--skip_incompatible_explicit_targets
사용 설정됨
더 표현력 있는 제약 조건
제약 조건을 더 유연하게 표현하려면
@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"],
}),
)
위의 내용은 다음과 같이 해석될 수 있습니다.
- macOS를 타겟팅할 때, 타겟에는 제약 조건이 없습니다.
- Linux를 대상으로 하는 경우, 타겟에는 제약 조건이 없습니다.
- 그 외의 경우에는 대상에
@platforms//:incompatible
제약조건이 있습니다. 왜냐하면@platforms//:incompatible
이(가) 플랫폼에 속하지 않으므로 타겟은 다음과 같습니다. 호환되지 않는 것으로 간주됩니다.
제약 조건을 더 쉽게 읽을 수 있도록 다음을 사용합니다.
skylib의
selects.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 cquery
의 Starlark 출력
형식을 사용하면
호환되지 않는 타겟을
호환되는 타겟에서 분리합니다
호환되지 않는 타겟을 필터링하는 데 사용할 수 있습니다. 아래 예는 호환되는 타겟의 라벨만 출력합니다. 호환되지 않는 타겟은 출력되지 않습니다.
$ cat example.cquery
def format(target):
if "IncompatiblePlatformProvider" not in providers(target):
return target.label
return ""
$ bazel cquery //... --output=starlark --starlark:file=example.cquery
알려진 문제
호환되지 않는 대상 공개 상태 무시 제한사항을 따릅니다.