Menggunakan Bazel di Windows

Laporkan masalah Lihat sumber Per Malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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

Masalah umum

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

Praktik terbaik

Menghindari masalah jalur yang panjang

Beberapa alat memiliki Batasan Panjang Jalur Maksimum di Windows, termasuk compiler MSVC. Agar masalah ini tidak terjadi, Anda dapat menentukan direktori output pendek untuk Bazel dengan flag --output_user_root.

Misalnya, tambahkan baris berikut ke file bazelrc Anda:

startup --output_user_root=C:/tmp

Aktifkan dukungan nama file 8.3

Bazel mencoba membuat versi nama pendek untuk jalur file yang panjang. Namun, 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 {i>symlink<i} 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 mempermudah, tambahkan baris berikut ke file bazelrc 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 menjalankan Bazel dari bash -- baik dari shell MSYS2, atau Git Bash, atau Cygwin, atau varian Bash lainnya. Sementara Bazel mungkin bekerja untuk sebagian besar kasus penggunaan, ada beberapa hal yang rusak, seperti mengganggu build dengan Ctrl+C dari MSYS2). Juga, jika Anda memilih untuk menjalankan di bawah MSYS2, Anda perlu menonaktifkan MSYS2's konversi jalur otomatis, jika tidak, MSYS akan mengonversi argumen baris perintah yang terlihat seperti jalur Unix (seperti //foo:bar) ke jalur Windows. Lihat jawaban StackOverflow ini untuk mengetahui detailnya.

Menggunakan Bazel tanpa Bash (MSYS2)

Menggunakan build bazel tanpa Bash

Versi Bazel sebelum 1.0 biasanya memerlukan Bash untuk membuat beberapa aturan.

Dimulai dengan Bazel 1.0, Anda dapat membuat aturan apa pun tanpa Bash kecuali jika:

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

Namun, genrule sering digunakan untuk tugas sederhana seperti menyalin file atau menulis file teks. Daripada menggunakan genrule (dan bergantung pada Bash), Anda mungkin menemukan aturan yang sesuai di repositori bazel-skylib. Saat dibuat 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.

Dimulai dengan Bazel 1.0, Anda dapat menguji aturan apa pun tanpa Bash, kecuali jika:

  • Anda menggunakan --run_under
  • aturan pengujian itu sendiri memerlukan Bash (karena {i>executable<i}-nya adalah skrip {i>shell<i})

Menggunakan {i>bazel run<i} tanpa Bash

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

Dimulai dengan 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 {i>executable<i}-nya adalah skrip {i>shell<i})

Menggunakan aturan shbinary dan sh*, serta ctx.actions.run_shell() tanpa Bash

Anda memerlukan Bash untuk membangun dan menguji aturan sh_*, serta membangun dan menguji Starlark aturan yang menggunakan ctx.actions.run_shell() dan ctx.resolve_command(). Ini tidak hanya berlaku untuk aturan proyek Anda, tetapi juga untuk aturan dalam repositori yang menjadi dependensi project Anda (bahkan secara transitif).

Di masa depan, mungkin ada pilihan menggunakan Windows Subsystem untuk Linux (WSL) untuk membuat aturan ini, tetapi saat ini hal itu bukan prioritas bagi subtim Bazel-on-Windows.

Menyetel variabel lingkungan

Variabel lingkungan yang Anda tetapkan di Windows Command Prompt (cmd.exe) hanya dalam sesi command prompt tersebut. Jika memulai cmd.exe baru, Anda harus dan kembali mengatur variabel. 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 aplikasi di Windows

Membangun C++ dengan MSVC

Untuk membangun target C++ dengan MSVC, Anda memerlukan:

  • Compiler Visual C++.

  • (Opsional) Variabel lingkungan BAZEL_VC dan BAZEL_VC_FULL_VERSION.

    Bazel secara otomatis mendeteksi compiler Visual C++ pada sistem Anda. Untuk memberi tahu Bazel agar menggunakan instalasi VC tertentu, Anda dapat mengatur 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) Versi lengkap hanya untuk Visual Studio 2017 dan 2019 nomor Visual C++ Build Tools Anda. Anda dapat memilih Visual C++ Build Tools yang tepat versi melalui BAZEL_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 Tools

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

    Windows SDK berisi file header dan library yang Anda perlukan saat membangun aplikasi Windows, termasuk Bazel sendiri. Secara {i>default<i}, Windows SDK terbaru yang terinstal akan sebaiknya 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 SDK Windows 8.1 yang tersedia). Pastikan Anda memiliki Windows SDK telah diinstal.

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

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

Jika semuanya sudah diatur, Anda dapat membangun target C++ sekarang!

Coba buat target dari salah satu contoh kami project:

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, 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 membangun target arsitektur ARM, jalankan:

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

Untuk membuat dan menggunakan Dynamically Linked Libraries (file DLL), lihat ini contoh.

Batas Panjang Command Line: Untuk mencegah Masalah batas panjang command line Windows, mengaktifkan fitur file parameter compiler melalui --features=compiler_param_file.

Membangun C++ dengan Clang

Mulai versi 0.29.0, Bazel mendukung proses build dengan driver compiler yang kompatibel dengan MSVC LLVM (clang-cl.exe).

Persyaratan: Untuk membangun aplikasi dengan Clang, Anda harus menginstal keduanya Alat LLVM dan Visual C++ Build, karena meskipun Anda menggunakan clang-cl.exe sebagai compiler, Anda masih harus menautkan ke Library C++ visual.

Bazel dapat secara otomatis mendeteksi instalasi LLVM pada sistem Anda, atau Anda dapat Bazel tempat LLVM diinstal oleh BAZEL_LLVM.

  • BAZEL_LLVM direktori penginstalan LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

Ada beberapa situasi untuk mengaktifkan toolchain Clang untuk membangun C++.

  • 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 ke BUILD file (misalnya 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 di file WORKSPACE Anda:
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    Class --incompatible_enable_cc_toolchain_resolution rencananya akan diaktifkan secara default pada rilis Bazel mendatang. Oleh karena itu, kami menyarankan Anda untuk mengaktifkan dukungan Clang dengan pendekatan kedua.

Membangun Java

Untuk membangun 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

Coba buat target dari salah satu contoh kami project:

  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 membuat dua file output untuk aturan py_binary:

  • file {i>zip<i} yang diekstrak sendiri
  • file yang dapat dieksekusi yang dapat meluncurkan penafsir Python dengan mengekstrak file zip secara mandiri sebagai argumen

Anda dapat menjalankan file yang dapat dieksekusi (file ini memiliki ekstensi .exe) atau Anda dapat menjalankan Python dengan file zip yang mengekstrak mandiri sebagai argumen.

Coba buat target dari salah satu contoh kami project:

  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 rincian tentang bagaimana Bazel membangun target Python Windows, lihat desain ini dokumen.