Bazel, platform ve öğeleri modellemek için araç zincirleri gibidir. Bunu gerçek projelerle entegre etmek için konusunda titiz bir şekilde çalışmamız gerekiyor.
Bu sayfada, platformların amacı özetlenmekte ve platformlarla nasıl geliştirme yapılacağı gösterilmektedir.
tl;dr: Bazel'in platformu ve araç zinciri API'leri kullanılabilir ancak çalışmaz
tüm dil kurallarına, select()
'lere ve diğer eski referanslara kadar her yerde
güncellendi. Bu çalışmalar sürekli devam ediyor. Bu sürecin sonunda tüm derlemeler platform tabanlı olacak.
Derlemelerinizin nereye denk geldiğini görmek için aşağıdaki bölümü okuyun.
Daha resmi belgeler için bkz:
Arka plan
Yazılımların Google Haberler'deki performansını standartlaştırmak için platformlar ve araç zincirleri farklı makineleri hedefler ve doğru dil araçlarıyla derler.
Bu, Bazel'e nispeten yeni bir yeniliktir. Evet
ilham
gözlem, dil geliştiricilerinin reklamlarda zaten bunu yaptıklarını
farklı şekillerde kullanabilirsiniz. Örneğin, C++ kuralları --cpu
ve --crosstool_top
değerlerini kullanır
derlemenin hedef CPU ve C++ araç zincirini ayarlayın. Bu modellerin ikisi de doğru değil
bir "platform". Tarihi buna yönelik girişimler tuhaf ve yanlış yapılara neden oldu.
Bu flag'ler, kendi gelişen Java derlemesini de kontrol etmez
--java_toolchain
ile bağımsız arayüze sahip olun.
Bazel büyük, çok dilli ve çok platformlu projeler için tasarlanmıştır. Bu Bu kavramlar için daha ilkeli destek gerektiriyor. dili ve projenin birlikte birlikte çalışabilirliğini teşvik eder. Bu yeni API'ler şunlardır: .
Taşıma
Platform ve araç zinciri API'leri yalnızca projeler gerçekten bunları kullandığında çalışır. Bu
çünkü projenin kural mantığı, araç zincirleri, bağımlılıkları
select()
ekibi bu kullanıcıları desteklemelidir. Bu işlem için dikkatli bir taşıma sırası gerekir
ve bağımlılıklarının doğru şekilde
çalışmasını sağlamak için gereklidir.
Örneğin, Bazel'in C++ Kuralları, platformları destekler. Ancak Apple Kuralları öyle değildir. C++ projeniz Apple'ı umursamıyor olabilir. Ancak diğerleri. ODK platformları tüm C++ derlemeleri için küresel olarak etkinleştirmek henüz güvenli değildir.
Bu sayfanın geri kalanında, söz konusu taşıma sırasının yanı sıra nasıl ve ne zaman nasıl yardımcı olabileceğini açıklayacaksınız.
Hedef
Tüm projeler şu formla derlendiğinde Bazel'in platform taşıma işlemi tamamlanır:
bazel build //:myproject --platforms=//:myplatform
Bu anlama gelir:
- Projenizin kullandığı kurallar, doğru araç zincirlerini
//:myplatform
- Projenizin bağımlılıklarının kullandığı kurallar, doğru araç zincirlerini tahmin edebilir
başlangıç fiyatı:
//:myplatform
. - Sizin projenize bağlı olarak ikisi
//:myplatform
ya da projesi eski API'leri (--crosstool_top
gibi) destekliyor. //:myplatform
referans [ortak bildirimler][Ortak Platform Beyanı]{: .external} Projeler arası otomatik çalışmayı destekleyenCPU
,OS
ve diğer genel kavramların sayısı uyumluluk.- Tüm ilgili projeleri
select()
sn.//:myplatform
tarafından belirtilen makine özelliklerini anlayın. //:myplatform
, net ve yeniden kullanılabilir bir yerde, yani projenizin projenize özgüyse bir depo, aksi takdirde tüm projelere özel bir yer bulunabilecek büyüklükte.
Bu hedefe ulaşılır edilmez eski API'ler kaldırılacaktır. Bu işlem, platform ve araç zincirleri belirlenirken standart proje yöntemlerinden biridir.
Platformları kullanmalı mıyım?
Sadece bir proje derlemek veya çapraz derlemek istiyorsanız en iyi uygulamaları paylaşacağım.
Bir proje, dil veya araç zinciri bakım sorumlusuysanız zaman içinde yeni API'leri desteklemeye başladı. Genel taşıma işleminin tamamlanmasını bekleyip beklemediğiniz veya erken kaydolma seçeneği, belirli değer / maliyet ihtiyaçlarınıza bağlıdır:
Değer
select()
özelliğini kullanabilir veya ilgilendiğiniz mülklerde araç zincirleri seçebilirsiniz. hakkında daha fazla bilgi edinin.--cpu
Örneğin, birden fazla CPU aynı talimat grubunu destekleyebilir.- Daha doğru derlemeler. Yukarıdaki örnekte
--cpu
ileselect()
, Aynı talimat grubunu (select()
) destekleyen yeni bir CPU ekleyin yeni CPU'yu tanımaz. Ancak platformlardakiselect()
metriği doğru olmaya devam ediyor. - Daha basit kullanıcı deneyimi. Tüm projeler aşağıdaki şartları karşılamalıdır:
--platforms=//:myplatform
Birden fazla dile özgü gereksinimlere gerek yoktur işaretleri arasında geçiş yapar. - Daha basit dil tasarımı. Tüm dillerde, tanımlama için ortak bir API kullanılır araç zincirlerini kullanmak, araç zincirlerini kullanmak ve platform için doğru araç zincirini seçmek.
- Aşağıdaki yöntemlerle hedefler atlanabilir: hedef platformla uyumsuzlarsa derleme ve test aşamalarına geçilmelidir.
Maliyetler
- Henüz platformları desteklemeyen bağımlı projeler otomatik olarak çalışmayabilir. kişiselleştirilmiş bir e-posta alırsınız.
- Cihazların çalışması için ek geçici bakım gerekebilir.
- Yeni ve eski API'lerin birlikte mevcut olması, aşağıdaki işlemler için kullanıcı rehberliğinin daha dikkatli bir şekilde yapılmasını gerektirir: karışıklıktan kaçının.
- Aşağıdaki gibi yaygın özelliklerin standart tanımları
OS
veCPU
geliştirilmeye devam ediyor. Bu nedenle, başlangıç için ek katkı yapılması gerekebilir. - Dile özgü araç zincirlerinin standart tanımları gelişmeye devam ediyor ilk katkılarda bulunmak gerekebilir.
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, WORKSPACE
öğesinde şununla kaydedilebilir:
register_toolchains
veya
komut satırını --extra_toolchains
ile değiştirin.
Daha ayrıntılı bilgi için buraya göz atın.
Durum
Mevcut platform desteği diller arasında değişiklik gösterir. Bazel'in tüm önemli kuralları belirlemektir. Ancak bu işlem zaman alır. Bunun üç ana nedeni vardır:
Yeni araç zincirinden araç bilgisi almak için kural mantığı güncellenmelidir. API (
ctx.toolchains
) API'sine gidip şunun gibi eski ayarları okumayı bırakın:--cpu
ve--crosstool_top
. Bu nispeten basittir.Araç zinciri sorumluları, araç zincirlerini tanımlamalı ve bunları kullanıcılar (GitHub depolarında ve
WORKSPACE
girişlerinde). Bu, teknik olarak basittir ancak akıllı bir şekilde organize edilmesi gerekir. sağlamak için çok önemlidir.Platform tanımları da gereklidir (aynı makine için derleme yapmadığınız sürece Bazel çalışır). Genel olarak projeler kendi platformlarını tanımlamalıdır.
Mevcut projeler taşınmalıdır.
select()
ve geçişlerin de doğru taşındı. En büyük zorluk bu. İnsanların çalışmalarının çok dilli projeler (tüm dillerin okuması mümkün değilse başarısız olabilir--platforms
).
Yeni bir kural kümesi tasarlıyorsanız başlar. Bu işlem, kurallarınızı otomatik olarak diğer kuralları ve projeleri destekler. Bu API, platform API'si oldukça yaygın olduğunu gördük.
Sık kullanılan platform özellikleri
Projelerde ortak olan OS
ve CPU
gibi platform özellikleri
standart ve merkezi bir yerde açıklanmalıdır. Bu sayede projeler arası
ve diller arası uyumluluk.
Örneğin, MyApp'da constraint_value
üzerinde bir select()
varsa
@myapp//cpus:arm
ve SomeCommonLib için select()
var.
@commonlib//constraints:arm
, bunlar "kollarını" tetikliyor modları uyumsuz
ölçütlerine bağlıdır.
Genel olarak yaygın olan özellikler
@platforms
kod deposu
(yani yukarıdaki örnek için standart etiket @platforms//cpu:arm
şeklindedir).
Dilde yaygın özellikler, ilgili depolarda belirtilmelidir.
dil.
Varsayılan platformlar
Proje sahipleri genellikle
platformların
farklı türlerde makine öğrenimi modelleri. Bunlar daha sonra
--platforms
--platforms
ayarlanmadığında Bazel, varsayılan olarakplatform
yerel derleme makinesidir. Bu, @local_config_platform//:host
tarihinde otomatik olarak oluşturuldu
net bir şekilde tanımlanmasına gerek yoktur. Yerel makinenin OS
eşler
ve CPU
ile constraint_value
@platforms
.
C++
Bazel'in C++ kuralları,
--incompatible_enable_cc_toolchain_resolution
.
(#7260).
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=...
Projeniz tamamen C++ ise ve C++ dışı projelere bağımlı değilse
select
ve güvenli bir şekilde kullanabileceğiniz
geçişler uyumlu. Görüntüleyin
#7260 ve
Daha fazla yardım için C++ araç zincirlerini yapılandırma.
Bu mod varsayılan olarak etkin değildir. Bunun nedeni Apple'ın,
C++ bağımlılıklarını --cpu
ve --crosstool_top
ile yapılandırmaya devam edin
(örnek). Bu, platformlara geçiş yapan Apple kurallarına bağlıdır.
Java
Bazel'in Java kuralları platformları kullanır.
Bu, eski --java_toolchain
, --host_java_toolchain
ve
--javabase
ve --host_javabase
.
Yapılandırma işaretlerinin nasıl kullanılacağını öğrenmek için Bazel ve Java kılavuzuna bakın. Ek bilgi için Tasarım belgesine bakın.
Eski işaretleri kullanmaya devam ediyorsanız Sorun #7849'da belirtilen taşıma işlemini uygulayın.
Android
Bazel'in Android kuralları,
--incompatible_enable_android_toolchain_resolution
Bu özellik, varsayılan olarak etkin değildir. Ancak taşıma devam ediyor.
elma
Bazel'in Apple kuralları henüz Apple araç zincirlerini seçen platformları desteklememektedir.
Ayrıca,
C++ araç zincirini ayarlamak için eski --crosstool_top
. Bu özellik taşınana kadar
Apple projelerini platorm kullanan C++ ile birlikte platform
eşlemeler
(örnek).
Diğer diller
- Bazel'in Rust kuralları tam olarak destekleniyor platformlar.
- Bazel'in Go kuralları tam olarak destekleniyor platformlar (ayrıntılar).
Yeni bir dil için kurallar tasarlıyorsanız platformları kullanın. araç zincirlerini seçin. Bkz. araç zinciri dokümanlarına göz atın.
select()
Projeler şurada select()
:
constraint_value
hedef ancak tamamlanmadı
platformlar. Bu kasıtlı olarak select()
s'nin mümkün olduğunca çeşitli içerikleri desteklemesi için yapılmıştır
sayısını artırmak istiyoruz. ARM
'a özel kaynaklara sahip bir kitaplık tarafından desteklenmelidir
Daha açık bir şekilde belirtmek için bir neden olmadığı sürece ARM
destekli tüm makinelerde kullanılabilir.
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. Zaman
bir dosyayı platformlara taşıyorsanız, bunları öncelikle
Desteklemek için constraint_values
veya platform eşlemelerini kullanın
taşıma penceresi aracılığıyla her iki stilde de geçerlidir.
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.
Günümüzde platformlar nasıl kullanılır?
Sadece bir proje derlemek veya çapraz derlemek istiyorsanız her şeyi öğreteceğim. Bu işin dil ve proje yöneticileri platformlarla nasıl ve ne zaman entegrasyon yapılacağını ve bunun ne gibi bir değer sunacağını belirler.
Proje, dil veya araç zinciri bakıcısıysanız ve derlemeniz kullanıyorsanız üç seçeneğiniz vardır (genel kampanyaları taşıma):
"Platformları kullanma"dan faydalanın tüm dilleri seçin (bunlar varsa sağlar) ve önemsediğiniz projelerin sizin için uygun olup olmadığını 10.000 hikaye oldu.
Sizin için önemli olan projeler hâlâ
--cpu
ve--crosstool_top
, bunları--platforms
ile birlikte kullanın:bazel build //:my_mixed_project --platforms==//:myplatform --cpu=... --crosstool_top=...
Bunun bir miktar bakım maliyeti vardır (ayarların manuel olarak . Fakat geri dönüşler olmadığında bu yöntem işe yarar geçişleri iptal edebilirsiniz.
Her iki stili de desteklemek için platform eşlemeleri yazın.
--cpu
stili ayarları ilgili platformlara eşler veya bunun tersi de geçerlidir.
Platform eşlemeleri
Platform eşlemeleri, geçici bir API'dir. API'lerin kullanılabilmesi için Eski destekli mantık, ikincisinin kullanımdan kaldırılmasıyla aynı yapıda bir arada bulunur penceresini kapatın.
Platform eşlemesi, bir platform()
ile bir
karşılık gelen eski işaretleri gösterir. Ö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 --apple_platform_type=macos" to "//platform:macos".
--cpu=darwin
--apple_platform_type=macos
//platforms:macos
Bazel, hem platform temelli hem de diğer ayarları garanti etmek için bunu kullanır derleme boyunca tutarlı bir şekilde uygulanır. geçişleri iptal edebilirsiniz.
Varsayılan olarak Bazel,platform_mappings
çalışma alanı kökü. Ayrıca,
--platform_mappings=//:my_custom_mapping
Görüntüleyin burada inceleyebilirsiniz.
Sorular
Genel destek almak ve taşıma zaman çizelgesiyle ilgili sorularınız için şurayla iletişime geçin: bazel-discuss@googlegroups.com veya uygun kuralların sahipleriyle iletişim kurar.
Platform/araç zinciri API'lerinin tasarımı ve evrimi ile ilgili tartışmalar için kişi bazel-dev@googlegroups.com.