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=//:myplatform
yerine eski sürüm:
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 şekilde 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şaretlerle kullanı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.
elma
Apple kuralları platformları desteklemez ve henüz desteklenmek üzere planlanmamıştır.
Apple derlemeleriyle (ör. Apple kuralları ve saf C++ karışımıyla derleme yaparken) platform eşlemeleri ile 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ı 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 bu işaretlerin hiçbiri birbiriyle birlikte çalışmıyordu. Bu durum, farklı dillerdeki 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. Bu, dile özgü platformların ve araç zincirlerinin tanımlanmasını, dil mantığının eski işaretler yerine yeni API aracılığıyla araç zincirlerini okumasını (ör. --crosstool_top
) ve eski işaretler yerine yeni API'de config_setting
s seçilmesini içerir.
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=//:myplatform
Bu durumda:
- 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 jenerik, dilden bağımsız özelliklerin ortak bildirimlerine atıfta bulunuyor.- Alakalı tüm
select()
s,//:myplatform
ile 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=//:myplatform
Kesin ayrıntılar için Durum ve dilinizdeki dokümanlara bakın.
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:
//:myplatform
mevcut 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.bazel
dosyanıza veya--extra_toolchains
ile 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ı olması için platform eşlemeleri 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 platform
değerini varsayılan olarak kullanır. Bu, @platforms//host
(@bazel_tools//tools:host_platform
olarak adlandırılır) konumunda 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 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
'e ö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. cihazlardaki select
, --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 kümenizin sahibiyseniz 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_language
işaretini tanımlayın. Böylece kural mantığı, taşıma testi sırasında yeni API veya--crosstool_top
gibi 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 veselect()
s platformlarının desteklendiğinden emin olun. En büyük zorluk budur. Bu durum, özellikle çok dilli projelerde zordur (--platforms
, tüm dillerde okunamı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.
Ortak 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 @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 "--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 de dahil olmak üzere derleme boyunca tutarlı bir şekilde uygulanmasını sağlamak için bu özelliği kullanır.
Bazel, varsayılan olarak çalışma alanınızın kök dizinindeki platform_mappings
dosyasından eşlemeleri okur. Ayrıca --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
hedef 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
makinelerinin hedefleyebileceği
(target_compatible_with = ["@platforms//os:linux"]
) ve araçlarının çalışabileceği
(exec_compatible_with = ["@platforms//os:mac"]
) makineleri 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 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.