Windows पर Bazel का इस्तेमाल करना

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

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

ऐसी समस्याएं जिनकी पहले से जानकारी है

Windows से जुड़ी बेज़ेल समस्याओं को GitHub पर "टीम-Windows" लेबल के साथ मार्क किया जाता है. आपको बाकी समस्याएं यहां दिखेंगी.

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

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

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

उदाहरण के लिए, अपनी बेज़लर्क फ़ाइल में नीचे दी गई लाइन जोड़ें:

startup --output_user_root=C:/tmp

8.3 फ़ाइल नाम समर्थन को सक्षम करें

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

fsutil 8dot3name set 0

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

इसे आसान बनाने के लिए, अपनी बेज़लर्क फ़ाइल में नीचे दी गई लाइनें जोड़ें:

startup --windows_enable_symlinks
build --enable_runfiles

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

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

इसका सुझाव दिया जाता है: कमांड प्रॉम्प्ट (cmd.exe) या PowerShell से Bazel चलाएं.

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

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

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

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

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

  • genrule, क्योंकि genनियमों से बैश निर्देश काम करते हैं
  • sh_binary या sh_test नियम, क्योंकि ये स्वाभाविक रूप से बैश की ज़रूरत है
  • Starlark का ऐसा नियम जो ctx.actions.run_shell() या ctx.resolve_command() का इस्तेमाल करता है

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

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

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

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

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

बैश के बिना bazel रन का उपयोग करना

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

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

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

shबाइनरी और sh* नियमों का उपयोग करना, और बैश के बिना ctx.action.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++ बनाएं

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

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

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

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

    विज़ुअल स्टूडियो 2017 और 2019 के लिए, BAZEL_VC में से कोई एक सेट करें. इसके अलावा, BAZEL_VC_FULL_VERSION को भी सेट किया जा सकता है.

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

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

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    विज़ुअल स्टूडियो 2015 या उससे पहले के वर्शन के लिए, BAZEL_VC सेट करें. (BAZEL_VC_FULL_VERSION समर्थित नहीं है.)

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

      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 इंस्टॉल किया हुआ है.

    ज़रूरी शर्त: यह वीसी 2017 और 2019 के साथ काम करता है. स्टैंडअलोन VC 2015 Build Tools, Windows SDK टूल को चुनने की सुविधा नहीं देता है. आपको विज़ुअल स्टूडियो 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 से, Bezel LLVM के MSVC-साथ काम करने वाले कंपाइलर ड्राइवर (clang-cl.exe) के साथ निर्माण का समर्थन करता है.

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

Bazel आपके सिस्टम पर, LLVM को इंस्टॉल किए जाने का अपने-आप पता लगा सकता है या आप साफ़ तौर पर Bazel को बता सकते हैं कि 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",
    )
    

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

Java बिल्ड करें

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

Windows पर, Bazel java_binary नियमों के लिए दो आउटपुट फ़ाइलें बनाता है:

  • एक .jar फ़ाइल
  • .exe फ़ाइल, जो जेवीएम के लिए एनवायरमेंट सेट अप कर सकती है और बाइनरी चला सकती है

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

  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

अगर आपको Windows पर Python के टारगेट बनाने के तरीके के बारे में जानकारी चाहिए, तो यह डिज़ाइन दस्तावेज़ देखें.