सामान्य नियम

नियम

उपनाम

alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)

alias नियम की मदद से एक और नाम बनाया जा सकता है, जिसे दूसरे नियम के तौर पर इस्तेमाल किया जा सकता है.

एलियासिंग सिर्फ़ "सामान्य" टारगेट के लिए काम करती है. खास तौर पर, package_group और test_suite को उपनाम नहीं दिया जा सकता.

उपनाम नियम की अपनी खुद की 'किसे दिखे' घोषणा होती है. अन्य सभी मामलों में, यह इसके बताए गए नियम की तरह काम करता है (उदाहरण के लिए, उपनाम पर सिर्फ़ टेस्ट करने की सुविधा को अनदेखा किया जाता है; इसकी जगह, बताए गए नियम की सिर्फ़ टेस्ट-ओनलीनेस का इस्तेमाल किया जाता है) कुछ छोटे अपवादों के साथ:

  • अगर कमांड लाइन पर उनके उपनाम का ज़िक्र होता है, तो जांच नहीं की जाती हैं. रेफ़र किए गए टेस्ट को चलाने वाला उपनाम तय करने के लिए, उसके tests एट्रिब्यूट में एक टारगेट वाले test_suite नियम का इस्तेमाल करें.
  • एनवायरमेंट ग्रुप तय करते समय, environment नियमों के लिए उपनाम काम नहीं करते. ये --target_environment कमांड लाइन विकल्प में भी काम नहीं करते.

उदाहरण

filegroup(
    name = "data",
    srcs = ["data.txt"],
)

alias(
    name = "other",
    actual = ":data",
)

तर्क

एट्रिब्यूट
name

Name; required

इस टारगेट के लिए यूनीक नाम.

actual

Label; required

वह टारगेट जिसके बारे में इस उपनाम से बताया गया है. ज़रूरी नहीं है कि यह कोई नियम हो, यह कोई इनपुट फ़ाइल भी हो सकती है.

config_setting

config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)

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

उदाहरण

नीचे दिया गया, उस बिल्ड से मैच करता है जो --compilation_mode=opt या -c opt को सेट करता है (या तो कमांड लाइन पर या साफ़ तौर पर .bazelrc फ़ाइलों से):

  config_setting(
      name = "simple",
      values = {"compilation_mode": "opt"}
  )
  

नीचे दिया गया तरीका, ARM को टारगेट करने वाले किसी भी बिल्ड से मैच करता है और कस्टम परिभाषित FOO=bar (जैसे, bazel build --cpu=arm --define FOO=bar ...) को लागू करता है:

  config_setting(
      name = "two_conditions",
      values = {
          "cpu": "arm",
          "define": "FOO=bar"
      }
  )
  

नीचे दिया गया तरीका, उपयोगकर्ता के तय किए गए फ़्लैग --//custom_flags:foo=1 को सेट करने वाले किसी भी बिल्ड से मिलता-जुलता है (या तो साफ़ तौर पर कमांड लाइन पर या .bazelrc फ़ाइलों से किसी और तरीके से):

  config_setting(
      name = "my_custom_flag_is_set",
      flag_values = { "//custom_flags:foo": "1" },
  )
  

नीचे दिया गया तरीका, x86_64 आर्किटेक्चर और glibc के वर्शन 2.25 वाले प्लैटफ़ॉर्म को टारगेट करने वाले किसी भी बिल्ड से मैच करता है. हालांकि, यह मानते हुए कि //example:glibc_2_25 लेबल वाला constraint_value मौजूद है. ध्यान रखें कि कोई प्लैटफ़ॉर्म तब भी मैच करता है, जब वह अतिरिक्त कंस्ट्रेंट वैल्यू के बारे में बताता है.

  config_setting(
      name = "64bit_glibc_2_25",
      constraint_values = [
          "@platforms//cpu:x86_64",
          "//example:glibc_2_25",
      ]
  )
  
इन सभी मामलों में, बिल्ड के अंदर कॉन्फ़िगरेशन बदला जा सकता है. उदाहरण के लिए, अगर किसी टारगेट को अपने डीप से अलग किसी दूसरे प्लैटफ़ॉर्म के लिए बनाने की ज़रूरत हो. इसका मतलब यह है कि config_setting, टॉप-लेवल के कमांड लाइन फ़्लैग से मैच न होने पर भी, कुछ बिल्ड टारगेट से मैच हो सकता है.

ज़रूरी जानकारी

  • यह देखने के लिए चुनें देखें कि जब एक से ज़्यादा config_setting, कॉन्फ़िगरेशन की मौजूदा स्थिति से मैच करते हैं, तो क्या होता है.
  • शॉर्टहैंड फ़ॉर्म (जैसे, --compilation_mode बनाम -c) के साथ काम करने वाले फ़्लैग के लिए, values परिभाषाओं में फ़ुल फ़ॉर्म का इस्तेमाल किया जाना चाहिए. इनमें से किसी भी फ़ॉर्म का इस्तेमाल करके, बातचीत शुरू करने वाली भाषाओं का अपने-आप मिलान हो जाता है.
  • अगर किसी फ़्लैग में एक से ज़्यादा वैल्यू (जैसे, --copt=-Da --copt=-Db या सूची वाला टाइप स्टारलार्क फ़्लैग) होती हैं, तो values = { "flag": "a" } तब मैच करता है, जब असल सूची में किसी भी जगह मौजूद हो."a"

    values = { "myflag": "a,b" } इसी तरह काम करता है: यह --myflag=a --myflag=b, --myflag=a --myflag=b --myflag=c, --myflag=a,b, और --myflag=c,b,a से मेल खाता है. हर फ़्लैग के लिए सटीक सिमैंटिक अलग-अलग होते हैं. उदाहरण के लिए, --copt एक ही इंस्टेंस में एक से ज़्यादा वैल्यू के साथ काम नहीं करता: --copt=a,b ["a,b"] जनरेट करता है, जबकि --copt=a --copt=b से ["a", "b"] जनरेट होता है (इसलिए, values = { "copt": "a,b" } पुरानी वैल्यू से मैच करता है, लेकिन बाद वाली वैल्यू से नहीं). हालांकि, --ios_multi_cpus (Apple के नियमों के लिए) -ios_multi_cpus=a,b और ios_multi_cpus=a --ios_multi_cpus=b , दोनों ["a", "b"] बनाते है. फ़्लैग की परिभाषाएं जांचें और अपनी शर्तों की सावधानी से जांच करें, ताकि आपको सही उम्मीद हो.

  • अगर आपको ऐसी शर्तें तय करनी हैं जिन्हें पहले से मौजूद बिल्ड फ़्लैग से मॉडल नहीं किया गया है, तो Starlark के तय किए गए फ़्लैग इस्तेमाल करें. आपके पास --define का इस्तेमाल करने का भी विकल्प है. हालांकि, इससे कम सहायता मिलती है. इसलिए, हम ऐसा करने का सुझाव नहीं देते हैं. ज़्यादा चर्चा के लिए, यहां जाएं.
  • अलग-अलग पैकेज में एक जैसी config_setting परिभाषाओं को दोहराने से बचें. इसके बजाय, कैननिकल पैकेज में बताए गए एक सामान्य config_setting का रेफ़रंस दें.
  • values, define_values, और constraint_values को एक ही config_setting में किसी भी कॉम्बिनेशन में इस्तेमाल किया जा सकता है. हालांकि, किसी भी config_setting के लिए कम से कम एक को सेट करना ज़रूरी है.

