Platformlara Geçiş

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel, çok mimarili ve çapraz derlenmiş derlemeler için platformları ve araç zincirlerini modelleme konusunda gelişmiş desteğe sahiptir.

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

Şuna da bakabilirsiniz:

Durum

C++

C++ kuralları, --incompatible_enable_cc_toolchain_resolution ayarlandığında araç zincirlerini seçmek için platformları kullanır.

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

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

yerine:

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 Projenizi Taşıma ve C++ araç zincirlerini yapılandırma başlıklı makaleleri inceleyin.

Java

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

Bu, eski --java_toolchain, --host_java_toolchain, --javabase ve --host_javabase işaretlerinin yerini alır.

Ayrıntılar için Java ve Bazel başlıklı makaleyi inceleyin.

Yapay Zeka

Android kuralları, --incompatible_enable_android_toolchain_resolution ayarlandığında araç zincirlerini seçmek için platformları kullanır.

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 özellik, 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 (ör. Apple kuralları ve saf C++ karışımıyla derleme yaparken) platform eşlemeleriyle kullanmaya devam edebilirsiniz.

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 bakımı uzmanlarının bunu reklamlarda zaten yaptığı gözlemine göre farklı şekillerde kullanabilirsiniz. Örneğin, C++ kuralları hedef bir CPU ve araç zinciri tanımlamak için --cpu ve --crosstool_top kullanırdı. Bu iki yöntem de "platform"u doğru şekilde modellemez. Bu durum, garip ve yanlış derlemelere 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. Bu da dil farklılığı olan derlemeleri karmaşık ve kafa karıştırıcı hale getiriyordu.

Bazel büyük, çok dilli ve çok platformlu projeler için tasarlanmıştır. Bu nedenle, net bir standart API de dahil olmak üzere bu kavramlar için daha ilkeli bir destek gerekiyor.

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 işlem basittir ancak her dil için ayrı bir çalışma gerektirir. Ayrıca proje sahiplerinin yaklaşan değişikliklere karşı test yapmaları için yeterli uyarıda bulunulmalıdır.

Bu nedenle, taşıma işlemi devam etmektedir.

Hedef

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

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

Bu, aşağıdakileri ifade eder:

  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 net ve erişilebilir bir yerde tanımlanmalıdır: Platform projenize özgüyse projenizin deposunda veya tüm tüketici projelerinin bulabileceği ortak bir yerde

--cpu, --crosstool_top ve --fat_apk_cpu gibi eski işaretler kullanımdan kaldırılacak ve güvenli olduğunda kaldırılacak.

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 bölümüne 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 derlenmesi 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. Standart araç zincirleri kullanılıyorsa dil sahipleri, bu araç zincirlerinin nasıl kaydedileceğine dair talimatlar eklemelidir. Eğer özel araç zincirlerinizi kendiniz yazarken kaydettirmeniz gerekir. WORKSPACE veya --extra_toolchains ile.

  3. select()'ler ve yapılandırma geçişleri düzgün şekilde çözülmelidir. select() ve Geçişler'e bakın.

  4. Derlemenizde platformları destekleyen ve desteklemeyen diller varsa eski dillerin yeni API ile çalışması için platform eşlemelerine ihtiyacınız olabilir. Ayrıntılar için Platform eşlemeleri bölümüne bakın.

Sorun yaşamaya devam ederseniz destek 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, @local_config_platform//:host tarihinde otomatik olarak oluşturuldu bu nedenle tanımlamaya gerek yoktur. Yerel makinenin OS eşler ve CPU ile constraint_value @platforms.

select()

Projeler şurada select(): constraint_value hedef ancak tamamlanmadı platformlar. Bu, select()'ün mümkün olduğunca çok sayıda makineyi desteklemesi için tasarlanmıştır. ARM'ye özel kaynaklar içeren bir kitaplık, daha ayrıntılı belirtmek için bir neden olmadığı sürece tüm ARM destekli makineleri desteklemelidir.

Bir veya daha fazla constraint_value seçmek için:

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

Bu, geleneksel olarak --cpu'te seçim yapmanıza eşdeğerdir:

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

Daha fazla bilgiyi burada bulabilirsiniz.

--cpu, --crosstool_top vb. cihazlardaki select'ler --platforms'ı anlamı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, derleme grafiğinizin işaretlenmiş bölümlerini değiştirir. 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

Kural kümeniz varsa ve platformları desteklemek istiyorsanız:

  1. Kural mantığının araç zincirlerini araç zinciri API'si ile çözmesini sağlayın. Toolchain API'ye (ctx.toolchains) bakın.

  2. İsteğe bağlı: Kural mantığının, taşıma testi sırasında araç zincirlerini yeni API veya --crosstool_top gibi eski işaretler aracılığıyla dönüşümlü olarak çözmesi için bir --incompatible_enable_platforms_for_my_language işareti tanımlayın.

  3. Platform bileşenlerini oluşturan ilgili özellikleri tanımlayın. Yaygın platform özellikleri başlıklı makaleyi inceleyin.

  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şlerinin platformları desteklediğinden emin olun. Bu, en büyük zorluk. Bu, özellikle çok dilli projeler için zordur (tüm diller --platforms'yi okuyamazsa 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 özgü özellikler, kuralınızın deposunda belirtilmelidir. Bu sayede, kurallarınızın sorumlu olduğu belirli kavramlar üzerinde net bir sahiplik elde edebilirsiniz.

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 "--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, hem platform tabanlı hem de eski tüm ayarların geçişler dahil olmak üzere derleme boyunca tutarlı bir şekilde uygulanmasını sağlamak için bunu kullanır.

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 hedeflerinin bir koleksiyonudur:

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

constraint_value, makine mülküdür. Aynı "tür"deki değerler ortak bir constraint_setting altında gruplandırılır:

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

toolchain bir Starlark kuralıdır. Özellikleri, bir dilin araçlarını (compiler = "//mytoolchain:custom_gcc" gibi) tanımlar. Sağlayıcıları bu bilgileri, bu araçlarla oluşturulması gereken kurallara iletir.

Araç zincirleri, hedefleyebilecekleri (target_compatible_with = ["@platforms//os:linux"]) ve araçlarının çalıştırılabileceği (exec_compatible_with = ["@platforms//os:mac"]) makinelerin constraint_value'lerini belirtir.

Bazel, $ bazel build //:myproject --platforms=//:myplatform'ü derlediğinde derleme makinesinde çalışabilecek ve //:myplatform için ikili dosyalar derleyebilecek bir araç zinciri otomatik olarak seçer. Buna araç zinciri çözümü denir.

Kullanılabilir araç zincirleri grubu, WORKSPACE öğesinde şununla kaydedilebilir: register_toolchains veya komut satırını --extra_toolchains ile değiştirin.

Daha fazla bilgiyi burada bulabilirsiniz.

Sorular

Taşıma zaman çizelgesi hakkında genel destek ve sorular için bazel-discuss ile veya ilgili kuralların sahipleriyle iletişime geçin.

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: