Platformlara Geçiş

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bazel, modelleme için gelişmiş destek sunuyor platformlar ve araç zincirleri: çoklu mimari ve derlemelerini kullanabilirsiniz.

Bu sayfada bu desteğin durumu özetlenmiştir.

Şuna da bakabilirsiniz:

Durum

C++

C++ kuralları, aşağıdaki durumlarda araç zincirlerini seçmek için platformları kullanır: --incompatible_enable_cc_toolchain_resolution ayarlandı.

Bu, bir C++ projesini aşağıdaki öğelerle yapılandırabileceğiniz anlamına gelir:

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

yeni bir sürüm oluşturun:

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

Bu, Bazel 7.0'da (#7260) varsayılan olarak etkinleştirilecektir.

C++ projenizi platformlarla test etmek için şuraya bakın: Projenizi Taşıma ve C++ araç zincirlerini yapılandırma.

Java

Java kuralları, araç zincirlerini seçmek için platformları kullanır.

Bu, eski --java_toolchain, --host_java_toolchain ve --javabase ve --host_javabase.

Ayrıntılar için Java ve Bazel'e göz atın.

Android

Android kuralları, aşağıdaki durumlarda araç zincirlerini seçmek için platformları kullanır: --incompatible_enable_android_toolchain_resolution ayarlandı.

Bu, Android projesini aşağıdaki öğelerle yapılandırabileceğiniz anlamına gelir:

bazel build //:my_android_project --android_platforms=//:my_android_platform

Bunun yerine --android_crosstool_top, --android_cpu, ve --fat_apk_cpu.

Bu, Bazel 7.0'da varsayılan olarak etkinleştirilecektir (#16285).

Android projenizi platformlarla test etmek için şuraya bakın: Projenizi Taşıma.

elma

Apple kuralları platformları desteklemez ve henüz planlanmamıştır adresinden iletişime geçebilirsiniz.

Platform API'lerini Apple derlemeleriyle kullanmaya devam edebilirsiniz (örneğin, Apple kuralları ve yalnızca C++ ile birlikte) platformu eşleme öğeleri için de kullanılabilir.

Diğer diller

Bir dil kuralı grubunuz varsa eklemek için Kural grubunuzu taşıma başlıklı makaleyi inceleyin destek.

Arka plan

Yazılımların Google Haberler'deki performansını standartlaştırmak için platformlar ve araç zincirleri farklı mimarileri ve çapraz derlemeyi hedefler.

Bu ilham dil geliştiricilerinin bunu reklamlarda zaten yaptığı gözlemine göre farklı şekillerde kullanabilirsiniz. Örneğin, C++ kuralları --cpu ve Hedef CPU ve araç zinciri tanımlamak için --crosstool_top. Bunların ikisi de "platform" modelini doğru şekilde modeller. Bu durum tuhaf ve yanlış yapılara neden oldu.

Java, Android ve diğer dillerin benzer amaçlar için kendi flag'leri geliştirildi. ve hiçbiri birbiriyle birlikte çalışmamalıdır. Böylece diller arası derlemeler kafa karıştırıcı ve karmaşık.

Bazel büyük, çok dilli ve çok platformlu projeler için tasarlanmıştır. Bu bu kavramlar için daha ilkeli destek gerektiriyor; standart API'dir.

Taşıma ihtiyacı

Yeni API'ya geçmek için iki işlem yapmanız gerekir: API'yi yayınlama ve yeni sürüme geçme. kural mantığına göre hareket eder.

İlki tamamlandı ama ikincisi devam ediyor. Bu süreç, projenin dile özgü platformlar ve araç zincirleri tanımlanır, dil mantığı --crosstool_top gibi eski flag'ler yerine yeni API üzerinden araç zincirleri ve config_setting öğeleri, eski flag'ler yerine yeni API'yi seçer.

Bu çalışma basittir ancak her dil için ayrı bir çalışma gerektirir. Ayrıca proje sahiplerine yapılacak değişiklikleri test etmeleri için adil uyarıda da bulunur.

Bu nedenle bu taşıma işlemi devam ediyor.

Hedef

Tüm projeler şu formla derlendiğinde bu taşıma işlemi tamamlanır:

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

Bu anlama gelir:

  1. Projenizin kuralları, //:myplatform için doğru araç zincirlerini seçiyor.
  2. Projenizin bağımlılıkları //:myplatform için doğru araç zincirlerini seçer.
  3. //:myplatform referans ortak bildirimler CPU, OS ve dilden bağımsız diğer genel mülklerden
  4. Alakalı tüm select() öğeleri //:myplatform ile gerektiği gibi eşleşiyor.
  5. //:myplatform açıkça ve erişilebilir bir yerde, yani projenizin projenize özgü bir depo veya tek bir ortak yer olması ihtiyacı olan projelere

