Bazel, modelleme için gelişmiş destek sunuyor platformlar ve araç zincirleri: çoklu mimari ve derlemelerini kullanabilirsiniz.
Bu sayfada bu desteğin durumu özetlenmiştir.
Şuna da bakabilirsiniz:
Durum
C++
C++ kuralları, aşağıdaki durumlarda araç zincirlerini seçmek için platformları kullanır:
--incompatible_enable_cc_toolchain_resolution
ayarlandı.
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 şuraya bakın: Projenizi Taşıma ve C++ araç zincirlerini yapılandırma.
Java
Java kuralları, araç zincirlerini seçmek için platformları kullanır.
Bu, eski --java_toolchain
, --host_java_toolchain
ve
--javabase
ve --host_javabase
.
Ayrıntılar için Java ve Bazel'e göz atın.
Android
Android kuralları, aşağıdaki durumlarda araç zincirlerini seçmek için platformları kullanır:
--incompatible_enable_android_toolchain_resolution
ayarlandı.
Bu, Android projesini aşağıdaki öğelerle yapılandırabileceğiniz anlamına gelir:
bazel build //:my_android_project --android_platforms=//:my_android_platform
Bunun yerine --android_crosstool_top
, --android_cpu
,
ve --fat_apk_cpu
.
Bu, Bazel 7.0'da varsayılan olarak etkinleştirilecektir (#16285).
Android projenizi platformlarla test etmek için şuraya bakın: Projenizi Taşıma.
elma
Apple kuralları platformları desteklemez ve henüz planlanmamıştır adresinden iletişime geçebilirsiniz.
Platform API'lerini Apple derlemeleriyle kullanmaya devam edebilirsiniz (örneğin, Apple kuralları ve yalnızca C++ ile birlikte) platformu eşleme öğeleri için de kullanılabilir.
Diğer diller
- Go kuralları, platformları tam olarak destekler
- Rus kuralları, platformları tam olarak destekler.
Bir dil kuralı grubunuz varsa eklemek için Kural grubunuzu taşıma başlıklı makaleyi inceleyin destek.
Arka plan
Yazılımların Google Haberler'deki performansını standartlaştırmak için platformlar ve araç zincirleri farklı mimarileri ve çapraz derlemeyi hedefler.
Bu
ilham
dil geliştiricilerinin bunu reklamlarda zaten yaptığı gözlemine göre
farklı şekillerde kullanabilirsiniz. Örneğin, C++ kuralları --cpu
ve
Hedef CPU ve araç zinciri tanımlamak için --crosstool_top
. Bunların ikisi de
"platform" modelini doğru şekilde modeller. Bu durum tuhaf ve yanlış yapılara neden oldu.
Java, Android ve diğer dillerin benzer amaçlar için kendi flag'leri geliştirildi. ve hiçbiri birbiriyle birlikte çalışmamalıdır. Böylece diller arası derlemeler kafa karıştırıcı ve karmaşık.
Bazel büyük, çok dilli ve çok platformlu projeler için tasarlanmıştır. Bu bu kavramlar için daha ilkeli destek gerektiriyor; standart API'dir.
Taşıma ihtiyacı
Yeni API'ya geçmek için iki işlem yapmanız gerekir: API'yi yayınlama ve yeni sürüme geçme. kural mantığına göre hareket eder.
İlki tamamlandı ama ikincisi devam ediyor. Bu süreç, projenin
dile özgü platformlar ve araç zincirleri tanımlanır, dil mantığı
--crosstool_top
gibi eski flag'ler yerine yeni API üzerinden araç zincirleri ve
config_setting
öğeleri, eski flag'ler yerine yeni API'yi seçer.
Bu çalışma basittir ancak her dil için ayrı bir çalışma gerektirir. Ayrıca proje sahiplerine yapılacak değişiklikleri test etmeleri için adil uyarıda da bulunur.
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
referans ortak bildirimlerCPU
,OS
ve dilden bağımsız diğer genel mülklerden- Alakalı tüm
select()
öğeleri//:myplatform
ile gerektiği gibi eşleşiyor. //:myplatform
açıkça ve erişilebilir bir yerde, yani projenizin projenize özgü bir depo veya tek bir ortak yer olması ihtiyacı olan projelere
--cpu
, --crosstool_top
ve --fat_apk_cpu
gibi eski flag'ler
kullanımdan kaldırılır ve güvenli olan en kısa sürede kaldırılır.
Sonuç olarak, mimarileri yapılandırmanın tek yolu bu olacaktır.
Projenizi taşıma
Platformları destekleyen dillerle derleme yaparsanız derlemeniz şuna benzer bir çağrıyla çalış:
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 bayrak gerekiyorsa ayrıca seçeceğim. 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. Bu genellikle proje sahibinin sorumluluğudur farklı projelerin farklı makineleri hedeflediğinden platformları tanımlamak önemlidir. Varsayılan platformlar'a göz atın.Kullanmak istediğiniz araç zincirleri mevcut olmalıdır. Stok araç zincirleri kullanıyorsanız dil sahiplerinin nasıl kaydedileceğine ilişkin talimatları eklemesi gerekir. Eğer özel araç zincirlerinizi kendiniz yazarken kaydettirmeniz gerekir.
MODULE.bazel
dosyası veya--extra_toolchains
ile.select()
öğeleri ve yapılandırma geçişleri çözer. select() ve Geçişler konularına bakın.Derlemeniz platformları destekleyen ve desteklemeyen diller içeriyorsa eski dillerin yeni API ile çalışmasına yardımcı olmak için platform eşlemeleri gerekmektedir. 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,
platformlar
temel atılımlar yapmaktır. Bunlar daha sonra --platforms
ile tetiklenir.
--platforms
ayarlanmadığında Bazel, varsayılan olarakplatform
yerel derleme makinesidir. Bu, @platforms//host
adresinde otomatik olarak oluşturuldu (diğer adıyla
@bazel_tools//tools:host_platform
)
net bir şekilde tanımlanmasına gerek yoktur. Yerel makinenin OS
eşler
ve CPU
ile constraint_value
@platforms
.
select()
Projeler şurada select()
:
constraint_value
hedef ancak tamamlanmadı
platformlar. Bu bilinçli bir uygulamadır. Bu nedenle select()
, çok çeşitli
mümkün olduğunca çok makine çevirisidir. ARM
'a özel kaynaklara sahip bir kitaplık tüm erişim düzeylerini desteklemelidir
Daha açık bir şekilde belirtmek için bir neden olmadığı sürece ARM
destekli makinelere izin verilir.
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 ya da mevcut bir projeniz için
Desteklemek için constraint_values
veya platform eşlemelerini kullanın
iki stili de taşıyabilirsiniz.
Geçişler
Starlark geçişleri değişikliği
yapı grafiğinizin bazı bölümlerini işaretler. Projeniz, RACI matrisinde
--cpu
, --crossstool_top
veya diğer eski işaretleri,
--platforms
bu değişiklikleri görmeyecek.
Projenizi platformlara taşırken ya da mevcut bir projeniz için
return { "//command_line_option:cpu": "arm" }
- return {
"//command_line_option:platforms": "//:my_arm_platform" }
veya platformu kullanın
eşlemelerini kullanın.
penceresini kapatın.
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. Görüntüleyin toolchain API'sini (
ctx.toolchains
) kullanabilirsiniz.İsteğe bağlı: Böylece bir
--incompatible_enable_platforms_for_my_language
işareti tanımlayın kural mantığı, araç zincirlerini alternatif olarak yeni API veya eski flag'ler aracılığıyla çözer. taşıma testi sırasında--crosstool_top
gibi.Platform bileşenlerini oluşturan ilgili özellikleri tanımlayın. Görüntüleyin Ortak platform özellikleri
Standart araç zincirleri tanımlayın ve bunların kuralın kayıt talimatları (ayrıntılar)
select()
ve yapılandırma geçişlerini destekleme platformlarını kullanın. Bu, en büyük zorluk. Çok dilli projelerde çalışmak daha zordur. (tüm diller--platforms
dilinde okuyamazsa bu işlem başarısız olabilir).
Platformları desteklemeyen kurallarla bir arada kullanmanız gerekiyorsa platform eşlemelerini kullanabilirsiniz.
Sık kullanılan platform özellikleri
OS
ve CPU
gibi yaygın olarak kullanılan diller arası platform mülkleri
@platforms
genelinde belirtilmiş.
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 kurallarınızın kapsamına giren belirli kavramlar üzerinde net bir şekilde sahip olmanıza olanak tanır. çok önemli.
Kurallarınız özel amaçlı işletim sistemi veya CPU kullanıyorsa bunlar
kuralın deposu ve
@platforms
.
Platform eşlemeleri
Platform eşlemeleri, platforma duyarlı mantığın mantığını kullanıyor. Bu, yalnızca farklı taşıma zaman aralıklarında sorunsuz uyumsuzluklar yaşarsınız.
Platform eşlemesi, bir platform()
ile bir
karşılık gelen eski işaretleri gösterir. Ö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 güvenli tüm ayarları garantilemek için bunu kullanır derleme boyunca tutarlı bir şekilde uygulanır. geçişlerini görebilirsiniz.
Varsayılan olarak Bazel,platform_mappings
çalışma alanı kökü. Ayrıca,
--platform_mappings=//:my_custom_mapping
Ayrıntılar için platform eşleme tasarımına bakın.
API incelemesi
platform
,
constraint_value
hedef:
platform(
name = "myplatform",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
constraint_value
, bir makinenin
Aynı "nazik" değerler ortak bir tema altında gruplandırılır
constraint_setting
:
constraint_setting(name = "os")
constraint_value(
name = "linux",
constraint_setting = ":os",
)
constraint_value(
name = "mac",
constraint_setting = ":os",
)
toolchain
bir Starlark kuralıdır. Bu
özellikleri bir dilin araçlarını (compiler =
"//mytoolchain:custom_gcc"
gibi) bildirir. Sağlayıcılar kartı
bu araçlarla geliştirmesi gereken kurallara
Araç zincirleri, ulaşabilecekleri makinelerin constraint_value
'larını
hedef
(target_compatible_with = ["@platforms//os:linux"]
) kadar iyi performans gösteren
çalıştır
(exec_compatible_with = ["@platforms//os:mac"]
).
$ bazel build //:myproject --platforms=//:myplatform
inşa edilirken, Bazel
derleme makinesinde çalışabilecek bir araç zincirini otomatik olarak seçer ve
//:myplatform
için ikili programlar oluşturun. Bu, araç zinciri çözünürlüğü olarak bilinir.
Kullanılabilir araç zincirleri grubu, MODULE.bazel
dosyasına kaydedilebilir
register_toolchains
ile veya
komut satırını --extra_toolchains
ile değiştirin.
Daha fazla bilgiyi burada bulabilirsiniz.
Sorular
Genel destek almak ve taşıma zaman çizelgesiyle ilgili sorularınız için şurayla iletişime geçin: bazel-CONVERSATION veya uygun kuralların sahipleri.
Platform/araç zinciri API'lerinin tasarımı ve evrimi ile ilgili tartışmalar için bazel-dev ile iletişime geçin.