หน้านี้อธิบายแนวทางปฏิบัติแนะนำในการใช้ Bazel ใน Windows โปรดดูวิธีการติดตั้งที่หัวข้อติดตั้ง Bazel ใน Windows
ปัญหาที่ทราบ
ปัญหา Bazel ที่เกี่ยวข้องกับ Windows จะมีการทำเครื่องหมายด้วยป้ายกำกับ "area-Windows" ใน GitHub GitHub-Windows
แนวทางปฏิบัติแนะนำ
หลีกเลี่ยงปัญหาเส้นทางที่ยาว
เครื่องมือบางรายการมีข้อจำกัดความยาวเส้นทางสูงสุดใน Windows ซึ่งรวมถึงคอมไพเลอร์ MSVC คุณสามารถระบุไดเรกทอรีเอาต์พุตแบบสั้นสำหรับ Bazel โดยใช้แฟล็ก --output_user_root เพื่อหลีกเลี่ยงปัญหานี้
เช่น เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc
startup --output_user_root=C:/tmp
เปิดใช้การรองรับลิงก์สัญลักษณ์
ฟีเจอร์บางอย่างกำหนดให้ Bazel ต้องสร้างลิงก์สัญลักษณ์ไฟล์ใน Windows ได้ โดยเปิดใช้โหมดนักพัฒนาซอฟต์แวร์ (ใน Windows 10 เวอร์ชัน 1703 ขึ้นไป) หรือเรียกใช้ Bazel ในฐานะผู้ดูแลระบบ ซึ่งจะเปิดใช้ฟีเจอร์ต่อไปนี้
หากต้องการทําให้ง่ายขึ้น ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc
startup --windows_enable_symlinks
build --enable_runfiles
หมายเหตุ: การสร้างลิงก์สัญลักษณ์ใน Windows เป็นการดำเนินการที่มีค่าใช้จ่ายสูง Flag --enable_runfiles อาจสร้างลิงก์สัญลักษณ์ของไฟล์จํานวนมาก เปิดใช้ฟีเจอร์นี้เฉพาะเมื่อจำเป็นเท่านั้น
เรียกใช้ Bazel: เชลล์ MSYS2 เทียบกับ Command Prompt เทียบกับ 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 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 (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์เชลล์)
การใช้ bazel run โดยไม่ใช้ Bash
Bazel เวอร์ชันก่อน 1.0 เคยต้องใช้ Bash เพื่อbazel run ทุกอย่าง
ตั้งแต่ Bazel 1.0 เป็นต้นไป คุณจะเรียกใช้กฎใดก็ได้โดยไม่ต้องใช้ Bash ยกเว้นในกรณีต่อไปนี้
- คุณใช้
--run_underหรือ--script_path - กฎการทดสอบต้องใช้ Bash (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์เชลล์)
การใช้กฎ sh_binary และ 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 คุณต้องมีสิ่งต่อไปนี้
(ไม่บังคับ) ตัวแปรสภาพแวดล้อม
BAZEL_VCและBAZEL_VC_FULL_VERSIONBazel จะตรวจหาคอมไพเลอร์ Visual C++ ในระบบโดยอัตโนมัติ หากต้องการบอกให้ Bazel ใช้การติดตั้ง VC ที่เฉพาะเจาะจง ให้ตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้
สำหรับ Visual Studio 2017 และ 2019 ให้ตั้งค่าเป็น
BAZEL_VCนอกจากนี้ คุณยังตั้งค่าBAZEL_VC_FULL_VERSIONได้ด้วยBAZEL_VCไดเรกทอรีการติดตั้ง Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VCBAZEL_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++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
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_VERSIONset BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
หากตั้งค่าทุกอย่างแล้ว คุณก็สร้างเป้าหมาย C++ ได้เลย
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่างต่อไปนี้
bazel build //examples/cpp:hello-worldbazel-bin\examples\cpp\hello-world.exe
โดยค่าเริ่มต้น ไบนารีที่คอมไพล์จะกำหนดเป้าหมายเป็นสถาปัตยกรรม x64 หากต้องการสร้างสำหรับสถาปัตยกรรม ARM64 ให้ใช้
--platforms=//:windows_arm64 --extra_toolchains=@local_config_cc//:cc-toolchain-arm64_windows
คุณแนะนำ @local_config_cc ใน MODULE.bazel ได้โดยใช้
bazel_dep(name = "rules_cc", version = "0.1.1")
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")
หากต้องการสร้างและใช้ไลบรารีที่ลิงก์แบบไดนามิก (ไฟล์ 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ไดเรกทอรีการติดตั้ง LLVMset BAZEL_LLVM=C:\Program Files\LLVM
การเปิดใช้ชุดเครื่องมือ Clang สำหรับการสร้าง C++ มีหลายกรณี
ใน Bazel 7.0.0 ขึ้นไป ให้เพิ่มเป้าหมายแพลตฟอร์มลงใน
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 โดยระบุ Flag การสร้างต่อไปนี้
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-clใน Bazel ที่เก่ากว่า 7.0.0 แต่ใหม่กว่า 0.28: เปิดใช้ชุดเครื่องมือ Clang โดยใช้แฟล็กการบิลด์
--compiler=clang-clหากบิลด์ตั้งค่า Flag --incompatible_enable_cc_toolchain_resolution เป็น
trueให้ใช้แนวทางสำหรับ Bazel 7.0.0ใน Bazel 0.28 และเวอร์ชันที่เก่ากว่า: ไม่รองรับ Clang
บิลด์ Java
หากต้องการสร้างเป้าหมาย Java คุณต้องมีสิ่งต่อไปนี้
ใน Windows นั้น Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ java_binary ดังนี้
- ไฟล์
.jar - ไฟล์
.exeที่สามารถตั้งค่าสภาพแวดล้อมสําหรับ JVM และเรียกใช้ไบนารี
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่างต่อไปนี้
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-worldbazel-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:binbazel-bin\examples\py_native\bin.exepython bazel-bin\examples\py_native\bin.zip
หากสนใจรายละเอียดเกี่ยวกับวิธีที่ Bazel สร้างเป้าหมาย Python ใน Windows โปรดดูเอกสารการออกแบบนี้