--cpu, --crosstool_top ve --fat_apk_cpu gibi eski flag'ler kullanımdan kaldırılır ve güvenli olan en kısa sürede kaldırılır.

Sonuç olarak, mimarileri yapılandırmanın tek yolu bu olacaktır.

Projenizi taşıma

Platformları destekleyen dillerle derleme yaparsanız derlemeniz şuna benzer bir çağrıyla çalış:

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

Tam ayrıntılar için Durum'a ve dilinize ait dokümanlara bakın.

Bir dilde platform desteğini etkinleştirmek için bir bayrak gerekiyorsa ayrıca seçeceğim. Ayrıntılar için Durum bölümüne bakın.

Projenizin oluşturulması için aşağıdakileri kontrol etmeniz gerekir:

  1. //:myplatform bulunmalıdır. Bu genellikle proje sahibinin sorumluluğudur farklı projelerin farklı makineleri hedeflediğinden platformları tanımlamak önemlidir. Varsayılan platformlar'a göz atın.

  2. Kullanmak istediğiniz araç zincirleri mevcut olmalıdır. Stok araç zincirleri kullanıyorsanız dil sahiplerinin nasıl kaydedileceğine ilişkin talimatları eklemesi gerekir. Eğer özel araç zincirlerinizi kendiniz yazarken kaydettirmeniz gerekir. MODULE.bazel dosyası veya --extra_toolchains ile.

  3. select() öğeleri ve yapılandırma geçişleri çözer. select() ve Geçişler konularına bakın.

  4. Derlemeniz platformları destekleyen ve desteklemeyen diller içeriyorsa eski dillerin yeni API ile çalışmasına yardımcı olmak için platform eşlemeleri gerekmektedir. Ayrıntılar için Platform eşlemeleri bölümüne bakın.

Sorun yaşamaya devam ederseniz destek almak için bize ulaşın.

Varsayılan platformlar

Proje sahipleri, platformlar temel atılımlar yapmaktır. Bunlar daha sonra --platforms ile tetiklenir.

--platforms ayarlanmadığında Bazel, varsayılan olarakplatform yerel derleme makinesidir. Bu, @platforms//host adresinde otomatik olarak oluşturuldu (diğer adıyla @bazel_tools//tools:host_platform) net bir şekilde tanımlanmasına gerek yoktur. Yerel makinenin OS eşler ve CPU ile constraint_value @platforms.

select()

Projeler şurada select(): constraint_value hedef ancak tamamlanmadı platformlar. Bu bilinçli bir uygulamadır. Bu nedenle select(), çok çeşitli mümkün olduğunca çok makine çevirisidir. ARM'a özel kaynaklara sahip bir kitaplık tüm erişim düzeylerini desteklemelidir Daha açık bir şekilde belirtmek için bir neden olmadığı sürece ARM destekli makinelere izin verilir.

Bir veya daha fazla constraint_value seçmek için şunu kullanın:

config_setting(
    name = "is_arm",
    constraint_values = [
        "@platforms//cpu:arm",
    ],
)

Bu, geleneksel olarak --cpu uygulamasında seçim yapmaya eşdeğerdir:

config_setting(
    name = "is_arm",
    values = {
        "cpu": "arm",
    },
)

Daha fazla bilgiyi burada bulabilirsiniz.

--cpu, --crosstool_top vb. üzerindeki select'lar --platforms anlaşılmıyor. Projenizi platformlara taşırken ya da mevcut bir projeniz için Desteklemek için constraint_values veya platform eşlemelerini kullanın iki stili de taşıyabilirsiniz.

Geçişler

Starlark geçişleri değişikliği yapı grafiğinizin bazı bölümlerini işaretler. Projeniz, RACI matrisinde --cpu, --crossstool_top veya diğer eski işaretleri, --platforms bu değişiklikleri görmeyecek.

Projenizi platformlara taşırken ya da mevcut bir projeniz için return { "//command_line_option:cpu": "arm" } - return { "//command_line_option:platforms": "//:my_arm_platform" } veya platformu kullanın eşlemelerini kullanın. penceresini kapatın.

Kural grubunuz taşınıyor

