플랫폼을 이용한 빌드

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

Bazel은 모델링 플랫폼도구 모음입니다. 이를 실제 프로젝트와 통합하려면 코드 소유자, 규칙 유지관리자, 핵심 Bazel 개발자 간의 신중한 협업을 통해 이루어집니다.

이 페이지에서는 플랫폼의 용도를 요약하고 플랫폼으로 빌드하는 방법을 보여줍니다.

tl;dr: Bazel의 플랫폼 및 도구 모음 API를 사용할 수 있지만 작동하지 않음 모든 언어 규칙, select() 및 기타 기존 참조가 포함될 때까지 어디에서나 적용 업데이트됩니다. 이 같은 노력은 현재도 진행 중입니다. 결국 모든 빌드는 플랫폼을 기반으로 합니다. 아래에서 빌드가 적합한 위치를 확인하세요.

더 공식적인 문서는 다음을 참조하세요.

배경

소프트웨어 사용 방식을 표준화하기 위해 플랫폼도구 모음이 도입되었습니다. 프로젝트는 다양한 머신을 대상으로 하고 올바른 언어 도구로 빌드합니다.

이는 비교적 최근에 Bazel에 추가된 버전입니다. 이었습니다 영감을 준 언어 유지관리자들이 이미 광고에서 이 작업을 하고 있다는 사실을 일회성, 비호환 방식으로 작동합니다 예를 들어 C++ 규칙은 --cpu--crosstool_top를 사용합니다. 빌드의 대상 CPU 및 C++ 도구 모음을 설정할 수 있습니다. 둘 다 올바르지 않음 '플랫폼'입니다. 과거의 이러한 시도로 인해 어색하고 부정확한 빌드가 발생했습니다. 이러한 플래그는 자체적으로 진화한 Java 컴파일도 제어하지 않습니다. --java_toolchain를 포함하는 독립된 인터페이스입니다.

Bazel은 대규모 다국어 다중 플랫폼 프로젝트에 사용됩니다. 이 명확한 API를 포함하여 이러한 개념에 대한 보다 원칙적인 지원이 필요합니다. 언어 및 프로젝트 상호 운용성을 장려합니다 이것이 바로 새로운 API의 특징입니다 정의합니다.

마이그레이션

플랫폼 및 도구 모음 API는 프로젝트에서 실제로 사용할 때만 작동합니다. 이 프로젝트의 규칙 로직, 도구 모음, 종속 항목 및 select()에서 이를 지원해야 합니다. 마이그레이션 순서를 신중하게 해야 함 를 사용하여 모든 프로젝트와 종속 항목이 올바르게 작동하도록 합니다.

예를 들어 Bazel의 C++ 규칙은 플랫폼을 지원합니다. 하지만 Apple Rules(사과 규칙)에는 그렇지 않습니다. 사용자의 C++ 프로젝트 애플에 관심이 없을 수도 있습니다. 그렇지 않은 경우도 있습니다. 그래서 모든 C++ 빌드에 플랫폼을 전역적으로 사용 설정하는 것은 아직 안전하지 않습니다.

이 페이지의 나머지 부분에서는 이전 순서와 시기에 대해 설명합니다. 몇 가지 옵션이 있습니다.

목표

모든 프로젝트가 다음 형식으로 빌드되면 Bazel의 플랫폼 마이그레이션이 완료됩니다.

bazel build //:myproject --platforms=//:myplatform

이는 다음을 의미합니다.

  1. 프로젝트에서 사용하는 규칙이 올바른 도구 모음을 추론할 때 //:myplatform
  2. 프로젝트의 종속 항목이 사용하는 규칙에 따라 올바른 도구 모음을 추론할 수 있음 최저가: //:myplatform
  3. 본인의 지원에 따라 프로젝트 //:myplatform 또는 프로젝트는 기존 API (예: --crosstool_top)를 지원합니다.
  4. 참조 //:myplatform개 [일반 선언][공통 플랫폼 선언]{: .external} 자동 프로젝트 간을 지원하는 CPU, OS, 기타 일반 개념 호환성을 제공합니다
  5. 모든 관련 프로젝트 select() //:myplatform에 암시된 머신 속성을 이해합니다.
  6. //:myplatform는 프로젝트의 플랫폼이 프로젝트에 고유한 경우 해당 저장소, 그렇지 않은 경우에는 모든 프로젝트의 특정 위치에 저장됩니다. 찾을 수 있습니다.

