नेटिव

नेटिव नियमों और पैकेज के अन्य हेल्पर फ़ंक्शन के साथ काम करने के लिए, पहले से मौजूद मॉड्यूल. सभी नेटिव नियम, इस मॉड्यूल में फ़ंक्शन के तौर पर दिखते हैं, जैसे कि native.cc_library. ध्यान दें कि नेटिव मॉड्यूल सिर्फ़ लोड होने के चरण में उपलब्ध होता है. उदाहरण के लिए, मैक्रो के लिए, नियम लागू करने के दौरान नहीं. एट्रिब्यूट, None वैल्यू को अनदेखा कर देंगे और उन्हें ऐसे मानेंगे जैसे एट्रिब्यूट सेट नहीं किया गया है.
ये फ़ंक्शन भी उपलब्ध हैं:

सदस्य

existing_rule

unknown native.existing_rule(name)

यह एक ऐसा डायक्शनरी जैसा ऑब्जेक्ट दिखाता है जिसे बदला नहीं जा सकता. इसमें इस थ्रेड के पैकेज में इंस्टैंशिएट किए गए नियम के एट्रिब्यूट के बारे में बताया जाता है. अगर उस नाम का कोई नियम इंस्टेंस मौजूद नहीं है, तो None दिखाया जाता है.

यहां, बदलाव न किए जा सकने वाले डिक्शनरी जैसे ऑब्जेक्ट का मतलब है कि डिक्शनरी जैसे दोहराव, len(x), name in x, x[name], x.get(name), x.items(), x.keys(), और x.values() का इस्तेमाल करने वाला, पूरी तरह से बदलाव न किया जा सकने वाला ऑब्जेक्ट x.

अगर --noincompatible_existing_rules_immutable_view फ़्लैग सेट है, तो यह उसी कॉन्टेंट के साथ एक नया, बदलाव किया जा सकने वाला डिक्शनरी फ़ंक्शन दिखाता है.

नतीजे में हर एट्रिब्यूट के लिए एक एंट्री होती है. हालांकि, इसमें निजी एट्रिब्यूट (जिनके नाम अक्षर से शुरू नहीं होते) और कुछ ऐसे लेगसी एट्रिब्यूट टाइप शामिल नहीं होते जिन्हें दिखाया नहीं जा सकता. साथ ही, इस डिक्शनरी में नियम के इंस्टेंस के name और kind (उदाहरण के लिए, 'cc_binary') के लिए एंट्री शामिल हैं.

नतीजे की वैल्यू, एट्रिब्यूट की वैल्यू इस तरह दिखाती हैं:

  • str, int, और bool टाइप एट्रिब्यूट की विशेषताएं ऐसे दिखाई गई हैं.
  • उसी पैकेज में मौजूद टारगेट के लिए लेबल को ':foo' फ़ॉर्म वाली स्ट्रिंग में या किसी दूसरे पैकेज के टारगेट के लिए '//pkg:name' फ़ॉर्मैट में बदला जाता है.
  • सूचियों को ट्यूपल के तौर पर दिखाया जाता है और डिक्शनरी को नए और बदलाव किए जा सकने वाले डिक्शनरी में बदल दिया जाता है. इन्हें एक ही तरीके से बार-बार बदला जाता है.
  • select वैल्यू, ऊपर बताए गए तरीके से बदले गए कॉन्टेंट के साथ दिखाए जाते हैं.
  • जिन एट्रिब्यूट के लिए नियम लागू करने के दौरान कोई वैल्यू नहीं दी गई थी और जिनकी डिफ़ॉल्ट वैल्यू का हिसाब लगाया गया है उन्हें नतीजे से बाहर रखा जाता है. (विश्लेषण के चरण से पहले, कैलकुलेट की गई डिफ़ॉल्ट वैल्यू को कैलकुलेट नहीं किया जा सकता.).

अगर हो सके, तो इस फ़ंक्शन का इस्तेमाल न करें. इससे BUILD फ़ाइलें अस्थिर और क्रम पर निर्भर हो जाती हैं. साथ ही, ध्यान रखें कि यह नियम के दो अन्य कन्वर्ज़न एट्रिब्यूट की वैल्यू से काफ़ी अलग है. वैल्यू के अंदरूनी फ़ॉर्मैट से Starlark भी अलग है: एक का इस्तेमाल डिफ़ॉल्ट तौर पर कंप्यूट किया गया होता है और दूसरा ctx.attr.foo.

पैरामीटर

पैरामीटर ब्यौरा
name ज़रूरी है
टारगेट का नाम.

existing_rules

unknown native.existing_rules()

इस थ्रेड के पैकेज में अब तक इंस्टैंशिएट किए गए नियमों के बारे में बताने वाला ऐसा ऑब्जेक्ट देता है जिसे बदला नहीं जा सकता. लिखवाने जैसे ऑब्जेक्ट की हर एंट्री, नियम के इंस्टेंस के नाम को उस नतीजे के साथ मैप करती है जो existing_rule(name) के बाद मिलता है.

