การใช้ Bazel บน Windows

7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

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

startup --output_user_root=C:/tmp

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

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

fsutil 8dot3name set 0

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

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

startup --windows_enable_symlinks
build --enable_runfiles

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

เรียกใช้ Bazel: MSYS2 shell เทียบกับ Command Prompt เทียบกับ PowerShell

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

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

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

การใช้ Bazel Build โดยไม่ใช้ 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 มักจะใช้สำหรับงานง่ายๆ เช่น การคัดลอกไฟล์หรือการเขียนไฟล์ข้อความ คุณอาจพบกฎที่เหมาะสมใน repository bazel-skylib แทนที่จะใช้ genrule (และขึ้นอยู่กับ Bash) เมื่อสร้างใน Windows กฎเหล่านี้ไม่จําเป็นต้องใช้ Bash

การใช้ bazel test โดยไม่ใช้ 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)

การใช้กฎ shbinary and sh* และ ctx.actions.run_shell() ที่ไม่มี Bash

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

ในอนาคตอาจมีตัวเลือกให้ใช้ Windows Subsystem for Linux (WSL) เพื่อสร้างกฎเหล่านี้ แต่ตอนนี้ไม่ใช่สิ่งที่ทีมย่อย Bazel ใน Windows ให้ความสำคัญ

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

ตัวแปรสภาพแวดล้อมที่คุณตั้งค่าใน Command Prompt ของ Windows (cmd.exe) จะตั้งค่าในเซสชัน Command Prompt นั้นเท่านั้น หากเริ่ม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++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (ไม่บังคับ) สำหรับ Visual Studio 2017 และ 2019 เท่านั้น เวอร์ชันเต็มของเครื่องมือสร้าง Visual C++ คุณเลือกเวอร์ชันเครื่องมือสร้าง Visual 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 (มี Windows 8.1 SDK เพียงเวอร์ชันเดียว) โปรดตรวจสอบว่าคุณได้ติดตั้ง SDK ของ Windows ที่ระบุแล้ว

    ข้อกําหนด: ฟีเจอร์นี้ใช้ได้กับ 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 * ARM: --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++ Build เพราะแม้ว่าคุณจะใช้ clang-cl.exe เป็นคอมไพเลอร์ แต่คุณก็ยังคงต้องลิงก์กับไลบรารี 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 โดยใช้ Flag การสร้าง --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 ในไฟล์ WORKSPACE
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    เราวางแผนที่จะเปิดใช้ Flag --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 โปรดดูเอกสารการออกแบบนี้