इस पेज पर, Windows पर Bazel का इस्तेमाल करने के सबसे सही तरीकों के बारे में बताया गया है. इंस्टॉल करने के निर्देशों के लिए, Windows पर Bazel इंस्टॉल करना लेख पढ़ें.
ज्ञात समस्याएं
Windows से जुड़ी Bazel की समस्याओं को GitHub पर "area-Windows" लेबल से मार्क किया जाता है. GitHub-Windows.
सबसे सही तरीके
पाथ की लंबाई से जुड़ी समस्याओं से बचें
कुछ टूल में, Windows पर पाथ की लंबाई की सीमा होती है. इनमें MSVC कंपाइलर भी शामिल है. इस समस्या से बचने के लिए, --output_user_root फ़्लैग का इस्तेमाल करके, Bazel के लिए छोटा आउटपुट डायरेक्ट्री तय की जा सकती है.
उदाहरण के लिए, अपनी bazelrc फ़ाइल में यह लाइन जोड़ें:
startup --output_user_root=C:/tmp
सिमलिंक की सुविधा चालू करें
कुछ सुविधाओं के लिए, Bazel को Windows पर फ़ाइल सिमलिंक बनाने की अनुमति देना ज़रूरी है, इसके लिए, डेवलपर मोड चालू करें (Windows 10 के 1703 या नए वर्शन पर) या Bazel को एडमिन के तौर पर चलाएं. इससे ये सुविधाएं चालू हो जाती हैं:
इसे आसान बनाने के लिए, अपनी bazelrc फ़ाइल में ये लाइनें जोड़ें:
startup --windows_enable_symlinks
build --enable_runfiles
ध्यान दें: Windows पर सिमलिंक बनाना एक मुश्किल प्रोसेस है. --enable_runfiles फ़्लैग से, फ़ाइल सिमलिंक की बड़ी संख्या में जनरेट होने की संभावना होती है. इस सुविधा को सिर्फ़ तब चालू करें, जब इसकी ज़रूरत हो.
Bazel को चलाना: MSYS2 शेल बनाम कमांड प्रॉम्प्ट बनाम. PowerShell
सुझाव: Bazel को कमांड प्रॉम्प्ट (cmd.exe) या PowerShell से चलाएं.
15 जनवरी, 2020 से, Bazel को bash से **न** चलाएं. चाहे वह MSYS2 शेल, Git Bash, Cygwin या Bash का कोई अन्य वर्शन हो. Bazel
ज़्यादातर इस्तेमाल के मामलों में काम कर सकता है. हालांकि, कुछ चीज़ें काम नहीं करती हैं. जैसे, MSYS2 से Ctrl+C दबाकर बिल्ड को रोकना).
इसके अलावा, अगर MSYS2 में Bazel चलाने का विकल्प चुना जाता है, तो आपको MSYS2's
automatic path conversion, otherwise MSYS will convert command line arguments
that look like Unix paths (such as //foo:bar) into Windows paths. ज़्यादा जानकारी के लिए,
StackOverflow का यह जवाब
देखें.
Bash (MSYS2) के बिना Bazel का इस्तेमाल करना
Bash के बिना bazel build का इस्तेमाल करना
Bazel के 1.0 से पहले के वर्शन में, कुछ नियमों को बनाने के लिए Bash की ज़रूरत होती थी.
Bazel 1.0 से, किसी भी नियम को Bash के बिना बनाया जा सकता है. हालांकि, ये नियम Bash के बिना नहीं बनाए जा सकते:
genrule, क्योंकि genrules, Bash कमांड लागू करते हैंsh_binaryयाsh_testनियम, क्योंकि इनके लिए Bash की ज़रूरत होती है- Starlark नियम, जो
ctx.actions.run_shell()याctx.resolve_command()का इस्तेमाल करता है
हालांकि, genrule का इस्तेमाल अक्सर आसान कामों के लिए किया जाता है. जैसे,
किसी फ़ाइल को कॉपी करना
या टेक्स्ट फ़ाइल लिखना.
genrule का इस्तेमाल करने के बजाय (और Bash पर निर्भर रहने के बजाय), आपको bazel-skylib रिपॉज़िटरी में कोई सही नियम मिल सकता है.
Windows पर बनाए जाने पर, इन नियमों के लिए Bash की ज़रूरत नहीं होती.
Bash के बिना bazel test का इस्तेमाल करना
Bazel के 1.0 से पहले के वर्शन में, किसी भी चीज़ को bazel test करने के लिए Bash की ज़रूरत होती थी.
Bazel 1.0 से, किसी भी नियम को Bash के बिना टेस्ट किया जा सकता है. हालांकि, इन मामलों में Bash की ज़रूरत होती है:
--run_underका इस्तेमाल करने पर- टेस्ट नियम के लिए Bash की ज़रूरत होने पर (क्योंकि इसका एक्ज़ीक्यूटेबल, शेल स्क्रिप्ट है)
Bash के बिना bazel run का इस्तेमाल करना
Bazel के 1.0 से पहले के वर्शन में, किसी भी चीज़ को bazel run करने के लिए Bash की ज़रूरत होती थी.
Bazel 1.0 से, किसी भी नियम को Bash के बिना चलाया जा सकता है. हालांकि, इन मामलों में Bash की ज़रूरत होती है:
--run_underया--script_pathका इस्तेमाल करने पर- टेस्ट नियम के लिए Bash की ज़रूरत होने पर (क्योंकि इसका एक्ज़ीक्यूटेबल, शेल स्क्रिप्ट है)
Bash के बिना sh_binary और sh_* नियमों के साथ-साथ ctx.actions.run_shell() का इस्तेमाल करना
sh_* नियमों को बनाने और टेस्ट करने के लिए, Bash की ज़रूरत होती है. साथ ही, Starlark के उन नियमों को बनाने और टेस्ट करने के लिए भी Bash की ज़रूरत होती है जो ctx.actions.run_shell() और ctx.resolve_command() का इस्तेमाल करते हैं. यह सिर्फ़ आपके प्रोजेक्ट के नियमों पर ही नहीं, बल्कि उन सभी बाहरी रिपॉज़िटरी के नियमों पर भी लागू होता है जिन पर आपका प्रोजेक्ट निर्भर करता है. भले ही, वह ट्रांज़िटिव तरीके से हो.
भविष्य में, इन नियमों को बनाने के लिए, Windows Subsystem for Linux (WSL) का इस्तेमाल करने का विकल्प मिल सकता है. हालांकि, फ़िलहाल Bazel-on-Windows सबटीम के लिए यह प्राथमिकता नहीं है.
एनवायरमेंट वैरिएबल सेट करना
Windows कमांड प्रॉम्प्ट (cmd.exe) में सेट किए गए एनवायरमेंट वैरिएबल, सिर्फ़ उस कमांड प्रॉम्प्ट सेशन में सेट होते हैं. अगर नया cmd.exe शुरू किया जाता है, तो आपको वैरिएबल फिर से सेट करने होंगे. cmd.exe शुरू होने पर, वैरिएबल हमेशा सेट करने के लिए, उन्हें Control Panel >
System Properties > Advanced > Environment Variables... डायलॉग में, उपयोगकर्ता वैरिएबल या सिस्टम वैरिएबल में जोड़ा जा सकता है.
Windows पर बिल्ड करना
MSVC की मदद से C++ बिल्ड करना
MSVC की मदद से C++ टारगेट बिल्ड करने के लिए, आपके पास ये चीज़ें होनी चाहिए:
(ज़रूरी नहीं)
BAZEL_VCऔरBAZEL_VC_FULL_VERSIONएनवायरमेंट वैरिएबल.Bazel, आपके सिस्टम पर Visual C++ कंपाइलर का अपने-आप पता लगा लेता है. Bazel को VC के किसी खास इंस्टॉलेशन का इस्तेमाल करने के लिए, ये एनवायरमेंट वैरिएबल सेट किए जा सकते हैं:
Visual Studio 2017 और 2019 के लिए,
BAZEL_VCमें से कोई एक सेट करें. इसके अलावा,BAZEL_VC_FULL_VERSIONभी सेट किया जा सकता है.BAZEL_VCVisual C++ Build Tools की इंस्टॉलेशन डायरेक्ट्रीset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VCBAZEL_VC_FULL_VERSION(ज़रूरी नहीं) सिर्फ़ Visual Studio 2017 और 2019 के लिए, Visual C++ Build Tools का पूरा वर्शन नंबर. अगर एक से ज़्यादा वर्शन इंस्टॉल किए गए हैं, तोBAZEL_VC_FULL_VERSIONकी मदद से, Visual C++ Build Tools का सही वर्शन चुना जा सकता है. ऐसा न करने पर, Bazel सबसे नया वर्शन चुन लेगा.set BAZEL_VC_FULL_VERSION=14.16.27023
Visual Studio 2015 या इससे पुराने वर्शन के लिए,
BAZEL_VCसेट करें. (BAZEL_VC_FULL_VERSIONकाम नहीं करता.)BAZEL_VCVisual C++ Build Tools की इंस्टॉलेशन डायरेक्ट्रीset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
Windows SDK में हेडर फ़ाइलें और लाइब्रेरी शामिल होती हैं. इनकी ज़रूरत, Windows ऐप्लिकेशन बनाने के दौरान होती है. इनमें Bazel भी शामिल है. डिफ़ॉल्ट रूप से, इंस्टॉल किए गए सबसे नए Windows SDK का इस्तेमाल किया जाएगा.
BAZEL_WINSDK_FULL_VERSIONसेट करके, Windows SDK का वर्शन भी तय किया जा सकता है. Windows 10 SDK का पूरा नंबर इस्तेमाल किया जा सकता है. जैसे, 10.0.10240.0. इसके अलावा, Windows 8.1 SDK का इस्तेमाल करने के लिए, 8.1 तय किया जा सकता है. Windows 8.1 SDK का सिर्फ़ एक वर्शन उपलब्ध है. कृपया पक्का करें कि आपने तय किया गया Windows SDK इंस्टॉल किया हो.ज़रूरी शर्त: यह VC 2017 और 2019 के साथ काम करता है. स्टैंडअलोन VC 2015 Build Tools, Windows SDK चुनने की सुविधा के साथ काम नहीं करता. इसके लिए, Visual Studio 2015 का पूरा इंस्टॉलेशन ज़रूरी है. ऐसा न करने पर,
BAZEL_WINSDK_FULL_VERSIONको अनदेखा कर दिया जाएगा.set 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
MODULE.bazel में, @local_config_cc को इसके साथ जोड़ा जा सकता है
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")
डाइनैमिक तौर पर लिंक की गई लाइब्रेरी (डीएलएल फ़ाइलें) बनाने और उनका इस्तेमाल करने के लिए, यह उदाहरण देखें.
कमांड लाइन की लंबाई की सीमा: Windows कमांड लाइन की लंबाई की सीमा से जुड़ी समस्या से बचने के लिए,
कंपाइलर पैरामीटर फ़ाइल की सुविधा चालू करें --features=compiler_param_file.
Clang की मदद से C++ बिल्ड करना
Bazel 0.29.0 से, LLVM के MSVC के साथ काम करने वाले कंपाइलर ड्राइवर (clang-cl.exe) की मदद से बिल्ड किया जा सकता है.
Bazel, आपके सिस्टम पर LLVM के इंस्टॉलेशन का अपने-आप पता लगा सकता है. इसके अलावा, BAZEL_LLVM की मदद से, Bazel को साफ़ तौर पर बताया जा सकता है कि LLVM कहां इंस्टॉल किया गया है.
BAZEL_LLVMLLVM की इंस्टॉलेशन डायरेक्ट्रीset BAZEL_LLVM=C:\Program Files\LLVM
C++ बिल्ड करने के लिए, Clang टूलचेन को चालू करने के लिए कई स्थितियां होती हैं.
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 टूलचेन को चालू करें:
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-clBazel के 7.0.0 से पुराने, लेकिन 0.28 से नए वर्शन में:
--compiler=clang-clबिल्ड फ़्लैग की मदद से, Clang टूलचेन को चालू करें.अगर आपके बिल्ड में फ़्लैग --incompatible_enable_cc_toolchain_resolution को
trueपर सेट किया गया है, तो Bazel 7.0.0 के लिए दिया गया तरीका इस्तेमाल करें.Bazel 0.28 और इससे पुराने वर्शन में: Clang काम नहीं करता.
Java बिल्ड करना
Java टारगेट बिल्ड करने के लिए, आपके पास ये चीज़ें होनी चाहिए:
Windows पर, Bazel, 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, py_binary नियमों के लिए दो आउटपुट फ़ाइलें बनाता है:
- सेल्फ़-एक्सट्रैक्टिंग zip फ़ाइल
- एक एक्ज़ीक्यूटेबल फ़ाइल, जो सेल्फ़-एक्सट्रैक्टिंग zip फ़ाइल को आर्ग्युमेंट के तौर पर इस्तेमाल करके, Python इंटरप्रेटर लॉन्च कर सकती है
एक्ज़ीक्यूटेबल फ़ाइल को चलाया जा सकता है. इसका एक्सटेंशन .exe होता है. इसके अलावा, सेल्फ़-एक्सट्रैक्टिंग zip फ़ाइल को आर्ग्युमेंट के तौर पर इस्तेमाल करके, Python को भी चलाया जा सकता है.
हमारे किसी सैंपल प्रोजेक्ट से टारगेट बिल्ड करके देखें:
bazel build //examples/py_native:binbazel-bin\examples\py_native\bin.exepython bazel-bin\examples\py_native\bin.zip
अगर आपको इस बारे में ज़्यादा जानकारी चाहिए कि Bazel, Windows पर Python टारगेट कैसे बिल्ड करता है, तो डिज़ाइन से जुड़ा यह दस्तावेज़ देखें.