Platformlara Geçiş

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

Bu sayfada, destek kaydının durumu özetlenmektedir.

Ş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 eski sürümü kullanıyorsanız:

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

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

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.

Android

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

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

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

yerine --android_crosstool_top, --android_cpu ve --fat_apk_cpu gibi eski işaretlerle kullanın.

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

Android projenizi platformlarla test etmek için Projenizi Taşıma başlıklı makaleyi inceleyin.

Apple

Apple kuralları platformları desteklemez ve henüz desteklenmek üzere planlanmamıştır.

Apple derlemeleriyle (ör. platform eşlemeleri ile Apple kuralları ve saf C++ karışımıyla derleme yaparken) platform API'lerini kullanmaya devam edebilirsiniz.

Diğer diller

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

Arka plan

Yazılım projelerinin farklı mimarileri hedefleme ve çapraz derleme yöntemlerini standartlaştırmak için platformlar ve araç zincirleri kullanıma sunuldu.

Bu özellik, dil bakımcılarının bunu zaten geçici ve uyumsuz şekillerde yaptığını gözlemleyerek geliştirildi. Örneğin, C++ kurallarında hedef CPU ve araç zinciri bildirmek için --cpu ve --crosstool_top kullanılıyordu. Bunların hiçbiri "platform"u doğru şekilde modellemiyor. Bu durum, garip ve yanlış derlemelere yol açtı.

Java, Android ve diğer diller benzer amaçlar için kendi işaretlerini geliştirmişti ancak bunlar birbirleriyle birlikte çalışmıyordu. Bu durum, diller arası derlemeleri kafa karıştırıcı ve karmaşık hale getiriyordu.

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

Taşıma ihtiyacı

Yeni API'ye yükseltme işlemi iki aşamada gerçekleştirilir: API'nin yayınlanması ve kural mantığının bu API'yi kullanacak şekilde yükseltilmesi.

Birincisi tamamlandı ancak ikincisi devam ediyor. Bunun için dile özgü platformların ve araç zincirlerinin tanımlanması, dil mantığının araç zincirlerini --crosstool_top gibi eski işaretler yerine yeni API üzerinden okuması ve config_setting'lerin eski işaretler yerine yeni API'de seçilmesi gerekir.

Bu işlem basittir ancak her dil için ayrı bir çaba gerektirir. Ayrıca, proje sahiplerine yaklaşan değişikliklere karşı test yapmaları için yeterli uyarı verilmelidir.

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

Hedef

Bu taşıma işlemi, formla oluşturulan tüm projeler aşağıdaki koşulları karşıladığında tamamlanır:

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

Bu durumda:

  1. Projenizin kuralları, //:myplatform için doğru araç zincirlerini seçer.
  2. Projenizin bağımlılıkları, //:myplatform için doğru araç zincirlerini seçer.
  3. //:myplatform referansları ortak bildirimler CPU, OS ve diğer jenerik, dilden bağımsız özellikler
  4. Alakalı tüm select()s, //:myplatform ile doğru şekilde eşleşiyor.
  5. //:myplatform, açık ve erişilebilir bir yerde tanımlanır: Platform projenize özgü ise projenizin deposunda veya tüm tüketen projelerin bulabileceği ortak bir yerde.

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

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

Projenizi taşıma

Platformları destekleyen dillerle derleme yapıyorsanız derlemeniz şu gibi bir çağırma işlemiyle zaten çalışıyor olmalıdır:

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

Kesin ayrıntılar için Durum ve dilinizdeki dokümanları inceleyin.

Bir dilin platform desteğinin etkinleştirilmesi için işaret gerekliyse bu işareti de ayarlamanız gerekir. 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 mevcut olmalıdır. Farklı projeler farklı makineleri hedeflediğinden platformları tanımlamak genellikle proje sahibinin sorumluluğundadır. Varsayılan platformlar başlıklı makaleyi inceleyin.

  2. Kullanmak istediğiniz araç zincirleri mevcut olmalıdır. Hazır araç zincirleri kullanılıyorsa dil sahipleri, bunları kaydetme talimatlarını eklemelidir. Kendi özel araç zincirlerinizi yazıyorsanız bunları MODULE.bazel dosyanıza veya --extra_toolchains ile kaydetmeniz gerekir.

  3. select() ve yapılandırma geçişleri düzgün şekilde çözümlenmelidir. select() ve Transitions'ı inceleyin.

  4. Derlemenizde platformları destekleyen ve desteklemeyen diller varsa eski dillerin yeni API ile çalışmasına yardımcı olmak için platform eşlemeleri yapmanız gerekebilir. Ayrıntılar için Platform eşlemeleri başlıklı makaleyi inceleyin.

Sorun yaşamaya devam ederseniz destek için iletişime geçin.

Varsayılan platformlar

Proje sahipleri, oluşturmak istedikleri mimarileri tanımlamak için açık platformlar belirlemelidir. Bunlar daha sonra --platforms ile tetiklenir.

--platforms ayarlanmadığında Bazel, yerel derleme makinesini temsil eden bir platform değerini varsayılan olarak kullanır. Bu, @platforms//host (@bazel_tools//tools:host_platform olarak takma adlandırılır) konumunda otomatik olarak oluşturulur. Bu nedenle, açıkça tanımlamanıza gerek yoktur. Yerel makinenin OS ve CPU değerlerini, @platforms içinde belirtilen constraint_value değerleriyle eşler.

