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-01-2020 से, Bazel को bash से न चलाएं. ऐसा MSYS2 शेल, Git Bash, Cygwin या Bash के किसी अन्य वैरिएंट से न करें. Bazel का इस्तेमाल ज़्यादातर मामलों में किया जा सकता है. हालांकि, कुछ चीज़ें काम नहीं करती हैं. जैसे, MSYS2 से Ctrl+C दबाकर बिल्ड को रोकना. इसके अलावा, अगर आपको MSYS2 के तहत चलाना है, तो आपको MSYS2 के पाथ को अपने-आप बदलने की सुविधा बंद करनी होगी. ऐसा न करने पर, MSYS उन कमांड लाइन आर्ग्युमेंट को Windows पाथ में बदल देगा जो Unix पाथ (जैसे कि //foo:bar) जैसे दिखते हैं. ज़्यादा जानकारी के लिए, StackOverflow का यह जवाब देखें.

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

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

Bazel के 1.0 से पहले के वर्शन में, कुछ नियमों को बनाने के लिए Bash की ज़रूरत होती थी.

Bazel 1.0 से, Bash के बिना कोई भी नियम बनाया जा सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक कि वह नियम इनमें से कोई एक न हो:

  • genrule, क्योंकि genrules, बैश कमांड को एक्ज़ीक्यूट करते हैं
  • sh_binary या sh_test नियम का इस्तेमाल नहीं किया जा सकता, क्योंकि इनके लिए Bash की ज़रूरत होती है
  • ctx.actions.run_shell() या ctx.resolve_command() का इस्तेमाल करने वाला Starlark नियम

हालांकि, genrule का इस्तेमाल अक्सर आसान कामों के लिए किया जाता है. जैसे, किसी फ़ाइल को कॉपी करना या टेक्स्ट फ़ाइल लिखना. genrule का इस्तेमाल करने के बजाय, आपको bazel-skylib रिपॉज़िटरी में कोई सही नियम मिल सकता है. हालांकि, यह Bash पर निर्भर करता है. 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 की ज़रूरत होगी. साथ ही, ctx.actions.run_shell() और ctx.resolve_command() का इस्तेमाल करने वाले Starlark नियमों को बनाने और उनकी जांच करने के लिए भी इसकी ज़रूरत होगी. यह न सिर्फ़ आपके प्रोजेक्ट के नियमों पर लागू होता है, बल्कि उन सभी बाहरी रिपॉज़िटरी के नियमों पर भी लागू होता है जिन पर आपका प्रोजेक्ट निर्भर करता है. भले ही, वह ट्रांज़िटिव तौर पर निर्भर करता हो.

आने वाले समय में, इन नियमों को बनाने के लिए Windows Subsystem for Linux (WSL) का इस्तेमाल करने का विकल्प मिल सकता है. हालांकि, फ़िलहाल Bazel-on-Windows सबटीम के लिए यह प्राथमिकता नहीं है.

एनवायरमेंट वैरिएबल सेट करना

Windows Command Prompt (cmd.exe) में सेट किए गए एनवायरमेंट वैरिएबल, सिर्फ़ उस कमांड प्रॉम्प्ट सेशन में सेट होते हैं. अगर आपने नया 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")

डाइनैमिक तौर पर लिंक की गई लाइब्रेरी (DLL फ़ाइलें) बनाने और उनका इस्तेमाल करने के लिए, यह उदाहरण देखें.

कमांड लाइन की लंबाई की सीमा: --features=compiler_param_file की मदद से, कंपाइलर पैरामीटर फ़ाइल की सुविधा चालू करें. इससे Windows कमांड लाइन की लंबाई की सीमा से जुड़ी समस्या से बचा जा सकता है.

Clang के साथ C++ बनाना

Bazel के 0.29.0 वर्शन से, LLVM के MSVC के साथ काम करने वाले कंपाइलर ड्राइवर (clang-cl.exe) का इस्तेमाल करके बनाया जा सकता है.

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

Clang टूलचेन को चालू करने के लिए, कॉन्फ़िगरेशन आपके Bazel वर्शन पर निर्भर करता है. साथ ही, यह भी निर्भर करता है कि Bzlmod या WORKSPACE का इस्तेमाल किया जा रहा है या नहीं.


Bazel 8 और उसके बाद के वर्शन:

  • Bzlmod का इस्तेमाल करना (सुझाया गया):

    1. पक्का करें कि आपने rules_cc को अपने MODULE.bazel में लोड किया हो और CC टूलचेन को कॉन्फ़िगर किया हो: ```python bazel_dep(name = "rules_cc", version = "0.0.17") # Or newer

      cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension") use_repo(cc_configure, "local_config_cc") ```

    2. BUILD फ़ाइल में platform टारगेट तय करें. उदाहरण के लिए, रूट BUILD फ़ाइल: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. इन फ़्लैग का इस्तेमाल करके, टूलचेन चालू करें: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • WORKSPACE का इस्तेमाल करके:

    1. अपनी WORKSPACE फ़ाइल में, rules_cc डिपेंडेंसी और टूलचेन लोड करें : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. BUILD फ़ाइल में platform टारगेट तय करें. उदाहरण के लिए, रूट BUILD फ़ाइल: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. इन फ़्लैग का इस्तेमाल करके, टूलचेन चालू करें: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 7:

ध्यान दें: Bazel 7 में, @bazel_tools//tools/cpp:clang-cl, @rules_cc कंस्ट्रेंट का एलियास नहीं है. Bazel 7 में rules_cc के साथ clang-cl का सही तरीके से इस्तेमाल करने के लिए, आपको @rules_cc रिपॉज़िटरी में किसी कंस्ट्रेंट का रेफ़रंस देना होगा. तकनीकी तौर पर, लेबल @rules_cc//cc/private/toolchain:clang-cl निजी है. हालांकि, Bazel 7 में WORKSPACE और Bzlmod सेटअप के बीच एक जैसा व्यवहार बनाए रखने के लिए, यह ज़रूरी है.

  • Bzlmod का इस्तेमाल करना:

    1. Bazel 8 के उदाहरण में दिए गए तरीके से MODULE.bazel को सेट अप करें.

    2. @rules_cc प्राइवेट कंस्ट्रेंट का इस्तेमाल करके, platform टारगेट तय करें: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. इन फ़्लैग का इस्तेमाल करके, टूलचेन चालू करें: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • WORKSPACE का इस्तेमाल करके:

    1. अपनी WORKSPACE फ़ाइल में, rules_cc डिपेंडेंसी और टूलचेन लोड करें : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. @rules_cc प्राइवेट कंस्ट्रेंट का इस्तेमाल करके, platform टारगेट तय करें: python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. इन फ़्लैग का इस्तेमाल करके, टूलचेन चालू करें: bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 0.29 से 6.x:

  • बिल्ड फ़्लैग --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 फ़ाइल
  • एक एक्ज़ीक्यूटेबल फ़ाइल, जो Python इंटरप्रेटर को लॉन्च कर सकती है. इसमें, सेल्फ़-एक्सट्रैक्टिंग ज़िप फ़ाइल को आर्ग्युमेंट के तौर पर इस्तेमाल किया जाता है

आपके पास एक्ज़ीक्यूटेबल फ़ाइल (इसका एक्सटेंशन .exe है) चलाने का विकल्प होता है. इसके अलावा, 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 टारगेट कैसे बनाता है, तो डिज़ाइन से जुड़ा यह दस्तावेज़ देखें.