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

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

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

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

Windows से जुड़ी Basel की समस्याओं को GitHub पर "team-Windows" लेबल के साथ मार्क किया जाता है. समस्याओं को ठीक किया गया है.

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

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

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

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

startup --output_user_root=C:/tmp

फ़ाइल नाम 8.3 की सुविधा देता है

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

fsutil 8dot3name set 0

कुछ सुविधाओं का इस्तेमाल करने के लिए, Windows पर डेवलपर मोड (Windows 10 के वर्शन 1703 या उसके बाद के वर्शन पर) या BaZ को एडमिन के तौर पर चलाकर, फ़ाइल सिमलिंक बनाना ज़रूरी है. इससे ये सुविधाएं चालू हो जाती हैं:

इसे आसान बनाने के लिए, अपनी baazrc फ़ाइल में ये लाइनें जोड़ें:

startup --windows_enable_symlinks
build --enable_runfiles

ध्यान दें: Windows पर सिमलिंक बनाना एक महंगी प्रक्रिया है. --enable_runfiles फ़्लैग की मदद से, बहुत ज़्यादा फ़ाइल सिमलिंक बनाए जा सकते हैं. इस सुविधा को सिर्फ़ तब चालू करें, जब आपको इसकी ज़रूरत हो.

रनिंग Baज़र: MSYS2 शेल बनाम कमांड प्रॉम्प्ट बनाम PowerShell

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

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

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

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

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

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

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

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

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

1.0 से पहले के Baज़ल वर्शन के लिए, Bash को bazel test करना ज़रूरी था.

Bazu 1.0 और उसके बाद के वर्शन में, Bash के बिना किसी भी नियम की जांच की जा सकती है. हालांकि, ऐसा सिर्फ़ तब होगा, जब:

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

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

1.0 से पहले के Baज़ल वर्शन के लिए, Bash को bazel run करना ज़रूरी था.

Basel 1.0 के साथ शुरू करते हुए, Bash के बिना कोई भी नियम चलाया जा सकता है. हालांकि, इन मामलों में ऐसा नहीं होगा:

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

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

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

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

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

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

Windows पर बनाएं

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

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

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

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

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

    विज़ुअल स्टूडियो 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++ बिल्ड टूल का पूरा वर्शन नंबर. अगर एक से ज़्यादा वर्शन इंस्टॉल किए गए हैं, तो BAZEL_VC_FULL_VERSION के ज़रिए, विज़ुअल C++ बिल्ड टूल का सटीक वर्शन चुना जा सकता है. ऐसा न करने पर, Baze नया वर्शन चुन लेगा.

      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 ऐप्लिकेशन बनाते समय ज़रूरत पड़ती है. इन फ़ाइलों में Basel का ऐप्लिकेशन भी शामिल है. डिफ़ॉल्ट रूप से, इंस्टॉल किए गए सबसे नए 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 SDK टूल का सिर्फ़ एक वर्शन उपलब्ध है. कृपया पक्का करें कि आपने चुना गया 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 से, LLVM के MSVC के साथ काम करने वाले कंपाइलर ड्राइवर (clang-cl.exe) के साथ बिल्डिंग बनाने की सुविधा देता है.

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

Basel, आपके सिस्टम पर एलएलवीएम इंस्टॉलेशन का अपने-आप पता लगा सकता है. इसके अलावा, आपको साफ़ तौर पर यह भी बताया जा सकता है कि BAZEL_LLVM ने 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
    
    • अपनी WORKSPACE फ़ाइल में प्लैटफ़ॉर्म और टूलचेन को रजिस्टर करें:
    register_execution_platforms(
        ":x64_windows-clang-cl"
    )
    
    register_toolchains(
        "@local_config_cc//:cc-toolchain-x64_windows-clang-cl",
    )
    

    --incompatible_enable_cc_toolchain_resolution फ़्लैग को, आने वाले समय में Basel की रिलीज़ में डिफ़ॉल्ट रूप से चालू किया जाएगा. इसलिए, हमारा सुझाव है कि दूसरे तरीके से Clang के लिए सहायता चालू करें.

Java बनाएं

Java टारगेट बनाने के लिए, आपको इनकी ज़रूरत होगी:

Windows पर, Baze, 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 पर, Baze, py_binary नियमों के लिए दो आउटपुट फ़ाइलें बनाता है:

  • एक सेल्फ़-एक्सट्रैक्टिंग ज़िप फ़ाइल
  • एक ऐसी एक्ज़ीक्यूटेबल फ़ाइल जो Python अनुवादक को लॉन्च कर सकती है.

आप या तो एक्ज़ीक्यूटेबल फ़ाइल चला सकते हैं (इसका एक्सटेंशन .exe है) या आप तर्क के तौर पर, खुद एक्सट्रैक्ट करने वाली ज़िप फ़ाइल से Python को चला सकते हैं.

हमारे किसी सैंपल प्रोजेक्ट में से कोई टारगेट बनाएं:

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

अगर आपको यह जानना है कि Baze, Windows पर Python टारगेट कैसे बनाता है, तो यह design दस्तावेज़ देखें.