Bazel memiliki dukungan canggih untuk memodelkan platform dan toolchain untuk build multi-arsitektur dan 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
disetel.
Artinya, Anda dapat mengonfigurasi project C++ dengan:
bazel build //:my_cpp_project --platforms=//:myplatform
bukan versi lama:
bazel build //:my_cpp_project` --cpu=... --crosstool_top=... --compiler=...
Fitur 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.
Flag ini menggantikan flag 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
disetel.
Artinya, 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
.
Fitur ini akan diaktifkan secara default di Bazel 7.0 (#16285).
Untuk menguji project Android Anda dengan platform, lihat Memigrasikan Project Anda.
Apple
Aturan Apple tidak mendukung platform dan belum dijadwalkan untuk didukung.
Anda tetap dapat menggunakan API platform dengan build Apple (misalnya, saat mem-build dengan campuran aturan Apple dan C++ murni) dengan pemetaan platform.
Bahasa lainnya
- Aturan Go sepenuhnya mendukung platform
- Aturan Rust mendukung platform sepenuhnya.
Jika Anda memiliki set aturan bahasa, lihat Memigrasikan set aturan Anda untuk menambahkan dukungan.
Latar belakang
Platform dan toolchain diperkenalkan untuk menstandardisasi cara project software menargetkan berbagai arsitektur dan melakukan kompilasi silang.
Hal ini
terinspirasi
oleh pengamatan bahwa pengelola bahasa sudah melakukannya secara ad
hoc dan tidak kompatibel. Misalnya, aturan C++ menggunakan --cpu
dan --crosstool_top
untuk mendeklarasikan CPU dan toolchain target. Tidak satu pun dari keduanya
memodelkan "platform" dengan benar. Hal ini menghasilkan build yang canggung dan salah.
Java, Android, dan bahasa lainnya mengembangkan flaganya sendiri untuk tujuan serupa, dan tidak ada yang dapat beroperasi satu sama lain. Hal ini membuat build lintas bahasa menjadi membingungkan dan rumit.
Bazel ditujukan untuk project besar, multi-bahasa, dan multi-platform. Hal ini memerlukan dukungan yang lebih berprinsip untuk konsep ini, termasuk API standar yang jelas.
Kebutuhan migrasi
Mengupgrade ke API baru memerlukan dua upaya: merilis API dan mengupgrade logika aturan untuk menggunakannya.
Yang pertama sudah selesai, tetapi yang kedua sedang berlangsung. Hal ini terdiri dari memastikan
platform dan toolchain khusus bahasa ditentukan, logika bahasa membaca
toolchain melalui API baru, bukan flag lama seperti --crosstool_top
, dan
config_setting
s memilih di API baru, bukan flag lama.
Pekerjaan ini mudah, tetapi memerlukan upaya yang berbeda untuk setiap bahasa, serta peringatan yang adil bagi pemilik project untuk menguji perubahan yang akan datang.
Inilah alasan mengapa migrasi ini sedang berlangsung.
Sasaran
Migrasi ini selesai saat semua project dibangun dengan formulir:
bazel build //:myproject --platforms=//:myplatform
Hal ini berarti:
- Aturan project Anda memilih toolchain yang tepat untuk
//:myplatform
. - Dependensi project Anda memilih toolchain yang tepat untuk
//:myplatform
. - Referensi
//:myplatform
deklarasi umum dariCPU
,OS
, dan properti generik lainnya yang tidak bergantung pada bahasa - Semua
select()
s yang relevan cocok dengan//:myplatform
dengan benar. //:myplatform
ditentukan di tempat yang jelas dan dapat diakses: di repo project Anda jika platformnya unik untuk project Anda, atau di tempat umum yang dapat ditemukan oleh semua project yang menggunakannya
Flag lama seperti --cpu
, --crosstool_top
, dan --fat_apk_cpu
akan dihentikan penggunaannya dan dihapus segera setelah aman untuk melakukannya.
Pada akhirnya, ini akan menjadi satu-satunya cara untuk mengonfigurasi arsitektur.
Memigrasikan project Anda
Jika Anda membangun 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 yang tepat.
Jika bahasa memerlukan tanda untuk mengaktifkan dukungan platform, Anda juga perlu menyetel tanda tersebut. Lihat Status untuk mengetahui detailnya.
Agar project Anda dapat dibuat, Anda harus memeriksa hal berikut:
//:myplatform
harus ada. Biasanya, pemilik proyek bertanggung jawab untuk menentukan platform karena proyek yang berbeda menargetkan komputer yang berbeda. Lihat Platform default.Toolchain yang ingin Anda gunakan harus ada. Jika menggunakan toolchain bawaan, pemilik bahasa harus menyertakan petunjuk cara mendaftarkannya. Jika menulis toolchain kustom Anda sendiri, Anda perlu mendaftarkannya di file
MODULE.bazel
atau dengan--extra_toolchains
.select()
s dan transisi konfigurasi harus diselesaikan dengan benar. Lihat select() dan Transisi.Jika build Anda mencampurkan 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 kami untuk mendapatkan dukungan.
Platform default
Pemilik project harus menentukan
platform eksplisit untuk mendeskripsikan arsitektur
yang ingin mereka bangun. Kemudian, fungsi ini dipicu dengan --platforms
.
Jika --platforms
tidak ditetapkan, Bazel akan menggunakan platform
secara default yang merepresentasikan mesin build lokal. Ini dibuat secara otomatis di @platforms//host
(diberi alias sebagai
@bazel_tools//tools:host_platform
)
sehingga Anda tidak perlu menentukannya secara eksplisit. Memetakan OS
dan CPU
komputer lokal dengan constraint_value
yang dideklarasikan di @platforms
.
select()
Project dapat select()
di
target constraint_value
, tetapi tidak dapat diselesaikan di
platform. Hal ini disengaja agar select()
mendukung sebanyak mungkin jenis mesin. Library dengan sumber khusus ARM
harus mendukung semua mesin yang didukung ARM
, kecuali jika ada alasan untuk lebih spesifik.
Untuk memilih satu atau beberapa constraint_value
, gunakan:
config_setting(
name = "is_arm",
constraint_values = [
"@platforms//cpu:arm",
],
)
Hal ini setara dengan memilih secara tradisional di --cpu
:
config_setting(
name = "is_arm",
values = {
"cpu": "arm",
},
)
Lihat detail selengkapnya di sini.
select
di --cpu
, --crosstool_top
, dll. tidak memahami --platforms
.
Saat memigrasikan project ke platform, Anda harus mengonversinya ke
constraint_values
atau menggunakan pemetaan platform untuk mendukung
kedua gaya selama migrasi.
Transisi
Transisi Starlark mengubah
bagian 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.
window.
Memigrasikan kumpulan aturan Anda
Jika Anda memiliki set aturan dan ingin mendukung platform, Anda harus:
Meminta logika aturan menyelesaikan toolchain dengan Toolchain API. Lihat toolchain API (
ctx.toolchains
).Opsional: tentukan flag
--incompatible_enable_platforms_for_my_language
sehingga logika aturan secara bergantian menyelesaikan toolchain melalui API baru atau flag lama seperti--crosstool_top
selama pengujian migrasi.Tentukan properti yang relevan yang membentuk komponen platform. Lihat Properti platform umum
Tentukan toolchain standar dan buat toolchain tersebut dapat diakses oleh pengguna melalui petunjuk pendaftaran aturan Anda (detail)
Pastikan
select()
s dan transisi konfigurasi mendukung platform. Ini adalah tantangan terbesar. Hal ini terutama sulit untuk project multi-bahasa (yang mungkin gagal jika semua bahasa tidak dapat membaca--platforms
).
Jika Anda perlu menggabungkan dengan 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 di @platforms
.
Hal ini mendorong berbagi, standardisasi, dan kompatibilitas lintas bahasa.
Properti unik untuk aturan Anda harus dideklarasikan di repo 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 tujuan kustom, OS atau CPU ini harus dideklarasikan di repo aturan Anda, bukan di
@platforms
.
Pemetaan platform
Pemetaan platform adalah API sementara yang memungkinkan logika yang kompatibel dengan platform berinteraksi dengan logika lama dalam build yang sama. Ini adalah alat sederhana yang hanya ditujukan untuk memuluskan ketidakcocokan dengan jangka waktu migrasi yang berbeda.
Pemetaan platform adalah peta platform()
ke set flag 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 menggunakannya untuk menjamin semua setelan, baik berbasis platform maupun lama, diterapkan secara konsisten di seluruh build, termasuk melalui transisi.
Secara default, Bazel 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
target constraint_value
:
platform(
name = "myplatform",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
constraint_value
adalah properti
mesin. Nilai dengan "jenis" yang sama dikelompokkan 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 dibuat dengan alat ini.
Rangkaian alat mendeklarasikan constraint_value
mesin yang dapat
ditargetkan
(target_compatible_with = ["@platforms//os:linux"]
) dan mesin yang dapat
menjalankan alatnya
(exec_compatible_with = ["@platforms//os:mac"]
).
Saat mem-build $ bazel build //:myproject --platforms=//:myplatform
, Bazel
akan otomatis memilih toolchain yang dapat berjalan di mesin build dan
mem-build biner untuk //:myplatform
. Hal ini dikenal sebagai penyelesaian toolchain.
Kumpulan 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 mengajukan pertanyaan tentang linimasa migrasi, hubungi bazel-discuss atau pemilik aturan yang sesuai.
Untuk diskusi tentang desain dan evolusi API platform/toolchain, hubungi bazel-dev.