Bazel çeşitli donanım, işletim sistemleri ve gibi pek çok farklı sürümünü kullanan sistem yapılandırmalarını bağlayıcılar ve derleyiciler. Bazel, bu karmaşıklığı yönetmeye yardımcı olmak için Kısıtlamalar ve platformlar. Sınırlamalar, derleme ya da CPU mimarisi, varlığı veya kontrolü gibi üretim ortamlarının GPU veya sistem tarafından yüklenmiş bir derleyici sürümü yok. Platform, bu kısıtlamalar için adlandırılmış seçim koleksiyonunu temsil eder ve mevcut kaynakları belirlemenize yardımcı olur.
Ortamı platform olarak modellemek, Bazel'in uygun araç zincirleri derleme işlemleri için kullanılır. Platformlar ayrıca config_setting yapılandırılabilir özellikler yazma kuralını hatırlatmak isteriz.
Bazel, bir platformun işleyebileceği üç rolün farkındadır:
- Ana makine: Bazel'in çalıştığı platform.
- Yürütme: Derleme araçlarının üzerinde derleme işlemleri yürüttüğü bir platformdur. ara ve nihai çıktılar üretmesini sağlar.
- Hedef: Nihai çıkışın yer aldığı ve yürütüldüğü platformdur.
Bazel, platformlarla ilgili olarak aşağıdaki derleme senaryolarını destekler:
Tek platformlu derlemeler (varsayılan): ana makine, yürütme ve hedef platformlar aynıdır. Örneğin, şurada çalışan Ubuntu’da yürütülebilir bir Linux Intel x64 CPU.
Çapraz derleme derlemeleri: Ana makine ve yürütme platformları aynıdır ancak hedef platformun farklı olması gerekir. Örneğin, macOS'te iOS uygulaması derleyerek bir MacBook Pro'da çalışıyor.
Çoklu platform derlemeleri: Ana makine, yürütme ve hedef platformların hepsi yardımcı olur.
Kısıtlamaları ve platformları tanımlama
Platformlar için olası seçenekler alanı,
constraint_setting
ve
BUILD
dosya içinde constraint_value
kural.
constraint_setting
yeni bir boyut oluşturur
constraint_value
belirli bir boyut için yeni bir değer oluşturur; birlikte
bir enum'u ve olası değerlerini etkili bir şekilde tanımlamak için kullanılır. Örneğin,
BUILD
dosyasının snippet'i sistemin glibc sürümü için bir kısıtlama getirir
iki olası değerle birlikte kullanır.
constraint_setting(name = "glibc_version")
constraint_value(
name = "glibc_2_25",
constraint_setting = ":glibc_version",
)
constraint_value(
name = "glibc_2_26",
constraint_setting = ":glibc_version",
)
Kısıtlamalar ve bunların değerleri çalışmayacaktır. Etiket tarafından referans verilir ve genel görünürlük ayarına tabidir. kontrol eder. Görünürlük izin veriyorsa mevcut bir kısıtlama ayarını bunun için kendi değerinizi tanımlayın.
platform
kuralı, aşağıdakileri içeren yeni bir platform sunar:
seçenekleri belirleyebilirsiniz. İlgili içeriği oluşturmak için kullanılan
komutu, linux_x86
adında bir platform oluşturur ve bu platformun
x86_64 mimarisine sahip Linux işletim sistemi ve
glibc sürümü 2.25. (Bazel'in yerleşik kısıtlamaları hakkında daha fazla bilgi edinmek için aşağıya bakın.)
platform(
name = "linux_x86",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
":glibc_2_25",
],
)
Genel olarak yararlı kısıtlamalar ve platformlar
Ekosistemin tutarlılığını sağlamak için Bazel ekibi, En popüler CPU mimarileri ve işletim sistemi için kısıtlama tanımları sistemlerdir. Bunların tümü yukarıdan https://github.com/bazelbuild/platforms.
Bazel, aşağıdaki özel platform tanımına sahiptir:
@platforms//host
(diğer adıyla @bazel_tools//tools:host_platform
). Bu,
otomatik olarak algılanan ana makine platformu değeri -
Bazel'in çalıştığı sistem için otomatik olarak algılanan platformu temsil eder.
Derleme için platform belirtme
Bir derleme için ana makineyi ve hedef platformları aşağıdakileri kullanarak belirtebilirsiniz: komut satırı işaretleri:
--host_platform
- varsayılan olarak@bazel_tools//tools:host_platform
değerine ayarlanır- Bu hedefin diğer adı, depo tarafından desteklenen
@platforms//host
olarak belirlendi ana makine işletim sistemini ve CPU'yu algılayıp platform hedefini yazan kuraldır. - Ayrıca
@platforms//host:constraints.bzl
var. Bu, başka BUILD ve yapılandırmalarınızda kullanılabilenHOST_CONSTRAINTS
Starlark dosyaları.
- Bu hedefin diğer adı, depo tarafından desteklenen
--platforms
- varsayılan olarak ana makine platformuna ayarlanır- Bu, başka bir işaret ayarlanmadığında
@platforms//host
hedef platformdur. --host_platform
ayarlanmışsa ancak--platforms
değilse--host_platform
hem ana makine hem de hedef platformdur.
- Bu, başka bir işaret ayarlanmadığında
Uyumlu olmayan hedefleri atlama
Belirli bir hedef platform için geliştirme yaparken, genellikle
otomatik olarak oluşturulan hedefler. Örneğin, Windows cihazınız
büyük ihtimalle çok sayıda derleyici hatasına neden olacaktır.
//...
yüklü Linux makinesi. Şunu kullanın:
target_compatible_with
özelliğini kullanabilirsiniz.
Bu özelliğin en basit kullanımı, hedefi tek bir platformla kısıtlar.
Hedef, tüm koşulları karşılamayan hiçbir platform için oluşturulmaz.
kısıtlar. Aşağıdaki örnekte win_driver_lib.cc
boyutu 64 bit ile sınırlıdır
Windows'a dokunun.
cc_library(
name = "win_driver_lib",
srcs = ["win_driver_lib.cc"],
target_compatible_with = [
"@platforms//cpu:x86_64",
"@platforms//os:windows",
],
)
:win_driver_lib
yalnızca 64 bit Windows ve
uyumlu değildir. Uyumsuzluk geçişlidir. Tüm hedefler
geçişli olarak uyumsuz bir hedefe bağlı olanların kendileri
uyumlu değildir.
Hedefler ne zaman atlanır?
Uyumsuz oldukları kabul edilen hedefler atlanır ve hedef kalıbı genişletmenin bir parçası olarak geliştiriyoruz. Örneğin, aşağıdaki iki şablonda Çağrılar, hedef kalıp genişletmesinde bulunan uyumsuz hedefleri atlar.
$ bazel build --platforms=//:myplatform //...
$ bazel build --platforms=//:myplatform //:all
test_suite
içindeki uyumsuz testler
test_suite
, komut satırında
--expand_test_suites
.
Başka bir deyişle, komut satırındaki test_suite
hedefleri :all
ve
...
. --noexpand_test_suites
kullanılması genişletmeyi engeller ve nedenleri
Uyumsuz testlere sahip test_suite
hedef de uyumsuz.
Komut satırında açıkça uyumsuz bir hedef belirlemek, hata mesajını ve başarısız bir derlemeyi gösterir.
$ bazel build --platforms=//:myplatform //:target_incompatible_with_myplatform
...
ERROR: Target //:target_incompatible_with_myplatform is incompatible and cannot be built, but was explicitly requested.
...
FAILED: Build did NOT complete successfully
Uyumsuz uygunsuz hedefler şu durumlarda sessizce atlanır:
--skip_incompatible_explicit_targets
etkinleştirildi.
Daha fazla ifade gücü
Kısıtlamaları ifade etme konusunda daha fazla esneklik için
@platforms//:incompatible
.
constraint_value
bir proje yönetimi metodolojisi teşkil ediyor.
select()
etiketini şununla birlikte kullanın:
Daha karmaşık kısıtlamalar ifade etmek için @platforms//:incompatible
. Örneğin,
bunu temel VEYA mantığını uygulamak için kullanabilirsiniz. Aşağıdakiler kitaplığı işaret eder
macOS ve Linux ile uyumludur, ancak başka platformlarla uyumlu değildir.
cc_library(
name = "unixish_lib",
srcs = ["unixish_lib.cc"],
target_compatible_with = select({
"@platforms//os:osx": [],
"@platforms//os:linux": [],
"//conditions:default": ["@platforms//:incompatible"],
}),
)
Yukarıdaki bilgiler aşağıdaki gibi yorumlanabilir:
- macOS hedeflenirken hedefte kısıtlama bulunmaz.
- Linux'u hedeflerken hedefte kısıtlama yoktur.
- Aksi takdirde, hedef
@platforms//:incompatible
kısıtlamasına sahip olur. Çünkü@platforms//:incompatible
herhangi bir platformun parçası değil. Hedef: uygunsuz olarak değerlendirilir.
Kısıtlamalarınızı daha okunabilir hale getirmek için
skylibs
selects.with_or()
.
Ters uyumluluğu benzer bir şekilde ifade edebilirsiniz. Aşağıdaki örnek ARM haricindeki her şeyle uyumlu bir kitaplığı ifade eder.
cc_library(
name = "non_arm_lib",
srcs = ["non_arm_lib.cc"],
target_compatible_with = select({
"@platforms//cpu:arm": ["@platforms//:incompatible"],
"//conditions:default": [],
}),
)
bazel cquery
kullanılarak uyumlu olmayan hedefler algılanıyor
URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için
IncompatiblePlatformProvider
bazel cquery
adlı kullanıcının Starlark çıkışında
biçimlendirmeyi kullanın
uyumlu olanlardan uyumsuz hedefler
ekleyebilirsiniz.
Bu, uyumlu olmayan hedefleri filtrelemek için kullanılabilir. Aşağıdaki örnekte yalnızca uyumlu hedeflere ait etiketleri yazdırın. Uyumsuz hedefler: yazdırılmadı.
$ cat example.cquery
def format(target):
if "IncompatiblePlatformProvider" not in providers(target):
return target.label
return ""
$ bazel cquery //... --output=starlark --starlark:file=example.cquery
Bilinen sorunlar
Uyumsuz hedefler görünürlüğü yoksayar kısıtlamalarına tabidir.