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

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

आम तौर पर होने वाली समस्याएं

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

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

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

Windows पर, कुछ टूल में मैक्सिमम पाथ लंबाई की सीमा होती है. इसमें एमएसवीसी कंपाइलर भी शामिल है. इस समस्या का सामना न हो, इसके लिए --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

सुझाव: कमांड प्रॉम्प्ट (cmd.exe) या PowerShell से Bazel चलाएं.

15-01-2020 तक, bash से Bazel को न चलाएं -- या तो MSYS2 शेल से, Git Bash या सिगविन या किसी भी अन्य Bash वैरिएंट से. वैसे तो Bazel ज़्यादातर मामलों में काम कर सकता है, लेकिन इसमें कुछ चीज़ें काम नहीं करतीं, जैसे कि MSYS2 के लिए Ctrl+C से बिल्ड में रुकावट डालना). साथ ही, अगर आपने MSYS2 के तहत रन करने का विकल्प चुना है, तो आपको MSYS2 के ऑटोमैटिक पाथ कन्वर्ज़न को बंद करना होगा. ऐसा न करने पर MSYS, यूनिक्स पाथ (जैसे //foo:bar) जैसे दिखने वाले कमांड लाइन तर्कों को Windows पाथ में बदल देगा. ज़्यादा जानकारी के लिए, StackOverflow का यह जवाब देखें.

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

बैश के बिना बैज़ल बिल्ड इस्तेमाल करना

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

Bazel 1.0 से शुरू, बैश के बिना कोई भी नियम बनाया जा सकता है, जब तक कि वह:

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

हालांकि, genrule का इस्तेमाल अक्सर आसान कामों के लिए किया जाता है. जैसे, फ़ाइल कॉपी करना या टेक्स्ट फ़ाइल लिखना. genrule (और बैश के आधार पर) का इस्तेमाल करने के बजाय, आपको bazel-skylib रिपॉज़िटरी में सही नियम मिल सकता है. Windows पर बनाए जाने पर, इन नियमों के लिए बैश की ज़रूरत नहीं होती.

बैश के बिना बेज़ल टेस्ट का इस्तेमाल करना

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

Bazel 1.0 के साथ, बैश के बिना किसी भी नियम की जांच की जा सकती है. हालांकि, ऐसा इन स्थितियों में किया जा सकता है:

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

बैश के बिना बैज़ल रन का इस्तेमाल

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

Bazel 1.0 के साथ, बैश के बिना कोई भी नियम चलाया जा सकता है. हालांकि, ऐसा इन स्थितियों में ही किया जा सकता है:

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

बैश के बिना बाइनरी और श* नियमों और ctx.actions.run_shel() का इस्तेमाल करना

आपको sh_* नियमों को बनाने और उनकी जांच करने के लिए, बैश की ज़रूरत होगी. साथ ही, ctx.actions.run_shell() और ctx.resolve_command() का इस्तेमाल करने वाले Starlark नियम बनाने और उनकी जांच करने के लिए भी आपको बैश की ज़रूरत होगी. यह न सिर्फ़ आपके प्रोजेक्ट के नियमों पर लागू होता है, बल्कि किसी भी बाहरी डेटा स्टोर करने की जगह के नियमों पर भी लागू होता है. यह प्रोजेक्ट आपके प्रोजेक्ट पर निर्भर करता है, भले ही वह ट्रांज़िशन के तौर पर ही क्यों न हो.

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

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

आपने Windows कमांड प्रॉम्प्ट (cmd.exe) में जो एनवायरमेंट वैरिएबल सेट किए हैं वे सिर्फ़ उसी कमांड प्रॉम्प्ट सेशन में सेट होते हैं. नया cmd.exe शुरू करने पर, आपको फिर से वैरिएबल सेट करने होंगे. cmd.exe शुरू होने पर हमेशा वैरिएबल सेट करने के लिए, उन्हें Control Panel > System Properties > Advanced > Environment Variables... डायलॉग बॉक्स के उपयोगकर्ता वैरिएबल या सिस्टम वैरिएबल में जोड़ा जा सकता है.

Windows पर बनाएं

एमएसवीसी की मदद से C++ बनाएं

एमएसवीसी के साथ C++ टारगेट बनाने के लिए, आपको इनकी ज़रूरत होगी:

  • विज़ुअल C++ कंपाइलर.

  • (ज़रूरी नहीं) BAZEL_VC और BAZEL_VC_FULL_VERSION एनवायरमेंट वैरिएबल.

    Bazel आपके सिस्टम पर विज़ुअल C++ कंपाइलर का अपने-आप पता लगा लेता है. Bazel को कोई खास VC इंस्टॉलेशन इस्तेमाल करने का निर्देश देने के लिए, नीचे दिए गए एनवायरमेंट वैरिएबल सेट किए जा सकते हैं:

    Visual Studio 2017 और 2019 के लिए, BAZEL_VC में से किसी एक को सेट करें. इसके अलावा, BAZEL_VC_FULL_VERSION को भी सेट किया जा सकता है.

    • विज़ुअल C++ बिल्ड टूल इंस्टॉलेशन डायरेक्ट्री BAZEL_VC

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (ज़रूरी नहीं) सिर्फ़ Visual Studio 2017 और 2019 के लिए, आपके विज़ुअल C++ बिल्ड टूल का पूरा वर्शन नंबर. अगर एक से ज़्यादा वर्शन इंस्टॉल किए जाते हैं, तो BAZEL_VC_FULL_VERSION के ज़रिए विज़ुअल C++ बिल्ड टूल वाला सटीक वर्शन चुनें. ऐसा न करने पर, Bazel नया वर्शन चुनेगा.

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    Visual Studio 2015 या उससे पहले के वर्शन के लिए, BAZEL_VC पर सेट करें. (BAZEL_VC_FULL_VERSION इस्तेमाल नहीं किया जा सकता.)

    • विज़ुअल C++ बिल्ड टूल इंस्टॉलेशन डायरेक्ट्री BAZEL_VC

      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 भी इस्तेमाल किया जा सकता है. SDK टूल के लिए, Windows 8.1 का सिर्फ़ एक वर्शन उपलब्ध है. कृपया पक्का करें कि आपने बताया गया Windows SDK टूल इंस्टॉल किया हुआ है.

    ज़रूरी शर्त: यह 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

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

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

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

0.29.0 से, Bazel, LLVM के MSVC-के साथ काम करने वाले कंपाइलर ड्राइवर (clang-cl.exe) के साथ बिल्डिंग बनाने की सुविधा देता है.

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

Bazel आपके सिस्टम पर LLVM इंस्टॉलेशन का अपने-आप पता लगा सकता है या आप साफ़ तौर पर बता सकते हैं कि BAZEL_LLVM ने Bazel को कहां इंस्टॉल किया है.

  • LLVM इंस्टॉलेशन डायरेक्ट्री BAZEL_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
    
    • प्लैटफ़ॉर्म और टूलचेन को अपनी WORKSPACE फ़ाइल में रजिस्टर करें:
    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 टारगेट कैसे बनाता है, तो यह डिज़ाइन दस्तावेज़ देखें.