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
yerine:
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'e göz atın.
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 özellik, Bazel 7.0'da varsayılan olarak etkinleştirilecektir (#16285).
Android projenizi platformlarla test etmek için Projenizi Taşıma başlıklı makaleyi inceleyin.
elma
Apple kuralları platformları desteklemez ve henüz destek için planlanmamıştır.
Platform API'lerini Apple derlemeleriyle (ör. Apple kuralları ve saf C++ karışımıyla derleme yaparken) platform eşlemeleriyle kullanmaya devam edebilirsiniz.
Diğer diller
- Go kuralları, platformları tam olarak destekler
- Rust kuralları platformları tam olarak destekler.
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.
Bu, dil koruyucuların bunu zaten gelişigüzel ve uyumsuz yöntemlerle yaptığı gözleminden ilham almıştır. Ö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 tuhaf ve yanlış yapılara 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 diller arası derlemeleri karmaşık ve karmaşık hale getiriyordu.
Bazel, büyük, çok dilli, ç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 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 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, 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:
- Projenizin kuralları,
//:myplatform
için doğru araç zincirlerini seçer. - Projenizin bağımlılıkları,
//:myplatform
için doğru araç zincirlerini seçer. //:myplatform
,CPU
,OS
ve diğer genel, dile bağlı olmayan mülklere ait ortak bildirimleri referans verir.- Alakalı tüm
select()
öğeleri//:myplatform
ile düzgün şekilde eşleşiyor. //: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.
Sonuç olarak, 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:
//: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.Kullanmak istediğiniz araç zincirleri mevcut olmalıdır. Standart araç zincirleri kullanılıyorsa dil sahipleri, bu araç zincirlerinin nasıl kaydedileceğine dair talimatlar eklemelidir. Kendi özel araç zincirlerinizi yazıyorsanız bunları
WORKSPACE
'nize veya--extra_toolchains
'e register gerekir.select()
'ler ve yapılandırma geçişleri düzgün şekilde çözülmelidir. select() ve Geçişler'e bakın.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, temel olarak derlemek istedikleri mimarileri tanımlamak için açık platformlar tanımlamalıdır. Ardından bu etkinlikler --platforms
ile tetiklenir.
--platforms
ayarlanmadığında Bazel, yerel derleme makinesini temsil eden bir platform
değerini varsayılan olarak kullanır. Bu, @platforms//host
'te otomatik olarak oluşturulur (@bazel_tools//tools:host_platform
olarak adlandırılır) olduğundan açıkça tanımlamanız gerekmez. 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:
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 taşıma sırasında her iki stili de desteklemek için bunları constraint_values
olarak dönüştürmeniz veya 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
Kural kümeniz varsa ve platformları desteklemek istiyorsanız:
Kural mantığının, araç zincirlerini araç zinciri API'siyle çözmesini sağlayın. Toolchain API'ye (
ctx.toolchains
) bakın.İ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.Platform bileşenlerini oluşturan alakalı ö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. 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 diller arası yaygın platform özellikleri @platforms
içinde beyan edilmelidir.
Bu, paylaşımı, standartlaştırmayı ve dillerin uyumluluğunu 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 net bir şekilde sahip olabilirsiniz.
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, 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ı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ü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
, Starlark kuralı'dır. Özellikleri, bir dilin araçlarını (compiler =
"//mytoolchain:custom_gcc"
gibi) tanımlar. Sağlayıcıları bu bilgileri, bu araçlarla oluşturulması 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ç zincirleri grubu, WORKSPACE
bölümüne register_toolchains
ile veya komut satırına --extra_toolchains
ile kaydedilebilir.
Daha fazla bilgi için burayı ziyaret edin.
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.