नेटिव

समस्या की शिकायत करें सोर्स देखें

नेटिव नियमों और दूसरे पैकेज हेल्पर फ़ंक्शन के साथ काम करने के लिए बिल्ट-इन मॉड्यूल. सभी नेटिव नियम, इस मॉड्यूल में फ़ंक्शन के तौर पर दिखते हैं, जैसे कि 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 वैल्यू, ऊपर बताए गए कॉन्टेंट के हिसाब से बदली जाती हैं.
  • ऐसे एट्रिब्यूट जिनके लिए, नियम बनाने के दौरान कोई वैल्यू नहीं दी गई थी और जिनकी डिफ़ॉल्ट वैल्यू कैलकुलेट की गई है उन्हें नतीजे से बाहर रखा गया है. (विश्लेषण के चरण से पहले, कैलकुलेट की गई डिफ़ॉल्ट वैल्यू को कैलकुलेट नहीं किया जा सकता.).

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

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

exports_files

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

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

पैरामीटर

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

ग्लोब

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

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

पैरामीटर

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

module_name

string native.module_name()

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

module_version

string native.module_version()

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

package_group

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

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

पैरामीटर

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

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 वैल्यू मिलती है, जो दी गई स्ट्रिंग को बिल्ड फ़ाइल में तय किए गए टारगेट के लेबल की वैल्यू वाले एट्रिब्यूट को पास करने पर मिलती है.

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

पैरामीटर

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

repository_name

string native.repository_name()

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

सबपैकेज

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

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

पैरामीटर

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