Bazel memiliki dukungan canggih untuk pemodelan platform dan toolchain untuk multi-arsitektur dan build yang dikompilasi silang.
Halaman ini merangkum status dukungan ini.
Lihat juga:
Status
C++
Aturan C++ menggunakan platform untuk memilih toolchain saat --incompatible_enable_cc_toolchain_resolution
ditetapkan.
Ini berarti Anda dapat mengonfigurasi project C++ dengan:
bazel build //:my_cpp_project --platforms=//:myplatform
bukan yang lama:
bazel build //:my_cpp_project` --cpu=... --crosstool_top=... --compiler=...
Tindakan ini akan diaktifkan secara default di Bazel 7.0 (#7260).
Untuk menguji project C++ Anda dengan platform, lihat Memigrasikan Project Anda dan Mengonfigurasi toolchain C++.
Java
Aturan Java menggunakan platform untuk memilih toolchain.
Ini menggantikan tanda lama --java_toolchain
, --host_java_toolchain
, --javabase
, dan --host_javabase
.
Lihat Java dan Bazel untuk mengetahui detailnya.
Android
Aturan Android menggunakan platform untuk memilih toolchain saat --incompatible_enable_android_toolchain_resolution
ditetapkan.
Ini berarti Anda dapat mengonfigurasi project Android dengan:
bazel build //:my_android_project --android_platforms=//:my_android_platform
bukan dengan tanda lama seperti --android_crosstool_top
, --android_cpu
,
dan --fat_apk_cpu
.
Tindakan ini akan diaktifkan secara default di Bazel 7.0 (#16285).
Untuk menguji project Android dengan platform, lihat Memigrasikan Project Anda.
Apel
Aturan Apple tidak mendukung platform dan belum dijadwalkan untuk dukungan.
Anda tetap dapat menggunakan API platform dengan build Apple (misalnya, saat membuat aplikasi dengan campuran aturan Apple dan C++ murni) dengan pemetaan platform.
Bahasa lainnya
- Aturan Go mendukung sepenuhnya platform
- Aturan acak sepenuhnya mendukung platform.
Jika Anda memiliki kumpulan aturan bahasa, lihat Memigrasikan kumpulan aturan Anda untuk menambahkan dukungan.
Latar belakang
Platform dan toolchain diperkenalkan untuk menstandarkan cara project software menargetkan arsitektur yang berbeda dan mengompilasi silang.
Cara ini terinspirasi oleh pengamatan bahwa pengelola bahasa sudah melakukan ini secara ad-hoc dan tidak kompatibel. Misalnya, aturan C++ menggunakan --cpu
dan --crosstool_top
untuk mendeklarasikan CPU dan toolchain target. Tak satu pun dari berikut ini yang memodelkan "platform" dengan benar. Hal ini menghasilkan build yang canggung dan salah.
Java, Android, dan bahasa lainnya mengembangkan flag-nya sendiri untuk tujuan serupa, dan tidak satu pun yang beroperasi satu sama lain. Hal ini membuat build lintas bahasa membingungkan dan rumit.
Bazel ditujukan untuk project multi-platform berukuran besar, multibahasa. Hal ini memerlukan dukungan yang lebih berprinsip untuk konsep ini, termasuk API standar yang jelas.
Perlu migrasi
Upgrade ke API baru memerlukan dua upaya: merilis API dan mengupgrade logika aturan untuk menggunakannya.
Yang pertama sudah selesai, tetapi yang kedua sedang berlangsung. Dukungan ini terdiri dari memastikan bahwa platform dan toolchain spesifik bahasa telah ditentukan, logika bahasa membaca toolchain melalui API baru, bukan flag lama seperti --crosstool_top
, dan config_setting
memilih API baru, bukan flag lama.
Pekerjaan ini mudah dilakukan, tetapi memerlukan upaya tersendiri untuk setiap bahasa, ditambah peringatan yang adil bagi pemilik project untuk melakukan pengujian terhadap perubahan mendatang.
Inilah alasan migrasi ini adalah migrasi yang sedang berlangsung.
Sasaran
Migrasi ini selesai saat semua project dibuat dengan formulir:
bazel build //:myproject --platforms=//:myplatform
Hal ini menyiratkan:
- Aturan project Anda memilih toolchain yang tepat untuk
//:myplatform
. - Dependensi project Anda memilih toolchain yang tepat untuk
//:myplatform
. //:myplatform
mereferensikan deklarasi umum dariCPU
,OS
, dan properti generik lainnya yang tidak bergantung pada bahasa- Semua
select()
yang relevan cocok dengan//:myplatform
. //:myplatform
ditentukan di tempat yang jelas dan dapat diakses: di repositori project Anda jika platform tersebut unik untuk project Anda, atau di beberapa tempat umum yang dapat ditemukan oleh semua project yang menggunakan
Flag lama seperti --cpu
, --crosstool_top
, dan --fat_apk_cpu
tidak akan digunakan lagi dan dihapus segera setelah aman untuk melakukannya.
Pada akhirnya, inilah cara satu-satunya untuk mengonfigurasi arsitektur.
Memigrasikan project
Jika Anda mem-build dengan bahasa yang mendukung platform, build Anda seharusnya sudah berfungsi dengan pemanggilan seperti:
bazel build //:myproject --platforms=//:myplatform
Lihat Status dan dokumentasi bahasa Anda untuk mengetahui detail akurat.
Jika suatu bahasa memerlukan tanda untuk mengaktifkan dukungan platform, Anda juga harus menetapkan tanda tersebut. Lihat Status untuk mengetahui detailnya.
Agar project dibangun, Anda harus memeriksa hal-hal berikut:
//:myplatform
harus ada. Biasanya pemilik project bertanggung jawab untuk menentukan platform karena project yang berbeda memiliki target komputer yang berbeda. Lihat Platform default.Toolchain yang ingin Anda gunakan harus ada. Jika menggunakan toolchain stok, pemilik bahasa harus menyertakan petunjuk cara mendaftarkannya. Jika menulis toolchain kustom sendiri, Anda harus register dalam file
MODULE.bazel
atau dengan--extra_toolchains
.select()
dan transisi konfigurasi harus di-resolve dengan benar. Lihat select() dan Transitions.Jika build Anda menggabungkan bahasa yang mendukung dan tidak mendukung platform, Anda mungkin memerlukan pemetaan platform untuk membantu bahasa lama berfungsi dengan API baru. Lihat Pemetaan platform untuk mengetahui detailnya.
Jika Anda masih mengalami masalah, hubungi untuk mendapatkan dukungan.
Platform default
Pemilik project harus menentukan
platform eksplisit untuk mendeskripsikan arsitektur
yang ingin mereka bangun. Tindakan ini kemudian dipicu dengan --platforms
.
Jika --platforms
tidak ditetapkan, Bazel akan ditetapkan secara default ke platform
yang mewakili
mesin build lokal. ID ini dibuat secara otomatis di @platforms//host
(alias
@bazel_tools//tools:host_platform
)
sehingga tidak perlu menentukannya secara eksplisit. Metode ini memetakan OS
dan CPU
komputer lokal dengan constraint_value
yang dideklarasikan dalam
@platforms
.
select()
Project dapat select()
pada
constraint_value
target, tetapi tidak dapat menyelesaikan
platform. Hal ini sengaja dilakukan agar select()
mendukung berbagai
komputer yang tersedia. Library dengan sumber khusus ARM
harus mendukung semua
mesin yang didukung ARM
kecuali ada alasan yang lebih spesifik.
Untuk memilih di satu atau beberapa constraint_value
, gunakan:
config_setting(
name = "is_arm",
constraint_values = [
"@platforms//cpu:arm",
],
)
Hal ini sama seperti memilih di --cpu
secara tradisional:
config_setting(
name = "is_arm",
values = {
"cpu": "arm",
},
)
Lihat detail selengkapnya di sini.
select
pada --cpu
, --crosstool_top
, dll. tidak memahami --platforms
.
Saat memigrasikan project ke platform, Anda harus mengonversinya menjadi
constraint_values
atau menggunakan pemetaan platform untuk mendukung
kedua gaya selama migrasi.
Transisi
Transisi Starlark mengubah flag ke bagian bawah grafik build Anda. Jika project Anda menggunakan transisi yang menetapkan --cpu
, --crossstool_top
, atau flag lama lainnya, aturan yang membaca --platforms
tidak akan melihat perubahan ini.
Saat memigrasikan project ke platform, Anda harus mengonversi perubahan seperti
return { "//command_line_option:cpu": "arm" }
menjadi return {
"//command_line_option:platforms": "//:my_arm_platform" }
atau menggunakan pemetaan
platform untuk mendukung kedua gaya selama
migrasi.
Memigrasikan kumpulan aturan Anda
Jika Anda memiliki kumpulan aturan dan ingin mendukung platform, Anda harus:
Meminta logika aturan menyelesaikan toolchain dengan API toolchain. Lihat toolchain API (
ctx.toolchains
).Opsional: tentukan flag
--incompatible_enable_platforms_for_my_language
agar logika aturan dapat menyelesaikan toolchain melalui API baru atau flag lama seperti--crosstool_top
selama pengujian migrasi secara bergantian.Tentukan properti relevan yang membentuk komponen platform. Lihat Properti platform umum
Menentukan toolchain standar dan membuatnya dapat diakses oleh pengguna melalui petunjuk pendaftaran aturan (detail)
Pastikan
select()
dan transisi konfigurasi mendukung platform. Ini adalah tantangan terbesar. Hal ini sangat menantang untuk project multibahasa (yang mungkin gagal jika semua bahasa tidak dapat membaca--platforms
).
Jika Anda perlu menggabungkan aturan yang tidak mendukung platform, Anda mungkin memerlukan pemetaan platform untuk menjembatani kesenjangan tersebut.
Properti platform umum
Properti platform lintas bahasa umum seperti OS
dan CPU
harus
dideklarasikan dalam @platforms
.
Hal ini mendorong aktivitas berbagi, standardisasi, dan kompatibilitas lintas bahasa.
Properti yang unik untuk aturan Anda harus dinyatakan di repositori aturan Anda. Hal ini memungkinkan Anda mempertahankan kepemilikan yang jelas atas konsep tertentu yang menjadi tanggung jawab aturan Anda.
Jika aturan Anda menggunakan OS atau CPU dengan tujuan khusus, aturan tersebut harus dideklarasikan dalam repo aturan Anda vs. @platforms
.
Pemetaan platform
Pemetaan platform adalah API sementara yang memungkinkan logika berbasis platform digabungkan dengan logika lama dalam build yang sama. Alat ini adalah alat tumpul yang hanya dimaksudkan untuk menghaluskan inkompatibilitas dengan jangka waktu migrasi yang berbeda.
Pemetaan platform adalah peta platform()
ke
kumpulan tanda lama yang sesuai atau sebaliknya. Contoh:
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 menggunakan ini untuk menjamin semua setelan, baik berbasis platform maupun lama, diterapkan secara konsisten di seluruh build, termasuk melalui transisi.
Secara default, Bazel akan membaca pemetaan dari file platform_mappings
di
root ruang kerja Anda. Anda juga dapat menetapkan --platform_mappings=//:my_custom_mapping
.
Lihat desain pemetaan platform untuk mengetahui detailnya.
Peninjauan API
platform
adalah kumpulan
constraint_value
target:
platform(
name = "myplatform",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
constraint_value
adalah properti
mesin. Nilai "jenis" yang sama dikelompokkan ke dalam constraint_setting
yang sama:
constraint_setting(name = "os")
constraint_value(
name = "linux",
constraint_setting = ":os",
)
constraint_value(
name = "mac",
constraint_setting = ":os",
)
toolchain
adalah aturan Starlark. Atributnya mendeklarasikan alat bahasa (seperti compiler =
"//mytoolchain:custom_gcc"
). Penyedianya meneruskan informasi ini ke aturan yang perlu di-build dengan alat tersebut.
Toolchain mendeklarasikan constraint_value
mesin yang dapat ditargetkan (target_compatible_with = ["@platforms//os:linux"]
) dan mesin yang dapat dijalankan alatnya (exec_compatible_with = ["@platforms//os:mac"]
).
Saat mem-build $ bazel build //:myproject --platforms=//:myplatform
, Bazel
akan otomatis memilih toolchain yang dapat berjalan pada mesin build dan
biner build untuk //:myplatform
. Ini dikenal sebagai resolusi toolchain.
Set toolchain yang tersedia dapat didaftarkan dalam file MODULE.bazel
dengan register_toolchains
atau di
command line dengan --extra_toolchains
.
Untuk informasi selengkapnya, lihat di sini.
Pertanyaan
Untuk mendapatkan dukungan umum dan pertanyaan tentang linimasa migrasi, hubungi bazel-discuss atau pemilik aturan yang sesuai.
Untuk diskusi tentang desain dan evolusi API platform/toolchain, hubungi bazel-dev.