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

समस्या की शिकायत करें स्रोत देखें

इस पेज पर, 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 Shell बनाम कमांड प्रॉम्प्ट बनाम PowerShell

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

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

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

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

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

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

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

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

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

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

Bazel 1.0 की शुरुआत में, बैश के बिना किसी भी नियम की जांच की जा सकती है. हालांकि, ऐसा इन मामलों को छोड़कर:

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

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

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

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

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

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

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

    ज़रूरी शर्त: यह VC 2017 और 2019 के साथ काम करता है. स्टैंडअलोन वीसी 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 टूलचेन चालू करने के लिए, कई स्थितियां उपलब्ध हैं.

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