नेटिव

नेटिव नियमों और पैकेज के अन्य हेल्पर फ़ंक्शन के लिए, एक बिल्ट-इन मॉड्यूल. इस मॉड्यूल में, सभी नेटिव नियम फ़ंक्शन के तौर पर दिखते हैं. जैसे, 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() को सपोर्ट करता है.

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

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

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

अगर मुमकिन हो, तो इस फ़ंक्शन का इस्तेमाल सिर्फ़ नियम फ़ाइनलाइज़र सिंबॉलिक मैक्रो के लागू करने वाले फ़ंक्शन में करें. इस फ़ंक्शन का इस्तेमाल अन्य संदर्भों में करने का सुझाव नहीं दिया जाता. इसे Bazel के आने वाले वर्शन में बंद कर दिया जाएगा. इससे 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() को सपोर्ट करता है.

अगर मुमकिन हो, तो इस फ़ंक्शन का इस्तेमाल सिर्फ़ नियम फ़ाइनलाइज़र सिंबॉलिक मैक्रो के लागू करने वाले फ़ंक्शन में करें. इस फ़ंक्शन का इस्तेमाल अन्य संदर्भों में करने का सुझाव नहीं दिया जाता. इसे Bazel के आने वाले वर्शन में बंद कर दिया जाएगा. इससे BUILD फ़ाइलें कमज़ोर हो जाती हैं और क्रम पर निर्भर हो जाती हैं.

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 int; डिफ़ॉल्ट वैल्यू है 1
यह फ़्लैग तय करता है कि डायरेक्ट्री को शामिल करना है या नहीं.
allow_empty डिफ़ॉल्ट वैल्यू है unbound
यह फ़्लैग तय करता है कि ग्लोब पैटर्न को किसी भी फ़ाइल से मैच करने की अनुमति देनी है या नहीं. अगर `allow_empty` की वैल्यू 'गलत' है, तो शामिल किए जाने वाले हर पैटर्न का किसी न किसी फ़ाइल से मैच होना ज़रूरी है. साथ ही, फ़ाइनल नतीजे में कम से कम एक फ़ाइल शामिल होनी चाहिए. यह फ़ाइनल नतीजा, `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_default_visibility

List native.package_default_visibility()

यह फ़ंक्शन, आकलन किए जा रहे पैकेज की डिफ़ॉल्ट विज़िबिलिटी दिखाता है. यह package() के default_visibility पैरामीटर की वैल्यू होती है. इसे पैकेज को शामिल करने के लिए बढ़ाया गया है.

package_group

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

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

पैरामीटर

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

package_name

string native.package_name()

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

package_relative_label

Label native.package_relative_label(input)

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

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

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

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

पैरामीटर

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

repo_name

string native.repo_name()

यह, उस डेटाबेस का कैननिकल नाम है जिसमें फ़िलहाल आकलन किया जा रहा पैकेज मौजूद है. इसमें शुरुआती ऐट-साइन शामिल नहीं होते.

repository_name

string native.repository_name()

एक्सपेरिमेंट के तौर पर उपलब्ध. यह एपीआई एक्सपेरिमेंट के तौर पर उपलब्ध है. इसमें कभी भी बदलाव किया जा सकता है. कृपया इसके भरोसे न रहें. इसे एक्सपेरिमेंट के तौर पर चालू किया जा सकता है. इसके लिए, --+incompatible_enable_deprecated_label_apis को सेट करना होगा
अब सेवा में नहीं है. इसके बजाय, repo_name का इस्तेमाल करें. इसमें शुरुआती ऐट-साइन शामिल नहीं होता. हालांकि, यह अन्य मामलों में एक जैसा काम करता है.

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

subpackages

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

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

पैरामीटर

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