तर्क

एट्रिब्यूट
name

Name; required

इस टारगेट के लिए यूनीक नाम.

constraint_values

List of labels; optional; nonconfigurable

constraint_values का कम से कम सेट जिसे टारगेट प्लैटफ़ॉर्म को तय करना ज़रूरी है, ताकि उसका मिलान इस config_setting से हो सके. (इसके लिए, प्रोसेस करने के प्लैटफ़ॉर्म को यहां शामिल नहीं किया जाता.) ऐसी किसी भी अतिरिक्त कंस्ट्रेंट वैल्यू को अनदेखा कर दिया जाता है जिसे प्लैटफ़ॉर्म ने अनदेखा कर दिया हो. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन करने लायक बिल्ड एट्रिब्यूट देखें.

ऐसे मामले में जहां दो config_setting, एक ही select में मेल खाते हैं, इस एट्रिब्यूट का इस्तेमाल यह तय करने के लिए नहीं किया जाता है कि config_setting में से एक एक की विशेषज्ञता है या नहीं. दूसरे शब्दों में, एक config_setting किसी प्लैटफ़ॉर्म को दूसरे प्लैटफ़ॉर्म से बेहतर तरीके से मैच नहीं कर सकता.

define_values

Dictionary: String -> String; optional; nonconfigurable

values के जैसा ही है, लेकिन खास तौर पर --define फ़्लैग के लिए है.

--define खास है, क्योंकि इसके सिंटैक्स (--define KEY=VAL) का मतलब है कि KEY=VAL, Bazel फ़्लैग के नज़रिए से एक वैल्यू है.

इसका मतलब है:

            config_setting(
                name = "a_and_b",
                values = {
                    "define": "a=1",
                    "define": "b=2",
                })
          

काम नहीं करता है क्योंकि एक ही कुंजी (define) शब्दकोश में दो बार दिखाई देती है. इस एट्रिब्यूट से वह समस्या हल हो जाती है:

            config_setting(
                name = "a_and_b",
                define_values = {
                    "a": "1",
                    "b": "2",
                })
          

bazel build //foo --define a=1 --define b=2 से सही तरीके से मेल खाता है.

--define अब भी सामान्य फ़्लैग सिंटैक्स के साथ values में दिख सकता है. इसे इस एट्रिब्यूट के साथ तब तक आसानी से मिलाया जा सकता है, जब तक शब्दकोश की कुंजियां अलग-अलग रहती हैं.

flag_values

Dictionary: label -> String; optional; nonconfigurable

values के जैसा है लेकिन उपयोगकर्ता के तय किए गए बिल्ड फ़्लैग के लिए.

यह एक अलग एट्रिब्यूट है, क्योंकि उपयोगकर्ता के तय किए गए फ़्लैग को लेबल के तौर पर रेफ़र किया जाता है, जबकि पहले से मौजूद फ़्लैग को आर्बिट्रेरी स्ट्रिंग के तौर पर रेफ़र किया जाता है.

values

Dictionary: String -> String; optional; nonconfigurable

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

यह नियम, कॉन्फ़िगर किए गए टारगेट के कॉन्फ़िगरेशन को इनहेरिट करता है, जिससे यह नियम select स्टेटमेंट में दिखता है. इसे Bazel शुरू करने वाले का नाम "मैच" माना जाता है, अगर डिक्शनरी में हर एंट्री के लिए, इसका कॉन्फ़िगरेशन एंट्री की अनुमानित वैल्यू से मेल खाता हो. उदाहरण के लिए, टारगेट के लिए कॉन्फ़िगर किए गए नियमों पर, values = {"compilation_mode": "opt"}, शुरू करने वाले bazel build --compilation_mode=opt ... और bazel build -c opt ... से मैच करता है.

सुविधा के लिए, कॉन्फ़िगरेशन वैल्यू को बिल्ड फ़्लैग के तौर पर दिखाया जाता है (पिछले "--" के बिना). हालांकि, ध्यान रखें कि दोनों एक जैसे नहीं हैं. ऐसा इसलिए, क्योंकि टारगेट को एक ही बिल्ड में कई कॉन्फ़िगरेशन में बनाया जा सकता है. उदाहरण के लिए, होस्ट कॉन्फ़िगरेशन का "सीपीयू", --host_cpu की वैल्यू से मैच होता है, न कि --cpu की. इसलिए, एक ही config_setting के अलग-अलग इंस्टेंस, एक ही बातचीत को शुरू करने वाली प्रक्रिया का अलग-अलग तरीके से मिलान कर सकते हैं. यह इस बात पर निर्भर करता है कि उनका इस्तेमाल करने वाले नियम के कॉन्फ़िगरेशन हैं या नहीं.