Bir kural grubunuz varsa ve platformları desteklemek istiyorsanız şunları yapmanız gerekir:

  1. Kural mantığının araç zincirlerini araç zinciri API'si ile çözmesini sağlayın. Görüntüleyin toolchain API'sini (ctx.toolchains) kullanabilirsiniz.

  2. İsteğe bağlı: Böylece bir --incompatible_enable_platforms_for_my_language işareti tanımlayın kural mantığı, araç zincirlerini alternatif olarak yeni API veya eski flag'ler aracılığıyla çözer. taşıma testi sırasında --crosstool_top gibi.

  3. Platform bileşenlerini oluşturan ilgili özellikleri tanımlayın. Görüntüleyin Ortak platform özellikleri

  4. Standart araç zincirleri tanımlayın ve bunların kuralın kayıt talimatları (ayrıntılar)

  5. select() ve yapılandırma geçişlerini destekleme platformlarını kullanın. Bu, en büyük zorluk. Çok dilli projelerde çalışmak daha zordur. (tüm diller --platforms dilinde okuyamazsa bu işlem başarısız olabilir).

Platformları desteklemeyen kurallarla bir arada kullanmanız gerekiyorsa platform eşlemelerini kullanabilirsiniz.

Sık kullanılan platform özellikleri

OS ve CPU gibi yaygın olarak kullanılan diller arası platform mülkleri @platforms genelinde belirtilmiş. Bu, paylaşımı, standartlaştırmayı ve diller arası uyumluluğu teşvik eder.

Kurallarınıza özel özellikler, kuralınızın deposunda belirtilmelidir. Bu kurallarınızın kapsamına giren belirli kavramlar üzerinde net bir şekilde sahip olmanıza olanak tanır. çok önemli.

Kurallarınız özel amaçlı işletim sistemi veya CPU kullanıyorsa bunlar kuralın deposu ve @platforms.

Platform eşlemeleri

Platform eşlemeleri, platforma duyarlı mantığın mantığını kullanıyor. Bu, yalnızca farklı taşıma zaman aralıklarında sorunsuz uyumsuzluklar yaşarsınız.

Platform eşlemesi, bir platform() ile bir karşılık gelen eski işaretleri gösterir. Örneğin:

platforms:
  # Maps "--platforms=//platforms:ios" to "--ios_multi_cpus=x86_64 --apple_platform_type=ios".
  //platforms:ios
    --ios_multi_cpus=x86_64
    --apple_platform_type=ios

flags:
  # Maps "--ios_multi_cpus=x86_64 --apple_platform_type=ios" to "--platforms=//platforms:ios".
  --ios_multi_cpus=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, hem platform tabanlı hem de güvenli tüm ayarları garantilemek için bunu kullanır derleme boyunca tutarlı bir şekilde uygulanır. geçişlerini görebilirsiniz.

Varsayılan olarak Bazel,platform_mappings çalışma alanı kökü. Ayrıca, --platform_mappings=//:my_custom_mapping

Ayrıntılar için platform eşleme tasarımına bakın.

API incelemesi

platform, constraint_value hedef:

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

constraint_value, bir makinenin Aynı "nazik" değerler ortak bir tema altında gruplandırılır constraint_setting:

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

toolchain bir Starlark kuralıdır. Bu özellikleri bir dilin araçlarını (compiler = "//mytoolchain:custom_gcc" gibi) bildirir. Sağlayıcılar kartı bu araçlarla geliştirmesi gereken kurallara

Araç zincirleri, ulaşabilecekleri makinelerin constraint_value'larını hedef (target_compatible_with = ["@platforms//os:linux"]) kadar iyi performans gösteren çalıştır (exec_compatible_with = ["@platforms//os:mac"]).

$ bazel build //:myproject --platforms=//:myplatform inşa edilirken, Bazel derleme makinesinde çalışabilecek bir araç zincirini otomatik olarak seçer ve //:myplatform için ikili programlar oluşturun. Bu, araç zinciri çözünürlüğü olarak bilinir.

Kullanılabilir araç zincirleri grubu, MODULE.bazel dosyasına kaydedilebilir register_toolchains ile veya komut satırını --extra_toolchains ile değiştirin.

Daha fazla bilgiyi burada bulabilirsiniz.

Sorular

Genel destek almak ve taşıma zaman çizelgesiyle ilgili sorularınız için şurayla iletişime geçin: bazel-CONVERSATION veya uygun kuralların sahipleri.

Platform/araç zinciri API'lerinin tasarımı ve evrimi ile ilgili tartışmalar için bazel-dev ile iletişime geçin.

Aşağıdaki kaynakları da incelemenizi öneririz: