सामग्री
पैकेज
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में मौजूद glob एक्सप्रेशन**/*.ccमें,x/y/z.ccशामिल नहीं है. ऐसा तब होता है, जबx/y,x/y/BUILDके तौर पर या पैकेज-पाथ पर कहीं और पैकेज के तौर पर मौजूद हो. इसका मतलब है कि glob एक्सप्रेशन का नतीजा, BUILD फ़ाइलों के मौजूद होने पर निर्भर करता है. इसका मतलब है कि अगरx/yनाम का कोई पैकेज मौजूद नहीं है या उसे --deleted_packages फ़्लैग का इस्तेमाल करके, मिटा दिया गया है, तो वही glob एक्सप्रेशनx/y/z.ccको शामिल करेगा. - ऊपर दी गई पाबंदी, सभी glob एक्सप्रेशन पर लागू होती है. भले ही, उनमें किसी भी वाइल्डकार्ड का इस्तेमाल किया गया हो.
-
जिस फ़ाइल का नाम
.से शुरू होता है वह छिपी हुई होती है. यह फ़ाइल,**और*, दोनों वाइल्डकार्ड से पूरी तरह मेल खाती है. अगर आपको किसी छिपी हुई फ़ाइल से मेल खाना है तो आपका पैटर्न.से शुरू होना चाहिए. उदाहरण के लिए,*और.*.txt,.foo.txtसे मेल खाएंगे, लेकिन*.txtमेल नहीं खाएगा. छिपी हुई डायरेक्ट्री भी इसी तरह से मेल खाती हैं. छिपी हुई डायरेक्ट्री में ऐसी फ़ाइलें शामिल हो सकती हैं जिनकी ज़रूरत इनपुट के तौर पर नहीं होती. इससे, बिना वजह glob की गई फ़ाइलों की संख्या और मेमोरी की खपत बढ़ सकती है. छिपी हुई डायरेक्ट्री को बाहर रखने के लिए, उन्हें "exclude" सूची वाले तर्क में जोड़ें. -
"**" वाइल्डकार्ड का एक कॉर्नर केस है: पैटर्न
"**", पैकेज के डायरेक्ट्री पाथ से मेल नहीं खाता. इसका मतलब है किglob(["**"], exclude_directories = False), मौजूदा पैकेज की डायरेक्ट्री के तहत आने वाली सभी फ़ाइलों और डायरेक्ट्री से ट्रांज़िटिव तौर पर मेल खाता है. हालांकि, यह सबपैकेज की डायरेक्ट्री में नहीं जाता. इसके बारे में पिछली टिप्पणी देखें.
आम तौर पर, 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()की तरह एक हेल्पर फ़ंक्शन है. यह फ़ाइलों और डायरेक्ट्री के बजाय, सबपैकेज की सूची दिखाता है. यहglob()के जैसे ही पाथ पैटर्न का इस्तेमाल करता है. साथ ही, यह मौजूदा समय में लोड हो रही BUILD फ़ाइल के सीधे तौर पर डिसेंडेंट वाले किसी भी सबपैकेज से मेल खा सकता है. शामिल करने और बाहर रखने के पैटर्न के बारे में ज़्यादा जानकारी और उदाहरण के लिए, 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' मॉड्यूल का इस्तेमाल करना चाहिए .