नियम
उपनाम
alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
alias नियम, एक ऐसा नाम बनाता है जिससे किसी नियम को रेफ़र किया जा सकता है.
एलियासिंग की सुविधा सिर्फ़ "रेगुलर" टारगेट के लिए काम करती है. खास तौर पर, package_group
और test_suite को एलियास नहीं किया जा सकता.
एलियास के नियम में, विज़िबिलिटी का अपना एलान होता है. अन्य सभी मामलों में, यह उस नियम की तरह काम करता है जिसका यह रेफ़रंस देता है. उदाहरण के लिए, testonly on the alias को अनदेखा किया जाता है. इसके बजाय, रेफ़रंस किए गए नियम के testonly-ness का इस्तेमाल किया जाता है. हालांकि, कुछ छोटे-मोटे अपवाद हैं:
-
अगर कमांड लाइन पर उनके एलियास का ज़िक्र किया गया है, तो टेस्ट नहीं चलाए जाते हैं. रेफ़र किए गए टेस्ट को चलाने वाले एलियास को तय करने के लिए,
test_suiteनियम का इस्तेमाल करें. इस नियम में,testsएट्रिब्यूट में सिर्फ़ एक टारगेट होना चाहिए. -
एनवायरमेंट ग्रुप तय करते समय,
environmentनियमों के लिए उपनामों का इस्तेमाल नहीं किया जा सकता. इन्हें--target_environmentकमांड लाइन विकल्प में भी इस्तेमाल नहीं किया जा सकता.
उदाहरण
filegroup(
name = "data",
srcs = ["data.txt"],
)
alias(
name = "other",
actual = ":data",
)
तर्क
| विशेषताएं | |
|---|---|
name |
इस टारगेट के लिए यूनीक नाम. |
actual
|
|
config_setting
config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)
यह कॉन्फ़िगरेशन की अनुमानित स्थिति से मेल खाता है. इसे बिल्ड फ़्लैग या प्लैटफ़ॉर्म की पाबंदियों के तौर पर दिखाया जाता है. इसका मकसद, कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट को ट्रिगर करना है. इस नियम का इस्तेमाल कैसे करें, इसके लिए select देखें. साथ ही, इस सुविधा के बारे में खास जानकारी पाने के लिए कॉन्फ़िगर किए जा सकने वाले एट्रिब्यूट देखें.
उदाहरण
नीचे दिया गया पैटर्न, --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"
}
)
नीचे दिया गया पैटर्न, उस बिल्ड से मेल खाता है जिसमें user-defined flag सेट किया गया हो. --//custom_flags:foo=1 (यह फ़्लैग, कमांड लाइन में साफ़ तौर पर या .bazelrc फ़ाइलों से इंप्लिसिट तौर पर सेट किया गया हो):
config_setting(
name = "my_custom_flag_is_set",
flag_values = { "//custom_flags:foo": "1" },
)
नीचे दिया गया उदाहरण, x86_64 आर्किटेक्चर और glibc वर्शन 2.25 वाले प्लैटफ़ॉर्म को टारगेट करने वाले किसी भी बिल्ड से मेल खाता है. हालांकि, इसके लिए यह ज़रूरी है कि constraint_value मौजूद हो और उसका लेबल //example:glibc_2_25 हो. ध्यान दें कि अगर कोई प्लैटफ़ॉर्म इन दो वैल्यू के अलावा, अन्य वैल्यू भी तय करता है, तो भी वह मैच करता है.
config_setting(
name = "64bit_glibc_2_25",
constraint_values = [
"@platforms//cpu:x86_64",
"//example:glibc_2_25",
]
)
config_setting, टॉप-लेवल के कमांड-लाइन फ़्लैग से मेल नहीं खाता है, तो भी यह कुछ बिल्ड टारगेट से मेल खा सकता है.
नोट
- जब कई
config_setting, मौजूदा कॉन्फ़िगरेशन की स्थिति से मेल खाते हैं, तो क्या होता है, यह जानने के लिए select देखें. - शॉर्टहैंड फ़ॉर्मैट वाले फ़्लैग (जैसे,
--compilation_modeबनाम-c) के लिए,valuesकी परिभाषाओं में पूरे फ़ॉर्म का इस्तेमाल किया जाना चाहिए. ये दोनों फ़ॉर्म इस्तेमाल करके, अपने-आप मैच होने वाले इनवॉकेशन. -
अगर किसी फ़्लैग की एक से ज़्यादा वैल्यू होती हैं (जैसे कि
--copt=-Da --copt=-Dbया सूची के टाइप वाला Starlark फ़्लैग), तो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 |
इस टारगेट के लिए यूनीक नाम. |
constraint_values
|
constraint_values का वह कम से कम सेट जिसे टारगेट प्लैटफ़ॉर्म को इस config_setting से मैच करने के लिए तय करना होगा. (यहां एक्ज़ीक्यूशन प्लैटफ़ॉर्म को शामिल नहीं किया गया है.) प्लैटफ़ॉर्म पर मौजूद अन्य पाबंदी की वैल्यू को अनदेखा कर दिया जाता है. ज़्यादा जानकारी के लिए,
कॉन्फ़िगर किए जा सकने वाले बिल्ड एट्रिब्यूट लेख पढ़ें.
अगर दो |
define_values
|
values के जैसा ही है, लेकिन खास तौर पर --define फ़्लैग के लिए है.
इसका मतलब है कि:
config_setting(
name = "a_and_b",
values = {
"define": "a=1",
"define": "b=2",
})
काम नहीं करता, क्योंकि शब्दकोश में एक ही कुंजी (
config_setting(
name = "a_and_b",
define_values = {
"a": "1",
"b": "2",
})
|
flag_values
|
values की तरह ही है, लेकिन
उपयोगकर्ता के तय किए गए बिल्ड फ़्लैग के लिए है.
यह एक अलग एट्रिब्यूट है, क्योंकि उपयोगकर्ता के तय किए गए फ़्लैग को लेबल के तौर पर रेफ़रंस किया जाता है. वहीं, बिल्ट-इन फ़्लैग को मनचाहे स्ट्रिंग के तौर पर रेफ़रंस किया जाता है. |
values
|
यह नियम, कॉन्फ़िगर किए गए उस टारगेट के कॉन्फ़िगरेशन को इनहेरिट करता है जो आसानी के लिए, कॉन्फ़िगरेशन वैल्यू को बिल्ड फ़्लैग के तौर पर बताया गया है. इनमें अगर कमांड लाइन में किसी फ़्लैग को साफ़ तौर पर सेट नहीं किया जाता है, तो उसकी डिफ़ॉल्ट वैल्यू का इस्तेमाल किया जाता है.
अगर किसी डिक्शनरी में कोई कुंजी एक से ज़्यादा बार दिखती है, तो सिर्फ़ आखिरी इंस्टेंस का इस्तेमाल किया जाता है.
अगर कोई कुंजी ऐसे फ़्लैग को रेफ़र करती है जिसे कमांड लाइन पर कई बार सेट किया जा सकता है (जैसे,
|
filegroup
filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)
filegroup का इस्तेमाल करके, टारगेट के कलेक्शन को आसानी से पहचाना जा सकने वाला नाम दें.
इसके बाद, इन्हें अन्य नियमों से रेफ़रंस किया जा सकता है.
डायरेक्ट्री को सीधे तौर पर रेफ़रंस करने के बजाय, filegroup का इस्तेमाल करने का सुझाव दिया जाता है.
बाद वाला तरीका सही नहीं है, क्योंकि बिल्ड सिस्टम को डायरेक्ट्री में मौजूद सभी फ़ाइलों के बारे में पूरी जानकारी नहीं होती. इसलिए, इन फ़ाइलों में बदलाव होने पर, यह उन्हें फिर से नहीं बना सकता. glob के साथ इस्तेमाल करने पर, filegroup यह पक्का कर सकता है कि सभी फ़ाइलें, बिल्ड सिस्टम को साफ़ तौर पर पता हों.
उदाहरण
दो सोर्स फ़ाइलों से मिलकर बनी filegroup बनाने के लिए, यह तरीका अपनाएं
filegroup(
name = "mygroup",
srcs = [
"a_file.txt",
"some/subdirectory/another_file.txt",
],
)
इसके अलावा, testdata डायरेक्ट्री को क्रॉल करने के लिए, 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 |
इस टारगेट के लिए यूनीक नाम. |
srcs
|
|
data
|
|
output_group
|
"आउटपुट ग्रुप", टारगेट के आउटपुट आर्टफ़ैक्ट की एक कैटगरी है. इसे उस नियम को लागू करने के तरीके में बताया जाता है. |
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(), Blaze क्वेरी लैंग्वेज में दी गई क्वेरी को चलाता है और नतीजे को किसी फ़ाइल में डंप करता है.
क्वेरी को एक जैसा बनाए रखने के लिए, इसे सिर्फ़ scope एट्रिब्यूट में बताए गए टारगेट के ट्रांज़िटिव क्लोज़र पर जाने की अनुमति है. इस नियम का उल्लंघन करने वाली क्वेरी, एक्ज़ीक्यूट नहीं की जा सकेंगी. ऐसा तब होगा, जब
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 |
इस टारगेट के लिए यूनीक नाम. |
expression
|
a/BUILD में मौजूद इस एट्रिब्यूट में दिया गया लेबल :b, टारगेट //:b को रेफ़र करेगा.
|
opts
|
bazel query को पास किया जा सकता है. यहां कुछ क्वेरी विकल्पों का इस्तेमाल नहीं किया जा सकता: --keep_going, --query_file, --universe_scope, --order_results, और --order_output. यहां नहीं दिए गए विकल्पों की डिफ़ॉल्ट वैल्यू, bazel query की कमांड लाइन पर मौजूद वैल्यू की तरह ही होंगी.
|
scope
|
|
strict
|
|
genrule
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, उपयोगकर्ता की तय की गई Bash कमांड का इस्तेमाल करके एक या उससे ज़्यादा फ़ाइलें जनरेट करता है.
Genrules, सामान्य बिल्ड नियम होते हैं. अगर किसी टास्क के लिए कोई खास नियम नहीं है, तो इनका इस्तेमाल किया जा सकता है.
उदाहरण के लिए, Bash की एक लाइन का कोड चलाया जा सकता है. हालांकि, अगर आपको C++ फ़ाइलों को कंपाइल करना है, तो मौजूदा cc_* नियमों का पालन करें. ऐसा इसलिए, क्योंकि आपके लिए पहले ही सभी ज़रूरी काम कर दिया गया है.
टेस्ट चलाने के लिए, genrule का इस्तेमाल न करें. टेस्ट और टेस्ट के नतीजों के लिए, खास छूट दी जाती हैं. इनमें कैश मेमोरी से जुड़ी नीतियां और एनवायरमेंट वैरिएबल शामिल हैं. आम तौर पर, टेस्ट को बिल्ड पूरा होने के बाद और टारगेट आर्किटेक्चर पर चलाना होता है. वहीं, जनरूल को बिल्ड के दौरान और होस्ट आर्किटेक्चर पर लागू किया जाता है. ये दोनों अलग-अलग हो सकते हैं. अगर आपको सामान्य मकसद के लिए
टेस्टिंग का नियम बनाना है, तो sh_test का इस्तेमाल करें.
क्रॉस-कंपाइलेशन से जुड़ी बातें
क्रॉस-कंपाइलेशन के बारे में ज़्यादा जानकारी के लिए, उपयोगकर्ता मैन्युअल देखें.
genrules, बिल्ड के दौरान चलते हैं. हालांकि, इनके आउटपुट का इस्तेमाल अक्सर बिल्ड के बाद, डिप्लॉयमेंट या टेस्टिंग के लिए किया जाता है. माइक्रोकंट्रोलर के लिए C कोड को कंपाइल करने का उदाहरण देखें: कंपाइलर, C सोर्स फ़ाइलों को स्वीकार करता है और ऐसा कोड जनरेट करता है जो माइक्रोकंट्रोलर पर चलता है. ज़ाहिर है कि जनरेट किया गया कोड, उस सीपीयू पर नहीं चल सकता जिसका इस्तेमाल इसे बनाने के लिए किया गया था. हालांकि, C कंपाइलर (अगर सोर्स से कंपाइल किया गया है) को ऐसा करना होगा.
बिल्ड सिस्टम, होस्ट कॉन्फ़िगरेशन का इस्तेमाल करके उन मशीनों के बारे में बताता है जिन पर बिल्ड चलता है. साथ ही, टारगेट कॉन्फ़िगरेशन का इस्तेमाल करके उन मशीनों के बारे में बताता है जिन पर बिल्ड का आउटपुट चलना चाहिए. यह इनमें से हर एक को कॉन्फ़िगर करने के विकल्प देता है. साथ ही, यह टकराव से बचने के लिए, इससे जुड़ी फ़ाइलों को अलग-अलग डायरेक्ट्री में बांटता है.
genrules के लिए, बिल्ड सिस्टम यह पक्का करता है कि डिपेंडेंसी सही तरीके से बनाई गई हों:
srcs को target कॉन्फ़िगरेशन के लिए बनाया जाता है (अगर ज़रूरी हो),
tools को host कॉन्फ़िगरेशन के लिए बनाया जाता है, और आउटपुट को target कॉन्फ़िगरेशन के लिए माना जाता है. यह
"Make" वैरिएबल भी उपलब्ध कराता है. इन्हें genrule कमांड, संबंधित टूल को पास कर सकती हैं.
यह जान-बूझकर किया गया है कि genrule, deps एट्रिब्यूट को तय नहीं करता: अन्य बिल्ट-इन नियम, नियमों के बीच पास की गई भाषा के हिसाब से मेटा जानकारी का इस्तेमाल करते हैं, ताकि यह अपने-आप तय किया जा सके कि निर्भर नियमों को कैसे हैंडल किया जाए. हालांकि, genrules के लिए इस तरह का ऑटोमेशन मुमकिन नहीं है. Genrules, सिर्फ़ फ़ाइल और runfiles लेवल पर काम करते हैं.
खास मामले
होस्ट-होस्ट कंपाइलेशन: कुछ मामलों में, बिल्ड सिस्टम को इस तरह से genrules चलाने की ज़रूरत होती है कि बिल्ड के दौरान आउटपुट भी एक्ज़ीक्यूट किया जा सके. उदाहरण के लिए, अगर कोई genrule कुछ कस्टम कंपाइलर बनाता है और बाद में इसका इस्तेमाल किसी दूसरे genrule में किया जाता है, तो पहले genrule को होस्ट कॉन्फ़िगरेशन के लिए अपना आउटपुट जनरेट करना होगा. ऐसा इसलिए, क्योंकि कंपाइलर दूसरे genrule में चलेगा. इस मामले में, बिल्ड सिस्टम अपने-आप सही काम करता है: यह टारगेट कॉन्फ़िगरेशन के बजाय होस्ट कॉन्फ़िगरेशन के लिए, पहले genrule का srcs और outs बनाता है. ज़्यादा जानकारी के लिए, उपयोगकर्ता मैन्युअल देखें.
JDK और C++ टूलिंग: JDK या C++ कंपाइलर सुइट के किसी टूल का इस्तेमाल करने के लिए, बिल्ड सिस्टम इस्तेमाल करने के लिए वैरिएबल का एक सेट उपलब्ध कराता है. ज़्यादा जानकारी के लिए, "मेक" वैरिएबल देखें.
Genrule Environment
genrule कमांड को Bash शेल से एक्ज़ीक्यूट किया जाता है. इसे इस तरह कॉन्फ़िगर किया जाता है कि जब कोई कमांड या पाइपलाइन फ़ेल हो जाए, तो यह भी फ़ेल हो जाए. इसके लिए, set -e -o pipefail का इस्तेमाल किया जाता है.
बिल्ड टूल, सैनिटाइज़ किए गए प्रोसेस एनवायरमेंट में बैश कमांड को एक्ज़ीक्यूट करता है. यह सिर्फ़ मुख्य वैरिएबल तय करता है, जैसे कि PATH, PWD, TMPDIR, और कुछ अन्य.
यह पक्का करने के लिए कि बिल्ड को फिर से बनाया जा सके, उपयोगकर्ता के शेल एनवायरमेंट में तय किए गए ज़्यादातर वैरिएबल, genrule के कमांड में पास नहीं किए जाते. हालांकि, Bazel (Blaze नहीं) उपयोगकर्ता के PATH एनवायरमेंट वैरिएबल की वैल्यू को पास करता है.
PATH की वैल्यू में कोई भी बदलाव होने पर, Bazel अगले बिल्ड पर कमांड को फिर से लागू करेगा.
genrule कमांड को नेटवर्क का ऐक्सेस नहीं होना चाहिए. हालांकि, यह नियम फ़िलहाल लागू नहीं है. इसका इस्तेमाल सिर्फ़ उन प्रोसेस को कनेक्ट करने के लिए किया जाना चाहिए जो कमांड की चाइल्ड प्रोसेस हैं.
बिल्ड सिस्टम, मौजूदा आउटपुट फ़ाइलों को अपने-आप मिटा देता है. हालांकि, यह genrule चलाने से पहले ज़रूरी पैरंट डायरेक्ट्री बना देता है. अगर कोई गड़बड़ी होती है, तो यह आउटपुट फ़ाइलों को भी हटा देता है.
सामान्य सलाह
- यह पक्का करें कि जनरूल से चलने वाले टूल, डिटरमिनिस्टिक और हर्मेटिक हों. उन्हें अपने आउटपुट में टाइमस्टैंप नहीं लिखने चाहिए. साथ ही, उन्हें सेट और मैप के लिए स्टेबल ऑर्डरिंग का इस्तेमाल करना चाहिए. इसके अलावा, उन्हें आउटपुट में सिर्फ़ मिलते-जुलते फ़ाइल पाथ लिखने चाहिए, न कि पूरे पाथ. इस नियम का पालन न करने पर, बिल्ड में अनचाहे बदलाव हो सकते हैं. जैसे, Bazel उस genrule को फिर से नहीं बनाएगा जिसे आपको फिर से बनाना था. साथ ही, इससे कैश मेमोरी की परफ़ॉर्मेंस भी खराब हो सकती है.
- आउटपुट, टूल, और सोर्स के लिए,
$(location)का ज़्यादा से ज़्यादा इस्तेमाल करें. अलग-अलग कॉन्फ़िगरेशन के लिए आउटपुट फ़ाइलों को अलग-अलग करने की वजह से, genrules, हार्ड-कोड किए गए और/या पूरे पाथ पर भरोसा नहीं कर सकते. - अगर एक जैसे या मिलते-जुलते genrule का इस्तेमाल कई जगहों पर किया जाता है, तो एक सामान्य Starlark मैक्रो लिखें. अगर जनरूल जटिल है, तो उसे स्क्रिप्ट में या Starlark नियम के तौर पर लागू करें. इससे कोड को पढ़ना और टेस्ट करना आसान हो जाता है.
- पक्का करें कि एक्ज़िट कोड से, genrule के सफल या असफल होने की जानकारी सही तरीके से मिलती हो.
- stdout या stderr में सूचना देने वाले मैसेज न लिखें. यह डीबग करने के लिए उपयोगी है. हालांकि, इससे आसानी से नॉइज़ जनरेट हो सकती है. genrule को बिना किसी आउटपुट के चलना चाहिए. दूसरी ओर, genrule के फ़ेल होने पर, गड़बड़ी के मैसेज सही तरीके से दिखने चाहिए.
$$evaluates to a$, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such asls $(dirname $x), one must escape it thus:ls $$(dirname $$x).- सिमलिंक और डायरेक्ट्री बनाने से बचें. Bazel, genrules से बनाए गए डायरेक्ट्री/सिमलिंक स्ट्रक्चर को कॉपी नहीं करता. साथ ही, डायरेक्ट्री की डिपेंडेंसी की जांच करने का तरीका सही नहीं है.
- किसी अन्य नियम में genrule का रेफ़रंस देते समय, genrule के लेबल या अलग-अलग आउटपुट फ़ाइलों के लेबल का इस्तेमाल किया जा सकता है. कभी-कभी एक तरीका ज़्यादा आसानी से समझ में आता है, तो कभी-कभी दूसरा तरीका: इस्तेमाल किए जा रहे नियम के
srcsमें नाम के हिसाब से आउटपुट का रेफ़रंस देने से, genrule के अन्य आउटपुट को गलती से चुनने से बचा जा सकेगा. हालांकि, अगर genrule कई आउटपुट जनरेट करता है, तो यह तरीका मुश्किल हो सकता है.
उदाहरण
इस उदाहरण में, foo.h जनरेट किया गया है. कोई सोर्स नहीं है, क्योंकि कमांड कोई इनपुट नहीं लेती है. कमांड से चलने वाला "बाइनरी", genrule के तौर पर एक ही पैकेज में मौजूद पर्ल स्क्रिप्ट है.
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 |
इस टारगेट के लिए यूनीक नाम. इस नियम को, अन्य BUILD नियमों के srcs या deps सेक्शन में नाम से रेफ़र किया जा सकता है. अगर नियम से सोर्स फ़ाइलें जनरेट होती हैं, तो आपको srcs एट्रिब्यूट का इस्तेमाल करना चाहिए.
|
srcs
|
इस एट्रिब्यूट का इस्तेमाल,
बिल्ड सिस्टम यह पक्का करता है कि genrule
कमांड चलाने से पहले, इन ज़रूरी शर्तों को पूरा किया गया हो. इन्हें ओरिजनल बिल्ड अनुरोध के तौर पर ही कॉन्फ़िगर किया जाता है. इन ज़रूरी शर्तों की फ़ाइलों के नाम, कमांड के लिए उपलब्ध होते हैं. ये नाम, स्पेस से अलग की गई सूची के तौर पर |
outs
|
आउटपुट फ़ाइलें, पैकेज की सीमाओं से बाहर नहीं होनी चाहिए. आउटपुट फ़ाइलों के नाम, पैकेज के हिसाब से तय किए जाते हैं.
अगर
genrule कमांड से, हर आउटपुट फ़ाइल को पहले से तय की गई जगह पर बनाने की उम्मीद की जाती है.
जगह की जानकारी, |
cmd
|
$(location)
और "मेक" वैरिएबल के हिसाब से बदलाव किया जा सकता है.
cmd_bash, cmd_ps, और cmd_bat का फ़ॉलबैक है.
अगर कमांड लाइन की लंबाई प्लैटफ़ॉर्म की सीमा से ज़्यादा है (Linux/macOS पर 64K, Windows पर 8K), तो genrule कमांड को स्क्रिप्ट में लिखेगा और उस स्क्रिप्ट को एक्ज़ीक्यूट करेगा. यह सभी सीएमडी एट्रिब्यूट ( |
cmd_bash
|
इस एट्रिब्यूट को |
cmd_bat
|
इस एट्रिब्यूट को
|
cmd_ps
|
इस एट्रिब्यूट को
Powershell को इस्तेमाल करने में आसान बनाने और इसमें कम गड़बड़ियां होने के लिए, हम यहां दिए गए निर्देशों को चलाते हैं. इससे genrule में Powershell निर्देश को लागू करने से पहले, एनवायरमेंट सेट अप हो जाता है.
|
exec_tools
|
tools एट्रिब्यूट की तरह काम करता है. हालांकि, इन डिपेंडेंसी को होस्ट कॉन्फ़िगरेशन के बजाय, नियम के एक्ज़ीक्यूशन प्लैटफ़ॉर्म के लिए कॉन्फ़िगर किया जाएगा.
इसका मतलब है कि exec_tools में मौजूद डिपेंडेंसी पर वही सीमाएं लागू नहीं होती हैं जो tools में मौजूद डिपेंडेंसी पर लागू होती हैं. खास तौर पर, उन्हें अपनी ट्रांज़िटिव डिपेंडेंसी के लिए होस्ट कॉन्फ़िगरेशन का इस्तेमाल करने की ज़रूरत नहीं है. ज़्यादा जानकारी के लिए, tools पर जाएं.
Blaze की टीम, |
executable
|
इस फ़्लैग को 'सही है' पर सेट करने का मतलब है कि आउटपुट एक एक्ज़ीक्यूटेबल फ़ाइल है और इसे जनरेट किए गए एक्ज़ीक्यूटेबल के लिए, डेटा डिपेंडेंसी के बारे में जानकारी देने की सुविधा उपलब्ध नहीं है. |
local
|
अगर इसे 'सही है' पर सेट किया जाता है, तो यह विकल्प इस
यह 'local' को टैग ( |
message
|
प्रोग्रेस मैसेज, जिसे इस बिल्ड चरण के पूरा होने पर प्रिंट किया जाएगा. डिफ़ॉल्ट रूप से, मैसेज "आउटपुट जनरेट किया जा रहा है" (या इसी तरह का कोई और मैसेज) होता है. हालांकि, आपके पास ज़्यादा जानकारी देने वाला मैसेज उपलब्ध कराने का विकल्प होता है. अपनी |
output_licenses
|
common attributes
देखें
|
output_to_bindir
|
अगर इसे 'सही है' पर सेट किया जाता है, तो इस विकल्प की वजह से आउटपुट फ़ाइलें, |
tools
|
बिल्ड सिस्टम यह पक्का करता है कि genrule कमांड चलाने से पहले, इन ज़रूरी शर्तों को पूरा किया गया हो. इन्हें होस्ट कॉन्फ़िगरेशन का इस्तेमाल करके बनाया जाता है, क्योंकि इन टूल को बिल्ड के हिस्से के तौर पर एक्ज़ीक्यूट किया जाता है.
|
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 जैसे इनवोकेशन के लिए, Blaze पहले //some/test:suite टारगेट में ट्रांज़िटिव तरीके से शामिल किए गए सभी टेस्ट टारगेट की गिनती करता है. इसे "test_suite expansion" कहा जाता है. इसके बाद, Blaze उन टारगेट को बनाता है और उनकी जांच करता है.
उदाहरण
यह टेस्ट सुइट, मौजूदा पैकेज में मौजूद सभी छोटे टेस्ट चलाने के लिए है.
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 |
इस टारगेट के लिए यूनीक नाम. |
tags
|
"-" वर्ण से शुरू होने वाले टैग को नेगेटिव टैग माना जाता है. "-" वर्ण को टैग का हिस्सा नहीं माना जाता. इसलिए, "-small" वाला सुइट टैग, टेस्ट के "small" साइज़ से मेल खाता है. अन्य सभी टैग को पॉज़िटिव टैग माना जाता है. अगर आपको पॉज़िटिव टैग को ज़्यादा साफ़ तौर पर दिखाना है, तो टैग "+" वर्ण से भी शुरू हो सकते हैं. हालांकि, इसे टैग के टेक्स्ट का हिस्सा नहीं माना जाएगा. इससे सिर्फ़ सकारात्मक और नकारात्मक अंतर को आसानी से पढ़ा जा सकता है. टेस्ट सुइट में सिर्फ़ वे टेस्ट नियम शामिल किए जाएंगे जो पॉज़िटिव टैग में से सभी और नेगेटिव टैग में से कोई नहीं मैच करते हैं. ध्यान दें कि इसका मतलब यह नहीं है कि फ़िल्टर किए गए टेस्ट पर निर्भरता के लिए, गड़बड़ी की जांच छोड़ दी जाती है.छोड़े गए टेस्ट पर निर्भरता अब भी कानूनी होनी चाहिए. उदाहरण के लिए, यह दिखने से जुड़ी पाबंदियों की वजह से ब्लॉक नहीं होनी चाहिए.
ध्यान दें कि फ़िल्टर करने के लिए, टेस्ट के
अगर आपको ऐसा |
tests
|
यहां किसी भी भाषा में
अगर |