अगर कमांड लाइन पर, साफ़ तौर पर फ़्लैग सेट नहीं किया गया है, तो उसकी डिफ़ॉल्ट वैल्यू का इस्तेमाल किया जाता है. अगर शब्दकोश में कोई कुंजी कई बार दिखती है, तो सिर्फ़ आखिरी इंस्टेंस का इस्तेमाल किया जाता है. अगर कोई कुंजी किसी ऐसे फ़्लैग का रेफ़रंस देती है जिसे कमांड लाइन पर कई बार सेट किया जा सकता है (जैसे, bazel build --copt=foo --copt=bar --copt=baz ...), तो मैच तब होता है, जब उनमें से कोई भी सेटिंग मेल खाती हो.

फ़ाइलग्रुप

filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)

टारगेट के कलेक्शन को एक आसान नाम देने के लिए, filegroup का इस्तेमाल करें. इसके बाद, इनकी जानकारी दूसरे नियमों से ली जा सकती है.

सीधे डायरेक्ट्री बताने के बजाय, filegroup का इस्तेमाल करने की सलाह दी जाती है. बाद वाली गड़बड़ी ठीक नहीं होती, क्योंकि बिल्ड सिस्टम के पास डायरेक्ट्री में मौजूद सभी फ़ाइलों की पूरी जानकारी नहीं होती. इसलिए, हो सकता है कि इन फ़ाइलों में बदलाव होने पर, वह फिर से न बने. ग्लोब के साथ इस्तेमाल करने पर, filegroup यह पक्का कर सकता है कि सभी फ़ाइलें साफ़ तौर पर बिल्ड सिस्टम को पता हों.

उदाहरण

दो सोर्स फ़ाइलों वाला filegroup बनाने के लिए, यह करें

filegroup(
    name = "mygroup",
    srcs = [
        "a_file.txt",
        "some/subdirectory/another_file.txt",
    ],
)

इसके अलावा, टेस्टडेटा डायरेक्ट्री को इकट्ठा करने के लिए, glob का इस्तेमाल करें:

filegroup(
    name = "exported_testdata",
    srcs = glob([
        "testdata/*.dat",
        "testdata/logs/**/*.log",
    ]),
)

इन परिभाषाओं का इस्तेमाल करने के लिए, filegroup में किसी भी नियम के लेबल के साथ रेफ़रंस दें:

cc_library(
    name = "my_library",
    srcs = ["foo.cc"],
    data = [
        "//my_package:exported_testdata",
        "//my_package:mygroup",
    ],
)

तर्क

एट्रिब्यूट
name

Name; required

इस टारगेट के लिए यूनीक नाम.

srcs

List of labels; optional

टारगेट की वह सूची जो फ़ाइल ग्रुप के सदस्य हैं.

आम तौर पर, srcs एट्रिब्यूट की वैल्यू के लिए ग्लोब एक्सप्रेशन के नतीजे का इस्तेमाल किया जाता है.

data

List of labels; optional

रनटाइम के दौरान, इस नियम के लिए ज़रूरी फ़ाइलों की सूची.

data एट्रिब्यूट में दिए गए टारगेट को इस filegroup नियम के runfiles में जोड़ दिया जाएगा. जब किसी दूसरे नियम के data एट्रिब्यूट में filegroup का रेफ़रंस दिया जाता है, तो उसके runfiles को, निर्भर करने वाले नियम के runfiles में जोड़ दिया जाएगा. डेटा फ़ाइलों पर निर्भरता और उन्हें इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, डेटा डिपेंडेंसी सेक्शन और data का सामान्य दस्तावेज़ देखें.

output_group

String; optional

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

"आउटपुट ग्रुप", किसी टारगेट के आउटपुट आर्टफ़ैक्ट की कैटगरी होती है. इसकी जानकारी, उस नियम को लागू करने के तरीके में दी गई होती है.

Genquery

genquery(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)

genquery(), ब्लेज़ क्वेरी भाषा में तय की गई क्वेरी चलाता है और नतीजे को एक फ़ाइल में डाल देता है.

बिल्ड को एक जैसा बनाए रखने के लिए, क्वेरी की अनुमति सिर्फ़ scope एट्रिब्यूट में बताए गए टारगेट के पूरी तरह से बंद होने वाले पेज पर जाने की अनुमति है. अगर strict सही नहीं है या strict सही नहीं है, तो इस नियम का उल्लंघन करने वाली क्वेरी को लागू नहीं किया जा सकेगा (अगर strict गलत है, तो दायरे से बाहर के टारगेट को स्किप कर दिया जाएगा). ऐसा न हो, यह पक्का करने का सबसे आसान तरीका यह है कि दायरे में उन लेबल के बारे में बताएं जो क्वेरी एक्सप्रेशन में हैं.