이전 API는 이 목표가 달성되는 즉시 삭제됩니다. 그러면 프로젝트가 플랫폼과 도구 모음을 선택하는 표준 방법이 되어야 합니다.

플랫폼을 사용해야 하나요?

프로젝트를 빌드하거나 크로스 컴파일하려면 참조하세요.

프로젝트, 언어 또는 도구 모음 유지관리자라면 새로운 API를 지원하도록 설계되었습니다 전역 마이그레이션이 완료될 때까지 대기 여부 구체적인 가치 / 비용 니즈에 따라 조기에 선택할 수도 있습니다.

  • 관심 있는 정확한 속성에서 select()하거나 도구 모음을 선택할 수 있습니다. about --cpu과 같은 하드 코딩 플래그 대신 사용됩니다. 예를 들어 CPU가 여러 개 있고 동일한 명령 집합을 지원할 수 있습니다.
  • 더 올바른 빌드. 위의 예에서 --cpuselect()하면 동일한 명령 집합인 select()를 지원하는 새 CPU를 추가합니다. 새 CPU를 인식하지 못합니다. 하지만 플랫폼의 select()는 여전히 정확합니다.
  • 사용자 환경 간소화. 모든 프로젝트는 다음을 이해합니다. --platforms=//:myplatform 여러 언어를 지정할 필요 없음 사용할 수 있습니다
  • 언어 디자인 간소화. 모든 언어는 용어 정의를 위한 공통 API를 도구 모음 사용, 플랫폼에 적합한 도구 모음 선택에 관한 내용을 다룹니다.
  • 다음에서 대상을 건너뛸 수 있습니다. 타겟 플랫폼과 호환되지 않는 경우 빌드 및 테스트 단계를 완료합니다.

비용

  • 아직 플랫폼을 지원하지 않는 종속 프로젝트는 자동으로 작동하지 않을 수 있습니다. 사용할 수 있습니다.
  • 제대로 작동하려면 추가적인 임시 유지관리가 필요할 수 있습니다.
  • 새로운 API와 기존 API의 병용을 위해서는 혼란을 주지 않도록 주의하세요.
  • 다음과 같은 일반 속성의 표준 정의 OSCPU는 아직 개발 중이므로 초기 참여가 추가로 필요할 수 있습니다.
  • 언어별 도구 모음에 대한 표준 정의는 여전히 발전하고 있으며 초기 기부가 추가로 필요할 수 있습니다

API 검토

platform타겟 constraint_value:

platform(
    name = "myplatform",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)

constraint_value는 머신입니다. 속성 동일한 'kind'의 값 공통으로 그룹화되고 constraint_setting:

constraint_setting(name = "os")
constraint_value(
    name = "linux",
    constraint_setting = ":os",
)
constraint_value(
    name = "mac",
    constraint_setting = ":os",
)

toolchainStarlark 법칙입니다. 자체 속성은 언어의 도구 (예: compiler = "//mytoolchain:custom_gcc")를 선언합니다. 제공업체 패스 이러한 도구를 사용하여 만들어야 하는 규칙에 이 정보를 추가합니다.

도구 모음은 실행할 수 있는 머신의 constraint_value를 선언합니다. 타겟 (target_compatible_with = ["@platforms//os:linux"]) 및 그 도구로 할 수 있는 기계 실행 (exec_compatible_with = ["@platforms//os:mac"]).

$ bazel build //:myproject --platforms=//:myplatform 빌드 시 Bazel 빌드 머신에서 실행할 수 있는 도구 모음을 자동으로 선택하고 //:myplatform용 빌드 바이너리 이를 도구 모음 확인이라고 합니다.