select()

Projeler select() constraint_value hedeflerinde ancak platformlarda tamamlanamaz. Bu, select()'nın mümkün olduğunca çok sayıda makineyi desteklemesi için kasıtlı olarak yapılmıştır. ARM'ye özel kaynakların bulunduğu bir kitaplık, daha spesifik 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 üzerinde seçim yapmaya eşdeğerdir:

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

Daha fazla bilgiyi burada bulabilirsiniz.

--cpu, --crosstool_top vb. yerlerdeki select'lar --platforms'ı anlamıyor. Projenizi platformlara taşırken bunları constraint_values biçimine dönüştürmeniz veya taşıma sırasında her iki stili de desteklemek için platform eşlemelerini kullanmanız gerekir.

Geçişler

Starlark geçişleri, derleme grafiğinizin bazı bölümlerindeki işaretleri değiştirir. Projenizde --cpu, --crossstool_top veya diğer eski işaretleri ayarlayan bir geçiş kullanılıyorsa --platforms okuyan kurallar bu değişiklikleri görmez.

Projenizi platformlara taşırken return { "//command_line_option:cpu": "arm" } gibi değişiklikleri return { "//command_line_option:platforms": "//:my_arm_platform" } olarak dönüştürmeniz veya taşıma sırasında her iki stili de desteklemek için platform eşlemelerini kullanmanız gerekir. window.

Kural kümenizi taşıma

Bir kural grubunuz varsa ve platformları desteklemek istiyorsanız:

  1. Kural mantığının, Toolchain API ile araç zincirlerini çözmesini sağlayın. Toolchain API (ctx.toolchains) başlıklı makaleyi inceleyin.

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

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

  4. Standart araç zincirleri tanımlayın ve bunları kuralınızın kayıt talimatları (ayrıntılar) aracılığıyla kullanıcılara erişilebilir hâle getirin.

  5. select()s ve yapılandırma geçişlerinin platformları desteklediğinden emin olun. Bu, en büyük zorluktur. Bu durum, özellikle çok dilli projelerde zordur (tüm diller --platforms okuyamıyorsa proje başarısız olabilir).

Platformları desteklemeyen kurallarla karıştırmanız gerekiyorsa aradaki farkı kapatmak için platform eşlemeleri kullanmanız gerekebilir.

Yaygın platform özellikleri

OS ve CPU gibi yaygın, diller arası platform özellikleri @platforms içinde bildirilmelidir. Bu, paylaşımı, standardizasyonu ve diller arası uyumluluğu teşvik eder.

Kurallarınıza özgü özellikler, kuralınızın deposunda bildirilmelidir. Bu sayede, kurallarınızın sorumlu olduğu belirli kavramlar üzerinde net bir sahiplik sürdürebilirsiniz.

Kurallarınızda özel amaçlı işletim sistemleri veya CPU'lar kullanılıyorsa bunlar @platforms yerine kuralınızın deposunda bildirilmelidir.

Platform eşlemeleri

Platform eşlemeleri, platformdan haberdar mantığın aynı derlemede eski mantıkla karışmasına olanak tanıyan geçici bir API'dir. Bu, yalnızca farklı taşıma zaman aralıklarıyla uyumsuzlukları gidermek için tasarlanmış basit bir araçtır.

Platform eşlemesi, platform() ile karşılık gelen bir eski işaretler kümesi arasındaki veya bunun tersi yöndeki eşlemedir. Ö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 eski tüm ayarların, geçişler de dahil olmak üzere derleme boyunca tutarlı bir şekilde uygulanmasını sağlamak için bu bilgiyi kullanır.

Bazel, varsayılan olarak eşlemeleri çalışma alanınızın kökündeki platform_mappings dosyasından okur. --platform_mappings=//:my_custom_mapping da ayarlayabilirsiniz.

Ayrıntılar için platform eşlemeleri 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 özelliğidir. 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, Starlark kuralıdır. Özellikleri, bir dilin araçlarını (ör. compiler = "//mytoolchain:custom_gcc") bildirir. Sağlayıcıları, bu bilgileri bu araçlarla oluşturulması gereken kurallara iletir.

Araç zincirleri, constraint_value'ları hedefleyebilecekleri (target_compatible_with = ["@platforms//os:linux"]) ve araçlarının üzerinde çalışabileceği (exec_compatible_with = ["@platforms//os:mac"]) makineler olarak bildirir.

$ bazel build //:myproject --platforms=//:myplatform oluşturulurken Bazel, derleme makinesinde çalışabilen ve //:myplatform için ikili dosyalar oluşturabilen bir araç zincirini otomatik olarak seçer. Bu işleme toolchain çözümü adı verilir.

Kullanılabilir araç zincirleri kümesi, MODULE.bazel dosyasında register_toolchains ile veya komut satırında --extra_toolchains ile kaydedilebilir.

Daha fazla bilgi için burayı ziyaret edin.

Sorular

Genel destek ve taşıma zaman çizelgesiyle ilgili sorularınız için bazel-discuss veya uygun kuralların sahipleriyle iletişime geçin.

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

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