Halaman ini membahas Praktik Terbaik untuk menggunakan Bazel di Windows. Untuk petunjuk penginstalan, lihat Menginstal Bazel di Windows.
Masalah umum
Masalah Bazel terkait Windows ditandai dengan label "team-Windows" di GitHub. Anda dapat melihat masalah yang belum ditangani di sini.
Praktik terbaik
Menghindari masalah jalur panjang
Beberapa alat memiliki Batasan Panjang Jalur Maksimum di Windows, termasuk compiler MSVC. Untuk menghindari masalah ini, Anda dapat menentukan direktori output singkat untuk Bazel dengan flag --output_user_root.
Misalnya, tambahkan baris berikut ke file bazelrc Anda:
startup --output_user_root=C:/tmp
Mengaktifkan dukungan nama file 8.3
Bazel mencoba membuat versi nama pendek untuk jalur file yang panjang. Namun, untuk melakukannya, dukungan nama file 8.3 perlu diaktifkan untuk volume tempat file dengan jalur panjang berada. Anda dapat mengaktifkan pembuatan nama 8.3 di semua volume dengan menjalankan perintah berikut:
fsutil 8dot3name set 0
Mengaktifkan dukungan symlink
Beberapa fitur mengharuskan Bazel dapat membuat symlink file di Windows, baik dengan mengaktifkan Mode Developer (di Windows 10 versi 1703 atau yang lebih baru), maupun dengan menjalankan Bazel sebagai administrator. Tindakan ini akan mengaktifkan fitur berikut:
Untuk mempermudah, tambahkan baris berikut ke file bazelrc Anda:
startup --windows_enable_symlinks
build --enable_runfiles
Catatan: Membuat symlink di Windows adalah operasi yang mahal. Flag --enable_runfiles
berpotensi membuat symlink file dalam jumlah besar. Aktifkan fitur ini hanya saat Anda membutuhkannya.
Menjalankan Bazel: shell MSYS2 vs. command prompt vs. PowerShell
Rekomendasi: Jalankan Bazel dari command prompt (cmd.exe
) atau dari PowerShell.
Mulai 15-01-2020, jangan menjalankan Bazel dari bash
-- baik
dari shell MSYS2, Git Bash, maupun mengurangi sendiri, atau varian Bash lainnya. Meskipun Bazel
mungkin berfungsi untuk sebagian besar kasus penggunaan, beberapa hal tidak dapat dilakukan, seperti
mengganggu build dengan Ctrl+C dari MSYS2).
Selain itu, jika memilih untuk menjalankan pada MSYS2, Anda harus menonaktifkan konversi jalur otomatis
MSYS2. Jika tidak, MSYS akan mengonversi argumen command line
yang terlihat seperti jalur Unix (seperti //foo:bar
) menjadi jalur Windows. Lihat jawaban StackOverflow ini untuk detailnya.
Menggunakan Bazel tanpa Bash (MSYS2)
Menggunakan build bazel tanpa Bash
Versi Bazel sebelum 1.0 biasanya meminta Bash untuk membuat beberapa aturan.
Mulai Bazel 1.0, Anda dapat membuat aturan apa pun tanpa Bash kecuali aturan tersebut:
genrule
, karena genrules mengeksekusi perintah Bash- Aturan
sh_binary
ataush_test
, karena ini secara inheren memerlukan Bash - Aturan Starlark yang menggunakan
ctx.actions.run_shell()
atauctx.resolve_command()
Namun, genrule
sering kali digunakan untuk tugas sederhana seperti
menyalin file
atau menulis file teks.
Daripada menggunakan genrule
(dan bergantung pada Bash), Anda mungkin akan menemukan aturan yang sesuai di repositori bazel-skylib.
Saat dibuat di Windows, aturan ini tidak memerlukan Bash.
Menggunakan pengujian bazel tanpa Bash
Versi Bazel sebelum 1.0 sebelumnya mengharuskan Bash untuk bazel test
apa pun.
Mulai Bazel 1.0, Anda dapat menguji aturan apa pun tanpa Bash, kecuali jika:
- kamu menggunakan
--run_under
- aturan pengujian itu sendiri memerlukan Bash (karena file yang dapat dieksekusi adalah skrip shell)
Menggunakan bazel run tanpa Bash
Versi Bazel sebelum 1.0 sebelumnya mengharuskan Bash untuk bazel run
apa pun.
Mulai dari Bazel 1.0, Anda dapat menjalankan aturan apa pun tanpa Bash, kecuali jika:
- Anda menggunakan
--run_under
atau--script_path
- aturan pengujian itu sendiri memerlukan Bash (karena file yang dapat dieksekusi adalah skrip shell)
Menggunakan aturan sh_binary dan sh_*, serta ctx.actions.run_shell() tanpa Bash
Anda memerlukan Bash untuk membuat dan menguji aturan sh_*
, serta membuat dan menguji aturan Starlark yang menggunakan ctx.actions.run_shell()
dan ctx.resolve_command()
. Hal ini tidak hanya berlaku untuk aturan dalam project Anda, tetapi juga untuk aturan di salah satu repositori eksternal yang menjadi dependensi project Anda (bahkan secara transitif).
Di masa mendatang, mungkin ada opsi untuk menggunakan Windows Subsystem for Linux (WSL) guna membuat aturan ini, tetapi saat ini aturan tersebut belum menjadi prioritas subtim Bazel-on-Windows.
Menyetel variabel lingkungan
Variabel lingkungan yang Anda tetapkan pada Windows Command Prompt (cmd.exe
) hanya
ditetapkan dalam sesi command prompt tersebut. Jika memulai cmd.exe
baru, Anda harus menetapkan variabel lagi. Untuk selalu menetapkan variabel saat cmd.exe
dimulai, Anda
dapat menambahkannya ke Variabel pengguna atau Variabel sistem di kotak dialog Control Panel >
System Properties > Advanced > Environment Variables...
.
Membangun di Windows
Membangun C++ dengan MSVC
Untuk membangun target C++ dengan MSVC, Anda memerlukan:
(Opsional) Variabel lingkungan
BAZEL_VC
danBAZEL_VC_FULL_VERSION
.Bazel akan otomatis mendeteksi compiler Visual C++ di sistem Anda. Untuk memberi tahu Bazel agar menggunakan penginstalan VC tertentu, Anda dapat menetapkan variabel lingkungan berikut:
Untuk Visual Studio 2017 dan 2019, tetapkan salah satu
BAZEL_VC
. Selain itu, Anda juga dapat menetapkanBAZEL_VC_FULL_VERSION
.BAZEL_VC
direktori penginstalan Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
BAZEL_VC_FULL_VERSION
(Opsional) Hanya untuk Visual Studio 2017 dan 2019, nomor versi lengkap Visual C++ Build Tools Anda. Anda dapat memilih versi Visual C++ Build Tools yang tepat melaluiBAZEL_VC_FULL_VERSION
jika lebih dari satu versi terinstal. Jika tidak, Bazel akan memilih versi terbaru.set BAZEL_VC_FULL_VERSION=14.16.27023
Untuk Visual Studio 2015 atau yang lebih lama, tetapkan
BAZEL_VC
. (BAZEL_VC_FULL_VERSION
tidak didukung.)BAZEL_VC
direktori penginstalan Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
Windows SDK berisi file header dan library yang Anda perlukan saat mem-build aplikasi Windows, termasuk Bazel itu sendiri. Secara default, Windows SDK terbaru yang diinstal akan digunakan. Anda juga dapat menentukan versi Windows SDK dengan menyetel
BAZEL_WINSDK_FULL_VERSION
. Anda dapat menggunakan nomor SDK Windows 10 lengkap seperti 10.0.10240.0, atau menentukan 8.1 untuk menggunakan SDK Windows 8.1 (hanya satu versi Windows 8.1 SDK yang tersedia). Pastikan Anda telah menginstal Windows SDK yang ditentukan.Persyaratan: Ini didukung dengan VC 2017 dan 2019. Build Tools VC 2015 mandiri tidak mendukung pemilihan Windows SDK. Anda memerlukan penginstalan Visual Studio 2015 penuh. Jika tidak,
BAZEL_WINSDK_FULL_VERSION
akan diabaikan.set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
Jika semuanya telah disiapkan, Anda dapat membuat target C++ sekarang.
Coba buat target dari salah satu contoh project kami:
bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe
Secara default, biner yang dibangun menargetkan arsitektur x64. Untuk menentukan arsitektur target
yang berbeda, tetapkan opsi build --cpu
untuk arsitektur target Anda:
* x64 (default): --cpu=x64_windows
atau tanpa opsi
* x86: --cpu=x64_x86_windows
* ARM: --cpu=x64_arm_windows
* ARM64: --cpu=arm64_windows
Misalnya, guna membangun target untuk arsitektur ARM, jalankan:
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
Untuk membuat dan menggunakan Dynamic Linked Libraries (file DLL), lihat contoh ini.
Batas Panjang Command Line: Untuk mencegah
masalah batas panjang command line Windows,
aktifkan fitur file parameter compiler melalui --features=compiler_param_file
.
Membuat C++ dengan Clang
Mulai 0.29.0, Bazel mendukung proses build dengan driver compiler yang kompatibel dengan MSVC (clang-cl.exe
) dari LLVM.
Persyaratan: Untuk membuat aplikasi dengan Clang, Anda harus menginstal alat LLVM dan Visual C++ Build baik karena meskipun menggunakan clang-cl.exe
sebagai compiler, Anda masih harus menautkan ke library Visual C++.
Bazel dapat otomatis mendeteksi penginstalan LLVM pada sistem, atau Anda dapat secara eksplisit memberi tahu
Bazel tempat LLVM diinstal oleh BAZEL_LLVM
.
BAZEL_LLVM
direktori penginstalan LLVMset BAZEL_LLVM=C:\Program Files\LLVM
Untuk mengaktifkan toolchain Clang untuk mem-build C++, ada beberapa situasi.
Pada bazel 0.28 dan yang lebih lama: Clang tidak didukung.
Tanpa
--incompatible_enable_cc_toolchain_resolution
: Anda dapat mengaktifkan toolchain Clang dengan flag build--compiler=clang-cl
.Dengan
--incompatible_enable_cc_toolchain_resolution
: Anda harus menambahkan target platform keBUILD file
(misalnya, fileBUILD
level teratas):platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", ], )
Kemudian, Anda dapat mengaktifkan toolchain Clang dengan salah satu dari dua cara berikut:
- Tetapkan flag build berikut:
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
- Daftarkan platform dan toolchain di file
MODULE.bazel
Anda:
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
Flag --incompatible_enable_cc_toolchain_resolution direncanakan untuk diaktifkan secara default pada rilis Bazel mendatang. Oleh karena itu, sebaiknya aktifkan dukungan Clang dengan pendekatan kedua.
Java Build
Untuk membangun target Java, Anda membutuhkan:
Di Windows, Bazel mem-build dua file output untuk aturan java_binary
:
- file
.jar
- file
.exe
yang dapat menyiapkan lingkungan untuk JVM dan menjalankan biner
Coba buat target dari salah satu contoh project kami:
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe
Membangun Python
Untuk membangun target Python, Anda memerlukan:
Di Windows, Bazel mem-build dua file output untuk aturan py_binary
:
- file {i>zip<i} yang mengekstrak sendiri
- file yang dapat dieksekusi yang dapat meluncurkan penafsir Python dengan file zip yang mengekstrak sendiri sebagai argumen
Anda dapat menjalankan file yang dapat dieksekusi (file ini memiliki ekstensi .exe
) atau menjalankan
Python dengan file zip yang mengekstrak sendiri sebagai argumen.
Coba buat target dari salah satu contoh project kami:
bazel build //examples/py_native:bin
bazel-bin\examples\py_native\bin.exe
python bazel-bin\examples\py_native\bin.zip
Jika Anda ingin mengetahui detail tentang cara Bazel mem-build target Python di Windows, lihat dokumen desain ini.