หน้านี้จะกล่าวถึงแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Bazel บน Windows โปรดดูวิธีการติดตั้งที่หัวข้อติดตั้ง Bazel ใน Windows
ปัญหาที่ทราบ
ปัญหา Bazel ที่เกี่ยวข้องกับ Windows จะมีการทำเครื่องหมายด้วยป้ายกำกับ "team-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
เปิดใช้การรองรับ symlink
ฟีเจอร์บางอย่างกำหนดให้ 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 อาจใช้งานได้กับกรณีการใช้งานส่วนใหญ่ แต่บางสิ่งก็ใช้งานไม่ได้ เช่น การหยุดการบิลด์ด้วย 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
มักใช้สำหรับงานง่ายๆ เช่น การคัดลอกไฟล์ หรือการเขียนไฟล์ข้อความ
คุณอาจค้นหากฎที่เหมาะสมในที่เก็บ Bazel-skylib แทนที่จะใช้ genrule
(และขึ้นอยู่กับ Bash)
เมื่อสร้างใน Windows กฎเหล่านี้ไม่จําเป็นต้องใช้ Bash
การใช้การทดสอบ bazel โดยไม่มี Bash
Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash เป็น bazel test
ทุกอย่าง
ตั้งแต่ Bazel 1.0 เป็นต้นไป คุณจะทดสอบกฎใดก็ได้โดยไม่ใช้ Bash ยกเว้นในกรณีต่อไปนี้
- คุณใช้
--run_under
- กฎการทดสอบต้องใช้ Bash (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์เชลล์)
ใช้การวิ่งแบบ 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 คุณต้องมีสิ่งต่อไปนี้
(ไม่บังคับ) ตัวแปรสภาพแวดล้อม
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 Toolsset 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++ 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_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++ เนื่องจากแม้ว่าคุณจะใช้ clang-cl.exe
เป็นคอมไพเลอร์ แต่ก็ยังต้องลิงก์กับไลบรารี Visual C++
Bazel ตรวจหาการติดตั้ง LLVM ในระบบโดยอัตโนมัติ หรือคุณจะบอก Bazel อย่างชัดแจ้งว่า BAZEL_LLVM
ติดตั้ง LLVM ไว้ที่ใด
BAZEL_LLVM
ไดเรกทอรีการติดตั้ง LLVMset 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 ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
- ระบุ Flag การสร้างต่อไปนี้
--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 โปรดดูเอกสารการออกแบบนี้