Bazel, çoklu mimari ve çapraz derlenmiş derlemeler için platform ve araç zincirlerini modelleme konusunda gelişmiş destek sunar.
Bu sayfada bu desteğin durumu özetlenmiştir.
Şuna da bakabilirsiniz:
Durum
C++
--incompatible_enable_cc_toolchain_resolution
ayarlandığında C++ kuralları, araç zincirlerini seçmek için platformları kullanır.
Bu, bir C++ projesini aşağıdaki öğelerle 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, Bazel 7.0'da (#7260) varsayılan olarak etkinleştirilecektir.
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'e göz atın.
Android
Android kuralları, --incompatible_enable_android_toolchain_resolution
ayarlandığında araç zincirlerini seçmek için platformları kullanır.
Bu, Android projesini aşağıdaki öğelerle 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şaretleri
kullanmayı deneyebilirsiniz.
Bu, Bazel 7.0'da varsayılan olarak etkinleştirilecektir (#16285).
Android projenizi platformlarla test etmek için Projenizi Taşıma bölümünü inceleyin.
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
- Go kuralları, platformları tam olarak destekler
- Rus 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 ve çapraz derlemeyi hedefleme şeklini standartlaştırmak için platformlar ve araç zincirleri kullanıma sunuldu.
Dil uzmanlarının bunu zaten geçici ve uyumsuz şekillerde yaptığı gözlemi bu duruma ilham verdi. Örneğin, C++ kuralları bir hedef CPU ve araç zinciri tanımlamak için --cpu
ve --crosstool_top
öğelerini kullandı. Bunların ikisi de bir "platform"u
doğru şekilde modellemez. Bu durum tuhaf ve yanlış yapılara neden oldu.
Java, Android ve diğer dillerin kendi flag'leri benzer amaçlar için geliştirildi. Bunların hiçbiri birbiriyle birlikte çalışmadı. Bu da diller arası derlemeleri karmaşık ve karmaşık hale getiriyordu.
Bazel büyük, çok dilli ve çok platformlu projeler için tasarlanmıştır. Bunun için, bu kavramlar için net bir standart API dahil olmak üzere daha ilkeli destek gerekir.
Taşıma ihtiyacı
Yeni API'ye yükseltme işlemi iki işlem gerektirir: API'yi yayınlamak ve API'yi kullanmak için kural mantığını yükseltmek.
İlki tamamlandı ama ikincisi devam ediyor. Bu, dile özgü platformların ve araç zincirlerinin tanımlanmasını, dil mantığının araç zincirlerini --crosstool_top
gibi eski işaretler yerine yeni API aracılığıyla okumasını ve config_setting
'lar eski işaretler yerine yeni API'yi seçmeyi içerir.
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 bu taşıma işlemi devam ediyor.
Hedef
Tüm projeler şu formla derlendiğinde bu taşıma işlemi tamamlanır:
bazel build //:myproject --platforms=//:myplatform
Bu anlama gelir:
- Projenizin kuralları,
//:myplatform
için doğru araç zincirlerini seçiyor. - Projenizin bağımlılıkları
//:myplatform
için doğru araç zincirlerini seçer. //:myplatform
;CPU
,OS
ve dilden bağımsız diğer genel özelliklerin yaygın beyanlarını- Alakalı tüm
select()
öğeleri//:myplatform
ile gerektiği gibi eşleşiyor. //:myplatform
, net ve erişilebilir bir yerde tanımlanır: Platform, projenize özel bir platformsa projenizin deposunda veya tüm tüketen projelerin bulunduğu ortak bir yerde
--cpu
, --crosstool_top
ve --fat_apk_cpu
gibi eski işaretler kullanımdan kaldırılacak ve güvenli bir şekilde en kısa sürede kaldırılacaktır.
Sonuç olarak, mimarileri yapılandırmanın tek yolu bu olacaktır.
Projenizi taşıma
Platformları destekleyen dillerle derleme yaparsanız derlemeniz halihazırda şuna benzer bir çağrıyla çalışır:
bazel build //:myproject --platforms=//:myplatform
Tam ayrıntılar için Durum'a ve dilinize ait dokümanlara bakın.
Bir dilde platform desteğini etkinleştirmek için bir işaret gerekiyorsa 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:
//:myplatform
bulunmalıdır. Farklı projeler farklı makineleri hedeflediğinden, platformları tanımlamak genellikle proje sahibinin sorumluluğundadır. Varsayılan platformlar bölümüne göz atın.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ı
WORKSPACE
veya--extra_toolchains
ile register gerekir.select()
'ler ve yapılandırma geçişleri doğru şekilde çözümlenmelidir. select() ve Geçişler konularına bakın.Derlemeniz platformları destekleyen ve desteklemeyen diller kullanıyorsa eski dillerin yeni API ile çalışmasına yardımcı olmak 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 almak için bize ulaşın.
Varsayılan platformlar
Proje sahipleri, temel olarak derlemek 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
'lerle eşler.
select()
Projeler constraint_value
hedefler üzerinde select()
işlemi gerçekleştirebilir ancak platformları tamamlayamaz. Bu işlem bilinçli olarak yapılmıştır. Dolayısıyla select()
, mümkün olduğunca çok çeşitli makineleri destekler. ARM
'a özgü kaynaklara sahip bir kitaplık, daha ayrıntılı olması 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
uygulamasında 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
anlaşılmı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ı kısımlarını değiştirir. Projenizde --cpu
, --crossstool_top
veya diğer eski işaretleri ayarlayan bir geçiş kullanılıyorsa --platforms
yazan kurallar bu değişiklikleri görmez.
Projenizi platformlara taşırken, taşıma sırasında her iki stili de desteklemek için return { "//command_line_option:cpu": "arm" }
gibi değişiklikleri return {
"//command_line_option:platforms": "//:my_arm_platform" }
biçimine dönüştürmeniz veya platform eşlemelerini kullanmanız gerekir.
Kural grubunuz taşınıyor
Bir kural grubunuz varsa ve platformları desteklemek istiyorsanız şunları yapmanız gerekir:
Kural mantığının araç zincirlerini araç zinciri API'si ile çözmesini sağlayın. Toolchain API'yi (
ctx.toolchains
) inceleyin.İ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 değişimli olarak çözmesi için bir--incompatible_enable_platforms_for_my_language
işareti tanımlayın.Platform bileşenlerini oluşturan ilgili özellikleri tanımlayın. Ortak platform özelliklerini inceleyin
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)
select()
ve yapılandırma geçişlerinin platformları desteklediğinden emin olun. En büyük zorluk bu. 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 boşluğu kapatmak için platform eşlemelerine ihtiyacınız olabilir.
Sık kullanılan platform özellikleri
OS
ve CPU
gibi diller arası yaygın platform özellikleri @platforms
içinde beyan edilmelidir.
Bu, paylaşımı, standartlaştırmayı ve diller arası uyumluluğu teşvik eder.
Kurallarınıza özel özellikler, kuralınızın deposunda belirtilmelidir. Bu sayede, kurallarınızın sorumlu olduğu belirli kavramlar üzerinde açık bir şekilde sahip olabilirsiniz.
Kurallarınız özel amaçlı işletim sistemleri veya CPU'lar kullanıyorsa bunları @platforms
yerine kuralınızın deposunda belirtmeniz gerekir.
Platform eşlemeleri
Platform eşlemeleri, aynı derlemede platforma duyarlı mantığın eski mantıkla birleştirilmesine olanak tanıyan geçici bir API'dir. Bu yalnızca farklı taşıma zaman aralıklarındaki uyumsuzlukları düzeltmek için tasarlanmış künt bir araçtır.
Platform eşlemesi, platform()
öğesinin karşılık gelen bir eski işaret grubuna veya tersine 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, geçişler de dahil olmak üzere derleme boyunca hem platform tabanlı hem de eski tüm ayarların tutarlı bir şekilde uygulanmasını garanti etmek 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
hedeften oluşan bir koleksiyondur:
platform(
name = "myplatform",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
constraint_value
bir makine özelliğidir. Aynı "türün" değerleri 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. Aracın sağlayıcıları bu bilgileri, bu araçlarla derlemesi gereken kurallara iletir.
Araç zincirleri, hedefleyebilecekleri (target_compatible_with = ["@platforms//os:linux"]
) makinelerin constraint_value
'larını ve araçlarının çalabileceği (exec_compatible_with = ["@platforms//os:mac"]
) makineleri 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. Bu, araç zinciri çözünürlüğü olarak bilinir.
Mevcut araç zincirleri grubu, WORKSPACE
bölümüne register_toolchains
ile veya komut satırına --extra_toolchains
ile kaydedilebilir.
Daha fazla bilgiyi burada bulabilirsiniz.
Sorular
Genel destek almak ve taşıma zaman çizelgesiyle ilgili sorular için bazel-caption ile veya ilgili kuralların sahipleriyle iletişime geçin.
Platform/araç zinciri API'lerinin tasarımı ve evrimi ile ilgili tartışmalar için bazel-dev ile iletişime geçin.