यहां और कमांड लाइन के लिए, इस्तेमाल की जा सकने वाली क्वेरी के बीच अंतर सिर्फ़ यह है कि यहां वाइल्डकार्ड टारगेट से जुड़ी जानकारी (जैसे, //pkg:* या //pkg:all) वाली क्वेरी की अनुमति नहीं है. इसकी वजहें दो-फ़ोल्ड हैं: पहला, क्योंकि genquery को एक स्कोप तय करना होता है, ताकि क्वेरी के ट्रांज़िटिव क्लोज़र से बाहर के टारगेट को रोका जा सके, ताकि इसके आउटपुट पर असर पड़ सके. दूसरा, क्योंकि BUILD फ़ाइलें, वाइल्डकार्ड डिपेंडेंसी के साथ काम नहीं करतीं (जैसे, deps=["//a/..."] की अनुमति नहीं है).

डिटर्मिनिस्टिक आउटपुट को लागू करने के लिए, genquery के आउटपुट को --order_output=full का इस्तेमाल करके ऑर्डर किया जाता है.

आउटपुट फ़ाइल का नाम, नियम का नाम होता है.

उदाहरण

यह उदाहरण, किसी फ़ाइल के लिए तय किए गए टारगेट के ट्रांज़िटिव क्लोज़ में लेबल की सूची लिखता है.

genquery(
    name = "kiwi-deps",
    expression = "deps(//kiwi:kiwi_lib)",
    scope = ["//kiwi:kiwi_lib"],
)

तर्क

एट्रिब्यूट
name

Name; required

इस टारगेट के लिए यूनीक नाम.

expression

String; required

निष्पादित की जाने वाली क्वेरी. BUILD फ़ाइलों में कमांड लाइन और दूसरी जगहों से उलट, यहां दिए गए लेबल को फ़ाइल फ़ोल्डर की रूट डायरेक्ट्री के हिसाब से रिज़ॉल्व किया जाता है. उदाहरण के लिए, a/BUILD फ़ाइल में इस एट्रिब्यूट का :b लेबल, टारगेट //:b को रेफ़र करेगा.
opts

List of strings; optional

क्वेरी इंजन को भेजे गए विकल्प. ये कमांड लाइन के उन विकल्पों के मुताबिक होते हैं जिन्हें bazel query को भेजा जा सकता है. यहां क्वेरी के कुछ विकल्पों की अनुमति नहीं है: --keep_going, --query_file, --universe_scope, --order_results, और --order_output. जो विकल्प यहां नहीं बताए गए हैं उनकी डिफ़ॉल्ट वैल्यू, bazel query कमांड लाइन की तरह ही लागू होंगी.
scope

null; required

क्वेरी का स्कोप. क्वेरी को इन टारगेट के ट्रांज़िटिव बंद होने के अलावा किसी और टारगेट को छूने की अनुमति नहीं है.
strict

Boolean; optional; default is True

सही होने पर, जिन टारगेट की क्वेरी अपने स्कोप के बंद होने से बच जाती हैं वे नहीं बनेंगे. अगर यह गलत है, तो Bazel एक चेतावनी प्रिंट करेगा. साथ ही, बाकी क्वेरी को पूरा करते हुए, उस क्वेरी पाथ को छोड़ देगा जो क्वेरी पाथ के दायरे से बाहर है.

जेनरूल

genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)

genrule, उपयोगकर्ता के तय किए गए बैश कमांड का इस्तेमाल करके, एक या उससे ज़्यादा फ़ाइलें जनरेट करता है.

जेन रूल, सामान्य बिल्ड नियम होते हैं. इनका इस्तेमाल तब किया जा सकता है, जब टास्क के लिए कोई खास नियम न हो. उदाहरण के लिए, बैश वन-लाइनर चलाया जा सकता है. अगर आपको C++ फ़ाइलें कंपाइल करनी हैं, तो cc_* के मौजूदा नियमों का पालन करें. इसकी वजह यह है कि आपने सभी मुश्किल काम पहले ही कर लिए हैं.

टेस्ट चलाने के लिए जेनरूल का इस्तेमाल न करें. जांच और जांच के नतीजों के लिए खास शर्तें होती हैं. इनमें कैश मेमोरी में सेव करने की नीतियां और एनवायरमेंट वैरिएबल भी शामिल हैं. आम तौर पर, टेस्ट, बिल्ड पूरा होने के बाद और टारगेट आर्किटेक्चर पर किए जाते हैं. जबकि, जनरेटर, बिल्ड और होस्ट आर्किटेक्चर के दौरान चलाए जाते हैं (दोनों अलग-अलग हो सकते हैं). अगर आपको अलग-अलग कामों के लिए इस्तेमाल किए जाने वाले टेस्टिंग नियम की ज़रूरत है, तो sh_test का इस्तेमाल करें.

क्रॉस-कंपाइलेशन ध्यान देने वाली बातें

क्रॉस-कंप्यूलेशन के बारे में ज़्यादा जानकारी के लिए, इस्तेमाल के लिए गाइड देखें.

जनरेट होने के दौरान, जनरेट किए गए जेनरूल काम करते हैं. हालांकि, उनके आउटपुट का इस्तेमाल आम तौर पर बिल्ड के बाद, डिप्लॉयमेंट या टेस्टिंग के लिए किया जाता है. माइक्रोकंट्रोलर के लिए C कोड को कंपाइल करने का उदाहरण देखें: कंपाइलर, C सोर्स फ़ाइलों को स्वीकार करता है और माइक्रोकंट्रोलर पर चलने वाला कोड जनरेट करता है. जनरेट किया गया कोड उस सीपीयू पर नहीं चल सकता जिसका इस्तेमाल इसे बनाने के लिए किया गया था. हालांकि, सी कंपाइलर (अगर सोर्स से कंपाइल किया गया हो) खुद ही ऐसा कर सकता है.

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

जनरेटिव सिस्टम के लिए, बिल्ड सिस्टम यह पक्का करता है कि डिपेंडेंसी सही तरीके से बनाई गई हो: टारगेट कॉन्फ़िगरेशन के लिए srcs बनाए गए हों (अगर ज़रूरी हो), tools, होस्ट कॉन्फ़िगरेशन के लिए बनाए गए हों, और आउटपुट टारगेट कॉन्फ़िगरेशन के लिए बनाया गया हो. इससे "Make" वैरिएबल भी मिलते हैं, जिन्हें जनरेट करने वाले निर्देश, उनसे जुड़े टूल को पास कर सकते हैं.

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

खास मामले

होस्ट-होस्ट को कंपाइल करना: कुछ मामलों में, बिल्ड सिस्टम को जनरेट करने के नियम इस तरह चलाने की ज़रूरत होती है कि बिल्ड के दौरान आउटपुट भी लागू किया जा सके. उदाहरण के लिए, अगर कोई जेनरूल कुछ कस्टम कंपाइलर बनाता है जिसे बाद में कोई दूसरा जेनरूल इस्तेमाल करता है, तो पहले वाले को होस्ट कॉन्फ़िगरेशन के लिए आउटपुट देना होता है, क्योंकि इसी जगह पर कंपाइलर दूसरे जेनरूल में चलेगा. इस मामले में, बिल्ड सिस्टम सही काम अपने-आप करता है: यह, टारगेट कॉन्फ़िगरेशन के बजाय, होस्ट कॉन्फ़िगरेशन के लिए पहले जेनरूल के srcs और outs को बनाता है. ज़्यादा जानकारी के लिए, इस्तेमाल के लिए गाइड देखें.