사용 가능한 도구 모음 집합은 다음을 사용하여 WORKSPACE에 등록할 수 있습니다. register_toolchains 또는 명령줄에서 --extra_toolchains로 대체합니다.

자세한 내용은 여기를 참고하세요.

상태

현재 플랫폼 지원은 언어에 따라 다릅니다. Bazel의 모든 주요 규칙은 . 하지만 이 과정에는 시간이 걸립니다. 여기에는 크게 세 가지 이유가 있습니다.

  1. 도구 모음에서 도구 정보를 가져오려면 규칙 로직을 업데이트해야 합니다. API (ctx.toolchains)에 연결되고 다음과 같은 기존 설정 읽기를 중지합니다. --cpu--crosstool_top 비교적 간단합니다.

  2. 툴체인 유지관리자는 도구 모음을 정의하고 이러한 도구 모음을 사용자 (GitHub 저장소 및 WORKSPACE 항목) 기술적으로는 간단하지만 쉽게 사용자 환경을 유지할 수 있어야 합니다

    플랫폼 정의도 필요합니다 (동일한 머신 Bazel 실행) 일반적으로 프로젝트는 자체 플랫폼을 정의해야 합니다.

  3. 기존 프로젝트를 마이그레이션해야 합니다. select()전환 역시 이전되었습니다. 이것이 가장 큰 과제입니다. 특히 IT 지원 전문가로서 다국어 프로젝트 (모든 언어가 읽을 수 없는 경우 실패할 수 있음) --platforms)을 입력합니다.

새 규칙 집합을 설계하는 경우 시작하겠습니다 이렇게 하면 규칙이 다른 광고 인벤토리와 플랫폼 API가 확장됨에 따라 가치가 증가함 더 많이 사용됩니다.

일반적인 플랫폼 속성

프로젝트 전반에 공통으로 사용되는 OS, CPU와 같은 플랫폼 속성은 중앙 집중식의 표준 공간에서 선언됩니다. 이는 프로젝트 간 언어 간 호환성이 있습니다

예를 들어 MyAppconstraint_valueselect()가 있는 경우 @myapp//cpus:armSomeCommonLib의 경우 select()가 있습니다. @commonlib//constraints:arm, 이렇게 하면 '암'을 트리거합니다. 호환되지 않는 모드 있습니다.

전역적으로 공통된 속성은 @platforms 저장소 따라서 위 예의 표준 라벨은 @platforms//cpu:arm입니다. 언어 공통 속성은 각 속성의 저장소에 선언되어야 합니다. 있습니다.

기본 플랫폼

일반적으로 프로젝트 소유자는 프로젝트 수준에서 platforms 다양한 종류의 기계를 빌드할 수 있습니다 그런 다음 --platforms

--platforms이 설정되지 않은 경우 Bazel은 기본적으로 platform 로컬 빌드 머신을 만드는 방법을 알아보겠습니다 @local_config_platform//:host에 자동 생성되었습니다. 명시적으로 정의할 필요가 없습니다 로컬 머신의 OS를 매핑합니다. 및 constraint_value이(가) 선언된 CPU @platforms

C++