यहां, लिखने के तरीके जैसे ऑब्जेक्ट का मतलब है, बहुत ज़्यादा बदलाव न किए जा सकने वाले ऑब्जेक्ट x का मतलब है कि बार-बार बदलाव नहीं किया जा सकता, len(x), name in x, x[name], x.get(name), x.items(), x.keys(), और x.values().

अगर --noincompatible_existing_rules_immutable_view फ़्लैग सेट किया गया है, तो यह दिखाने के बजाय, उसी कॉन्टेंट वाला नया बदला जा सकने वाला डिक्शनरी दिखाता है.

ध्यान दें: अगर हो सके, तो इस फ़ंक्शन का इस्तेमाल करने से बचें. इससे BUILD फ़ाइलें खराब होती हैं और ऑर्डर पर निर्भर होती हैं. इसके अलावा, अगर --noincompatible_existing_rules_immutable_view फ़्लैग सेट है, तो यह फ़ंक्शन बहुत महंगा हो सकता है. खास तौर पर, अगर इसे किसी लूप में कॉल किया जाता है.

exports_files

None native.exports_files(srcs, visibility=None, licenses=None)

इस पैकेज से जुड़ी उन फ़ाइलों की सूची दिखाती है जिन्हें दूसरे पैकेज में एक्सपोर्ट किया गया है.

पैरामीटर

पैरामीटर ब्यौरा
srcs sequence of strings; ज़रूरी है
एक्सपोर्ट की जाने वाली फ़ाइलों की सूची.
visibility sequence; or None; default = None
विज्ञापन दिखने की जानकारी दी जा सकती है. फ़ाइलें, तय किए गए टारगेट को दिखेंगी. अगर कोई 'किसको दिखे' सेटिंग तय नहीं की गई है, तो फ़ाइलें हर पैकेज को दिखेंगी.
licenses sequence of strings; or None; डिफ़ॉल्ट = कोई नहीं
लाइसेंस की जानकारी देनी होगी.

glob

sequence native.glob(include=[], exclude=[], exclude_directories=1, allow_empty=unbound)

Glob मौजूदा पैकेज में, हर फ़ाइल की ऐसी नई, बदली जा सकने वाली, क्रम से लगाई गई सूची दिखाता है जो:
  • include में कम से कम एक पैटर्न से मेल खाता है.
  • exclude (डिफ़ॉल्ट []) में मौजूद किसी भी पैटर्न से मेल नहीं खाता.
अगर exclude_directories आर्ग्युमेंट को चालू किया गया (1 पर सेट किया गया) है, तो डायरेक्ट्री टाइप वाली फ़ाइलें, नतीजों से हटा दी जाएंगी (डिफ़ॉल्ट 1).

पैरामीटर

पैरामीटर ब्यौरा
include sequence of strings; default = []
शामिल किए जाने वाले ग्लोब पैटर्न की सूची.
exclude sequence of strings; डिफ़ॉल्ट = []
शामिल नहीं किए जाने वाले ग्लोब पैटर्न की सूची.
exclude_directories डिफ़ॉल्ट = 1
यह फ़्लैग तय करता है कि डायरेक्ट्री को शामिल करना है या नहीं.
allow_empty डिफ़ॉल्ट = अनबाउंड
क्या हम ग्लोब पैटर्न को किसी भी चीज़ से मैच करने की अनुमति न दें. अगर `allow_खाली` 'गलत' है, तो हर एक इनक्लूड पैटर्न को कुछ हद तक मैच करना चाहिए. साथ ही, फ़ाइनल नतीजा भी खाली नहीं होना चाहिए (`एक्सक्लूज़न` पैटर्न से मेल खाने वाले पैटर्न को बाहर रखने के बाद).

package_group

None native.package_group(name, packages=[], includes=[])

यह फ़ंक्शन, पैकेज के सेट के बारे में बताता है और ग्रुप को एक लेबल असाइन करता है. इस लेबल का रेफ़रंस visibility एट्रिब्यूट में दिया जा सकता है.

पैरामीटर

पैरामीटर ब्यौरा
name ज़रूरी है
इस नियम के लिए यूनीक नाम.
packages sequence of strings; डिफ़ॉल्ट = []
इस ग्रुप में पैकेज की पूरी सूची.
includes sequence of strings; डिफ़ॉल्ट = []
इस ग्रुप में शामिल अन्य पैकेज ग्रुप.

package_name

string native.package_name()

जिस पैकेज का आकलन किया जा रहा है उसका नाम. उदाहरण के लिए, बिल्ड फ़ाइल some/package/BUILD में इसकी वैल्यू some/package होगी. अगर BUILD फ़ाइल, .bzl फ़ाइल में तय किए गए किसी फ़ंक्शन को कॉल करती है, तो package_name(), कॉल करने वाले BUILD फ़ाइल पैकेज से मैच करेगा. यह फ़ंक्शन, काम नहीं करने वाले वैरिएबल PACKAGE_NAME के बराबर है.

