การใช้ Bazel บน Windows

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้จะกล่าวถึงแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Bazel บน Windows สำหรับติดตั้ง โปรดดูวิธีการที่หัวข้อติดตั้ง Bazel ใน Windows

ปัญหาที่ทราบ

ปัญหาเกี่ยวกับ Bazel ที่เกี่ยวข้องกับ Windows จะมีคำว่า "ทีม Windows" กำกับอยู่ บน GitHub ดูปัญหาที่ยังไม่ได้รับการแก้ไขได้ที่นี่

แนวทางปฏิบัติแนะนำ

หลีกเลี่ยงปัญหาเส้นทางยาว

เครื่องมือบางอย่างมีขีดจำกัดความยาวเส้นทางสูงสุดใน Windows ซึ่งรวมถึงคอมไพเลอร์ MSVC คุณระบุไดเรกทอรีเอาต์พุตแบบสั้นสำหรับ Bazel ได้โดยใช้แฟล็ก --output_user_root เพื่อหลีกเลี่ยงปัญหานี้

ตัวอย่างเช่น ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc:

startup --output_user_root=C:/tmp

เปิดใช้การรองรับชื่อไฟล์ 8.3

บาเซลพยายามสร้างเวอร์ชันชื่อย่อสำหรับเส้นทางไฟล์ที่ยาว แต่หากต้องการเปิดใช้การรองรับชื่อไฟล์ 8.3 จะต้องเปิดใช้งานวอลุ่มที่มีเส้นทางยาวอยู่ด้วย คุณสามารถเปิดใช้การสร้างชื่อ 8.3 ในวอลุ่มทั้งหมดโดยเรียกใช้คำสั่งต่อไปนี้

fsutil 8dot3name set 0

ฟีเจอร์บางอย่างต้องให้ Bazel สร้างลิงก์สัญลักษณ์ของไฟล์บน Windows ได้ ด้วยการเปิดใช้งาน โหมดนักพัฒนาซอฟต์แวร์ (ใน Windows 10 เวอร์ชัน 1703 ขึ้นไป) หรือเรียกใช้ Bazel ในฐานะผู้ดูแลระบบ การดำเนินการนี้จะเปิดใช้ฟีเจอร์ต่อไปนี้

หากต้องการทำให้ง่ายขึ้น ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc:

startup --windows_enable_symlinks
build --enable_runfiles

หมายเหตุ: การสร้างลิงก์สัญลักษณ์ใน Windows เป็นการดำเนินการที่มีค่าใช้จ่ายสูง แฟล็ก --enable_runfiles อาจสร้างลิงก์สัญลักษณ์ไฟล์จำนวนมาก เปิดใช้ฟีเจอร์นี้เมื่อจำเป็นเท่านั้น

การเรียกใช้ Bazel: เชลล์ MSYS2 กับพรอมต์คำสั่งกับ PowerShell

คำแนะนำ: เรียกใช้ Bazel จาก Command Prompt (cmd.exe) หรือจาก PowerShell.