JDK और C++ टूलिंग: JDK या C++ कंपाइलर सुइट के टूल का इस्तेमाल करने के लिए, बिल्ड सिस्टम इस्तेमाल करने के लिए वैरिएबल का एक सेट उपलब्ध कराता है. ज़्यादा जानकारी के लिए, "बनाएं" वैरिएबल देखें.

जेनरूल एनवायरमेंट

जेनरूल निर्देश, बैश शेल के ज़रिए लागू किया जाता है. इसे set -e -o pipefail का इस्तेमाल करके, किसी निर्देश या पाइपलाइन के काम न करने पर कॉन्फ़िगर किया जाता है.

बिल्ड टूल, सैनिटाइज़्ड प्रोसेस एनवायरमेंट में बैश कमांड एक्ज़ीक्यूट करता है. यह सिर्फ़ PATH, PWD, TMPDIR, और कुछ अन्य जैसे कोर वैरिएबल के बारे में बताता है. यह पक्का करने के लिए कि बिल्ड फिर से बनाए जा सकें, उपयोगकर्ता के शेल एनवायरमेंट में तय किए गए ज़्यादातर वैरिएबल, जेनरूल के निर्देश के ज़रिए पास नहीं किए जाते. हालांकि, Bazel (हालांकि, Blaze नहीं) उपयोगकर्ता के PATH के एनवायरमेंट वैरिएबल की वैल्यू से गुज़रता है. PATH की वैल्यू में कोई भी बदलाव करने पर, Bazel अगले बिल्ड पर निर्देश को फिर से लागू कर देगा.

जेनरूल निर्देश को नेटवर्क को ऐक्सेस नहीं करना चाहिए. हालांकि, उसे उन प्रोसेस से कनेक्ट करने के लिए ऐक्सेस करना चाहिए जो कमांड के बच्चे हों. हालांकि, फ़िलहाल इसे लागू नहीं किया गया है.

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

सामान्य सलाह

  • यह पक्का करें कि जेनरूल की मदद से चलाए जा रहे टूल, डिटर्मिनिस्टिक और हेमेटिक हों. उन्हें अपने आउटपुट में टाइमस्टैंप नहीं लिखने चाहिए. साथ ही, उन्हें सेट और मैप के लिए, स्टेबल क्रम का इस्तेमाल करना चाहिए. साथ ही, उन्हें आउटपुट के लिए सिर्फ़ मिलते-जुलते फ़ाइल पाथ, बिना किसी ऐब्सलूट पाथ को लिखना चाहिए. इस नियम का पालन न करने पर, उम्मीद के मुताबिक बिल्ड बिहेवियर होगा (बज़ल आपके हिसाब से जेनरूल दोबारा नहीं बना पाएगा) और कैश मेमोरी की परफ़ॉर्मेंस में कमी आएगी.
  • आउटपुट, टूल, और सोर्स के लिए, $(location) का ज़्यादा से ज़्यादा इस्तेमाल करें. अलग-अलग कॉन्फ़िगरेशन के लिए आउटपुट फ़ाइलों को अलग-अलग किए जाने की वजह से, जनरेटिव एआई, हार्ड कोड और/या ऐब्सलूट पाथ पर भरोसा नहीं कर सकता.
  • एक सामान्य Starlark मैक्रो लिखें, ताकि कई जगहों पर एक जैसे या बहुत मिलते-जुलते जनरेट का इस्तेमाल होने पर आसानी से उसका इस्तेमाल किया जा सके. अगर जेनरूल मुश्किल है, तो इसे स्क्रिप्ट या स्टारलार्क नियम के तौर पर लागू करें. इससे पढ़ने और टेस्ट करने में आसानी होती है.
  • पक्का करें कि एग्ज़िट कोड, जेनरूल की सफलता या असफलता को सही तरीके से दिखाता हो.
  • stdout या stderr पर जानकारी देने वाले मैसेज न लिखें. हालांकि, यह डीबग करने के लिए काम का है, लेकिन यह आसानी से ग़ैर-ज़रूरी डेटा बन सकता है. इसलिए, जनरेटिव जनरेट होने की प्रोसेस पूरी तरह से सटीक नहीं होनी चाहिए. दूसरी ओर, अगर कोई सफल जेनरूल काम नहीं करता, तो उससे अच्छी गड़बड़ी के मैसेज मिलने चाहिए.
  • $$ evaluates to a $, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such as ls $(dirname $x), one must escape it thus: ls $$(dirname $$x).
  • सिमलिंक और डायरेक्ट्री बनाने से बचें. Bazel, Genrules की मदद से बनाई गई डायरेक्ट्री/सिमलिंक के स्ट्रक्चर को कॉपी नहीं करता. साथ ही, डायरेक्ट्री की डिपेंडेंसी की जांच में गड़बड़ी हुई है.
  • दूसरे नियमों में जेनरूल का रेफ़रंस देते समय, जेनरूल के लेबल का या अलग-अलग आउटपुट फ़ाइलों के लेबल का इस्तेमाल किया जा सकता है. कभी-कभी एक तरीका ज़्यादा पढ़ा जा सकता है, कभी-कभी दूसरा तरीका: इस्तेमाल करने वाले नियम के srcs में आउटपुट को नाम से इस्तेमाल करने से, अनजाने में जनरेट किए गए नियम के दूसरे आउटपुट का इस्तेमाल करने से बचा जा सकता है. हालांकि, अगर जेनरूल से कई आउटपुट जनरेट होते हैं, तो यह काफ़ी मुश्किल हो सकता है.

उदाहरण

इस उदाहरण से, foo.h जनरेट होता है. कोई सोर्स नहीं है, क्योंकि निर्देश कोई इनपुट नहीं लेता. निर्देश से चलाई जाने वाली "बाइनरी", पर्ल स्क्रिप्ट होती है. यह उसी पैकेज में होती है जिसमें जेनरूल होता है.

