नेटिव

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

सदस्य

existing_rule

unknown native.existing_rule(name)

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

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

अगर --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()

यह फ़ंक्शन, dict-like ऑब्जेक्ट दिखाता है. इसमें इस थ्रेड के पैकेज में अब तक इंस्टैंटिएट किए गए नियमों के बारे में जानकारी होती है. इस ऑब्जेक्ट में बदलाव नहीं किया जा सकता. डिक्शनरी जैसे ऑब्जेक्ट की हर एंट्री, नियम के इंस्टेंस के नाम को उस नतीजे पर मैप करती है जो 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 स्ट्रिंग का क्रम; ज़रूरी है
एक्सपोर्ट की जाने वाली फ़ाइलों की सूची.
visibility sequence; या None; डिफ़ॉल्ट वैल्यू None
है विज़िबिलिटी का एलान किया जा सकता है. फ़ाइलें, तय किए गए टारगेट को दिखेंगी. अगर फ़ाइलों को दिखाने की सेटिंग नहीं दी गई है, तो वे हर पैकेज में दिखेंगी.
licenses स्ट्रिंग का क्रम; या None; डिफ़ॉल्ट वैल्यू None
है लाइसेंस तय किए जाने हैं.

glob

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

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

पैरामीटर

पैरामीटर ब्यौरा
include स्ट्रिंग का क्रम; डिफ़ॉल्ट वैल्यू []
है शामिल किए जाने वाले ग्लोब पैटर्न की सूची.
exclude स्ट्रिंग का क्रम; डिफ़ॉल्ट वैल्यू []
है ग्लोब पैटर्न की वह सूची जिसे शामिल नहीं करना है.
exclude_directories डिफ़ॉल्ट वैल्यू 1
है यह फ़्लैग बताता है कि डायरेक्ट्री को बाहर रखना है या नहीं.
allow_empty डिफ़ॉल्ट वैल्यू unbound
है क्या हम ग्लोब पैटर्न को किसी भी चीज़ से मैच करने की अनुमति देते हैं. अगर `allow_empty` की वैल्यू False है, तो शामिल किए जाने वाले हर पैटर्न का किसी न किसी पैटर्न से मेल खाना ज़रूरी है. साथ ही, `exclude` पैटर्न से मेल खाने वाले पैटर्न को हटाने के बाद, फ़ाइनल नतीजे का खाली न होना भी ज़रूरी है.

module_name

string native.module_name()

उस Bazel मॉड्यूल का नाम जिससे यह पैकेज जुड़ा है. अगर यह पैकेज MODULE.bazel के बजाय WORKSPACE में तय किए गए किसी रेपो से है, तो यह खाली होता है. मॉड्यूल एक्सटेंशन से जनरेट की गई रिपॉज़िटरी के लिए, यह एक्सटेंशन को होस्ट करने वाले मॉड्यूल का नाम होता है. यह module_ctx.modules में दिखने वाले module.name फ़ील्ड जैसा ही होता है. None को वापस किया जा सकता है.

module_version

string native.module_version()

यह Bazel मॉड्यूल का वह वर्शन है जिससे यह पैकेज जुड़ा हुआ है. अगर यह पैकेज MODULE.bazel के बजाय WORKSPACE में तय किए गए किसी रेपो से है, तो यह खाली होता है. मॉड्यूल एक्सटेंशन से जनरेट किए गए रेपो के लिए, यह एक्सटेंशन को होस्ट करने वाले मॉड्यूल का वर्शन है. यह module_ctx.modules में दिखने वाले module.version फ़ील्ड जैसा ही होता है. None को वापस किया जा सकता है.

package_group

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

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

पैरामीटर

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

package_name

string native.package_name()

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

package_relative_label

Label native.package_relative_label(input)

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

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

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

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

पैरामीटर

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

repository_name

string native.repository_name()

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

सब-पैकेज

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

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

पैरामीटर

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