इस पेज में, Windows पर Basel का इस्तेमाल करने के सबसे सही तरीके बताए गए हैं. इंस्टॉल करने के निर्देशों के लिए, Windows पर Bazel इंस्टॉल करना लेख पढ़ें.
पहले से मालूम समस्याएं
Windows से जुड़ी Bazel की समस्याओं को GitHub पर "team-Windows" लेबल के साथ मार्क किया जाता है. समस्याओं को ठीक किया गया है.
सबसे सही तरीके
लंबे पाथ से जुड़ी समस्याओं से बचें
Windows पर कुछ टूल की संख्यात्मक विश्लेषण की सीमा तय होती है. इनमें MSVC कंपाइलर भी शामिल है. इस समस्या से बचने के लिए, --output_user_root फ़्लैग की मदद से, Bazel के लिए छोटी आउटपुट डायरेक्ट्री तय की जा सकती है.
उदाहरण के लिए, अपनी baazrc फ़ाइल में यह लाइन जोड़ें:
startup --output_user_root=C:/tmp
8.3 फ़ाइल नाम वाली फ़ाइलों के साथ काम करने की सुविधा चालू करना
Baज़ल, लंबे फ़ाइल पाथ के लिए, छोटे नाम का वर्शन बनाने की कोशिश करता है. हालांकि, ऐसा करने के लिए 8.3 फ़ाइल नाम से जुड़ी सहायता की सुविधा उस वॉल्यूम के लिए चालू होनी चाहिए जिसमें लंबे पाथ वाली फ़ाइल मौजूद है. सभी वॉल्यूम में 8.3 नाम बनाने की सुविधा चालू करने के लिए, यह कमांड चलाएं:
fsutil 8dot3name set 0
सिमलिंक की सुविधा चालू करें
कुछ सुविधाओं का इस्तेमाल करने के लिए, Windows पर डेवलपर मोड (Windows 10 के वर्शन 1703 या उसके बाद के वर्शन) को चालू करके या Basel को एडमिन के तौर पर चलाकर, फ़ाइल सिमलिंक बनाना ज़रूरी है. इससे ये सुविधाएं चालू होती हैं:
इसे आसान बनाने के लिए, अपनी bazelrc फ़ाइल में ये लाइनें जोड़ें:
startup --windows_enable_symlinks
build --enable_runfiles
ध्यान दें: Windows पर सिमलिंक बनाना एक महंगी प्रक्रिया है. --enable_runfiles
फ़्लैग से, फ़ाइल के बहुत सारे सिमलिंक बन सकते हैं. इस सुविधा को सिर्फ़ तब चालू करें, जब ज़रूरत हो.
रनिंग Baज़र: MSYS2 शेल बनाम कमांड प्रॉम्प्ट बनाम PowerShell
सुझाव: कमांड प्रॉम्प्ट (cmd.exe
) या PowerShell से Basel को चलाएं.
15-01-2020 तक, bash
से Baज़ेन को न चलाएं -- MSYS2 शेल से, Git Bash या Cyगविन से या Bash के किसी भी दूसरे वैरिएंट से. Bazel, ज़्यादातर इस्तेमाल के उदाहरणों के लिए काम कर सकता है. हालांकि, कुछ चीज़ें काम नहीं करतीं. जैसे, MSYS2 से Ctrl+C का इस्तेमाल करके बिल्ड को रोकना.
इसके अलावा, अगर आपको MSYS2 पर चलाना है, तो आपको MSYS2 के पाथ को अपने-आप बदलने की सुविधा बंद करनी होगी. ऐसा न करने पर, MSYS उन कमांड-लाइन आर्ग्युमेंट को Windows पाथ में बदल देगा जो //foo:bar
जैसे यूनिक्स पाथ जैसे दिखते हैं. ज़्यादा जानकारी के लिए, StackOverflow पर दिया गया यह जवाब देखें.
Bash (MSYS2) के बिना Bazel का इस्तेमाल करना
Bash के बिना bazel build का इस्तेमाल करना
1.0 से पहले के Baज़ल वर्शन में, Bash के इस्तेमाल के लिए कुछ नियम बनाना ज़रूरी था.
Basel 1.0 की शुरुआत के साथ, Bash के बिना कोई भी नियम बनाया जा सकता है. ऐसा तब तक किया जा सकता है, जब तक:
genrule
, क्योंकि genrules, Bash कमांड को एक्ज़ीक्यूट करते हैंsh_binary
याsh_test
नियम, क्योंकि इनमें Bash की ज़रूरत होती है- Starlark नियम, जो
ctx.actions.run_shell()
याctx.resolve_command()
का इस्तेमाल करता है
हालांकि, अक्सर genrule
का इस्तेमाल फ़ाइल कॉपी करने या टेक्स्ट फ़ाइल लिखने जैसे आसान कामों के लिए किया जाता है.
genrule
का इस्तेमाल करने के बजाय, (बैश के हिसाब से) आपको baज़ेन-skylib डेटा स्टोर करने की जगह में सही नियम मिल सकता है.
Windows पर बनाए जाने पर, इन नियमों के लिए Bash की ज़रूरत नहीं होती.
Bash के बिना bazel test का इस्तेमाल करना
1.0 से पहले के Baज़ल वर्शन के लिए, Bash को bazel test
करना ज़रूरी था.
Basel 1.0 के बाद के वर्शन में, Bash के बिना किसी भी नियम की जांच की जा सकती है. हालांकि, इन मामलों में ऐसा नहीं किया जा सकता:
- आप
--run_under
का इस्तेमाल करती हैं - जांच के नियम के लिए Bash की ज़रूरत होती है, क्योंकि इसका एक्ज़ीक्यूटेबल एक शेल स्क्रिप्ट है
बैश के बिना बेज़ल रन का इस्तेमाल किया जा रहा है
1.0 से पहले के Baज़ल वर्शन के लिए, Bash को bazel run
करना ज़रूरी था.
Basel 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 Command Prompt (cmd.exe
) में जो एनवायरमेंट वैरिएबल सेट किए जाते हैं वे सिर्फ़ उसी कमांड प्रॉम्प्ट सेशन में सेट किए जाते हैं. नया cmd.exe
शुरू करने पर, आपको वैरिएबल फिर से सेट करने होंगे. cmd.exe
शुरू होने पर वैरिएबल हमेशा सेट करने के लिए, आपके पास उन्हें Control Panel >
System Properties > Advanced > Environment Variables...
डायलॉग बॉक्स में उपयोगकर्ता वैरिएबल या सिस्टम वैरिएबल में जोड़ने का विकल्प है.
Windows पर बनाएं
MSVC की मदद से C++ प्रोग्राम बनाना
MSVC के साथ C++ टारगेट बनाने के लिए, आपको इनकी ज़रूरत होगी:
(ज़रूरी नहीं)
BAZEL_VC
औरBAZEL_VC_FULL_VERSION
एनवायरमेंट वैरिएबल.Baज़र, आपके सिस्टम पर 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++ बिल्ड टूल का पूरा वर्शन नंबर. अगर एक से ज़्यादा वर्शन इंस्टॉल हैं, तो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 ऐप्लिकेशन बनाते समय ज़रूरत पड़ती है. इन फ़ाइलों में 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
डाइनैमिक तौर पर लिंक की गई लाइब्रेरी (DLL फ़ाइलें) बनाने और उनका इस्तेमाल करने के लिए, यह उदाहरण देखें.
कमांड लाइन की लंबाई की सीमा: Windows कमांड लाइन की लंबाई की सीमा से जुड़ी समस्या से बचने के लिए, --features=compiler_param_file
की मदद से कंपाइलर पैरामीटर फ़ाइल की सुविधा चालू करें.
Clang की मदद से C++ बनाएं
0.29.0 से, Bazel LLVM के MSVC-संगत कंपाइलर ड्राइवर (clang-cl.exe
) के साथ बिल्ड करने की सुविधा देता है.
ज़रूरी शर्त: Clang के साथ बिल्ड करने के लिए, आपको LLVM और Visual 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 फ़्लैग को, आने वाले समय में Bagel रिलीज़ में डिफ़ॉल्ट रूप से चालू करने की योजना है. इसलिए, हमारा सुझाव है कि आप दूसरे तरीके से 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
अगर आपको यह जानना है कि Baze, Windows पर Python टारगेट कैसे बनाता है, तो यह design दस्तावेज़ देखें.