genrule(
    name = "foo",
    srcs = [],
    outs = ["foo.h"],
    cmd = "./$(location create_foo.pl) > \"$@\"",
    tools = ["create_foo.pl"],
)

इस उदाहरण में, filegroup को इस्तेमाल करने का तरीका और दूसरे genrule के आउटपुट के बारे में बताया गया है. ध्यान दें कि साफ़ तौर पर $(location) के बजाय, $(SRCS) का इस्तेमाल करने से भी फ़ायदा होगा. यह उदाहरण, जानकारी देने के लिए बाद वाले निर्देश का इस्तेमाल करता है.

genrule(
    name = "concat_all_files",
    srcs = [
        "//some:files",  # a filegroup with multiple files in it ==> $(locations)
        "//other:gen",   # a genrule with a single output ==> $(location)
    ],
    outs = ["concatenated.txt"],
    cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)

तर्क

एट्रिब्यूट
name

Name; required

इस टारगेट के लिए यूनीक नाम.


आप अन्य BUILD नियमों के srcs या deps सेक्शन में इस नियम को नाम से देख सकते हैं. अगर नियम, सोर्स फ़ाइलें जनरेट करता है, तो आपको srcs एट्रिब्यूट का इस्तेमाल करना चाहिए.
srcs

List of labels; optional

इस नियम के लिए इनपुट की सूची, जैसे कि सोर्स फ़ाइलों को प्रोसेस करने के लिए.

यह एट्रिब्यूट, उन टूल की सूची बनाने के लिए सही नहीं है जिन्हें cmd ने लागू किया है. इसके बजाय, उनके लिए tools एट्रिब्यूट का इस्तेमाल करें.

बिल्ड सिस्टम यह पक्का करता है कि जेनरूल कमांड चलाने से पहले, ये ज़रूरी शर्तें पूरी की गई हों. इन्हें बनाने के लिए, ओरिजनल बिल्ड अनुरोध वाले कॉन्फ़िगरेशन का ही इस्तेमाल किया जाता है. इन ज़रूरी शर्तों की फ़ाइलों के नाम, $(SRCS) में स्पेस से अलग की गई सूची के तौर पर कमांड में उपलब्ध होते हैं. इसके अलावा, किसी srcs टारगेट //x:y के पाथ को $(location //x:y) का इस्तेमाल करके या $< का इस्तेमाल करके पाया जा सकता है, बशर्ते srcs में सिर्फ़ यही एंट्री हो.

outs

List of filenames; required; nonconfigurable

इस नियम से जनरेट की गई फ़ाइलों की सूची.

आउटपुट फ़ाइलों को पैकेज की सीमाओं को पार नहीं करना चाहिए. आउटपुट फ़ाइलों के नाम, पैकेज से मिलते-जुलते माने जाते हैं.

अगर executable फ़्लैग सेट है, तो outs में सिर्फ़ एक लेबल होना चाहिए.

जेनरूल निर्देश से, हर आउटपुट फ़ाइल को पहले से तय की गई जगह पर बनाया जाएगा. जगह की जानकारी, cmd में जनरूल के हिसाब से बने "बनाएं" वैरिएबल ($@, $(OUTS), $(@D) या $(RULEDIR)) का इस्तेमाल करके या $(location) के बदले में उपलब्ध है.

cmd

String; optional

चलाने के लिए निर्देश. यह विकल्प, $(location) और "बनाएं" वैरिएबल में बदलाव करता है.
  1. सबसे पहले, $(location) विकल्प को लागू किया गया है. यह $(location label) और $(locations label) के सभी वर्शन (और इससे मिलते-जुलते वैरिएबल execpath, execpaths, rootpath, और rootpaths) का इस्तेमाल करके, इनके मिलते-जुलते होने की जगह ले लेगा.
  2. इसके बाद, "बनाएं" वैरिएबल को बड़ा किया जाता है. ध्यान दें कि पहले से तय वैरिएबल $(JAVA), $(JAVAC), और $(JAVABASE), होस्ट कॉन्फ़िगरेशन के तहत बड़े होते हैं. इसलिए, बिल्ड चरण के हिस्से के तौर पर चलने वाले Java के शुरू होने वाले कोड, शेयर की गई लाइब्रेरी और अन्य डिपेंडेंसी को सही तरीके से लोड कर सकते हैं.
  3. आखिर में, मिलने वाला निर्देश, बैश शेल का इस्तेमाल करके एक्ज़ीक्यूट किया जाता है. अगर इसका एग्ज़िट कोड शून्य नहीं है, तो यह माना जाता है कि निर्देश फ़ेल हो गया है.
अगर इनमें से कोई भी लागू नहीं होता, तो यह cmd_bash, cmd_ps, और cmd_bat का फ़ॉलबैक होता है.

अगर कमांड लाइन की लंबाई प्लैटफ़ॉर्म की सीमा (Linux/macOS पर 64K और Windows पर 8K) से ज़्यादा हो जाती है, तो इसके बाद जेनरूल किसी स्क्रिप्ट को निर्देश देगा और उस स्क्रिप्ट को लागू करेगा, ताकि वह ठीक से काम कर सके. यह सभी cmd एट्रिब्यूट (cmd, cmd_bash, cmd_ps, cmd_bat) पर लागू होता है.

cmd_bash

String; optional

चलाने के लिए बैश कमांड.

इस एट्रिब्यूट की प्राथमिकता cmd से ज़्यादा है. इस निर्देश को बड़ा किया जाता है और यह cmd एट्रिब्यूट की तरह ही काम करता है.

cmd_bat

String; optional

Windows पर चलाने के लिए बैच कमांड.

