Windows पर बेज़ेल का इस्तेमाल करना

इस पेज पर, 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 के पाथ को अपने-आप बदलने की सुविधा बंद करनी होगी. ऐसा न करने पर, MSYS, कमांड लाइन के उन आर्ग्युमेंट को Windows पाथ में बदल देगा जो Unix पाथ की तरह दिखते हैं . जैसे, //foo:bar. ज़्यादा जानकारी के लिए, StackOverflow का यह जवाब देखें.

Bash (MSYS2) के बिना Bazel का इस्तेमाल करना

Bash के बिना bazel build का इस्तेमाल करना

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 रिपॉज़िटरी में कोई काम का नियम मिल सकता है. Windows पर बनाए जाने पर, इन नियमों के लिए Bash की ज़रूरत नहीं होती.

Bash के बिना bazel test का इस्तेमाल करना

Bazel के 1.0 से पहले वाले वर्शन में, किसी भी चीज़ को bazel test करने के लिए Bash की ज़रूरत होती थी.

Bazel 1.0 से, किसी भी नियम को Bash के बिना टेस्ट किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि:

  • आपने --run_under का इस्तेमाल न किया हो
  • टेस्ट नियम के लिए Bash की ज़रूरत न हो (क्योंकि इसका एक्ज़ीक्यूटेबल, शेल स्क्रिप्ट है)

Bash के बिना bazel run का इस्तेमाल करना

Bazel के 1.0 से पहले वाले वर्शन में, किसी भी चीज़ को bazel run करने के लिए Bash की ज़रूरत होती थी.

Bazel 1.0 से, किसी भी नियम को 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++ टारगेट बिल्ड करने के लिए, आपके पास ये चीज़ें होनी चाहिए:

  • 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++ 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_VC Visual C++ Build Tools की इंस्टॉलेशन डायरेक्ट्री

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

    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-world
bazel-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) की मदद से बिल्ड किया जा सकता है.

ज़रूरी शर्त: Clang की मदद से बिल्ड करने के लिए, LLVM और Visual C++ Build Tools दोनों को इंस्टॉल करना होगा. ऐसा इसलिए, क्योंकि कंपाइलर के तौर पर clang-cl.exe का इस्तेमाल करने के बावजूद, आपको Visual C++ लाइब्रेरी से लिंक करना होगा.

Bazel, आपके सिस्टम पर LLVM के इंस्टॉलेशन का अपने-आप पता लगा सकता है. इसके अलावा, BAZEL_LLVM की मदद से, Bazel को यह भी बताया जा सकता है कि LLVM कहां इंस्टॉल किया गया है.

  • BAZEL_LLVM LLVM की इंस्टॉलेशन डायरेक्ट्री

    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-cl
    
  • Bazel के 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-world
  bazel-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:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

अगर आपको इस बारे में ज़्यादा जानकारी चाहिए कि Bazel, Windows पर Python टारगेट कैसे बिल्ड करता है, तो डिज़ाइन से जुड़ा यह दस्तावेज़ देखें.