सामग्री
package
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
यह फ़ंक्शन, पैकेज के हर नियम पर लागू होने वाले मेटाडेटा के बारे में बताता है. इसका इस्तेमाल, किसी पैकेज (BUILD फ़ाइल) में ज़्यादा से ज़्यादा एक बार किया जा सकता है.
अगर आपको पूरे
डेटाबेस के हर नियम पर लागू होने वाले मेटाडेटा के बारे में बताना है, तो अपने डेटाबेस के रूट में मौजूद
REPO.bazel फ़ाइल में repo() फ़ंक्शन का इस्तेमाल करें.
repo() फ़ंक्शन, package() के जैसे ही आर्ग्युमेंट स्वीकार करता है.
package() फ़ंक्शन को फ़ाइल में सबसे ऊपर मौजूद सभी load() स्टेटमेंट के ठीक बाद और किसी भी नियम से पहले कॉल किया जाना चाहिए.
तर्क
| एट्रिब्यूट | ब्यौरा |
|---|---|
default_applicable_licenses |
|
default_visibility |
लेबल की सूची; डिफ़ॉल्ट रूप से इस पैकेज में, टॉप-लेवल के नियम टारगेट और सिंबॉलिक
मैक्रो की डिफ़ॉल्ट विज़िबिलिटी. इसका मतलब है कि ऐसे टारगेट और सिंबॉलिक मैक्रो
जो खुद किसी सिंबॉलिक मैक्रो में तय नहीं किए गए हैं. अगर टारगेट या मैक्रो में वैल्यू तय की गई है, तो इस एट्रिब्यूट
को अनदेखा कर दिया जाता है इस एट्रिब्यूट के सिंटैक्स के बारे में ज़्यादा जानकारी के लिए, दस्तावेज़ देखें visibility. पैकेज की डिफ़ॉल्ट विज़िबिलिटी, exports_files पर लागू नहीं होती. यह डिफ़ॉल्ट रूप से सार्वजनिक होती है. |
default_deprecation |
स्ट्रिंग; डिफ़ॉल्ट रूप से इस पैकेज के सभी नियमों के लिए, डिफ़ॉल्ट
|
default_package_metadata |
लेबल की सूची; डिफ़ॉल्ट रूप से मेटाडेटा टारगेट की डिफ़ॉल्ट सूची सेट करता है. यह सूची, पैकेज के अन्य सभी टारगेट पर लागू होती है. आम तौर पर, ये टारगेट ओएसएस पैकेज और लाइसेंस के एलान से जुड़े होते हैं. उदाहरण के लिए, rules_license देखें. |
default_testonly |
बूलियन; डिफ़ॉल्ट रूप से इस पैकेज के सभी नियमों के लिए, डिफ़ॉल्ट
|
features |
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से अलग-अलग फ़्लैग सेट करता है. इनका असर, इस BUILD फ़ाइल के सिमैंटिक पर पड़ता है. इस सुविधा का इस्तेमाल मुख्य रूप से, बिल्ड सिस्टम पर काम करने वाले लोग उन पैकेज को टैग करने के लिए करते हैं जिन्हें किसी खास तरीके से हैंडल करने की ज़रूरत होती है. इसका इस्तेमाल तब तक न करें, जब तक बिल्ड सिस्टम पर काम करने वाला कोई व्यक्ति आपसे साफ़ तौर पर ऐसा करने के लिए न कहे. |
उदाहरण
नीचे दिए गए एलान से पता चलता है कि इस पैकेज में मौजूद नियम, सिर्फ़//foo:target पैकेज ग्रुप के सदस्यों को दिखते हैं. अगर किसी नियम के लिए, विज़िबिलिटी के एलान मौजूद हैं, तो वे इस स्पेसिफ़िकेशन को बदल देते हैं.
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
यह फ़ंक्शन, पैकेज का सेट तय करता है और सेट के साथ एक लेबल जोड़ता है. लेबल को visibility एट्रिब्यूट में रेफ़र किया जा सकता है.
पैकेज ग्रुप का इस्तेमाल मुख्य रूप से, विज़िबिलिटी को कंट्रोल करने के लिए किया जाता है. सार्वजनिक तौर पर दिखने वाले टारगेट को, सोर्स ट्री में मौजूद हर पैकेज से रेफ़र किया जा सकता है. निजी तौर पर दिखने वाले टारगेट को, सिर्फ़ उसके पैकेज (सबपैकेज नहीं) में रेफ़र किया जा सकता है. इन दोनों के बीच, कोई टारगेट अपने पैकेज के साथ-साथ, एक या उससे ज़्यादा पैकेज ग्रुप में बताए गए किसी भी पैकेज को ऐक्सेस करने की अनुमति दे सकता है. विज़िबिलिटी सिस्टम के बारे में ज़्यादा जानकारी के लिए, विज़िबिलिटी एट्रिब्यूट देखें.
किसी पैकेज को ग्रुप में तब माना जाता है, जब वह packages एट्रिब्यूट से मेल खाता हो या includes एट्रिब्यूट में बताए गए किसी अन्य पैकेज ग्रुप में पहले से शामिल हो.
पैकेज ग्रुप, तकनीकी तौर पर टारगेट होते हैं. हालांकि, इन्हें नियमों से नहीं बनाया जाता. साथ ही, इनमें विज़िबिलिटी से जुड़ी कोई सुरक्षा नहीं होती.
तर्क
| एट्रिब्यूट | ब्यौरा |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
packages |
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से शून्य या उससे ज़्यादा पैकेज स्पेसिफ़िकेशन की सूची. हर पैकेज स्पेसिफ़िकेशन स्ट्रिंग का फ़ॉर्मैट इनमें से कोई एक हो सकता है: फ़ॉर्मैट:
इसके अलावा, पहले दो तरह के पैकेज स्पेसिफ़िकेशन के पहले
पैकेज ग्रुप में ऐसा कोई भी पैकेज शामिल होता है जो उसके कम से कम एक पॉज़िटिव स्पेसिफ़िकेशन से मेल खाता हो और उसके किसी भी नेगेटिव स्पेसिफ़िकेशन से मेल न खाता हो. उदाहरण के लिए, सार्वजनिक विज़िबिलिटी के अलावा, मौजूदा डेटाबेस से बाहर के पैकेज को सीधे तौर पर तय करने का कोई तरीका नहीं है. अगर यह एट्रिब्यूट मौजूद नहीं है, तो इसका मतलब है कि इसे खाली सूची पर सेट किया गया है. इसका मतलब यह भी है कि इसे सिर्फ़ ध्यान दें: Bazel 6.0 से पहले, ध्यान दें: Bazel 6.0 से पहले, जब इस एट्रिब्यूट को
|
includes |
लेबल की सूची; डिफ़ॉल्ट रूप से अन्य पैकेज ग्रुप जो इसमें शामिल हैं. इस एट्रिब्यूट में मौजूद लेबल, अन्य पैकेज ग्रुप को रेफ़र करने चाहिए.
रेफ़रंस वाले पैकेज ग्रुप में मौजूद पैकेज को, इस
पैकेज ग्रुप का हिस्सा माना जाता है. यह ट्रांज़िटिव है. इसका मतलब है कि अगर पैकेज ग्रुप
नेगेटिव पैकेज स्पेसिफ़िकेशन के साथ इस्तेमाल करने पर, ध्यान दें कि हर ग्रुप के लिए पैकेज का सेट, पहले अलग-अलग तरीके से कंप्यूट किया जाता है. इसके बाद, नतीजों को एक साथ जोड़ा जाता है. इसका मतलब है कि एक ग्रुप में मौजूद नेगेटिव स्पेसिफ़िकेशन का असर, दूसरे ग्रुप में मौजूद स्पेसिफ़िकेशन पर नहीं पड़ता. |
उदाहरण
package_group के नीचे दिए गए एलान में, "tropical" नाम का एक पैकेज ग्रुप तय किया गया है. इसमें ट्रॉपिकल फल शामिल हैं.
package_group(
name = "tropical",
packages = [
"//fruits/mango",
"//fruits/orange",
"//fruits/papaya/...",
],
)
नीचे दिए गए एलान में, किसी काल्पनिक ऐप्लिकेशन के पैकेज ग्रुप तय किए गए हैं:
package_group(
name = "fooapp",
includes = [
":controller",
":model",
":view",
],
)
package_group(
name = "model",
packages = ["//fooapp/database"],
)
package_group(
name = "view",
packages = [
"//fooapp/swingui",
"//fooapp/webui",
],
)
package_group(
name = "controller",
packages = ["//fooapp/algorithm"],
)
exports_files
exports_files([label, ...], visibility, licenses)
exports_files() , इस पैकेज से जुड़ी उन फ़ाइलों की सूची तय करता है जिन्हें अन्य पैकेज में एक्सपोर्ट किया जाता है.
किसी पैकेज की BUILD फ़ाइल, सोर्स फ़ाइलों को सीधे तौर पर सिर्फ़ तब रेफ़र कर सकती है, जब उन्हें
किसी दूसरे पैकेज से संबंधित होने पर
exports_files() स्टेटमेंट के साथ साफ़ तौर पर एक्सपोर्ट किया गया हो. फ़ाइलों की विज़िबिलिटी के बारे में ज़्यादा जानें.
पुराने तरीके के मुताबिक, किसी नियम के इनपुट के तौर पर बताई गई फ़ाइलों को भी डिफ़ॉल्ट विज़िबिलिटी के साथ एक्सपोर्ट किया जाता है.
ऐसा तब तक होता है, जब तक फ़्लैग
--incompatible_no_implicit_file_export
फ़्लिप नहीं किया जाता. हालांकि, इस तरीके पर भरोसा नहीं करना चाहिए और इससे धीरे-धीरे
माइग्रेट करना चाहिए.
तर्क
आर्ग्युमेंट, मौजूदा पैकेज में मौजूद फ़ाइलों के नामों की सूची होती है. विज़िबिलिटी का एलान भी तय किया जा सकता है. इस मामले में, फ़ाइलें तय किए गए टारगेट को दिखेंगी. अगर कोई विज़िबिलिटी तय नहीं की जाती है, तो फ़ाइलें
हर पैकेज को दिखेंगी. भले ही, पैकेज की डिफ़ॉल्ट विज़िबिलिटी
package
फ़ंक्शन में तय की गई हो. लाइसेंस भी तय किए जा सकते हैं.
उदाहरण
नीचे दिए गए उदाहरण में, golden.txt को test_data पैकेज की टेक्स्ट फ़ाइल के तौर पर एक्सपोर्ट किया गया है, ताकि अन्य पैकेज इसका इस्तेमाल कर सकें. उदाहरण के लिए, टेस्ट के data एट्रिब्यूट में.
# from //test_data/BUILD exports_files(["golden.txt"])
glob
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob एक हेल्पर फ़ंक्शन है. यह पाथ के कुछ पैटर्न से मेल खाने वाली सभी फ़ाइलें ढूंढता है. साथ ही, उनके पाथ की नई, बदली जा सकने वाली, क्रम से लगाई गई सूची दिखाता है. Glob सिर्फ़ अपने पैकेज में फ़ाइलें खोजता है. साथ ही, यह सिर्फ़ सोर्स फ़ाइलें ढूंढता है. यह जनरेट की गई फ़ाइलें या अन्य टारगेट नहीं ढूंढता.
अगर फ़ाइल का पैकेज के हिसाब से पाथ, include के किसी भी पैटर्न से मेल खाता है और exclude के किसी भी पैटर्न से मेल नहीं खाता है, तो सोर्स फ़ाइल का लेबल, नतीजे में शामिल किया जाता है.
include और exclude सूचियों में, मौजूदा पैकेज के हिसाब से पाथ के पैटर्न शामिल होते हैं. हर पैटर्न में, पाथ के एक या उससे ज़्यादा सेगमेंट हो सकते हैं. Unix पाथ की तरह, इन सेगमेंट को / से अलग किया जाता है. पैटर्न में मौजूद सेगमेंट, पाथ के सेगमेंट से मैच किए जाते हैं. सेगमेंट में * वाइल्डकार्ड शामिल हो सकता है. यह वाइल्डकार्ड, पाथ सेगमेंट में मौजूद किसी भी सबस्ट्रिंग (खाली सबस्ट्रिंग भी) से मैच करता है. हालांकि, यह डायरेक्ट्री सेपरेटर / से मैच नहीं करता. इस वाइल्डकार्ड का इस्तेमाल, पाथ के एक सेगमेंट में कई बार किया जा सकता है. इसके अलावा, ** वाइल्डकार्ड, पाथ के शून्य या उससे ज़्यादा सेगमेंट से मैच कर सकता है. हालांकि, इसे पाथ के अलग सेगमेंट के तौर पर तय किया जाना चाहिए.
foo/bar.txt, इस पैकेज में मौजूदfoo/bar.txtफ़ाइल से पूरी तरह मैच करता है. हालांकि, ऐसा तब होता है, जबfoo/कोई सबपैकेज न होfoo/*.txt,foo/डायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब फ़ाइल.txtसे खत्म होती हो औरfoo/कोई सबपैकेज न होfoo/a*.htm*,foo/डायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब फ़ाइलaसे शुरू होती हो, उसमें कोई भी स्ट्रिंग (खाली भी हो सकती है) हो, उसके बाद.htmहो, और वह किसी अन्य स्ट्रिंग से खत्म होती हो. ऐसा तब होता है, जबfoo/कोई सबपैकेज न हो. उदाहरण के लिए,foo/axx.htmऔरfoo/a.htmlयाfoo/axxx.htmlfoo/*,foo/डायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जबfoo/कोई सबपैकेज न हो. यहfooडायरेक्ट्री से मैच नहीं करता. भले ही,exclude_directoriesको 0 पर सेट किया गया होfoo/**, पैकेज की पहली लेवल की सबडायरेक्ट्रीfoo/के तहत आने वाली हर नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता है. अगरexclude_directoriesको 0 पर सेट किया गया है, तोfooडायरेक्ट्री भी पैटर्न से मैच करती है. इस मामले में,**को पाथ के शून्य सेगमेंट से मैच करने वाला माना जाता है**/a.txt, इस पैकेज की डायरेक्ट्री के साथ-साथ, नॉन-सबपैकेज सबडायरेक्ट्री में मौजूदa.txtफ़ाइलों से मैच करता है.**/bar/**/*.txtइस पैकेज की हर नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद हर.txtफ़ाइल से मैच करता है. हालांकि, ऐसा तब होता है, जब नतीजे के तौर पर मिलने वाले पाथ पर कम से कम एक डायरेक्ट्री का नामbarहो. उदाहरण के लिए,xxx/bar/yyy/zzz/a.txtयाbar/a.txt(ध्यान रखें कि**शून्य सेगमेंट से भी मैच करता है) याbar/zzz/a.txt**, इस पैकेज की हर नॉन-सबपैकेज सबडायरेक्ट्री में मौजूद हर फ़ाइल से मैच करता हैfoo**/a.txt, अमान्य पैटर्न है. ऐसा इसलिए, क्योंकि**को एक सेगमेंट के तौर पर अलग से तय किया जाना चाहिएfoo/, अमान्य पैटर्न है. ऐसा इसलिए, क्योंकि/के बाद तय किया गया दूसरा सेगमेंट, खाली स्ट्रिंग है
अगर exclude_directories आर्ग्युमेंट चालू है (इसे 1 पर सेट किया गया है), तो नतीजों में डायरेक्ट्री टाइप की फ़ाइलें शामिल नहीं की जाएंगी. डिफ़ॉल्ट रूप से, यह 1 पर सेट होता है.
अगर allow_empty आर्ग्युमेंट को False पर सेट किया गया है, तो glob फ़ंक्शन गड़बड़ी दिखाएगा. ऐसा तब होगा, जब नतीजे के तौर पर खाली सूची मिलेगी.
इसकी कुछ अहम सीमाएं और चेतावनियां हैं:
-
glob(), BUILD फ़ाइल के आकलन के दौरान चलता है. इसलिए,glob()सिर्फ़ आपके सोर्स ट्री में मौजूद फ़ाइलों से मैच करता है. यह जनरेट की गई फ़ाइलों से कभी मैच नहीं करता. अगर आपको ऐसा टारगेट बनाना है जिसके लिए सोर्स और जनरेट की गई, दोनों तरह की फ़ाइलों की ज़रूरत है, तो आपको glob में जनरेट की गई फ़ाइलों की साफ़ तौर पर सूची जोड़नी होगी. नीचे दिया गया उदाहरण देखें. इसमें:mylibऔर:gen_java_srcsका इस्तेमाल किया गया है. -
अगर किसी नियम का नाम, मैच की गई सोर्स फ़ाइल के नाम जैसा है, तो नियम, फ़ाइल को "शेडो" करेगा.
इसे समझने के लिए, ध्यान रखें कि
glob()पाथ की सूची दिखाता है. इसलिए, अन्य नियमों के एट्रिब्यूट मेंglob()का इस्तेमाल करने पर (उदाहरण के लिए,srcs = glob(["*.cc"])) , मैच किए गए पाथ को साफ़ तौर पर लिस्ट करने जैसा ही असर होता है. उदाहरण के लिए, अगरglob(),["Foo.java", "bar/Baz.java"]दिखाता है, लेकिन पैकेज में "Foo.java" नाम का एक नियम भी है (हालांकि, Bazel इसके बारे में चेतावनी देता है), तोglob()का इस्तेमाल करने वाला व्यक्ति, "Foo.java" फ़ाइल के बजाय "Foo.java" नियम (इसके आउटपुट) का इस्तेमाल करेगा. ज़्यादा जानकारी के लिए, GitHub पर समस्या #10395 देखें. - Glob, सबडायरेक्ट्री में मौजूद फ़ाइलों से मैच कर सकता है. साथ ही, सबडायरेक्ट्री के नामों में वाइल्डकार्ड का इस्तेमाल किया जा सकता है. हालांकि...
-
लेबल को पैकेज की सीमा से बाहर इस्तेमाल नहीं किया जा सकता. साथ ही, glob, सबपैकेज में मौजूद फ़ाइलों से मैच नहीं करता.
उदाहरण के लिए, अगर
x/y,x/y/BUILDके तौर पर या पैकेज-पाथ पर कहीं और पैकेज के तौर पर मौजूद है, तो पैकेजxमें**/*.ccglob एक्सप्रेशन मेंx/y/z.ccशामिल नहीं है. इसका मतलब है कि glob एक्सप्रेशन का नतीजा, BUILD फ़ाइलों के मौजूद होने पर निर्भर करता है. यानी, अगरx/yनाम का कोई पैकेज मौजूद नहीं है या उसे --deleted_packages फ़्लैग का इस्तेमाल करके, मिटाया गया है, तो वही glob एक्सप्रेशनx/y/z.ccको शामिल करेगा. - ऊपर दी गई पाबंदी, सभी glob एक्सप्रेशन पर लागू होती है. भले ही, उनमें किसी भी वाइल्डकार्ड का इस्तेमाल किया गया हो.
-
जिस फ़ाइल का नाम
.से शुरू होता है उसे**और*, दोनों वाइल्डकार्ड से पूरी तरह मैच किया जा सकता है. अगर आपको किसी छिपी हुई फ़ाइल को किसी कंपोज़िट पैटर्न से मैच करना है, तो आपका पैटर्न.से शुरू होना चाहिए. उदाहरण के लिए,*और.*.txt,.foo.txtसे मैच करेंगे, लेकिन*.txtमैच नहीं करेगा. छिपी हुई डायरेक्ट्री भी इसी तरह मैच की जाती हैं. छिपी हुई डायरेक्ट्री में ऐसी फ़ाइलें शामिल हो सकती हैं जिनकी इनपुट के तौर पर ज़रूरत नहीं होती. इससे, बिना वजह glob की गई फ़ाइलों की संख्या और मेमोरी की खपत बढ़ सकती है. छिपी हुई डायरेक्ट्री को बाहर रखने के लिए, उन्हें "exclude" लिस्ट आर्ग्युमेंट में जोड़ें. -
"**" वाइल्डकार्ड का एक कॉर्नर केस है: पैटर्न
"**"पैकेज के डायरेक्ट्री पाथ से मैच नहीं करता. इसका मतलब है किglob(["**"], exclude_directories = 0), मौजूदा पैकेज की डायरेक्ट्री के तहत आने वाली सभी फ़ाइलों और डायरेक्ट्री से ट्रांज़िटिव तरीके से मैच करता है. हालांकि, यह सबपैकेज की डायरेक्ट्री में नहीं जाता. इसके बारे में पिछली टिप्पणी देखें.
आम तौर पर, glob पैटर्न के लिए, सिर्फ़ '*' का इस्तेमाल करने के बजाय, सही एक्सटेंशन (उदाहरण के लिए, *.html) देने की कोशिश करनी चाहिए. साफ़ तौर पर नाम देने से, यह खुद ही दस्तावेज़ बन जाता है. साथ ही, इससे यह पक्का होता है कि आपने गलती से बैकअप फ़ाइलों या emacs/vi/... की अपने-आप सेव होने वाली फ़ाइलों को मैच नहीं किया है.
बिल्ड के नियम लिखते समय, glob के एलिमेंट की गिनती की जा सकती है. इससे, हर इनपुट के लिए अलग-अलग नियम जनरेट किए जा सकते हैं. उदाहरण के लिए, नीचे, glob के बड़े किए गए उदाहरण वाला सेक्शन देखें.
Glob के उदाहरण
इस डायरेक्ट्री में मौजूद सभी Java फ़ाइलों और :gen_java_srcs नियम से जनरेट की गई सभी फ़ाइलों से, Java लाइब्रेरी बनाएं.
java_library(
name = "mylib",
srcs = glob(["*.java"]) + [":gen_java_srcs"],
deps = "...",
)
genrule(
name = "gen_java_srcs",
outs = [
"Foo.java",
"Bar.java",
],
...
)
testdata डायरेक्ट्री में मौजूद सभी txt फ़ाइलें शामिल करें. हालांकि, इसमें experimental.txt शामिल नहीं की जाएगी. ध्यान दें कि testdata की सबडायरेक्ट्री में मौजूद फ़ाइलें शामिल नहीं की जाएंगी. अगर आपको उन फ़ाइलों को शामिल करना है, तो रिकर्सिव glob (**) का इस्तेमाल करें.
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(
["testdata/*.txt"],
exclude = ["testdata/experimental.txt"],
),
)
रिकर्सिव Glob के उदाहरण
टेस्ट को testdata डायरेक्ट्री और उसकी किसी भी सबडायरेक्ट्री (और उनकी सबडायरेक्ट्री वगैरह) में मौजूद सभी txt फ़ाइलों पर निर्भर बनाएं. जिन सबडायरेक्ट्री में BUILD फ़ाइल मौजूद है उन्हें अनदेखा किया जाता है. (ऊपर दी गई सीमाएं और चेतावनियां देखें.)
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(["testdata/**/*.txt"]),
)
इस डायरेक्ट्री और सभी सबडायरेक्ट्री में मौजूद सभी Java फ़ाइलों से एक लाइब्रेरी बनाएं. हालांकि, इसमें ऐसी सबडायरेक्ट्री शामिल नहीं की जाएंगी जिनके पाथ में testing नाम की डायरेक्ट्री शामिल है. अगर हो सके, तो इस पैटर्न का इस्तेमाल नहीं करना चाहिए. इससे बिल्ड की इंक्रीमेंटैलिटी कम हो सकती है. इसलिए, बिल्ड में लगने वाला समय बढ़ सकता है.
java_library(
name = "mylib",
srcs = glob(
["**/*.java"],
exclude = ["**/testing/**"],
),
)
Glob के बड़े किए गए उदाहरण
मौजूदा डायरेक्ट्री में मौजूद *_test.cc के लिए, अलग-अलग genrule बनाएं. इससे फ़ाइल में मौजूद लाइनों की संख्या गिनी जाएगी.
# Conveniently, the build language supports list comprehensions.
[genrule(
name = "count_lines_" + f[:-3], # strip ".cc"
srcs = [f],
outs = ["%s-linecount.txt" % f[:-3]],
cmd = "wc -l $< >$@",
) for f in glob(["*_test.cc"])]
अगर ऊपर दी गई BUILD फ़ाइल, //foo पैकेज में है और पैकेज में तीन मैचिंग फ़ाइलें, a_test.cc, b_test.cc, और c_test.cc मौजूद हैं, तो bazel query '//foo:all' चलाने पर, जनरेट किए गए सभी नियम दिखेंगे:
$ bazel query '//foo:all' | sort //foo:count_lines_a_test //foo:count_lines_b_test //foo:count_lines_c_test
select
select(
{conditionA: valuesA, conditionB: valuesB, ...},
no_match_error = "custom message"
)
select() एक हेल्पर फ़ंक्शन है. इसकी मदद से, किसी नियम के एट्रिब्यूट
को कॉन्फ़िगर किया जा सकता है.
यह
लगभग
किसी भी एट्रिब्यूट असाइनमेंट के दाईं ओर मौजूद वैल्यू को बदल सकता है. इसलिए, इसकी वैल्यू, कमांड-लाइन Bazel फ़्लैग पर निर्भर करती है.
उदाहरण के लिए, इसका इस्तेमाल प्लैटफ़ॉर्म के हिसाब से डिपेंडेंसी तय करने या किसी नियम को "डेवलपर" मोड के मुकाबले "रिलीज़" मोड में बनाने पर, अलग-अलग संसाधन एम्बेड करने के लिए किया जा सकता है.
इसका बुनियादी इस्तेमाल इस तरह किया जाता है:
sh_binary(
name = "mytarget",
srcs = select({
":conditionA": ["mytarget_a.sh"],
":conditionB": ["mytarget_b.sh"],
"//conditions:default": ["mytarget_default.sh"]
})
)
इससे, srcs एट्रिब्यूट को sh_binary कॉन्फ़िगर किया जा सकता है. इसके लिए, सामान्य लेबल की सूची के असाइनमेंट को select कॉल से बदलें. यह कॉल, कॉन्फ़िगरेशन की शर्तों को मैचिंग वैल्यू पर मैप करती है. हर शर्त,
config_setting या
constraint_value का लेबल
रेफ़रंस होती है. यह तब "मैच" होती है, जब टारगेट का कॉन्फ़िगरेशन, वैल्यू के अनुमानित सेट से
मैच करता है. इसके बाद, mytarget#srcs की वैल्यू, मौजूदा कॉल से मैच करने वाला कोई भी लेबल बन जाती है.
ध्यान दें:
- किसी भी कॉल पर, सिर्फ़ एक शर्त चुनी जाती है.
- अगर एक से ज़्यादा शर्तें मैच करती हैं और उनमें से एक, अन्य शर्तों का स्पेशलाइज़ेशन है, स्पेशलाइज़ेशन को प्राथमिकता दी जाती है. शर्त B को शर्त A का स्पेशलाइज़ेशन तब माना जाता है, जब B में वे सभी फ़्लैग और कंस्ट्रेंट वैल्यू मौजूद हों जो A में हैं. साथ ही, इसमें कुछ अतिरिक्त फ़्लैग या कंस्ट्रेंट वैल्यू भी मौजूद हों. इसका मतलब यह भी है कि स्पेशलाइज़ेशन रिज़ॉल्यूशन को ऑर्डरिंग बनाने के लिए डिज़ाइन नहीं किया गया है. इसके बारे में, नीचे दिए गए दूसरे उदाहरण में बताया गया है.
- अगर एक से ज़्यादा शर्तें मैच करती हैं और उनमें से एक, अन्य सभी शर्तों का स्पेशलाइज़ेशन नहीं है, तो Bazel गड़बड़ी दिखाता है. हालांकि, ऐसा तब नहीं होता, जब सभी शर्तों की वैल्यू एक जैसी हो.
- अगर कोई अन्य शर्त मैच नहीं करती है, तो
//conditions:defaultके खास स्यूडो-लेबल को मैच करने वाला माना जाता है. अगर इस शर्त को छोड़ दिया जाता है, तो गड़बड़ी से बचने के लिए, किसी अन्य नियम को मैच करना होगा. selectको किसी बड़े एट्रिब्यूट असाइनमेंट के अंदर एम्बेड किया जा सकता है. इसलिए,srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})औरsrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})मान्य एक्सप्रेशन हैं.select, ज़्यादातर एट्रिब्यूट के साथ काम करता है. हालांकि, यह सभी एट्रिब्यूट के साथ काम नहीं करता. असंगत एट्रिब्यूट को उनके दस्तावेज़ मेंnonconfigurableके तौर पर मार्क किया जाता है.subpackages
subpackages(include, exclude=[], allow_empty=True)
subpackages(),glob()की तरह एक हेल्पर फ़ंक्शन है. यह फ़ाइलों और डायरेक्ट्री के बजाय, सबपैकेज की सूची दिखाता है. यह पाथ के पैटर्न का इस्तेमाल करता है. साथ ही, यह मौजूदा समय में लोड हो रही BUILD फ़ाइल के सीधे तौर पर डिसेंडेंट वाले किसी भी सबपैकेज से मैच कर सकता है.glob()शामिल करने और बाहर रखने के पैटर्न के बारे में ज़्यादा जानकारी और उदाहरण के लिए, glob देखें.नतीजे के तौर पर मिलने वाली सबपैकेज की सूची, क्रम से लगाई जाती है. इसमें मौजूदा समय में लोड हो रहे पैकेज के हिसाब से पाथ शामिल होते हैं. ये पाथ,
includeमें दिए गए पैटर्न से मैच करते हैं. हालांकि, येexcludeमें दिए गए पैटर्न से मैच नहीं करते.उदाहरण
नीचे दिए गए उदाहरण में,
foo/BUILDपैकेज के सभी डायरेक्ट सबपैकेज की सूची दिखाई गई है# The following BUILD files exist: # foo/BUILD # foo/bar/baz/BUILD # foo/bar/but/bad/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs1 = subpackages(include = ["**"]) # results in subs1 == ["sub", "bar/baz", "bar/but/bad"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo' subs2 = subpackages(include = ["bar/*"]) # results in subs2 = ["bar/baz"] # # Since 'bar' is not a subpackage itself, this looks for any subpackages under # all first level subdirectories of 'bar'. subs3 = subpackages(include = ["bar/**"]) # results in subs3 = ["bar/baz", "bar/but/bad"] # # Since bar is not a subpackage itself, this looks for any subpackages which are # (1) under all subdirectories of 'bar' which can be at any level, (2) not a # subpackage of another subpackages. subs4 = subpackages(include = ["sub"]) subs5 = subpackages(include = ["sub/*"]) subs6 = subpackages(include = ["sub/**"]) # results in subs4 and subs6 being ["sub"] # results in subs5 = []. # # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a # subpackage of 'foo'). # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since # 'foo/sub' is already a subpackage itself, the subdirectories will not be # traversed anymore. # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it # is returned. But the subdirectories of 'foo/sub' will not be traversed # anymore.
आम तौर पर, यह बेहतर है कि उपयोगकर्ता इस फ़ंक्शन को सीधे तौर पर कॉल करने के बजाय कि उपयोगकर्ता skylib के 'subpackages' मॉड्यूल का इस्तेमाल करें .