इस एट्रिब्यूट की प्राथमिकता cmd और cmd_bash से ज़्यादा है. यह निर्देश, cmd एट्रिब्यूट की तरह ही काम करता है. इसमें ये अंतर होते हैं:

  • यह एट्रिब्यूट सिर्फ़ Windows पर लागू होता है.
  • निर्देश, इन डिफ़ॉल्ट आर्ग्युमेंट के साथ cmd.exe /c के साथ चलता है:
    • /S - पहले और पिछले कोटेशन को स्ट्रिप करें और बाकी सब कुछ ऐसे ही लागू करें.
    • /E:ON - बढ़ाया गया निर्देश सेट चालू करें.
    • /V:ON - लेट वैरिएबल एक्सपैंशन की सुविधा चालू करें
    • /D - AutoRun रजिस्ट्री एंट्री को अनदेखा करें.
  • $(location) और " Make" वैरिएबल को बदलने के बाद, पाथ को Windows स्टाइल पाथ (बैकस्लैश के साथ) तक बड़ा किया जाएगा.
cmd_ps

String; optional

Windows पर चलाने के लिए Powershell कमांड.

इस एट्रिब्यूट की प्राथमिकता cmd, cmd_bash, और cmd_bat से ज़्यादा है. यह निर्देश, cmd एट्रिब्यूट की तरह ही काम करता है. हालांकि, इसमें ये अंतर होते हैं:

  • यह एट्रिब्यूट सिर्फ़ Windows पर लागू होता है.
  • निर्देश powershell.exe /c के साथ चलता है.

PowersShe को इस्तेमाल करना आसान हो और उसमें गड़बड़ी का खतरा कम हो, इसके लिए हम नीचे दिए गए निर्देशों का पालन करते हैं. इससे, Genrole में Powershell कमांड लागू करने से पहले, एनवायरमेंट सेट अप किया जाता है.

  • Set-ExecutionPolicy -Scope CurrentUser RemoteSigned - बिना हस्ताक्षर वाली स्क्रिप्ट चलाने की अनुमति देता है.
  • $errorActionPreference='Stop' - अगर ; से अलग किए गए कई निर्देश हैं, तो Powershell CmdLet काम नहीं करता, तो कार्रवाई तुरंत बंद हो जाती है. हालांकि, बाहरी कमांड के लिए यह काम नहीं करता.
  • $PSDefaultParameterValues['*:Encoding'] = 'utf8' - कोड में बदलने के डिफ़ॉल्ट तरीके को utf-16 से utf-8 में बदलें.
exec_tools

List of labels; optional

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

ब्लेज़ की टीम, exec_tools के सिमैंटिक का इस्तेमाल करने के लिए, tools के सभी इस्तेमाल को माइग्रेट कर रही है. उपयोगकर्ताओं को सलाह दी जाती है कि वे tools के लिए exec_tools को प्राथमिकता दें, ताकि कोई समस्या न हो. फ़ंक्शनल माइग्रेशन पूरा होने के बाद, हम exec_tools का नाम बदलकर tools कर सकते हैं. ऐसा होने से पहले, आपको माइग्रेशन की चेतावनी और माइग्रेशन के बारे में निर्देश मिलेंगे.

executable

Boolean; optional; nonconfigurable; default is False

आउटपुट को एक्ज़ीक्यूटेबल होने का एलान करें.

इस फ़्लैग को 'सही है' पर सेट करने का मतलब है कि आउटपुट एक एक्ज़ीक्यूटेबल फ़ाइल है और इसे run कमांड का इस्तेमाल करके चलाया जा सकता है. इस मामले में, जेनरूल को सिर्फ़ एक आउटपुट देना चाहिए. अगर यह एट्रिब्यूट सेट किया जाता है, तो run फ़ाइल का कॉन्टेंट चाहे जो भी हो, उसे एक्ज़ीक्यूट करने की कोशिश करेगा.

जनरेट किए गए एक्ज़ीक्यूटेबल के लिए, डेटा डिपेंडेंसी का एलान नहीं किया जा सकता.

local

Boolean; optional; default is False

अगर 'सही है' पर सेट किया जाता है, तो यह विकल्प इस genrule को "लोकल" रणनीति का इस्तेमाल करके हर हाल में चलाने के लिए मजबूर करता है. इसका मतलब है कि रिमोट तरीके से कोई एक्ज़ीक्यूशन नहीं होता है, न ही सैंडबॉक्सिंग होती है, और न ही स्थायी वर्कर होता है.

यह, 'लोकल' को एक टैग (tags=["local"]) के तौर पर देने के बराबर है.

message

String; optional

प्रोग्रेस मैसेज.

इस बिल्ड चरण के पूरा होने पर, प्रोग्रेस का मैसेज प्रिंट किया जाएगा. डिफ़ॉल्ट रूप से, मैसेज "आउटपुट जनरेट किया जा रहा है" (या ऐसा ही कुछ और भी है) लेकिन आप ज़्यादा सटीक जानकारी दे सकते हैं. अपने cmd निर्देश में echo या अन्य प्रिंट स्टेटमेंट के बजाय, इस एट्रिब्यूट का इस्तेमाल करें. इससे बिल्ड टूल को यह तय करने की अनुमति मिलती है कि प्रोग्रेस मैसेज प्रिंट किए जाएं या नहीं.

output_licenses

Licence type; optional

common attributes देखें
output_to_bindir

Boolean; optional; nonconfigurable; default is False

अगर इस विकल्प को 'सही है' पर सेट किया जाता है, तो इस विकल्प की वजह से आउटपुट फ़ाइलें, genfiles डायरेक्ट्री के बजाय bin डायरेक्ट्री में लिखी जाती हैं.

tools

List of labels; optional

इस नियम के लिए टूल डिपेंडेंसी की सूची. ज़्यादा जानकारी के लिए, डिपेंडेंसी की परिभाषा देखें.

बिल्ड सिस्टम यह पक्का करता है कि जनरेटिव कमांड चलाने से पहले ये ज़रूरी शर्तें पूरी की गई हों. इन्हें होस्ट कॉन्फ़िगरेशन का इस्तेमाल करके बनाया जाता है, क्योंकि इन टूल को बिल्ड के हिस्से के तौर पर इस्तेमाल किया जाता है. किसी व्यक्तिगत tools टारगेट //x:y का पाथ $(location //x:y) का इस्तेमाल करके हासिल किया जा सकता है.

