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=//:myplatformyerine 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_platformyerine --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
- Gitme kuralları, platformları tam olarak destekler.
- Güven kuralları, platformları tam olarak destekler.
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=//:myplatformBu durumda:
- Projenizin kuralları,
//:myplatformiçin doğru araç zincirlerini seçer. - Projenizin bağımlılıkları,
//:myplatformiçin doğru araç zincirlerini seçer. //:myplatformreferansları ortak bildirimlerCPU,OSve diğer jenerik, dilden bağımsız özellikler- Alakalı tüm
select()s,//:myplatformile doğru şekilde eşleşiyor. //: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=//:myplatformKesin 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:
//:myplatformmevcut 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.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.bazeldosyanıza veya--extra_toolchainsile kaydetmeniz gerekir.select()ve yapılandırma geçişleri düzgün şekilde çözümlenmelidir. select() ve Transitions'ı inceleyin.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:
Kural mantığının, Toolchain API ile araç zincirlerini çözmesini sağlayın. Toolchain API (
ctx.toolchains) başlıklı makaleyi inceleyin.İsteğe bağlı:
--incompatible_enable_platforms_for_my_languageişaretini tanımlayın. Böylece kural mantığı, taşıma testi sırasında yeni API veya--crosstool_topgibi eski işaretler aracılığıyla araç zincirlerini alternatif olarak çözer.Platform bileşenlerini oluşturan ilgili özellikleri tanımlayın. Ortak platform özellikleri başlıklı makaleyi inceleyin.
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.
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--platformsokuyamı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.