Platformlarla Geliştirme

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

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:

  1. Projenizin kullandığı kurallar, doğru araç zincirlerini //:myplatform
  2. Projenizin bağımlılıklarının kullandığı kurallar, doğru araç zincirlerini tahmin edebilir başlangıç fiyatı: //:myplatform.
  3. Sizin projenize bağlı olarak ikisi //:myplatform ya da projesi eski API'leri (--crosstool_top gibi) destekliyor.
  4. //:myplatform referans [ortak bildirimler][Ortak Platform Beyanı]{: .external} Projeler arası otomatik çalışmayı destekleyen CPU, OS ve diğer genel kavramların sayısı uyumluluk.
  5. Tüm ilgili projeleri select() sn. //:myplatform tarafından belirtilen makine özelliklerini anlayın.
  6. //: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 ile select(), Aynı talimat grubunu (select()) destekleyen yeni bir CPU ekleyin yeni CPU'yu tanımaz. Ancak platformlardaki select() 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 ve CPU 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:

  1. 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.

  2. 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.

  3. 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 oluşturuyoruz. 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

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):

  1. "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.

  2. 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.

  3. 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.

Aşağıdaki kaynakları da incelemenizi öneririz: