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

इस पेज पर, Windows पर Bazel का इस्तेमाल करने के सबसे सही तरीकों के बारे में बताया गया है. इंस्टॉल करने के निर्देशों के लिए, Windows पर Bazel इंस्टॉल करना लेख पढ़ें.

ज्ञात समस्याएं

GitHub पर, Windows से जुड़ी Bazel की समस्याओं को "team-Windows" लेबल से मार्क किया जाता है. यहां, ठीक की जानी बाकी समस्याएं देखी जा सकती हैं.

सबसे सही तरीके

पाथ की लंबाई से जुड़ी समस्याओं से बचना

कुछ टूल में, Windows पर पाथ की लंबाई की सीमा होती है. इनमें MSVC कंपाइलर भी शामिल है. इस समस्या से बचने के लिए, --output_user_root फ़्लैग का इस्तेमाल करके, Bazel के लिए छोटा आउटपुट डायरेक्ट्री तय की जा सकती है.

उदाहरण के लिए, अपनी bazelrc फ़ाइल में यह लाइन जोड़ें:

startup --output_user_root=C:/tmp

8.3 फ़ाइल नाम की सुविधा चालू करना

Bazel, लंबे पाथ वाली फ़ाइलों के लिए, छोटे नाम वाला वर्शन बनाने की कोशिश करता है. हालांकि, ऐसा करने के लिए, उस वॉल्यूम के लिए 8.3 फ़ाइल नाम की सुविधा चालू करनी होगी जिसमें लंबे पाथ वाली फ़ाइल मौजूद है. सभी वॉल्यूम में 8.3 नाम बनाने की सुविधा चालू करने के लिए, यह कमांड चलाएं:

fsutil 8dot3name set 0

कुछ सुविधाओं के लिए, 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 आर्किटेक्चर को टारगेट करती हैं. किसी दूसरे टारगेट आर्किटेक्चर को तय करने के लिए, अपने टारगेट आर्किटेक्चर के लिए --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

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

कमांड लाइन की लंबाई की सीमा: 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 के 0.28 और इससे पहले के वर्शन में: Clang काम नहीं करता.

  • --incompatible_enable_cc_toolchain_resolution के बिना: --compiler=clang-cl बिल्ड फ़्लैग की मदद से, Clang टूलचेन को चालू किया जा सकता है.

  • --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 टूलचेन को इन दो तरीकों में से किसी एक से चालू किया जा सकता है:

    • ये बिल्ड फ़्लैग तय करें:
    --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
    
    • अपनी MODULE.bazel फ़ाइल में प्लैटफ़ॉर्म और टूलचेन रजिस्टर करें:
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

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