Bazel은 멀티 아키텍처 및 교차 컴파일 빌드를 위한 플랫폼 및 도구 모음 모델링을 위한 정교한 지원을 제공합니다.
이 페이지에서는 이 지원의 상태를 요약합니다.
관련 주제에 대한 추가 정보
상태
C++
C++ 규칙은 --incompatible_enable_cc_toolchain_resolution
가 설정된 경우 플랫폼을 사용하여 도구 모음을 선택합니다.
즉, 다음을 사용하여 C++ 프로젝트를 구성할 수 있습니다.
bazel build //:my_cpp_project --platforms=//:myplatform
기존 방식 대신 다음을 사용하세요.
bazel build //:my_cpp_project` --cpu=... --crosstool_top=... --compiler=...
이 기능은 Bazel 7.0에서 기본적으로 사용 설정됩니다 (#7260).
플랫폼으로 C++ 프로젝트를 테스트하려면 프로젝트 이전 및 C++ 도구 모음 구성을 참고하세요.
자바
Java 규칙은 플랫폼을 사용하여 도구 모음을 선택합니다.
이는 기존 플래그 --java_toolchain
, --host_java_toolchain
, --javabase
, --host_javabase
를 대체합니다.
자세한 내용은 Java 및 Bazel을 참고하세요.
Android
Android 규칙은 --incompatible_enable_android_toolchain_resolution
가 설정된 경우 플랫폼을 사용하여 도구 모음을 선택합니다.
즉, 다음을 사용하여 Android 프로젝트를 구성할 수 있습니다.
bazel build //:my_android_project --android_platforms=//:my_android_platform
--android_crosstool_top
, --android_cpu
, --fat_apk_cpu
와 같은 기존 플래그를 사용하지 않습니다.
이 기능은 Bazel 7.0에서 기본적으로 사용 설정됩니다 (#16285).
플랫폼으로 Android 프로젝트를 테스트하려면 프로젝트 마이그레이션을 참고하세요.
Apple
Apple 규칙은 플랫폼을 지원하지 않으며 아직 지원이 예정되어 있지 않습니다.
플랫폼 매핑을 사용하여 Apple 규칙과 순수 C++의 혼합으로 빌드하는 등 Apple 빌드에서 플랫폼 API를 계속 사용할 수 있습니다.
다른 언어
언어 규칙 세트를 소유한 경우 지원을 추가하려면 규칙 세트 이전을 참고하세요.
배경
플랫폼과 툴체인은 소프트웨어 프로젝트가 다양한 아키텍처를 타겟팅하고 교차 컴파일하는 방식을 표준화하기 위해 도입되었습니다.
이는 언어 관리자가 이미 임시적이고 호환되지 않는 방식으로 이를 수행하고 있다는 관찰에서 영감을 받았습니다. 예를 들어 C++ 규칙은 --cpu
및 --crosstool_top
를 사용하여 타겟 CPU와 도구 모음을 선언했습니다. 이 두 가지 모두 '플랫폼'을 올바르게 모델링하지 않습니다. 이로 인해 어색하고 잘못된 빌드가 생성되었습니다.
Java, Android, 기타 언어는 비슷한 목적으로 자체 플래그를 발전시켰지만 서로 상호 운용되지 않았습니다. 이로 인해 교차 언어 빌드가 혼란스럽고 복잡해졌습니다.
Bazel은 대규모 다중 언어, 다중 플랫폼 프로젝트를 위해 설계되었습니다. 이를 위해서는 명확한 표준 API를 비롯해 이러한 개념에 대한 원칙에 기반한 지원이 필요합니다.
이전 필요
새 API로 업그레이드하려면 API를 출시하고 이를 사용하도록 규칙 로직을 업그레이드하는 두 가지 노력이 필요합니다.
첫 번째는 완료되었지만 두 번째는 진행 중입니다. 여기에는 언어별 플랫폼과 도구 모음이 정의되어 있고 언어 로직이 --crosstool_top
와 같은 이전 플래그 대신 새 API를 통해 도구 모음을 읽고 config_setting
가 이전 플래그 대신 새 API에서 선택하는지 확인하는 작업이 포함됩니다.
이 작업은 간단하지만 언어별로 별도의 노력이 필요하며 프로젝트 소유자가 예정된 변경사항을 테스트할 수 있도록 적절한 경고가 필요합니다.
따라서 지속적인 마이그레이션이 필요합니다.
목표
다음과 같은 형식으로 모든 프로젝트가 빌드되면 마이그레이션이 완료됩니다.
bazel build //:myproject --platforms=//:myplatform
이는 다음을 의미합니다.
- 프로젝트의 규칙은
//:myplatform
에 적합한 도구 모음을 선택합니다. - 프로젝트의 종속 항목이
//:myplatform
에 적합한 도구 모음을 선택합니다. //:myplatform
는CPU
,OS
, 기타 일반적인 언어 독립적 속성의 일반 선언을 참조합니다.- 모든 관련
select()
이//:myplatform
와 적절하게 일치합니다. //:myplatform
는 명확하고 액세스 가능한 위치에 정의됩니다. 플랫폼이 프로젝트에 고유한 경우 프로젝트의 저장소에 정의되거나 모든 소비 프로젝트가 찾을 수 있는 공통 위치에 정의됩니다.
--cpu
, --crosstool_top
, --fat_apk_cpu
와 같은 이전 플래그는 안전한 시점에 지원 중단되고 삭제됩니다.
궁극적으로는 이 방법이 아키텍처를 구성하는 유일한 방법이 될 것입니다.
프로젝트 마이그레이션
플랫폼을 지원하는 언어로 빌드하는 경우 빌드는 다음과 같은 호출로 이미 작동해야 합니다.
bazel build //:myproject --platforms=//:myplatform
자세한 내용은 상태 및 언어 문서를 참고하세요.
언어에서 플랫폼 지원을 사용 설정하려면 플래그가 필요한 경우 해당 플래그도 설정해야 합니다. 자세한 내용은 상태를 참고하세요.
프로젝트를 빌드하려면 다음을 확인해야 합니다.
//:myplatform
이 있어야 합니다. 일반적으로 프로젝트 소유자는 서로 다른 프로젝트가 서로 다른 머신을 타겟팅하므로 플랫폼을 정의해야 합니다. 기본 플랫폼을 참고하세요.사용하려는 도구 모음이 있어야 합니다. 스톡 도구 모음을 사용하는 경우 언어 소유자는 등록 방법을 위한 안내를 포함해야 합니다. 자체 맞춤 도구 모음을 작성하는 경우
MODULE.bazel
파일 또는--extra_toolchains
에 등록해야 합니다.select()
및 구성 전환이 올바르게 해결되어야 합니다. select() 및 Transitions를 참고하세요.빌드에서 플랫폼을 지원하는 언어와 지원하지 않는 언어를 혼합하는 경우 기존 언어가 새 API와 호환되도록 플랫폼 매핑이 필요할 수 있습니다. 자세한 내용은 플랫폼 매핑을 참고하세요.
문제가 계속되면 문의하여 지원을 받으세요.
기본 플랫폼
프로젝트 소유자는 빌드하려는 아키텍처를 설명하기 위해 명시적 플랫폼을 정의해야 합니다. 그런 다음 --platforms
로 트리거됩니다.
--platforms
이 설정되지 않은 경우 Bazel은 로컬 빌드 머신을 나타내는 platform
을 기본값으로 사용합니다. 이는 @platforms//host
(@bazel_tools//tools:host_platform
로 별칭 지정)에서 자동 생성되므로 명시적으로 정의할 필요가 없습니다. @platforms
에 선언된 constraint_value
로 로컬 머신의 OS
및 CPU
을 매핑합니다.
select()
프로젝트는 constraint_value
타겟에서 select()
할 수 있지만 플랫폼을 완료할 수는 없습니다. 이는 select()
가 최대한 다양한 머신을 지원하도록 하기 위한 의도적인 조치입니다. ARM
관련 소스가 있는 라이브러리는 더 구체적인 이유가 없는 한 모든
ARM
지원 머신을 지원해야 합니다.
하나 이상의 constraint_value
를 선택하려면 다음을 사용하세요.
config_setting(
name = "is_arm",
constraint_values = [
"@platforms//cpu:arm",
],
)
이는 기존에 --cpu
에서 선택하는 것과 동일합니다.
config_setting(
name = "is_arm",
values = {
"cpu": "arm",
},
)
자세한 내용은 여기를 참고하세요.
--cpu
, --crosstool_top
등의 select
는 --platforms
를 이해하지 못합니다.
프로젝트를 플랫폼으로 이전할 때는 constraint_values
로 변환하거나 플랫폼 매핑을 사용하여 이전 중에 두 스타일을 모두 지원해야 합니다.
화면전환
Starlark 전환은 빌드 그래프의 일부에서 플래그를 변경합니다. 프로젝트에서 --cpu
, --crossstool_top
또는 기타 기존 플래그를 설정하는 전환을 사용하는 경우 --platforms
를 읽는 규칙에는 이러한 변경사항이 표시되지 않습니다.
프로젝트를 플랫폼으로 이전할 때 return { "//command_line_option:cpu": "arm" }
와 같은 변경사항을 return {
"//command_line_option:platforms": "//:my_arm_platform" }
로 변환하거나 플랫폼 매핑을 사용하여 이전 기간 동안 두 스타일을 모두 지원해야 합니다.
규칙 세트 마이그레이션
규칙 세트를 소유하고 플랫폼을 지원하려면 다음을 수행해야 합니다.
규칙 로직이 도구 모음 API로 도구 모음을 해결하도록 합니다. 툴체인 API (
ctx.toolchains
)를 참고하세요.선택사항: 이전 테스트 중에 규칙 로직이 새 API 또는
--crosstool_top
과 같은 이전 플래그를 통해 번갈아 툴체인을 해결하도록--incompatible_enable_platforms_for_my_language
플래그를 정의합니다.플랫폼 구성요소를 구성하는 관련 속성을 정의합니다. 일반 플랫폼 속성을 참고하세요.
표준 도구 모음을 정의하고 규칙의 등록 안내 (세부정보)를 통해 사용자가 액세스할 수 있도록 합니다.
select()
및 구성 전환이 플랫폼을 지원하는지 확인합니다. 이것이 가장 큰 문제입니다. 특히 다국어 프로젝트의 경우 모든 언어가--platforms
를 읽을 수 없으면 실패할 수 있으므로 문제가 됩니다.
플랫폼을 지원하지 않는 규칙과 혼합해야 하는 경우 플랫폼 매핑을 사용하여 격차를 해소해야 할 수 있습니다.
일반 플랫폼 속성
OS
, CPU
과 같은 공통적인 교차 언어 플랫폼 속성은 @platforms
에 선언해야 합니다.
이를 통해 공유, 표준화, 언어 간 호환성이 장려됩니다.
규칙에 고유한 속성은 규칙의 저장소에 선언해야 합니다. 이렇게 하면 규칙이 담당하는 특정 개념에 대한 명확한 소유권을 유지할 수 있습니다.
규칙에서 맞춤 용도 OS나 CPU를 사용하는 경우 @platforms
이 아닌 규칙의 저장소에 선언해야 합니다.
플랫폼 매핑
플랫폼 매핑은 플랫폼 인식 논리를 동일한 빌드에서 기존 논리와 혼합할 수 있는 임시 API입니다. 이는 다양한 이전 기간과의 비호환성을 완화하기 위한 용도로만 사용되는 무딘 도구입니다.
플랫폼 매핑은 platform()
를 해당 기존 플래그 집합으로 매핑하거나 그 반대입니다. 예를 들면 다음과 같습니다.
platforms:
# Maps "--platforms=//platforms:ios" to "--cpu=ios_x86_64 --apple_platform_type=ios".
//platforms:ios
--cpu=ios_x86_64
--apple_platform_type=ios
flags:
# Maps "--cpu=ios_x86_64 --apple_platform_type=ios" to "--platforms=//platforms:ios".
--cpu=ios_x86_64
--apple_platform_type=ios
//platforms:ios
# Maps "--cpu=darwin_x86_64 --apple_platform_type=macos" to "//platform:macos".
--cpu=darwin_x86_64
--apple_platform_type=macos
//platforms:macos
Bazel은 이를 사용하여 전환을 비롯한 빌드 전체에 플랫폼 기반 설정과 기존 설정이 모두 일관되게 적용되도록 보장합니다.
기본적으로 Bazel은 작업공간 루트의 platform_mappings
파일에서 매핑을 읽습니다. --platform_mappings=//:my_custom_mapping
도 설정할 수 있습니다.
자세한 내용은 플랫폼 매핑 설계를 참고하세요.
API 검토
platform
은 constraint_value
타겟의 모음입니다.
platform(
name = "myplatform",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
constraint_value
은 머신 속성입니다. 동일한 '종류'의 값은 공통 constraint_setting
아래에 그룹화됩니다.
constraint_setting(name = "os")
constraint_value(
name = "linux",
constraint_setting = ":os",
)
constraint_value(
name = "mac",
constraint_setting = ":os",
)
toolchain
은 Starlark 규칙입니다. 속성은 언어의 도구 (예: compiler =
"//mytoolchain:custom_gcc"
)를 선언합니다. 제공자는 이 정보를 이러한 도구로 빌드해야 하는 규칙에 전달합니다.
툴체인은 타겟팅할 수 있는 머신(target_compatible_with = ["@platforms//os:linux"]
)과 도구를 실행할 수 있는 머신(exec_compatible_with = ["@platforms//os:mac"]
)의 constraint_value
를 선언합니다.
$ bazel build //:myproject --platforms=//:myplatform
를 빌드할 때 Bazel은 빌드 머신에서 실행되고 //:myplatform
용 바이너리를 빌드할 수 있는 도구 모음을 자동으로 선택합니다. 이를 도구 모음 해결이라고 합니다.
사용 가능한 도구 모음은 MODULE.bazel
파일에서 register_toolchains
로 등록하거나 명령줄에서 --extra_toolchains
로 등록할 수 있습니다.
자세한 내용은 여기를 참고하세요.
질문
일반적인 지원 및 이전 일정에 관한 질문은 bazel-discuss 또는 적절한 규칙의 소유자에게 문의하세요.
플랫폼/도구 모음 API의 설계 및 발전에 관한 논의는 bazel-dev에 문의하세요.