Menggunakan Bazel di Windows

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

Halaman ini membahas Praktik Terbaik untuk menggunakan Bazel di Windows. Untuk petunjuk penginstalan, baca Menginstal Bazel di Windows.

Masalah umum

Masalah Bazel terkait Windows ditandai dengan label "team-Windows" di GitHub. Anda dapat melihat masalah terbuka di sini.

Praktik terbaik

Menghindari masalah jalur yang 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 bazel Anda:

startup --output_user_root=C:/tmp

Mengaktifkan dukungan nama file 8.3

Bazel mencoba membuat versi nama pendek untuk jalur file yang panjang. Tetapi untuk melakukannya, dukungan nama file 8.3 harus 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

Beberapa fitur mengharuskan Bazel dapat membuat symlink file di Windows, baik dengan mengaktifkan Mode Developer (di Windows 10 versi 1703 atau yang lebih baru), atau dengan menjalankan Bazel sebagai administrator. Tindakan ini akan mengaktifkan fitur berikut:

Untuk mempermudahnya, tambahkan baris berikut ke file bazel Anda:

startup --windows_enable_symlinks
build --enable_runfiles

Catatan: Membuat symlink di Windows adalah operasi yang mahal. Tanda --enable_runfiles berpotensi membuat symlink file dalam jumlah besar. Hanya aktifkan fitur ini saat Anda membutuhkannya.

Menjalankan Bazel: MSYS2 shell vs. command prompt vs. PowerShell

Rekomendasi: Jalankan Bazel dari command prompt (cmd.exe) atau dari PowerShell.

Mulai 15-01-2020, jangan jalankan Bazel dari bash -- baik dari shell MSYS2, atau Git Bash, atau Cygwin, atau varian Bash lainnya. Meskipun Bazel dapat berfungsi untuk sebagian besar kasus penggunaan, beberapa hal rusak, 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 mengetahui detailnya.

Menggunakan Bazel tanpa Bash (MSYS2)

Menggunakan build bazel tanpa Bash

Versi Bazel sebelum versi 1.0 biasanya mewajibkan Bash untuk membuat beberapa aturan.

Mulai dari Bazel 1.0, Anda dapat membuat aturan apa pun tanpa Bash kecuali jika ini merupakan:

  • genrule, karena genrules menjalankan perintah Bash
  • Aturan sh_binary atau sh_test, karena inheren memerlukan Bash
  • Aturan Starlark yang menggunakan ctx.actions.run_shell() atau ctx.resolve_command()

Namun, genrule sering digunakan untuk tugas-tugas sederhana seperti menyalin file atau menulis file teks. Anda dapat menemukan aturan yang sesuai di repositori bazel-skylib, bukan menggunakan genrule (dan bergantung pada Bash). Saat mem-build di Windows, aturan ini tidak memerlukan Bash.

Menggunakan uji bazel tanpa Bash

Versi Bazel sebelum 1.0 biasanya memerlukan Bash untuk bazel test apa pun.

Mulai dari Bazel 1.0, Anda dapat menguji aturan apa pun tanpa Bash, kecuali jika:

  • Anda 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 biasanya memerlukan 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 shbinary 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, tetapi juga untuk aturan di salah satu repositori eksternal yang bergantung pada project Anda (bahkan secara transitif).

Di masa mendatang, mungkin ada opsi untuk menggunakan Windows Subsystem for Linux (WSL) untuk mem-build aturan ini, tetapi saat ini hal tersebut bukan prioritas bagi sub-tim Bazel-on-Windows.

Menyetel variabel lingkungan