ตั้งแต่วันที่ 15-01-2020 อย่าเรียกใช้ Bazel จาก bash เลย จาก MSYS2 Shell, Git Bash, Cygwin หรือตัวแปร Bash อื่นๆ ขณะที่ Bazel อาจใช้ได้กับ Use Case ส่วนใหญ่ และมีฟีเจอร์บางอย่างเสีย เช่น รบกวนบิลด์ด้วย Ctrl+C จาก MSYS2) นอกจากนี้ หากคุณเลือกที่จะใช้ MSYS2 คุณจะต้องปิดใช้งาน MSYS2 การแปลงเส้นทางอัตโนมัติ ไม่เช่นนั้น MSYS จะแปลงอาร์กิวเมนต์บรรทัดคำสั่ง ที่มีลักษณะเหมือนเส้นทาง Unix (เช่น //foo:bar) ไปยังเส้นทางของ Windows โปรดดู คำตอบของ StackOverflow นี้ เพื่อดูรายละเอียด

การใช้ Bazel โดยไม่ใช้ Bash (MSYS2)

การใช้บิลด์ Bazel โดยไม่มี Bash

Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash ต้องสร้างกฎบางอย่าง

เริ่มต้นด้วย Bazel 1.0 คุณสามารถสร้างกฎโดยไม่ต้องใช้ Bash ได้ ยกเว้นในกรณีต่อไปนี้

  • genrule เนื่องจาก Genrules จะเรียกใช้คำสั่ง Bash
  • กฎ sh_binary หรือ sh_test เพราะว่ากฎเหล่านี้ต้องมี Bash โดยพื้นฐานแล้ว
  • กฎ Starlark ที่ใช้ ctx.actions.run_shell() หรือ ctx.resolve_command()

อย่างไรก็ตาม genrule มักจะใช้สำหรับงานง่ายๆ เช่น การคัดลอกไฟล์ หรือการเขียนไฟล์ข้อความ คุณอาจเห็นกฎที่เหมาะสมแทนที่จะใช้ genrule (และขึ้นอยู่กับ Bash) ในช่วง ที่เก็บของ bazel-skylib กฎเหล่านี้ไม่ต้องใช้ Bash เมื่อสร้างบน Windows

การใช้การทดสอบ bazel โดยไม่มี Bash

Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash เป็น bazel test ทุกอย่าง

ตั้งแต่ Bazel 1.0 เป็นต้นไป คุณจะทดสอบกฎใดก็ได้โดยไม่ใช้ Bash ยกเว้นในกรณีต่อไปนี้

  • คุณใช้ --run_under
  • กฎทดสอบเองต้องใช้ Bash (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์ Shell)

ใช้การวิ่งแบบ Bazel โดยไม่มี Bash

Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash เป็น bazel run ทุกอย่าง

เริ่มต้นด้วย Bazel 1.0 คุณสามารถเรียกใช้กฎใดก็ได้โดยไม่ใช้ Bash ยกเว้นในกรณีต่อไปนี้

  • คุณใช้ --run_under หรือ --script_path
  • กฎทดสอบเองต้องใช้ Bash (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์ Shell)

การใช้กฎ sh_binary และ sh_* และ ctx.actions.run_shell() โดยไม่มี Bash

คุณต้องใช้ Bash เพื่อสร้างและทดสอบกฎ sh_* และสร้างและทดสอบ Starlark กฎที่ใช้ ctx.actions.run_shell() และ ctx.resolve_command() ช่วงเวลานี้ ไม่เพียงมีผลกับกฎในโปรเจ็กต์ของคุณ แต่กับกฎในส่วน เก็บที่โปรเจ็กต์ของคุณอ้างอิงอยู่ (แม้กระทั่งแบบทางอ้อม)

ในอนาคตอาจมีตัวเลือกให้ใช้ระบบย่อยของ Windows สำหรับ Linux (WSL) เพื่อสร้างกฎเหล่านี้ แต่ในปัจจุบัน ยังไม่ให้ความสำคัญกับ ทีมย่อย Bazel-on-Windows

การตั้งค่าตัวแปรสภาพแวดล้อม

ตัวแปรสภาพแวดล้อมที่คุณตั้งค่าไว้ใน Command Prompt (cmd.exe) ของ Windows เป็นเพียง ที่ตั้งไว้ในเซสชันพร้อมรับคำสั่งนั้น หากคุณเริ่ม cmd.exe ใหม่ คุณต้องทำดังนี้ ตั้งค่าตัวแปรอีกครั้ง หากต้องการตั้งค่าตัวแปรเมื่อ cmd.exe เริ่มทำงานเสมอ คุณต้อง สามารถเพิ่มลงในตัวแปรผู้ใช้หรือตัวแปรระบบในกล่องโต้ตอบ Control Panel > System Properties > Advanced > Environment Variables...

สร้างบน Windows

สร้าง C++ ด้วย MSVC

หากต้องการสร้างเป้าหมาย C++ ด้วย MSVC คุณต้องมีสิ่งต่อไปนี้

  • คอมไพเลอร์ Visual C++

  • (ไม่บังคับ) ตัวแปรสภาพแวดล้อม BAZEL_VC และ BAZEL_VC_FULL_VERSION

    Bazel จะตรวจหาคอมไพเลอร์ Visual C++ ในระบบโดยอัตโนมัติ หากต้องการบอกให้ Bazel ใช้การติดตั้ง VC ที่เจาะจง คุณสามารถตั้งค่า ตัวแปรสภาพแวดล้อมต่อไปนี้

    สำหรับ Visual Studio 2017 และ 2019 ให้ตั้งค่าเป็น BAZEL_VC นอกจากนี้ คุณอาจตั้งค่า BAZEL_VC_FULL_VERSION ด้วย

    • BAZEL_VC ไดเรกทอรีการติดตั้งเครื่องมือสร้าง Visual C++

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (ไม่บังคับ) สำหรับ Visual Studio 2017 และ 2019 เวอร์ชันเต็มเท่านั้น จำนวนเครื่องมือสร้าง Visual C++ คุณสามารถเลือกเครื่องมือสร้าง C++ แบบภาพที่ต้องการได้ เวอร์ชันผ่าน BAZEL_VC_FULL_VERSION หากมีการติดตั้งมากกว่า 1 เวอร์ชัน มิเช่นนั้น Bazel จะเลือกเวอร์ชันล่าสุด

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    สำหรับ Visual Studio 2015 หรือเก่ากว่า ให้ตั้งค่า BAZEL_VC (ไม่รองรับ BAZEL_VC_FULL_VERSION)

    • BAZEL_VC ไดเรกทอรีการติดตั้งเครื่องมือสร้าง Visual C++

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

    Windows SDK มีไฟล์ส่วนหัวและไลบรารีที่คุณจำเป็นต้องใช้ในการสร้าง แอปพลิเคชัน Windows รวมถึง Bazel เอง โดยค่าเริ่มต้น Windows SDK ล่าสุดที่ติดตั้งจะ นอกจากนี้ คุณยังระบุเวอร์ชันของ Windows SDK ได้โดยการตั้งค่า BAZEL_WINSDK_FULL_VERSION คุณ สามารถใช้หมายเลข SDK ของ Windows 10 แบบเต็ม เช่น 10.0.10240.0 หรือระบุ 8.1 เพื่อใช้ Windows 8.1 ได้ SDK (มี SDK ของ Windows 8.1 เวอร์ชันเดียวเท่านั้น) โปรดตรวจสอบว่าคุณได้ระบุ ติดตั้ง Windows SDK แล้ว

    ข้อกำหนด: รองรับ VC 2017 และ 2019 เครื่องมือสร้าง VC 2015 แบบสแตนด์อโลนจะไม่ รองรับการเลือก Windows SDK คุณจะต้องติดตั้ง Visual Studio 2015 อย่างเต็มรูปแบบ ไม่เช่นนั้น ระบบจะไม่สนใจ BAZEL_WINSDK_FULL_VERSION

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

หากตั้งค่าทุกอย่างเรียบร้อยแล้ว คุณก็สามารถสร้างเป้าหมาย C++ ได้เลย

ลองสร้างเป้าหมายจากหนึ่งในตัวอย่างของเรา ต่อไปนี้

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

โดยค่าเริ่มต้น ไบนารีที่สร้างจะกำหนดเป้าหมายเป็นสถาปัตยกรรม x64 หากต้องการระบุ สถาปัตยกรรมเป้าหมาย ให้กำหนดตัวเลือกบิลด์ --cpu สำหรับสถาปัตยกรรมเป้าหมาย ดังนี้ * x64 (ค่าเริ่มต้น): --cpu=x64_windows หรือไม่มีตัวเลือก * x86: --cpu=x64_x86_windows * กลุ่ม: --cpu=x64_arm_windows * ARM64: --cpu=arm64_windows

ตัวอย่างเช่น หากต้องการสร้างเป้าหมายสำหรับสถาปัตยกรรม ARM ให้เรียกใช้คำสั่งต่อไปนี้

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

ในการสร้างและใช้ไลบรารีที่ลิงก์แบบไดนามิก (ไฟล์ DLL) โปรดดู ตัวอย่าง

ขีดจำกัดความยาวของบรรทัดคำสั่ง: หากไม่ต้องการให้ ปัญหาขีดจำกัดความยาวของบรรทัดคำสั่งของ Windows เปิดใช้ฟีเจอร์ไฟล์พารามิเตอร์ของคอมไพเลอร์ผ่าน --features=compiler_param_file

สร้าง C++ ด้วย Clang

ตั้งแต่เวอร์ชัน 0.29.0 เป็นต้นไป Bazel รองรับการสร้างด้วยไดรเวอร์คอมไพเลอร์ที่เข้ากันได้กับ MSVC ของ LLVM (clang-cl.exe)

ข้อกำหนด: หากต้องการสร้างด้วย Clang คุณต้องติดตั้งทั้งคู่ LLVM และ Visual C++ เครื่องมือสร้าง, เพราะแม้ว่าคุณจะใช้ clang-cl.exe เป็นคอมไพเลอร์ คุณยังคงต้องลิงก์กับ ไลบรารี Visual C++

Bazel สามารถตรวจพบการติดตั้ง LLVM บนระบบของคุณโดยอัตโนมัติ หรือคุณสามารถบอก Bazel ที่ติดตั้ง LLVM โดย BAZEL_LLVM

  • BAZEL_LLVM ไดเรกทอรีการติดตั้ง LLVM

    set BAZEL_LLVM=C:\Program Files\LLVM
    

การเปิดใช้เครื่องมือ Clang ในการสร้าง C++ สามารถทำได้หลายกรณี

  • ใน bazel 0.28 และเก่ากว่า: Clang ไม่ได้รับการสนับสนุน

  • หากไม่มี --incompatible_enable_cc_toolchain_resolution: คุณเปิดใช้เครื่องมือ Clang ได้ด้วยแฟล็กบิลด์ --compiler=clang-cl

  • ด้วย --incompatible_enable_cc_toolchain_resolution: คุณต้องเพิ่มเป้าหมายแพลตฟอร์มไปยัง BUILD file (เช่น ไฟล์ BUILD ระดับบนสุด) ดังนี้

    platform(
        name = "x64_windows-clang-cl",
        constraint_values = [
            "@platforms//cpu:x86_64",
            "@platforms//os:windows",
            "@bazel_tools//tools/cpp:clang-cl",
        ],
    )
    

    จากนั้นคุณสามารถเปิดใช้เครื่องมือ Clang ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

    • ระบุแฟล็กบิลด์ต่อไปนี้
    --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
    
    • ลงทะเบียนแพลตฟอร์มและ Toolchain ในไฟล์ MODULE.bazel
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    --incompatible_enable_cc_toolchain_resolution ธงได้รับการวางแผนว่าจะเปิดใช้งานโดยค่าเริ่มต้นสำหรับรุ่น Bazel ในอนาคต ดังนั้น ขอแนะนำให้เปิดใช้การสนับสนุน Clang ด้วยวิธีที่ 2

สร้าง Java

คุณต้องมีสิ่งต่อไปนี้เพื่อสร้างเป้าหมาย Java

ใน Windows Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ java_binary ดังนี้

  • ไฟล์ .jar
  • ไฟล์ .exe ที่ตั้งค่าสภาพแวดล้อมสำหรับ JVM และเรียกใช้ไบนารีได้

ลองสร้างเป้าหมายจากหนึ่งในตัวอย่างของเรา ต่อไปนี้

  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

สร้าง Python

หากต้องการสร้างเป้าหมาย Python คุณต้องมีสิ่งต่อไปนี้

ใน Windows Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ py_binary ดังนี้

  • ไฟล์ ZIP แบบดึงตัวเอง
  • ไฟล์ปฏิบัติการที่สามารถเปิดใช้งานอินเทอร์พรีเตอร์ Python ด้วยฟังก์ชัน ไฟล์ ZIP ที่แยกตัวเองเป็นอาร์กิวเมนต์

คุณสามารถเรียกใช้ไฟล์สั่งการ (ไฟล์มีนามสกุล .exe) หรือเรียกใช้ Python ที่มีไฟล์ ZIP ที่แยกตัวเองออกมาเป็นอาร์กิวเมนต์

ลองสร้างเป้าหมายจากหนึ่งในตัวอย่างของเรา ต่อไปนี้

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

หากสนใจรายละเอียดเกี่ยวกับวิธีที่ Bazel สร้างเป้าหมาย Python Windows โปรดดูการออกแบบนี้ เอกสาร