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

yeni bir sürüm oluşturun:

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

Bu özellik, Bazel 7.0'da varsayılan olarak etkinleştirilecektir (#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.

Yapay Zeka

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

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

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

--android_crosstool_top, --android_cpu ve --fat_apk_cpu gibi eski işaretler yerine

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

Android projenizi platformlarla test etmek için Projenizi Taşıma bölümüne bakın.

elma

Apple kuralları platformları desteklemez ve henüz destek için planlanmamıştır.

Platform API'lerini Apple derlemeleriyle (örneğin, Apple kuralları ve tamamen C++ ile derleme yaparken) platform eşlemeleri ile kullanmaya devam edebilirsiniz.

Diğer diller

Dil kuralı kümeniz varsa destek eklemek için Kural kümenizi taşıma başlıklı makaleyi inceleyin.

Arka plan

Platformlar ve araç zincirleri, yazılım projelerinin farklı mimarileri hedefleme ve çapraz derleme yöntemlerini standartlaştırmak için kullanıma sunulmuştur.

Dil uzmanlarının bunu zaten geçici ve uyumsuz şekillerde yaptığı gözlemi bu duruma ilham verdi. Örneğin, C++ kuralları hedef bir CPU ve araç seti 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 diller benzer amaçlar için kendi işaretlerini geliştirdi. Bu işaretlerin hiçbiri birbiriyle etkileşime geçmiyordu. Bu da dil farklılığı olan derlemeleri karmaşık ve kafa karıştırıcı hale getiriyordu.

Bazel, büyük, çok dilli, ç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'ye geçiş için iki işlem gerekir: API'yi yayınlama ve kural mantığını API'yi kullanacak şekilde yükseltme.

İlki tamamlandı ancak ikincisi devam ediyor. Bu, dile özgü platformların ve araç zincirlerinin tanımlanmasını, dil mantığının --crosstool_top gibi eski işaretler yerine yeni API üzerinden araç zincirlerini okumasını ve config_setting'ların eski işaretler yerine yeni API'de seçilmesini sağlar.

Bu çalışma basit olsa da her dil için ayrı bir çalışma yapılması ve proje sahiplerine yapılacak değişikliklere karşı test yapmaları için adil bir uyarı yapılması gerekir.

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

Hedef

Tüm projeler aşağıdaki formla oluşturulduğunda 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, CPU, OS ve diğer genel, dile bağlı olmayan mülklere ait ortak bildirimleri referans verir.
  4. Alakalı tüm select() öğeleri //:myplatform ile düzgün şekilde eşleşiyor.
  5. //:myplatform net ve erişilebilir bir yerde tanımlanı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.

Sonunda, mimarileri yapılandırmanın tek yolu bu olacaktır.

Projenizi taşıma

Platformları destekleyen dillerle derleme yapıyorsanız derlemeniz şu gibi bir çağrıyla zaten çalışmalıdır:

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

Ayrıntılı bilgi için Durum'a ve dilinizin belgelerine bakın.

Bir dilin platform desteğini etkinleştirmek için işarete ihtiyacı varsa bu işareti de ayarlamanız gerekir. Ayrıntılar için Durum bölümüne bakın.

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

  1. //:myplatform mevcut olmalıdır. Farklı projeler farklı makineleri hedeflediği için 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. Stok araç zincirleri kullanılıyorsa dil sahipleri, bunların nasıl kaydedileceğine dair talimatları eklemelidir. Kendi özel araç zincirlerinizi yazıyorsanız bunları MODULE.bazel dosyanıza veya --extra_toolchains ile register gerekir.

  3. select()'ler ve yapılandırma geçişleri düzgün şekilde çözülmelidir. select() ve Geçişler konularına 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, geliştirmek istedikleri mimarileri tanımlamak için açık platformlar tanımlamalıdır. Bunlar daha sonra --platforms ile tetiklenir.

--platforms ayarlanmadığında Bazel, varsayılan olarak yerel derleme makinesini temsil eden bir platform değerini alır. Bu kimlik, @platforms//host adresinde otomatik olarak oluşturulur (diğer adıyla @bazel_tools//tools:host_platform) bu nedenle açıkça tanımlanmasına gerek yoktur. Yerel makinenin OS ve CPU öğelerini @platforms içinde tanımlanan constraint_value öğeleriyle eşler.

select()

Projeler constraint_value hedeflerinde select() olabilir ancak platformları tamamlayamaz. 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 şunu kullanın:

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 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 işaretli bölümlerini değiştirir. Projenizde --cpu, --crossstool_top veya diğer eski işaretleri ayarlayan bir geçiş kullanılıyorsa --platforms değerini 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.

Kural kümenizi taşıma

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ı: Taşıma testi sırasında kural mantığının araç zincirlerini yeni API veya --crosstool_top gibi eski işaretler aracılığıyla alternatif olarak çözümlemesi için bir --incompatible_enable_platforms_for_my_language işareti tanımlayın.

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

  4. Standart araç zincirleri tanımlayın ve kuralınızın kayıt talimatlarıyla kullanıcıların bu zincirlere erişebilmesini sağlayın (ayrıntılar)

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

Platformları desteklemeyen kurallarla karıştırmanız gerekiyorsa bu boşluğu doldurmak için platform eşlemelerine ihtiyacınız olabilir.

Ortak platform özellikleri

OS ve CPU gibi dillere dayalı olmayan ortak platform özellikleri @platforms içinde tanımlanmalıdır. 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ızda özel amaçlı işletim sistemleri veya CPU'lar kullanılıyorsa bunlar kuralınızın deposunda @platforms yerine bildirilmelidir.

Platform eşlemeleri

Platform eşlemeleri, platform bilincine sahip mantığın aynı derlemedeki eski mantıkla karışmasına olanak tanıyan geçici bir API'dir. Bu, yalnızca farklı taşıma zaman aralıklarını uyumlu hale getirmek için tasarlanmış basit bir araçtır.

Platform eşleme, platform() ile ilgili eski işaretler grubunun veya bunun tersinin bir eşlemesidir. Ö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, çalışma alanı kökünüzdeki platform_mappings dosyasından eşlemeleri okur. Ayrıca --platform_mappings=//:my_custom_mapping değerini de ayarlayabilirsiniz.

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) bildirir. Sağlayıcıları bu bilgileri, bu araçlarla derlemesi 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 oluştururken derleme makinesinde çalışabilecek ve //:myplatform için ikili programlar oluşturabilecek bir araç zincirini otomatik olarak seçer. Buna araç zinciri çözümü denir.

Kullanılabilir araç zinciri grubu, MODULE.bazel dosyasına register_toolchains ile veya komut satırına --extra_toolchains ile kaydedilebilir.

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 gelişimi hakkında tartışmak için bazel-dev ile iletişime geçin.

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