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=//: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 kullanmayı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.
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
- Rust 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 nasıl hedeflediğini ve çapraz derlemeyi 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 bunlar birbirleriyle birlikte çalışmıyordu. Bu durum, farklı dillerdeki derlemelerin kafa karıştırıcı ve karmaşık olmasına neden oluyordu.
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 için iki adım gerekir: API'yi yayınlama ve kural mantığını bu API'yi kullanacak şekilde yükseltme.
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 önceden uyarıda bulunulmalıdır.
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 şu anlama gelir:
- Projenizin kuralları,
//:myplatformiçin doğru araç zincirlerini seçer. - Projenizin bağımlılıkları,
//:myplatformiçin doğru araç zincirlerini seçer. //:myplatform,CPU,OSve diğer jenerik, dilden bağımsız özelliklerin ortak bildirimlerine referans veriyor- 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 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=//: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. Stok 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 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 bir platform değerini varsayılan olarak kullanır. Bu, @platforms//host (@bazel_tools//tools:host_platform olarak adlandırılır) tarafından 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 tam 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. üzerindeki 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'ye (
ctx.toolchains) bakın.İsteğe bağlı: Kural mantığının, taşıma testi sırasında yeni API veya
--crosstool_topgibi eski işaretler aracılığıyla araç zincirlerini alternatif olarak çözmesi için bir--incompatible_enable_platforms_for_my_languageişareti tanımlayın.Platform bileşenlerini oluşturan ilgili özellikleri tanımlayın. Yaygın 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. En büyük zorluk budur. Bu durum, özellikle çok dilli projeler için zorlayıcıdır (tüm diller--platformsokuyamazsa proje başarısız olabilir).
Platformları desteklemeyen kurallarla karıştırmanız gerekiyorsa aradaki farkı kapatmak için platform eşlemeleri yapmanı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 sağlayabilirsiniz.
Kurallarınızda özel amaçlı işletim sistemleri veya CPU'lar kullanılıyorsa bunlar kuralınızın deposunda bildirilmelidir.
@platforms.
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 ilgili 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 özelliği 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 ç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ü denir.
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 buraya bakın.
Sorular
Genel destek ve taşıma zaman çizelgesiyle ilgili sorularınız 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.