package_relative_label

Label native.package_relative_label(input)

अभी शुरू किए जा रहे पैकेज (यानी, BUILD फ़ाइल, जिसके लिए मौजूदा मैक्रो चलाया जा रहा है) के संदर्भ में, इनपुट स्ट्रिंग को किसी लेबल ऑब्जेक्ट में बदलता है. अगर इनपुट पहले से ही Label है, तो इसमें कोई बदलाव नहीं किया जाता.

इस फ़ंक्शन को सिर्फ़ बिल्ड फ़ाइल का मूल्यांकन करते समय कॉल किया जा सकता है और मैक्रो को सीधे तौर पर या किसी अन्य तरीके से कॉल किया जा सकता है; हो सकता है कि उसे (उदाहरण के लिए) नियम लागू करने वाले फ़ंक्शन में कॉल न किया जाए.

इस फ़ंक्शन का नतीजा वही Label वैल्यू होती है जो BUILD फ़ाइल में बताए गए टारगेट के लेबल-वैल्यू वाले एट्रिब्यूट में दी गई स्ट्रिंग को पास करने पर मिलती है.

इस्तेमाल से जुड़ी जानकारी: इस फ़ंक्शन और Label() के बीच का अंतर यह है कि Label(), .bzl फ़ाइल के पैकेज के कॉन्टेक्स्ट का इस्तेमाल करता है, न कि BUILD फ़ाइल के पैकेज का. जब आपको किसी ऐसे तय टारगेट के बारे में बताने की ज़रूरत हो जिसे मैक्रो में हार्डकोड किया गया हो, जैसे कि कंपाइलर, तो Label() का इस्तेमाल करें. जब आपको BUILD फ़ाइल से मिली लेबल स्ट्रिंग को Label ऑब्जेक्ट के लिए नॉर्मलाइज़ करना हो, तब package_relative_label() का इस्तेमाल करें. (BUILD फ़ाइल या कॉलिंग .bzl फ़ाइल के अलावा किसी दूसरे पैकेज के लिए स्ट्रिंग को Label में बदलने का कोई तरीका नहीं है. इसलिए, बाहरी मैक्रो को हमेशा लेबल स्ट्रिंग के बजाय, लेबल ऑब्जेक्ट को अंदरूनी मैक्रो में पास करना चाहिए.)

पैरामीटर

पैरामीटर ब्यौरा
input string; or Label; ज़रूरी है
इनपुट लेबल स्ट्रिंग या लेबल ऑब्जेक्ट. अगर कोई लेबल ऑब्जेक्ट पास किया जाता है, तो उसे वैसे ही दिखाया जाता है.

repository_name

string native.repository_name()

नियम या बिल्ड एक्सटेंशन को इकट्ठा करने की रिपॉज़िटरी का नाम. उदाहरण के लिए, जिन पैकेज को वर्कस्पेस छंद local_repository(name='local', path=...) में दिया गया है उनमें @local को सेट किया जाएगा. डेटा स्टोर करने की मुख्य जगह के पैकेज में, यह @ पर सेट होगा. यह फ़ंक्शन, काम नहीं करने वाले वैरिएबल REPOSITORY_NAME के बराबर है.

सबपैकेज

sequence native.subpackages(include, exclude=[], allow_empty=False)

यह फ़ंक्शन, मौजूदा पैकेज के हर डायरेक्ट सब-पैकेज की नई सूची दिखाता है. इस सूची में बदलाव किया जा सकता है. फ़ाइल-सिस्टम डायरेक्ट्री की गहराई का इस पर कोई असर नहीं पड़ता. लौटाए गए पैकेज की सूची क्रम से लगाई जाती है. इसमें मौजूदा पैकेज से मिलते-जुलते सबपैकेज के नाम होते हैं. हमारा सुझाव है कि इस फ़ंक्शन को सीधे कॉल करने के बजाय, bazz_skylib.subpackages मॉड्यूल में दिए गए तरीकों का इस्तेमाल करें.

पैरामीटर

पैरामीटर ब्यौरा
include sequence of strings; ज़रूरी है
सब-पैकेज स्कैन में शामिल करने के लिए, ग्लोब पैटर्न की सूची.
exclude sequence of strings; default = []
सब-पैकेज के स्कैन से बाहर रखने के लिए, ग्लोब पैटर्न की सूची.
allow_empty default = False
अगर कॉल से खाली सूची मिलती है, तो क्या हमें गड़बड़ी का मैसेज दिखेगा. डिफ़ॉल्ट रूप से, खाली सूची से पता चलता है कि BUILD फ़ाइल में संभावित गड़बड़ी है. इसमें subpackages() को कॉल करना ज़रूरी नहीं है. सही पर सेट करने से यह फ़ंक्शन उस मामले में सफल होता है.