Bazel, çok mimarili ve çapraz derlenmiş derlemeler için platformları ve araç zincirlerini modelleme konusunda gelişmiş destek sunar.
Bu sayfada, söz konusu desteğin 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=//:myplatform
kullanın:
bazel build //:my_cpp_project` --cpu=... --crosstool_top=... --compiler=...
Bu özellik, 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 bölümlerine bakın.
Java
Java kuralları, araç zincirlerini seçmek için platformları kullanır.
Bu; --java_toolchain
, --host_java_toolchain
,
--javabase
ve --host_javabase
eski işaretlerinin yerini alır.
Ayrıntılar için Java ve Bazel'e bakın.
Android
Android kuralları, --incompatible_enable_android_toolchain_resolution
ayarlandığında araç zincirlerini seçmek için platformları kullanır.
Bu sayede bir Android projesini şunlarla yapılandırabilirsiniz:
bazel build //:my_android_project --android_platforms=//:my_android_platform
eski işaretlerle (--android_crosstool_top
, --android_cpu
ve --fat_apk_cpu
gibi)
kullanabilirsiniz.
Bu özellik, Bazel 7.0'da (#16285) varsayılan olarak etkinleştirilecektir.
Android projenizi platformlarla test etmek için Projenizi Taşıma bölümüne bakın.
elma
Apple kuralları platformları desteklemez ve henüz destek için planlanmamıştır.
Yine de Apple derlemeleriyle platform API'lerini (örneğin, Apple kuralları ve salt C++'nın bir karışımıyla derleme yaparken) platform eşlemeleri ile kullanabilirsiniz.
Diğer diller
- Go kuralları platformları tamamen destekler
- Taşıma 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öntemini standartlaştırmak için platformlar ve araç zincirleri kullanıma sunulmuştur.
Bunun nedeni, dil bakım uzmanlarının bunu anlık, uyumsuz yollarla zaten yaptığı gözleminden esin kaynağıydı. Örneğin, C++ kuralları bir hedef CPU ve araç zinciri tanımlamak için --cpu
ve --crosstool_top
kullanır. Bunların ikisi de bir "platform"u doğru
şekilde modellemez. Bu garip ve yanlış derlemelere yol açtı.
Java, Android ve diğer diller benzer amaçlar için kendi bayraklarını geliştirdi ve bu dillerin hiçbiri birbiriyle birlikte çalıştı. Bu da 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, net bir standart API dahil olmak üzere bu kavramların daha ilkeli bir şekilde desteklenmesini gerektiriyor.
Taşıma gereksinimi
Yeni API'ye geçmek için iki çaba gösterilmesi gerekir: API'yi yayınlamak ve API'yi kullanmak için kural mantığını yükseltmek.
İlki tamamlandı, ancak ikincisi devam ediyor. Bunun için dile özgü platformların ve araç zincirlerinin tanımlanmasını, dil mantığının, --crosstool_top
gibi eski işaretler yerine araç zincirlerini yeni API aracılığıyla okumasını ve config_setting
öğelerinin eski işaretler yerine yeni API'yi seçmesini sağlamak yer alır.
Bu çalışma basittir ancak her dilde ayrı bir çalışma yapılması ve proje sahiplerinin yaklaşan değişiklikleri test etmeleri 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
Bunun anlamı şudur:
//:myplatform
için doğru araç zincirleri, projenizin kuralları tarafından seçilir.- Projenizin bağımlılıkları,
//:myplatform
için doğru araç zincirlerini seçer. //:myplatform
;CPU
,OS
ve diğer genel, dilden bağımsız özelliklerin yaygın bildirimlerine referans veriyor- Alakalı tüm
select()
öğeleri//:myplatform
ile uygun şekilde eşleşiyor. //:myplatform
, açık ve erişilebilir bir yerde tanımlanır: Platform projenize özelse projenizin deposunda veya tüm tüketen projelerin bulabildiği ortak bir yer.
--cpu
, --crosstool_top
ve --fat_apk_cpu
gibi eski işaretler güvenli olduğu anda kullanımdan kaldırılacak ve kaldırılacaktır.
Sonuç olarak bu, mimarileri yapılandırmanın tek yolu olacaktır.
Projenizi taşıma
Platformları destekleyen dillerde derleme yapıyorsanız derlemeniz zaten aşağıdaki gibi bir çağrıyla çalışıyor olmalıdır:
bazel build //:myproject --platforms=//:myplatform
Ayrıntılı bilgi için Durum'a ve dilinize ait dokümanlara bakın.
Bir dil, platform desteğini etkinleştirmek için bir işaret gerektiriyorsa bu bayrağı da 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ğinden platformları tanımlamak genellikle proje sahibinin sorumluluğundadır. Varsayılan platformlar bölümüne bakın.Kullanmak istediğiniz araç zincirlerinin mevcut olması gerekir. Stok araç zincirleri kullanılıyorsa dil sahipleri, araç zincirlerini nasıl kaydedeceklerine dair talimatlar sağlamalıdır. Kendi özel araç zincirlerinizi yazıyorsanız bunları
MODULE.bazel
dosyanıza veya--extra_toolchains
ile register gerekir.select()
'ler ve yapılandırma geçişleri doğru şekilde çözümlenmelidir. Bkz. select() ve Geçişler.Derlemeniz, platformları destekleyen ve desteklemeyen dilleri bir arada içeriyorsa eski dillerin yeni API ile çalışmasına yardımcı olacak 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, derlemek istedikleri mimarileri açıklamak 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ğerine ayarlanır. Bu dize, @platforms//host
adresinde otomatik olarak oluşturulur (@bazel_tools//tools:host_platform
adıyla diğer ad). Bu nedenle, açıkça tanımlamaya gerek yoktur. Yerel makinenin OS
ve CPU
değerlerini @platforms
içinde tanımlanan constraint_value
ile eşler.
select()
Projeler constraint_value
hedeflerinde select()
olabilir ancak platformları tamamlayamaz. Bu yöntem bilinçli olarak yapıldığından select()
mümkün olduğunca çok çeşitli makineyi destekler. ARM
özelliğine özel kaynaklara sahip bir kitaplık, daha spesifik bir durum olmadığı sürece ARM
destekli tüm makineleri desteklemelidir.
Bir veya daha fazla constraint_value
arasından seçim yapmak için şunu kullanın:
config_setting(
name = "is_arm",
constraint_values = [
"@platforms//cpu:arm",
],
)
Bu, geleneksel olarak --cpu
ürününde seçim yapmaya eşdeğerdir:
config_setting(
name = "is_arm",
values = {
"cpu": "arm",
},
)
Daha fazla bilgiyi burada bulabilirsiniz.
--cpu
, --crosstool_top
vb. platformlardaki select
, --platforms
dilini 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ümlerinin işaretlerini değiştirir. Projenizde --cpu
, --crossstool_top
veya diğer eski işaretleri ayarlayan bir geçiş kullanılıyorsa --platforms
yönergesini 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" }
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.
Kural grubunuz taşınıyor
Bir kural grubunuz varsa ve platformları desteklemek istiyorsanız şunları yapmanız gerekir:
Araç zinciri API'siyle kural mantığı çözümleme araç zincirleri edinin. Toolchain API'yi (
ctx.toolchains
) inceleyin.İsteğe bağlı: Kural mantığının, taşıma testi sırasında araç zincirlerini yeni API veya
--crosstool_top
gibi eski işaretler aracılığıyla alternatif 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. Yaygın platform özellikleri bölümünü inceleyin
Standart araç zincirleri tanımlayın ve bunları kuralınızın kayıt talimatlarıyla kullanıcılar için erişilebilir hale getirin (ayrıntılar)
select()
ve yapılandırma geçişlerinin platformları desteklediğinden emin olun. Bu en büyük zorluk. Bu, özellikle çok dilli projeler için zordur (tüm diller--platforms
okuyamazsa bu başarısız olabilir).
Platformları desteklemeyen kurallarla karıştırmanız gerekiyorsa boşluğu doldurmak için platform eşlemelerine ihtiyacınız olabilir.
Yaygın platform özellikleri
OS
ve CPU
gibi diller arası yaygın platform özellikleri @platforms
içinde belirtilmelidir.
Bu; paylaşımı, standartlaştırmayı ve diller arası uyumluluğu teşvik eder.
Kurallarınıza özel özellikler, kuralınızın deposunda tanımlanmalıdır. Bu, kurallarınızın sorumlu olduğu belirli kavramlar üzerinde açık bir şekilde sahip olmanızı sağlar.
Kurallarınız özel amaçlı işletim sistemleri veya CPU'lar kullanıyorsa bunlar, @platforms
yerine kuralınızın deposunda bildirilmelidir.
Platform eşlemeleri
Platform eşlemeleri, platforma duyarlı mantığın aynı derlemede eski mantıkla birleştirilmesini sağlayan geçici bir API'dir. Bu yalnızca farklı taşıma zaman aralıklarındaki uyumsuzlukları gidermeyi amaçlayan sade bir araçtır.
Platform eşlemesi, platform()
ile karşılık gelen eski işaret kümesi arasındaki ya da tam tersinin eşlemesidir. Ö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 derleme boyunca (geçişler dahil) tutarlı bir şekilde uygulanmasını garanti etmek için bunu kullanır.
Varsayılan olarak Bazel, çalışma alanı kök dizininizdeki platform_mappings
dosyasındaki eşlemeleri okur. --platform_mappings=//:my_custom_mapping
özelliğini de ayarlayabilirsiniz.
Ayrıntılı bilgi için platform eşleme tasarımı konusuna 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üre" sahip 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
bir Starlark kuralıdır. Özellikleri, dilin araçlarını (compiler =
"//mytoolchain:custom_gcc"
gibi) tanımlar. Dizinin 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 çalabileceği constraint_value
makineyi (exec_compatible_with = ["@platforms//os:mac"]
) tanımlar.
Bazel, $ bazel build //:myproject --platforms=//:myplatform
derlerken otomatik olarak derleme makinesinde çalışabilecek ve //:myplatform
için ikili programlar oluşturabilecek bir araç zinciri seçer. Bu, araç zinciri çözünürlüğü olarak bilinir.
Kullanılabilir araç zincirleri grubu, MODULE.bazel
dosyasına register_toolchains
ile veya komut satırına --extra_toolchains
ile kaydedilebilir.
Daha fazla bilgiyi burada bulabilirsiniz.
Sorular
Geçiş zaman çizelgesiyle ilgili genel destek ve 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şimi hakkında tartışmalar için bazel-dev ile iletişime geçin.