cmd की ओर से चलाया जाने वाला कोई भी *_binary या टूल, इस सूची में दिखना चाहिए, srcs में नहीं. इससे यह पक्का होता है कि वे सही कॉन्फ़िगरेशन में बनाए गए हैं.

test_suite

test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)

test_suite, टेस्ट के ऐसे सेट के बारे में बताता है जो इंसानों के लिए "काम का" माने जाते हैं. इससे प्रोजेक्ट को टेस्ट के सेट तय करने में मदद मिलती है. जैसे, "चेक-इन से पहले आपको किए जाने वाले टेस्ट", "हमारे प्रोजेक्ट के स्ट्रेस टेस्ट" या "सभी छोटे टेस्ट." blaze test कमांड, इस तरह के संगठन का पालन करता है: blaze test //some/test:suite जैसे कहने के लिए, ब्लेज़ पहले //some/test:suite टारगेट में शामिल सभी टेस्ट टारगेट की गिनती करता है (हम इसे "test_suite एक्सपैंशन" भी कहते हैं). इसके बाद, ब्लेज़ उन टारगेट को बनाता और उनकी जांच करता है.

उदाहरण

एक टेस्ट सुइट, जो मौजूदा पैकेज में सभी छोटे टेस्ट को चलाता है.

test_suite(
    name = "small_tests",
    tags = ["small"],
)

एक टेस्ट सुइट, जो चुनिंदा टेस्ट सेट करता है:

test_suite(
    name = "smoke_tests",
    tests = [
        "system_unittest",
        "public_api_unittest",
    ],
)

मौजूदा पैकेज में सभी टेस्ट चलाने के लिए एक टेस्ट सुइट. यह सुविधा अस्थिर नहीं है.

test_suite(
    name = "non_flaky_test",
    tags = ["-flaky"],
)

तर्क

एट्रिब्यूट
name

Name; required

इस टारगेट के लिए यूनीक नाम.

tags

List of strings; optional; nonconfigurable

"छोटा" या "डेटाबेस" या "-फ़्लैकी" जैसे टेक्स्ट टैग की सूची. टैग, कोई मान्य स्ट्रिंग हो सकते हैं.

"-" वर्ण से शुरू होने वाले टैग को नेगेटिव टैग माना जाता है. पिछले "-" वर्ण को टैग का हिस्सा नहीं माना जाता है. इसलिए, "-छोटा" वाला सुइट टैग, टेस्ट के "छोटा" साइज़ से मेल खाता है. बाकी सभी टैग को पॉज़िटिव टैग माना जाता है.

इसके अलावा, पॉज़िटिव टैग को ज़्यादा साफ़ तौर पर दिखाने के लिए, टैग की शुरुआत "+" वर्ण से भी की जा सकती है. इसका आकलन टैग के टेक्स्ट के हिस्से के तौर पर नहीं किया जाएगा. इससे सकारात्मक और नकारात्मक दोनों के बीच के अंतर को पढ़ना आसान हो जाता है.

टेस्ट सुइट में सिर्फ़ उन जांच नियमों को शामिल किया जाएगा जो सभी पॉज़िटिव टैग से मैच करते हैं और नेगेटिव टैग में से किसी भी नहीं को शामिल किया जाता है. ध्यान दें कि इसका मतलब यह नहीं है कि फ़िल्टर किए गए टेस्ट पर निर्भरता की जांच छोड़ दी जाएगी.स्किप किए गए टेस्ट की डिपेंडेंसी अब भी कानूनी होनी चाहिए. उदाहरण के लिए, विज़िबिलिटी की कमी की वजह से ब्लॉक नहीं किया गया हो.

manual टैग वाले कीवर्ड को ऊपर दिए गए कीवर्ड से अलग तरीके से पेश किया जाता है. "test_Suite एक्सपैंशन" सुविधा, वाइल्डकार्ड टारगेट पैटर्न वाले न्योते पर blaze test कमांड की मदद से परफ़ॉर्म करती है. वहां, "मैन्युअल" टैग किए गए test_suite टारगेट, फ़िल्टर करके बाहर कर दिए जाते हैं (इसलिए, उन्हें बड़ा नहीं किया जाता). यह व्यवहार सामान्य तौर पर, blaze build और blaze test के वाइल्डकार्ड टारगेट पैटर्न को मैनेज करने के तरीके जैसा होता है. ध्यान दें कि यह blaze query 'tests(E)' के काम करने के तरीके से साफ़ तौर पर अलग है, क्योंकि tests क्वेरी फ़ंक्शन की मदद से सुइट को हमेशा बड़ा किया जाता है, भले ही manual टैग कुछ भी हो.

ध्यान दें कि फ़िल्टर करने के लिए, टेस्ट के size को टैग माना जाता है.

अगर आपको ऐसे test_suite की ज़रूरत है जिसमें म्युचुअली एक्सक्लूसिव टैग (जैसे, सभी छोटे और मीडियम टेस्ट) वाले टेस्ट शामिल हों, तो आपको test_suite के तीन नियम बनाने होंगे: सभी छोटे टेस्ट के लिए, सभी मीडियम टेस्ट के लिए एक नियम, और दूसरा, जिसमें पिछले दो नियम शामिल हों.

tests

List of labels; optional; nonconfigurable

किसी भी भाषा के टेस्ट सुइट और टेस्ट टारगेट की सूची.

किसी भी भाषा के लिए, यहां कोई भी *_test स्वीकार किया जाता है. हालांकि, *_binary के किसी भी टारगेट को स्वीकार नहीं किया जाता, भले ही वे टेस्ट करने के लिए हों. tags के हिसाब से फ़िल्टर करने की सुविधा, सिर्फ़ उन टेस्ट के लिए की जाती है जो सीधे तौर पर इस एट्रिब्यूट में शामिल हैं. अगर इस एट्रिब्यूट में test_suite शामिल हैं, तो उनमें मौजूद टेस्ट को इस test_suite से फ़िल्टर नहीं किया जाएगा. इन्हें पहले से ही फ़िल्टर किया हुआ माना जाता है.

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