Variabel lingkungan yang Anda tetapkan di Command Prompt Windows (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....

Mem-build pada Windows

Mem-build C++ dengan MSVC

Untuk membuat target C++ dengan MSVC, Anda perlu:

  • Compiler Visual C++.

  • (Opsional) Variabel lingkungan BAZEL_VC dan BAZEL_VC_FULL_VERSION.

    Bazel otomatis mendeteksi compiler Visual C++ di sistem Anda. Untuk memberi tahu Bazel untuk menggunakan penginstalan VC tertentu, Anda dapat menyetel variabel lingkungan berikut:

    Untuk Visual Studio 2017 dan 2019, tetapkan salah satu dari BAZEL_VC. Selain itu, Anda juga dapat menetapkan BAZEL_VC_FULL_VERSION.

    • BAZEL_VC direktori penginstalan Visual C++ Build Tools

      set 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 melalui BAZEL_VC_FULL_VERSION jika lebih dari satu versi diinstal, atau Bazel akan memilih versi terbaru.

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    Untuk Visual Studio 2015 atau yang lebih lama, setel BAZEL_VC. (BAZEL_VC_FULL_VERSION tidak didukung.)

    • BAZEL_VC direktori penginstalan Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • Windows SDK.

    Windows SDK berisi file header dan library yang Anda perlukan saat mem-build aplikasi Windows, termasuk Bazel itu sendiri. Secara default, Windows SDK yang terinstal terakhir akan digunakan. Anda juga dapat menentukan versi Windows SDK dengan menyetel BAZEL_WINSDK_FULL_VERSION. Anda dapat menggunakan nomor Windows 10 SDK lengkap seperti 10.0.10240.0, atau menentukan 8.1 untuk menggunakan Windows 8.1 SDK (hanya satu versi Windows 8.1 SDK yang tersedia). Pastikan Anda telah menginstal Windows SDK yang ditentukan.

    Persyaratan: Hal ini didukung dengan VC 2017 dan 2019. VC 2015 Build Tools mandiri tidak mendukung pemilihan Windows SDK, Anda akan memerlukan penginstalan Visual Studio 2015 yang lengkap, jika tidak, BAZEL_WINSDK_FULL_VERSION akan diabaikan.

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

Jika semuanya sudah siap, Anda dapat mem-build target C++ sekarang.

Cobalah membuat target dari salah satu contoh project kami:

bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe

Secara default, biner yang dibuat 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, untuk membuat target untuk arsitektur ARM, jalankan:

bazel build //examples/cpp:hello-world --cpu=x64_arm_windows

Untuk mem-build dan menggunakan Library Dynamic Linked (file DLL), lihat contoh ini.

Batas Panjang Baris Perintah: Untuk mencegah masalah batas panjang command line Windows, aktifkan fitur file parameter compiler melalui --features=compiler_param_file.

Mem-build C++ dengan Clang

Dari 0.29.0, Bazel mendukung build dengan driver compiler yang kompatibel dengan MSVM LLVM (clang-cl.exe).

Persyaratan: Untuk mem-build dengan Clang, Anda harus menginstal alat LLVM dan Visual C++ Build, karena meskipun menggunakan clang-cl.exe sebagai compiler, Anda masih perlu menautkan ke library Visual C++.

Bazel dapat otomatis mendeteksi penginstalan LLVM di sistem, atau Anda dapat secara eksplisit memberi tahu Bazel tempat LLVM diinstal oleh BAZEL_LLVM.

  • BAZEL_LLVM direktori penginstalan LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

Untuk mengaktifkan toolchain Clang dalam mem-build C++, ada beberapa situasi.

  • Di bazel 0.28 dan yang lebih lama: Clang tidak didukung.

  • Tanpa --incompatible_enable_cc_toolchain_resolution: Anda dapat mengaktifkan toolchain Clang melalui flag build --compiler=clang-cl.

  • Dengan --incompatible_enable_cc_toolchain_resolution: Anda harus menambahkan target platform ke BUILD file (mis., file BUILD 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:

    • Tentukan 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 dalam file WORKSPACE 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 akan diaktifkan secara default pada rilis Bazel mendatang. Oleh karena itu, sebaiknya aktifkan dukungan Clang dengan pendekatan kedua.

Java Build

Untuk membuat target Java, Anda memerlukan:

Di Windows, Bazel membuat dua file output untuk aturan java_binary:

  • file .jar
  • file .exe yang dapat menyiapkan lingkungan untuk JVM dan menjalankan biner

Cobalah membuat 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

Mem-build Python

Untuk mem-build target Python, Anda memerlukan:

Di Windows, Bazel membuat dua file output untuk aturan py_binary:

  • file zip yang mengekstrak sendiri
  • file yang dapat dieksekusi yang dapat meluncurkan penafsir Python dengan file zip yang diekstrak sendiri sebagai argumen

Anda dapat menjalankan file yang dapat dieksekusi (memiliki ekstensi .exe) atau menjalankan Python dengan file zip yang diekstrak sendiri sebagai argumen.

Cobalah membuat 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 tertarik dengan detail cara Bazel mem-build target Python di Windows, lihat dokumen desain ini.