Bazel의 C++ 규칙은 --incompatible_enable_cc_toolchain_resolution (#7260)

즉, 다음을 사용하여 C++ 프로젝트를 구성할 수 있습니다.

bazel build //:my_cpp_project --platforms=//:myplatform

레거시가 아닌

bazel build //:my_cpp_project` --cpu=... --crosstool_top=...  --compiler=...

프로젝트가 순수 C++이고 C++가 아닌 프로젝트에 종속되지 않는 경우 다음을 사용할 수 있습니다. select전환이 호환됩니다. 자세한 내용은 #7260 및 자세한 내용은 C++ 도구 모음 구성을 참조하세요.

이 모드는 기본적으로 사용 설정되어 있지 않습니다. 이는 Apple 프로젝트가 여전히 --cpu--crosstool_top로 C++ 종속 항목 구성 () 따라서 이는 플랫폼으로 이전하는 Apple 규칙에 따라 다릅니다.

자바

Bazel의 Java 규칙은 플랫폼을 사용합니다.

이는 기존 플래그 --java_toolchain, --host_java_toolchain, --javabase, --host_javabase

구성 플래그를 사용하는 방법을 알아보려면 Bazel 및 Java 설명서를 참조하세요. 자세한 내용은 디자인 문서를 참고하세요.

아직 기존 플래그를 사용 중인 경우 문제 #7849의 이전 프로세스를 따르세요.

Android

Bazel의 Android 규칙은 --incompatible_enable_android_toolchain_resolution

이 기능은 기본적으로 사용 설정되어 있지 않습니다. 그러나 이전은 순조롭게 진행되고 있습니다.

Apple

Bazel의 Apple 규칙은 아직 Apple 도구 모음을 선택하는 플랫폼을 지원하지 않습니다.

또한 플랫폼 지원 C++ 종속 항목을 지원하지 않습니다. 기존 --crosstool_top: C++ 도구 모음을 설정합니다. 이전될 때까지는 플랫폼을 통해 Apple 프로젝트를 플랫폼 지원 C++와 혼합할 수 있음 매핑 ()

다른 언어

새로운 언어에 대한 규칙을 설계하는 경우 플랫폼 사용 해당 언어의 도구 모음을 선택할 수 있습니다. 자세한 내용은 도구 모음 문서를 참조하세요.

select()

프로젝트는 다음에서 select()할 수 있습니다. 타겟이 constraint_value이지만 완료되지 않음 지원합니다 이는 select()가 다양한 API를 지원하도록 의도된 것입니다. 최대한 자동화해야 합니다 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" } 또는 플랫폼 사용 매핑을 변경하여 마이그레이션 과정을 통해 두 스타일을 모두 지원할 수 있도록 합니다. 창

현재 플랫폼 사용 방법

프로젝트를 빌드하거나 크로스 컴파일하려면 참조하세요. 어떤 일이 벌어지고 있는지는 언어 및 프로젝트 플랫폼과 통합하는 방법 및 시기, 플랫폼이 제공하는 가치를 결정합니다.

여러분이 프로젝트, 언어 또는 도구 모음 유지관리자인데 기본적으로 세 가지 옵션이 있습니다. 이전):

  1. '플랫폼 사용' 켜기 플래그 (프로젝트 언어가 하나)하고 필요한 프로젝트가 있는지 확인하기 위해 필요한 모든 테스트를 수행합니다. 일을 하고 있습니다.

  2. 관심 있는 프로젝트가 여전히 --cpu--crosstool_top--platforms와 함께 사용합니다.

    bazel build //:my_mixed_project --platforms==//:myplatform --cpu=... --crosstool_top=...
    

    유지보수 비용이 약간 듭니다 (설정이 올바르게 작동하는지 직접 확인해야 함). 일치). 하지만 탈락자가 없다면 전환을 설정하는 방법을 설명합니다.

  3. 다음과 같이 플랫폼 매핑을 작성하여 두 스타일을 모두 지원합니다. --cpu 스타일 설정을 상응하는 플랫폼에 매핑하거나 그 반대로 매핑해야 합니다.

플랫폼 매핑

플랫폼 매핑은 임시 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 --apple_platform_type=macos" to "//platform:macos".
  --cpu=darwin
  --apple_platform_type=macos
    //platforms:macos

Bazel은 이를 사용하여 플랫폼 기반 및 레거시가 있으며, 다음을 포함하여 빌드 전체에 일관되게 적용됩니다. 전환을 설정하는 방법을 설명합니다.

기본적으로 Bazel은 platform_mappings 파일에서 매핑을 읽고 작업공간 루트를 선택합니다. 또한 --platform_mappings=//:my_custom_mapping

자세한 내용은 여기 를 참조하세요.

질문

이전 일정에 관한 일반적인 지원 및 질문이 있는 경우 다음 연락처로 문의하세요. bazel-discuss@googlegroups.com 또는 해당 규칙의 소유자에게 문의하세요.

플랫폼/도구 모음 API의 설계와 진화에 관한 논의는 연락처 bazel-dev@googlegroups.com으로 제출하세요.

참고 항목