Platformlar

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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.

ziyaret edin.

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ılabilen HOST_CONSTRAINTS Starlark dosyaları.
  • --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.

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 açık 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:

  1. macOS hedeflenirken hedefte kısıtlama bulunmaz.
  2. Linux'u hedeflerken hedefte kısıtlama yoktur.
  3. 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 hakkında daha fazla bilgi edinin.