इस सेक्शन में, कई फ़ंक्शन या बिल्ड नियमों में इस्तेमाल होने वाले अलग-अलग शब्दों और कॉन्सेप्ट के बारे में बताया गया है.
सामग्री
- Bourne shell टोकनाइज़ेशन
- लेबल एक्सपैंशन
- ज़्यादातर बिल्ड नियमों के हिसाब से तय किए गए सामान्य एट्रिब्यूट
- सभी बिल्ड नियमों के लिए सामान्य एट्रिब्यूट
- सभी टेस्ट नियमों (*_test) के लिए सामान्य एट्रिब्यूट
- सभी बाइनरी नियमों (*_binary) के लिए सामान्य एट्रिब्यूट
- कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट
- इंप्लिसिट आउटपुट टारगेट
बॉर्न शेल टोकनाइज़ेशन
कुछ नियमों के कुछ स्ट्रिंग एट्रिब्यूट को बॉर्न शेल के टोकनाइज़ेशन के नियमों के मुताबिक, कई शब्दों में बांटा जाता है: बिना कोटेशन वाले स्पेस, शब्दों को अलग करते हैं. साथ ही, सिंगल और डबल कोटेशन वाले वर्णों और बैकस्लैश का इस्तेमाल, टोकनाइज़ेशन को रोकने के लिए किया जाता है.
जिन एट्रिब्यूट के लिए टोकनाइज़ेशन की सुविधा उपलब्ध है उन्हें इस दस्तावेज़ में साफ़ तौर पर बताया गया है.
"Make" वैरिएबल एक्सपैंशन और बॉर्न शेल टोकनाइज़ेशन के लिए इस्तेमाल किए जाने वाले एट्रिब्यूट का इस्तेमाल आम तौर पर, कंपाइलर और अन्य टूल को मनचाहे विकल्प पास करने के लिए किया जाता है. इस तरह के एट्रिब्यूट के उदाहरण ये हैं: cc_library.copts
और java_library.javacopts
.
इन सब्स्टिट्यूशन की मदद से, एक स्ट्रिंग वैरिएबल को कॉन्फ़िगरेशन के हिसाब से विकल्पों की सूची में बदला जा सकता है.
लेबल का दायरा बढ़ाना
कुछ नियमों के कुछ स्ट्रिंग एट्रिब्यूट, लेबल के विस्तार के दायरे में आते हैं: अगर उन स्ट्रिंग में सबस्ट्रिंग के तौर पर कोई मान्य लेबल शामिल है, जैसे कि //mypkg:target
, और वह लेबल मौजूदा नियम की ज़रूरी शर्त है, तो उसे target
//mypkg:target
से दिखाए गए फ़ाइल के पाथनेम में बदल दिया जाता है.
उदाहरण के लिए, एट्रिब्यूट में genrule.cmd
और cc_binary.linkopts
शामिल हैं. हर मामले में, जानकारी में काफ़ी अंतर हो सकता है. जैसे: क्या मिलते-जुलते लेबल को बड़ा किया गया है; एक से ज़्यादा फ़ाइलों में दिखने वाले लेबल को कैसे मैनेज किया जाता है वगैरह. ज़्यादा जानकारी के लिए, नियम एट्रिब्यूट का दस्तावेज़ पढ़ें.
ज़्यादातर बिल्ड नियमों के हिसाब से तय किए गए सामान्य एट्रिब्यूट
इस सेक्शन में, उन एट्रिब्यूट के बारे में बताया गया है जिन्हें कई बिल्ड नियमों के हिसाब से तय किया जाता है, लेकिन सभी के हिसाब से नहीं.
एट्रिब्यूट | ब्यौरा |
---|---|
data |
लेबल की सूची; डिफ़ॉल्ट वैल्यू इस नियम को रनटाइम में जिन फ़ाइलों की ज़रूरत होती है. इसमें फ़ाइल या नियम के टारगेट की सूची शामिल हो सकती है. आम तौर पर, किसी भी टारगेट को अनुमति देता है.
नए नियमों में |
deps |
लेबल की सूची; डिफ़ॉल्ट वैल्यू
इस टारगेट के लिए डिपेंडेंसी. आम तौर पर, सिर्फ़ नियम के टारगेट की सूची बनाता है. (हालांकि, कुछ नियमों के तहत फ़ाइलों को सीधे भाषा के हिसाब से बने नियमों के तहत, आम तौर पर टारगेट को सिर्फ़ उन लोगों तक सीमित किया जाता है जिनके पास खास सेवा देने वाली कंपनियां हैं.
ज़्यादातर मामलों में, |
licenses |
स्ट्रिंग की सूची; कॉन्फ़िगर नहीं किया जा सकता;
डिफ़ॉल्ट वैल्यू इस टारगेट के लिए इस्तेमाल की जाने वाली लाइसेंस-टाइप स्ट्रिंग की सूची. यह लाइसेंसिंग एपीआई के पुराने वर्शन का हिस्सा है. Bazel अब इसका इस्तेमाल नहीं करता. इसका इस्तेमाल न करें. |
srcs |
लेबल की सूची; डिफ़ॉल्ट वैल्यू
इस नियम के तहत प्रोसेस की गई या शामिल की गई फ़ाइलें. आम तौर पर, फ़ाइलों को सीधे तौर पर सूची में शामिल करता है, लेकिन
डिफ़ॉल्ट आउटपुट शामिल करने के लिए, नियम के टारगेट (जैसे कि भाषा के हिसाब से बने नियमों के तहत, अक्सर यह ज़रूरी होता है कि सूची में शामिल फ़ाइलों में खास फ़ाइल एक्सटेंशन हों. |
सभी बिल्ड नियमों के लिए सामान्य एट्रिब्यूट
इस सेक्शन में उन एट्रिब्यूट के बारे में बताया गया है जिन्हें सभी बिल्ड नियमों में अपने-आप जोड़ दिया जाता है.
एट्रिब्यूट | ब्यौरा |
---|---|
aspect_hints |
लेबल की सूची; डिफ़ॉल्ट वैल्यू यह ऐसे लेबल की सूची है जो पहलू के लिए उपलब्ध है. खास तौर पर, इस नियम की रिवर्स डिपेंडेंसी से जुड़े पहलू. हालांकि, यह इस नियम के खुद के लागू करने के लिए उपलब्ध नहीं है. किसी खास भाषा के लिए बने नियमों के सेट से जुड़े दस्तावेज़ देखें. इससे आपको यह पता चलेगा कि किसी पहलू के बारे में दिए गए सुझाव का क्या असर होगा. किसी पहलू के बारे में जानकारी देने वाले सुझाव को टैग के बेहतर विकल्प के तौर पर देखा जा सकता है:
टैग सिर्फ़ बूलियन स्थिति के बारे में बताता है. इसका मतलब है कि टैग, असल में, पहलू के बारे में जानकारी देने वाले हिंट का इस्तेमाल, भाषा के हिसाब से बनाए गए अलग-अलग नियम सेट के बीच इंटरऑपरेबिलिटी के लिए किया जाता है. उदाहरण के लिए, मान लें कि आपके पास एक उदाहरण के लिए, सबसे सही तरीके:
|
compatible_with |
लेबल की सूची;
कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू डिफ़ॉल्ट रूप से काम करने वाले एनवायरमेंट के अलावा, इस टारगेट को जिन एनवायरमेंट के लिए बनाया जा सकता है उनकी सूची. यह Bazel के कॉन्स्ट्रेंट सिस्टम का हिस्सा है. इससे उपयोगकर्ता यह तय कर सकते हैं कि कौनसे टारगेट एक-दूसरे पर निर्भर हो सकते हैं और कौनसे नहीं. उदाहरण के लिए, बाहरी तौर पर डिप्लॉय किए जा सकने वाले बाइनरी, कंपनी के सीक्रेट कोड वाली लाइब्रेरी पर निर्भर नहीं होने चाहिए. ज़्यादा जानकारी के लिए, ConstraintSemantics देखें. |
deprecation |
स्ट्रिंग; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू इस टारगेट से जुड़ी चेतावनी का मैसेज. आम तौर पर, इसका इस्तेमाल उपयोगकर्ताओं को यह सूचना देने के लिए किया जाता है कि कोई टारगेट पुराना हो गया है. इसके अलावा, इसका इस्तेमाल यह बताने के लिए भी किया जाता है कि किसी टारगेट को किसी दूसरे नियम ने बदल दिया है, वह किसी पैकेज के लिए निजी है या किसी वजह से उसे नुकसान पहुंचाने वाला माना जाता है. कुछ रेफ़रंस (जैसे, वेबपेज, गड़बड़ी का नंबर या माइग्रेशन के उदाहरण वाले सीएल) शामिल करना एक अच्छा विचार है, ताकि यह आसानी से पता लगाया जा सके कि मैसेज से बचने के लिए कौनसे बदलाव ज़रूरी हैं. अगर कोई नया टारगेट उपलब्ध है, जिसका इस्तेमाल पुराने टारगेट की जगह किया जा सकता है, तो पुराने टारगेट के सभी उपयोगकर्ताओं को माइग्रेट करना बेहतर होता है.
इस एट्रिब्यूट से, चीज़ें बनाने के तरीके पर कोई असर नहीं पड़ता. हालांकि, इससे बिल्ड टूल के डाइग्नोस्टिक आउटपुट पर असर पड़ सकता है. जब किसी दूसरे पैकेज में मौजूद टारगेट, इंट्रा-पैकेज डिपेंडेंसी को इस चेतावनी से छूट दी गई है, ताकि उदाहरण के लिए, बंद किए गए नियम के टेस्ट बनाने पर चेतावनी न मिले. अगर बंद किए गए किसी टारगेट के लिए, बंद किए गए किसी दूसरे टारगेट पर निर्भर रहना ज़रूरी है, तो चेतावनी वाला कोई मैसेज नहीं दिखाया जाता. जब लोग इसका इस्तेमाल करना बंद कर दें, तब टारगेट को हटाया जा सकता है. |
exec_compatible_with |
लेबल की सूची;
कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू
|
exec_group_compatible_with |
लेबल की सूचियों के लिए स्ट्रिंग का शब्दकोश;
nonconfigurable; डिफ़ॉल्ट वैल्यू
यह एक्ज़ेक ग्रुप के नामों की डिक्शनरी है. इसमें |
exec_properties |
स्ट्रिंग का शब्दकोश; डिफ़ॉल्ट वैल्यू स्ट्रिंग की एक डिक्शनरी, जिसे इस टारगेट के लिए चुने गए प्लैटफ़ॉर्म के अगर कोई कुंजी, प्लैटफ़ॉर्म और टारगेट-लेवल, दोनों प्रॉपर्टी में मौजूद है, तो वैल्यू को टारगेट से लिया जाएगा. कुंजी के नाम से पहले, एक्ज़ीक्यूशन ग्रुप का नाम और उसके बाद |
features |
सुविधा स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू सुविधा एक स्ट्रिंग टैग होती है, जिसे किसी टारगेट पर चालू या बंद किया जा सकता है. किसी सुविधा का मतलब, नियम पर निर्भर करता है. इस |
package_metadata |
लेबल की सूची;
कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट रूप से पैकेज का उन लेबल की सूची जो इस टारगेट के बारे में मेटाडेटा से जुड़े हैं. आम तौर पर, लेबल ऐसे आसान नियम होते हैं जो एक जैसी वैल्यू देने वाली कंपनी की जानकारी देते हैं. नियम और पहलू, इन लेबल का इस्तेमाल करके बिल्ड ग्राफ़ का कुछ अतिरिक्त विश्लेषण कर सकते हैं.
rules_license एट्रिब्यूट का इस्तेमाल करने का सबसे सही तरीका यह है.
इस मामले में, |
restricted_to |
लेबल की सूची;
कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू उन एनवायरमेंट की सूची जिनके लिए इस टारगेट को बनाया जा सकता है. यह सूची, डिफ़ॉल्ट रूप से काम करने वाले एनवायरमेंट की सूची के बदले इस्तेमाल की जाती है.
यह Bazel के कंस्ट्रेंट सिस्टम का हिस्सा है. ज़्यादा जानकारी के लिए, |
tags |
स्ट्रिंग की सूची; कॉन्फ़िगर नहीं किया जा सकता;
डिफ़ॉल्ट वैल्यू
टैग का इस्तेमाल किसी भी नियम पर किया जा सकता है. टेस्ट और
अगर Bazel को किसी भी टेस्ट या
आम तौर पर, टेस्ट पर टैग का इस्तेमाल, डीबग और रिलीज़ की प्रोसेस में टेस्ट की भूमिका को एनोटेट करने के लिए किया जाता है. आम तौर पर, टैग C++ और Python टेस्ट के लिए सबसे ज़्यादा फ़ायदेमंद होते हैं. इनमें रनटाइम एनोटेशन की सुविधा नहीं होती. टैग और साइज़ एलिमेंट का इस्तेमाल करने से, कोडबेस चेक-इन नीति के आधार पर टेस्ट के सुइट को असेंबल करने में आसानी होती है.
अगर Bazel को टेस्ट के नियम के
|
target_compatible_with |
लेबल की सूची; डिफ़ॉल्ट वैल्यू
ऐसे टारगेट जो ट्रांज़िटिव तौर पर, काम न करने वाले टारगेट पर निर्भर होते हैं उन्हें भी काम न करने वाला टारगेट माना जाता है. इन्हें बनाने और जाँचने के लिए भी नहीं चुना जाता. खाली सूची (जो डिफ़ॉल्ट होती है) का मतलब है कि टारगेट सभी प्लैटफ़ॉर्म के साथ काम करता है.
Workspace के नियमों को छोड़कर, अन्य सभी नियमों के लिए इस एट्रिब्यूट का इस्तेमाल किया जा सकता है.
कुछ नियमों के लिए, इस एट्रिब्यूट का कोई असर नहीं होता. उदाहरण के लिए,
टारगेट स्किप करने की सुविधा के साथ काम न करने वाले प्लैटफ़ॉर्म के बारे में ज़्यादा जानने के लिए, प्लैटफ़ॉर्म पेज देखें. |
testonly |
बूलियन; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू
अगर
इसी तरह,
जांच ( इस एट्रिब्यूट का मतलब है कि टारगेट को प्रोडक्शन के लिए रिलीज़ किए गए बाइनरी में शामिल नहीं किया जाना चाहिए. testonly को बिल्ड टाइम पर लागू किया जाता है, न कि रन टाइम पर. साथ ही, यह डिपेंडेंसी ट्री के ज़रिए तेज़ी से फैलता है. इसलिए, इसे सोच-समझकर लागू किया जाना चाहिए. उदाहरण के लिए, स्टब और फ़ेक, यूनिट टेस्ट के लिए फ़ायदेमंद होते हैं. ये इंटिग्रेशन टेस्ट के लिए भी फ़ायदेमंद हो सकते हैं. इनमें प्रोडक्शन के लिए रिलीज़ किए जाने वाले एक ही बाइनरी शामिल होते हैं. इसलिए, इन्हें शायद testonly के तौर पर मार्क नहीं किया जाना चाहिए. इसके उलट, जिन नियमों को लिंक करने से भी खतरा होता है उन्हें testonly के तौर पर मार्क किया जाना चाहिए. ऐसा इसलिए, क्योंकि वे बिना किसी शर्त के सामान्य व्यवहार को बदल देते हैं. |
toolchains |
लेबल की सूची;
कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू
टारगेट का वह सेट जिसके मेक वैरिएबल को यह टारगेट ऐक्सेस कर सकता है. ये टारगेट, ऐसे नियमों के उदाहरण होते हैं जो
ध्यान दें कि यह टूलचेन रिज़ॉल्यूशन के कॉन्सेप्ट से अलग है. इसका इस्तेमाल, प्लैटफ़ॉर्म पर निर्भर कॉन्फ़िगरेशन के लिए नियमों को लागू करने के लिए किया जाता है. इस एट्रिब्यूट का इस्तेमाल करके, यह तय नहीं किया जा सकता कि टारगेट कौनसे |
visibility |
लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट वैल्यू अलग-अलग होती है
BUILD फ़ाइल में सीधे तौर पर या BUILD फ़ाइल से कॉल किए गए लेगसी मैक्रो में एलान किए गए टारगेट के लिए, डिफ़ॉल्ट वैल्यू पैकेज का |
सभी टेस्ट नियमों (*_test) के लिए सामान्य एट्रिब्यूट
इस सेक्शन में उन एट्रिब्यूट के बारे में बताया गया है जो टेस्ट के सभी नियमों के लिए सामान्य हैं.
एट्रिब्यूट | ब्यौरा | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
स्ट्रिंग की सूची; $(location) और "वैरिएबल बनाएं" के हिसाब से बदलती है. साथ ही, बोर्न शेल टोकनाइज़ेशन के हिसाब से बदलती है; डिफ़ॉल्ट वैल्यू कमांड लाइन आर्ग्युमेंट, जिन्हें
ये आर्ग्युमेंट, |
||||||||||||||||||||
env |
स्ट्रिंग की डिक्शनरी; वैल्यू, $(location) और "Make variable" के हिसाब से बदलती हैं; डिफ़ॉल्ट वैल्यू
यह एट्रिब्यूट सिर्फ़ नेटिव नियमों पर लागू होता है. जैसे, |
||||||||||||||||||||
env_inherit |
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू
यह एट्रिब्यूट सिर्फ़ नेटिव नियमों पर लागू होता है. जैसे, |
||||||||||||||||||||
size |
स्ट्रिंग इससे टेस्ट टारगेट की "heaviness" के बारे में पता चलता है. इसका मतलब है कि इसे चलाने के लिए कितना समय/संसाधन चाहिए. यूनिट टेस्ट को "छोटा", इंटिग्रेशन टेस्ट को "मीडियम", और एंड-टू-एंड टेस्ट को "बड़ा" या "बहुत बड़ा" माना जाता है. Bazel, साइज़ का इस्तेमाल करके डिफ़ॉल्ट टाइम आउट तय करता है. इसे टेस्ट के साइज़, डिफ़ॉल्ट टाइम आउट और स्थानीय संसाधनों के अनुमानित पीक इस्तेमाल के हिसाब से तय किए जाते हैं. ये इस तरह से तय किए जाते हैं:
टेस्ट शुरू करते समय, एनवायरमेंट वैरिएबल |
||||||||||||||||||||
timeout |
स्ट्रिंग यह टेस्ट कितने समय तक चलेगा.
टेस्ट के साइज़ एट्रिब्यूट से संसाधन के अनुमान को कंट्रोल किया जाता है. हालांकि, टेस्ट का टाइमआउट अलग से सेट किया जा सकता है. अगर टाइम आउट की अवधि साफ़ तौर पर नहीं बताई गई है, तो यह टेस्ट के साइज़ पर आधारित होती है.
ऊपर दिए गए समय के अलावा, टेस्ट के टाइमआउट को
टेस्ट शुरू करते समय, एनवायरमेंट वैरिएबल |
||||||||||||||||||||
flaky |
बूलियन; कॉन्फ़िगर नहीं किया जा सकता;
डिफ़ॉल्ट वैल्यू इस कुकी का इस्तेमाल, टेस्ट को फ़्लेकी के तौर पर मार्क करने के लिए किया जाता है. अगर यह विकल्प सेट किया जाता है, तो टेस्ट को तीन बार तक चलाया जाता है. अगर टेस्ट हर बार फ़ेल होता है, तो ही उसे फ़ेल के तौर पर मार्क किया जाता है. डिफ़ॉल्ट रूप से, इस एट्रिब्यूट को False पर सेट किया जाता है. साथ ही, टेस्ट सिर्फ़ एक बार किया जाता है. ध्यान दें कि आम तौर पर इस एट्रिब्यूट का इस्तेमाल करने का सुझाव नहीं दिया जाता. अगर टेस्ट में पुष्टि की गई शर्तों का पालन किया जाता है, तो टेस्ट के नतीजे भरोसेमंद होने चाहिए. |
||||||||||||||||||||
shard_count |
50 से कम या इसके बराबर का नॉन-नेगेटिव पूर्णांक; डिफ़ॉल्ट वैल्यू टेस्ट चलाने के लिए, पैरलल शार्ड की संख्या तय करता है. अगर यह वैल्यू सेट की जाती है, तो यह उन सभी अनुमानित तरीकों को बदल देगी जिनका इस्तेमाल, टेस्ट को चलाने के लिए पैरलल शार्ड की संख्या तय करने के लिए किया जाता है. ध्यान दें कि कुछ टेस्ट रूल के लिए, इस पैरामीटर की ज़रूरत हो सकती है. ऐसा इसलिए, ताकि शार्डिंग को चालू किया जा सके. अगर टेस्ट शार्डिंग चालू है, तो टेस्ट शुरू करते समय एनवायरमेंट वैरिएबल शार्डिंग के लिए, टेस्ट रनर को टेस्ट शार्डिंग प्रोटोकॉल के साथ काम करना होगा. अगर ऐसा नहीं होता है, तो हर शार्ड में हर टेस्ट चलने की संभावना ज़्यादा होती है. हालांकि, ऐसा नहीं होना चाहिए. शार्डिंग के बारे में ज़्यादा जानकारी के लिए, Test Encyclopedia में Test Sharding देखें. |
||||||||||||||||||||
local |
बूलियन; कॉन्फ़िगर नहीं किया जा सकता;
डिफ़ॉल्ट वैल्यू इस विकल्प से, टेस्ट को सैंडबॉक्सिंग के बिना स्थानीय तौर पर चलाया जाता है. इसे True पर सेट करने का मतलब है कि आपने टैग ( |
सभी बाइनरी नियमों (*_binary) के लिए सामान्य एट्रिब्यूट
इस सेक्शन में, ऐसे एट्रिब्यूट के बारे में बताया गया है जो सभी बाइनरी नियमों के लिए सामान्य हैं.
एट्रिब्यूट | ब्यौरा |
---|---|
args |
स्ट्रिंग की सूची; $(location) और "वैरिएबल बनाएं" के हिसाब से बदलती है. साथ ही, बोर्न शेल टोकनाइज़ेशन के हिसाब से बदलती है;
कॉन्फ़िगर नहीं की जा सकती;
डिफ़ॉल्ट वैल्यू
कमांड लाइन आर्ग्युमेंट, जिन्हें Bazel, टारगेट को तब पास करेगा, जब उसे
ध्यान दें: Bazel के बाहर टारगेट चलाने पर, आर्ग्युमेंट पास नहीं किए जाते. उदाहरण के लिए, |
env |
स्ट्रिंग की डिक्शनरी; वैल्यू $(location) और "Make variable" के हिसाब से बदलती हैं; डिफ़ॉल्ट वैल्यू
यह एट्रिब्यूट सिर्फ़ नेटिव नियमों पर लागू होता है. जैसे,
ध्यान दें: Bazel के बाहर टारगेट चलाने पर, एनवायरमेंट वैरिएबल सेट नहीं होते. उदाहरण के लिए, |
output_licenses |
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू इस बाइनरी से जनरेट होने वाली आउटपुट फ़ाइलों के लाइसेंस. यह लाइसेंसिंग एपीआई के पुराने वर्शन का हिस्सा है. Bazel अब इसका इस्तेमाल नहीं करता. इसका इस्तेमाल न करें. |
कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट
ज़्यादातर एट्रिब्यूट "कॉन्फ़िगर किए जा सकने वाले" होते हैं. इसका मतलब है कि टारगेट को अलग-अलग तरीकों से बनाने पर, उनकी वैल्यू बदल सकती हैं. खास तौर पर, कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट, Bazel कमांड लाइन को पास किए गए फ़्लैग या टारगेट का अनुरोध करने वाली डाउनस्ट्रीम डिपेंडेंसी के आधार पर अलग-अलग हो सकते हैं. उदाहरण के लिए, इसका इस्तेमाल कई प्लैटफ़ॉर्म या कंपाइलेशन मोड के लिए टारगेट को पसंद के मुताबिक बनाने के लिए किया जा सकता है.
यहां दिए गए उदाहरण में, अलग-अलग टारगेट आर्किटेक्चर के लिए अलग-अलग सोर्स तय किए गए हैं. bazel build :multiplatform_lib --cpu x86
को चलाने पर, x86_impl.cc
का इस्तेमाल करके टारगेट बनाया जाएगा. वहीं, --cpu arm
को बदलने पर, arm_impl.cc
का इस्तेमाल किया जाएगा.
cc_library( name = "multiplatform_lib", srcs = select({ ":x86_mode": ["x86_impl.cc"], ":arm_mode": ["arm_impl.cc"] }) ) config_setting( name = "x86_mode", values = { "cpu": "x86" } ) config_setting( name = "arm_mode", values = { "cpu": "arm" } )
select()
फ़ंक्शन, कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट के लिए अलग-अलग वैकल्पिक वैल्यू में से किसी एक को चुनता है. यह इस आधार पर होता है कि टारगेट का कॉन्फ़िगरेशन, config_setting
या constraint_value
में से किस शर्त को पूरा करता है.
Bazel, कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट का आकलन, मैक्रो को प्रोसेस करने के बाद और नियमों को प्रोसेस करने से पहले करता है. तकनीकी तौर पर, यह
लोडिंग और विश्लेषण के चरणों के बीच होता है.
select()
के आकलन से पहले की गई किसी भी प्रोसेसिंग को यह नहीं पता होता कि select()
कौनसी ब्रांच चुनता है. उदाहरण के लिए, मैक्रो चुनी गई ब्रांच के आधार पर अपने व्यवहार में बदलाव नहीं कर सकतीं. साथ ही, bazel query
किसी टारगेट की कॉन्फ़िगर की जा सकने वाली डिपेंडेंसी के बारे में सिर्फ़ अनुमान लगा सकती है. नियमों और मैक्रो के साथ select()
का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए,
अक्सर पूछे जाने वाले इस सवाल
को देखें.
दस्तावेज़ में nonconfigurable
के तौर पर मार्क किए गए एट्रिब्यूट, इस सुविधा का इस्तेमाल नहीं कर सकते. आम तौर पर, किसी एट्रिब्यूट को कॉन्फ़िगर नहीं किया जा सकता, क्योंकि Bazel को select()
को हल करने का तरीका तय करने से पहले, इसकी वैल्यू के बारे में पता होना चाहिए.
ज़्यादा जानकारी के लिए, कॉन्फ़िगर किए जा सकने वाले बिल्ड एट्रिब्यूट देखें.
इंप्लिसिट आउटपुट टारगेट
C++ में इंप्लिसिट आउटपुट का इस्तेमाल बंद कर दिया गया है. कृपया इसे अन्य भाषाओं में इस्तेमाल न करें. फ़िलहाल, हमारे पास बंद होने वाले वर्शन के लिए कोई पाथ नहीं है. हालांकि, इन्हें भी बंद कर दिया जाएगा.
BUILD फ़ाइल में कोई बिल्ड नियम तय करने का मतलब है कि आपने पैकेज में, नाम वाला नया नियम टारगेट साफ़ तौर पर तय किया है. कई बिल्ड रूल फ़ंक्शन में, एक या उससे ज़्यादा आउटपुट फ़ाइल टारगेट भी इंप्लिसिट होते हैं. इनका कॉन्टेंट और मतलब, नियम के हिसाब से होता है.
उदाहरण के लिए, जब किसी java_binary(name='foo', ...)
नियम को साफ़ तौर पर तय किया जाता है, तब उसी पैकेज के सदस्य के तौर पर आउटपुट फ़ाइल टारगेट foo_deploy.jar
को भी इंप्लिसिट तौर पर तय किया जाता है.
(यह खास टारगेट, एक सेल्फ-कंटेन्ड Java संग्रह है, जो डिप्लॉयमेंट के लिए सही है.)
इंप्लिसिट आउटपुट टारगेट, ग्लोबल टारगेट ग्राफ़ के सबसे अहम सदस्य होते हैं. अन्य टारगेट की तरह, इन्हें भी मांग के आधार पर बनाया जाता है. ऐसा तब होता है, जब इन्हें टॉप-लेवल की बिल्ड कमांड में तय किया जाता है या जब ये अन्य बिल्ड टारगेट के लिए ज़रूरी शर्तें होती हैं. इन्हें BUILD फ़ाइलों में डिपेंडेंसी के तौर पर रेफ़रंस किया जा सकता है. साथ ही, इन्हें bazel query
जैसे विश्लेषण टूल के आउटपुट में देखा जा सकता है.
हर तरह के बिल्ड नियम के लिए, नियम के दस्तावेज़ में एक खास सेक्शन होता है. इसमें, उस तरह के नियम के एलान से जुड़े किसी भी इंप्लिसिट आउटपुट के नाम और कॉन्टेंट के बारे में जानकारी दी जाती है.
बिल्ड सिस्टम में इस्तेमाल किए गए दो नेमस्पेस के बीच एक ज़रूरी, लेकिन कुछ हद तक मामूली अंतर है:
लेबल, टारगेट की पहचान करते हैं. ये नियम या फ़ाइलें हो सकती हैं. फ़ाइल टारगेट को सोर्स (या इनपुट) फ़ाइल टारगेट और डिराइव की गई (या आउटपुट) फ़ाइल टारगेट में बांटा जा सकता है. ये ऐसी चीज़ें हैं जिन्हें BUILD फ़ाइलों में शामिल किया जा सकता है, कमांड-लाइन से बनाया जा सकता है या bazel query
का इस्तेमाल करके देखा जा सकता है. यह टारगेट नेमस्पेस है. हर फ़ाइल टारगेट, डिस्क पर मौजूद किसी एक फ़ाइल ("फ़ाइल सिस्टम नेमस्पेस") से जुड़ा होता है. हर नियम टारगेट, डिस्क पर मौजूद शून्य, एक या उससे ज़्यादा फ़ाइलों से जुड़ा हो सकता है.
डिस्क पर ऐसी फ़ाइलें हो सकती हैं जिनका कोई टारगेट नहीं है. उदाहरण के लिए, C++ कंपाइलेशन के दौरान बनाई गई .o
ऑब्जेक्ट फ़ाइलों को BUILD फ़ाइलों या कमांड लाइन से रेफ़रंस नहीं किया जा सकता.
इस तरह, बिल्ड टूल यह जानकारी छिपा सकता है कि वह अपना काम कैसे करता है. इसके बारे में ज़्यादा जानकारी BUILD कॉन्सेप्ट रेफ़रंस में दी गई है.