Platformlara Geçiş

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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ğıdaki özelliklerle yapılandırabileceğiniz anlamına gelir:

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

yerine eski sürüm:

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 şekilde 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ştirilecek (#16285).

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

elma

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

Apple derlemeleriyle (ör. Apple kuralları ve saf C++ karışımıyla derleme yaparken) platform eşlemeleri ile 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ı hedef CPU ve araç zinciri bildirmek için --cpu ve --crosstool_top kullanı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 bu işaretlerin hiçbiri birbiriyle birlikte çalışmıyordu. Bu durum, farklı dillerdeki 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. Bu, dile özgü platformların ve araç zincirlerinin tanımlanmasını, dil mantığının eski işaretler yerine yeni API aracılığıyla araç zincirlerini okumasını (ör. --crosstool_top) ve eski işaretler yerine yeni API'de config_settings seçilmesini içerir.

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, CPU, OS ve diğer jenerik, dilden bağımsız özelliklerin ortak bildirimlerine atıfta bulunuyor.
  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 ve silinecek.

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ümanlara bakın.

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ı olması için platform eşlemeleri gerekebilir. Ayrıntılar için Platform eşlemeleri başlıklı makaleyi inceleyin.

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

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 platform değerini varsayılan olarak kullanır. Bu, @platforms//host (@bazel_tools//tools:host_platform olarak adlandırılır) konumunda otomatik olarak oluşturulduğundan açıkça tanımlanması gerekmez. 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'e ö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. cihazlardaki select, --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 kümenizin sahibiyseniz 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 select()s platformlarının desteklendiğinden emin olun. En büyük zorluk budur. Bu durum, özellikle çok dilli projelerde zordur (--platforms, tüm dillerde okunamı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.

Ortak 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 sağlayabilirsiniz.

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 "--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 de dahil olmak üzere derleme boyunca tutarlı bir şekilde uygulanmasını sağlamak için bu özelliği kullanır.

Bazel, varsayılan olarak çalışma alanınızın kök dizinindeki platform_mappings dosyasından eşlemeleri okur. Ayrıca --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 hedef 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 makinelerinin hedefleyebileceği (target_compatible_with = ["@platforms//os:linux"]) ve araçlarının çalışabileceği (exec_compatible_with = ["@platforms//os:mac"]) makineleri 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 için bazel-discuss ile 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: