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

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

पहले से मालूम समस्याएं

Windows से जुड़ी Bazel की समस्याओं को GitHub पर "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

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

15-01-2020 से, bash से Bazel नहीं चलाएं -- MSYS2 शेल, Git Bash, Cygwin या Bash के किसी भी दूसरे वैरिएंट से. Bazel, ज़्यादातर इस्तेमाल के उदाहरणों के लिए काम कर सकता है. हालांकि, कुछ चीज़ें काम नहीं करतीं. जैसे, MSYS2 से Ctrl+C का इस्तेमाल करके बिल्ड को रोकना. इसके अलावा, अगर आपको MSYS2 पर चलाना है, तो आपको MSYS2 के पाथ को अपने-आप बदलने की सुविधा बंद करनी होगी. ऐसा न करने पर, MSYS उन कमांड-लाइन आर्ग्युमेंट को Windows पाथ में बदल देगा जो //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 के बिना shbinary and sh* नियमों और ctx.actions.run_shell() का इस्तेमाल करना

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

आने वाले समय में, इन नियमों को बनाने के लिए, 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

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

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

Clang की मदद से C++ प्रोग्राम बनाना

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

ज़रूरी शर्त: Clang का इस्तेमाल करके प्रोग्राम बनाने के लिए, आपको LLVM और Visual C++ बिल्ड टूल, दोनों इंस्टॉल करने होंगे. ऐसा इसलिए, क्योंकि 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",
    )
    

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

  • अपने-आप एक्सट्रैक्ट होने वाली ज़िप फ़ाइल
  • ऐसी फ़ाइल जिसे चलाने पर, Python इंटरप्रेटर को आर्ग्युमेंट के तौर पर, खुद से एक्सट्रैक्ट होने वाली zip फ़ाइल के साथ लॉन्च किया जा सकता है

आपके पास, .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 टारगेट कैसे बनाता है, तो यह डिज़ाइन वाला दस्तावेज़ देखें.