नियमों का यह सेट, आपको उन खास हार्डवेयर प्लैटफ़ॉर्म के लिए मॉडल बनाने की अनुमति देता है जिनके लिए आप ऐप्लिकेशन बना रहे हैं. साथ ही, उन प्लैटफ़ॉर्म के लिए कोड को कॉम्पाइल करने के लिए, ज़रूरी टूल की जानकारी भी देता है. उपयोगकर्ता को यहां बताए गए कॉन्सेप्ट के बारे में पता होना चाहिए.
नियम
constraint_setting
नियम का सोर्स देखेंconstraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)
इस नियम का इस्तेमाल, नई पाबंदी के टाइप को लागू करने के लिए किया जाता है. इसके लिए, प्लैटफ़ॉर्म कोई वैल्यू तय कर सकता है.
उदाहरण के लिए, "glibc_version" नाम का constraint_setting
तय करके, यह दिखाया जा सकता है कि प्लैटफ़ॉर्म पर glibc लाइब्रेरी के अलग-अलग वर्शन इंस्टॉल किए जा सकते हैं.
ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म पेज देखें.
हर constraint_setting
के साथ, constraint_value
का एक बड़ा सेट जुड़ा होता है. आम तौर पर, इन्हें एक ही पैकेज में तय किया जाता है. हालांकि, कभी-कभी किसी अलग पैकेज में मौजूदा सेटिंग के लिए नई वैल्यू जोड़ी जाती हैं. उदाहरण के लिए, पहले से तय की गई सेटिंग @platforms//cpu:cpu
को कस्टम वैल्यू के साथ बढ़ाया जा सकता है, ताकि किसी ऐसे प्लैटफ़ॉर्म को तय किया जा सके जो किसी खास सीपीयू आर्किटेक्चर को टारगेट करता हो.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
default_constraint_value
|
नाम; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट constraint_value को उसी पैकेज में तय किया जाना चाहिए जिस पैकेज में यह constraint_setting मौजूद है.
अगर किसी शर्त की सेटिंग में डिफ़ॉल्ट वैल्यू है, तो जब भी कोई प्लैटफ़ॉर्म उस सेटिंग के लिए कोई शर्त की वैल्यू शामिल नहीं करता, तो यह वैसा ही होता है जैसे प्लैटफ़ॉर्म ने डिफ़ॉल्ट वैल्यू तय की हो. अगर कोई डिफ़ॉल्ट वैल्यू नहीं है, तो उस प्लैटफ़ॉर्म के लिए, पाबंदी की सेटिंग को तय नहीं माना जाता. ऐसे में, प्लैटफ़ॉर्म किसी भी पाबंदी वाली सूची (जैसे, |
constraint_value
नियम का सोर्स देखेंconstraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)
उदाहरण
यहां दी गई वैल्यू, पहले से तय constraint_value
के लिए एक नई वैल्यू बनाती है, जो सीपीयू आर्किटेक्चर को दिखाती है.
constraint_value( name = "mips", constraint_setting = "@platforms//cpu:cpu", )
mips
आर्किटेक्चर है, जो x86_64
, arm
वगैरह के विकल्प के तौर पर उपलब्ध है.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
constraint_setting
|
लेबल; कॉन्फ़िगर नहीं किया जा सकता; ज़रूरी है वहconstraint_setting जिसके लिए यह constraint_value एक संभावित विकल्प है.
|
प्लैटफ़ॉर्म
नियम का सोर्स देखेंplatform(name, constraint_values, deprecation, distribs, exec_properties, features, flags, licenses, parents, remote_execution_properties, required_settings, tags, testonly, visibility)
यह नियम, एक नए प्लैटफ़ॉर्म के बारे में बताता है. यह प्लैटफ़ॉर्म, नाम वाले ऐसे कलेक्शन होता है जिसमें पाबंदी के विकल्प (जैसे, सीपीयू आर्किटेक्चर या कंपाइलर वर्शन) होते हैं. इन विकल्पों से उस एनवायरमेंट के बारे में पता चलता है जिसमें बिल्ड का कोई हिस्सा चल सकता है. ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म पेज देखें.
उदाहरण
यह एक ऐसा प्लैटफ़ॉर्म तय करता है जो ARM पर Linux चलाने वाले किसी भी एनवायरमेंट के बारे में बताता है.
platform( name = "linux_arm", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:arm", ], )
प्लैटफ़ॉर्म फ़्लैग
प्लैटफ़ॉर्म, flags
एट्रिब्यूट का इस्तेमाल करके, उन फ़्लैग की सूची तय कर सकते हैं जिन्हें कॉन्फ़िगरेशन में तब जोड़ा जाएगा, जब प्लैटफ़ॉर्म का इस्तेमाल टारगेट प्लैटफ़ॉर्म (यानी, --platforms
फ़्लैग की वैल्यू के तौर पर) के तौर पर किया जाएगा.
प्लैटफ़ॉर्म से सेट किए गए फ़्लैग को सबसे ज़्यादा प्राथमिकता दी जाती है. साथ ही, कमांड लाइन, rc फ़ाइल या ट्रांज़िशन से, उस फ़्लैग की पिछली वैल्यू को बदल दिया जाता है.
उदाहरण
platform( name = "foo", flags = [ "--dynamic_mode=fully", "--//bool_flag", "--no//package:other_bool_flag", ], )
इससे foo
नाम के प्लैटफ़ॉर्म के बारे में पता चलता है. अगर यह टारगेट प्लैटफ़ॉर्म है (इसकी वजह यह हो सकती है कि उपयोगकर्ता ने --platforms//:foo
तय किया हो, किसी ट्रांज़िशन ने //command_line_option:platforms
फ़्लैग को ["//:foo"]
पर सेट किया हो या //:foo
का इस्तेमाल, एक्सीक्यूशन प्लैटफ़ॉर्म के तौर पर किया गया हो), तो दिए गए फ़्लैग कॉन्फ़िगरेशन में सेट हो जाएंगे.
प्लैटफ़ॉर्म और बार-बार इस्तेमाल किए जा सकने वाले फ़्लैग
कुछ फ़्लैग दोहराए जाने पर, उनकी वैल्यू इकट्ठा हो जाएंगी. जैसे, --features
,
--copt
, config.string(repeatable = True)
के तौर पर बनाया गया कोई भी Starlark फ़्लैग.
ये फ़्लैग, प्लैटफ़ॉर्म से फ़्लैग सेट करने के साथ काम नहीं करते: इसके बजाय, सभी पिछली वैल्यू हटा दी जाएंगी और प्लैटफ़ॉर्म की वैल्यू से बदल दी जाएंगी.
उदाहरण के लिए, नीचे दिए गए प्लैटफ़ॉर्म के लिए, build --platforms=//:repeat_demo
--features feature_a --features feature_b
को कॉल करने पर, --feature
फ़्लैग की वैल्यू ["feature_c", "feature_d"]
हो जाएगी. साथ ही, कमांड लाइन पर सेट की गई सुविधाएं हट जाएंगी.
platform( name = "repeat_demo", flags = [ "--features=feature_c", "--features=feature_d", ], )
इस वजह से, हमारा सुझाव है कि flags
एट्रिब्यूट में, बार-बार इस्तेमाल किए जा सकने वाले फ़्लैग का इस्तेमाल न करें.
प्लैटफ़ॉर्म इनहेरिटेंस
प्लैटफ़ॉर्म, parents
एट्रिब्यूट का इस्तेमाल करके, किसी ऐसे दूसरे प्लैटफ़ॉर्म की जानकारी दे सकते हैं जिससे उन्हें पाबंदी की वैल्यू इनहेरिट करनी है. parents
एट्रिब्यूट में सूची दी जा सकती है. हालांकि, फ़िलहाल एक से ज़्यादा वैल्यू नहीं दी जा सकतीं. साथ ही, एक से ज़्यादा पैरंट की जानकारी देना गड़बड़ी है.
किसी प्लैटफ़ॉर्म में पाबंदी की सेटिंग की वैल्यू की जांच करते समय, सबसे पहले सीधे constraint_values
एट्रिब्यूट के ज़रिए सेट की गई वैल्यू की जांच की जाती है. इसके बाद, पैरंट पर पाबंदी की वैल्यू की जांच की जाती है. यह प्रोसेस, पैरंट प्लैटफ़ॉर्म की चेन में बार-बार होती रहती है. इस तरह, सीधे किसी प्लैटफ़ॉर्म पर सेट की गई कोई भी वैल्यू, पैरंट पर सेट की गई वैल्यू को बदल देगी.
प्लैटफ़ॉर्म, पैरंट प्लैटफ़ॉर्म से exec_properties
एट्रिब्यूट को इनहेरिट करते हैं.
पैरंट और चाइल्ड प्लैटफ़ॉर्म के exec_properties
में मौजूद डिक्शनरी की एंट्री को एक साथ जोड़ दिया जाएगा.
अगर पेरेंट और चाइल्ड, दोनों के exec_properties
में एक ही कुंजी दिखती है, तो
चाइल्ड की वैल्यू का इस्तेमाल किया जाएगा. अगर चाइल्ड प्लैटफ़ॉर्म, वैल्यू के तौर पर खाली स्ट्रिंग तय करता है, तो उससे जुड़ी प्रॉपर्टी को अनसेट कर दिया जाएगा.
प्लैटफ़ॉर्म, पैरंट प्लैटफ़ॉर्म से remote_execution_properties
एट्रिब्यूट (इस्तेमाल नहीं किया जा रहा) को भी इनहेरिट कर सकते हैं. ध्यान दें: नए कोड में exec_properties
का इस्तेमाल किया जाना चाहिए. यहां बताए गए लॉजिक को लेगसी व्यवहार के साथ काम करने के लिए बनाए रखा गया है. हालांकि, इसे आने वाले समय में हटा दिया जाएगा.
अगर कोई पैरंट प्लैटफ़ॉर्म है, तो remote_execution_platform
को सेट करने का लॉजिक इस तरह का है:
-
अगर चाइल्ड प्लैटफ़ॉर्म पर
remote_execution_property
सेट नहीं है, तो पैरंट केremote_execution_properties
का इस्तेमाल किया जाएगा. -
अगर चाइल्ड प्लैटफ़ॉर्म पर
remote_execution_property
सेट है और उसमें लिटरल स्ट्रिंग {PARENT_REMOTE_EXECUTION_PROPERTIES} है, तो उस मैक्रो को पैरंट केremote_execution_property
एट्रिब्यूट के कॉन्टेंट से बदल दिया जाएगा. -
अगर चाइल्ड प्लैटफ़ॉर्म पर
remote_execution_property
सेट है और उसमें मैक्रो शामिल नहीं है, तो चाइल्ड केremote_execution_property
का इस्तेमाल बिना किसी बदलाव के किया जाएगा.
remote_execution_properties
का इस्तेमाल बंद कर दिया गया है और इसे हटा दिया जाएगा. इसलिए, एक ही इनहेरिटेंस चेन में remote_execution_properties
और exec_properties
को एक साथ इस्तेमाल करने की अनुमति नहीं है.
इस्तेमाल न किए जाने वाले
remote_execution_properties
के बजाय, exec_properties
का इस्तेमाल करें.
उदाहरण: कंस्ट्रेंट की वैल्यू
platform( name = "parent", constraint_values = [ "@platforms//os:linux", "@platforms//cpu:arm", ], ) platform( name = "child_a", parents = [":parent"], constraint_values = [ "@platforms//cpu:x86_64", ], ) platform( name = "child_b", parents = [":parent"], )
इस उदाहरण में, चाइल्ड प्लैटफ़ॉर्म में ये प्रॉपर्टी हैं:
-
child_a
में कंस्ट्रेंट वैल्यू@platforms//os:linux
(पैरंट से इनहेरिट की गई) और@platforms//cpu:x86_64
(सीधे प्लैटफ़ॉर्म पर सेट की गई) होती हैं. -
child_b
, पैरंट से सभी कंस्ट्रेंट वैल्यू इनहेरिट करता है और खुद से कोई वैल्यू सेट नहीं करता.
उदाहरण: एक्सीक्यूशन प्रॉपर्टी
platform( name = "parent", exec_properties = { "k1": "v1", "k2": "v2", }, ) platform( name = "child_a", parents = [":parent"], ) platform( name = "child_b", parents = [":parent"], exec_properties = { "k1": "child" } ) platform( name = "child_c", parents = [":parent"], exec_properties = { "k1": "" } ) platform( name = "child_d", parents = [":parent"], exec_properties = { "k3": "v3" } )
इस उदाहरण में, चाइल्ड प्लैटफ़ॉर्म में ये प्रॉपर्टी हैं:
-
child_a
, पैरंट की "exec_properties" को इनहेरिट करता है और अपनी सेट नहीं करता. -
child_b
, पैरंट कीexec_properties
वैल्यू इनहेरिट करता है औरk1
की वैल्यू को बदल देता है. इसकाexec_properties
:{ "k1": "child", "k2": "v2" }
होगा. -
child_c
, पैरंट केexec_properties
को इनहेरिट करता है औरk1
को अनसेट करता है. इसकाexec_properties
:{ "k2": "v2" }
होगा. -
child_d
, पैरंट कीexec_properties
को इनहेरिट करता है और एक नई प्रॉपर्टी जोड़ता है. इसकाexec_properties
:{ "k1": "v1", "k2": "v2", "k3": "v3" }
होगा.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
constraint_values
|
लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट तौर पर इस सूची में मौजूद हर |
exec_properties
|
डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; nonconfigurable; डिफ़ॉल्ट exec_properties एट्रिब्यूट का डेटा शामिल होता है.
अगर चाइल्ड और पैरंट प्लैटफ़ॉर्म में एक ही कुंजियां तय की जाती हैं, तो चाइल्ड की वैल्यू को रखा जाता है. खाली स्ट्रिंग वाली वैल्यू से जुड़ी सभी
की, डिक्शनरी से हटा दी जाती हैं.
यह एट्रिब्यूट, इस्तेमाल नहीं किए जा रहे
remote_execution_properties की जगह पूरी तरह से इस्तेमाल किया जा सकता है.
|
flags
|
स्ट्रिंग की सूची; कॉन्फ़िगर नहीं की जा सकती; डिफ़ॉल्ट |
parents
|
लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट तौर पर platform टारगेट का लेबल, जिसे इस प्लैटफ़ॉर्म को इनहेरिट करना चाहिए. हालांकि, एट्रिब्यूट में सूची शामिल की जाती है, लेकिन इसमें एक से ज़्यादा प्लैटफ़ॉर्म नहीं होने चाहिए. सीधे इस प्लैटफ़ॉर्म पर सेट नहीं की गई कोई भी
constraint_settings, पैरंट प्लैटफ़ॉर्म में दिखेगी.
ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म इनहेरिटेंस सेक्शन देखें.
|
remote_execution_properties
|
स्ट्रिंग; कॉन्फ़िगर नहीं की जा सकती; डिफ़ॉल्ट |
required_settings
|
लेबल की सूची; डिफ़ॉल्ट config_setting की सूची, जो टारगेट कॉन्फ़िगरेशन से मेल खानी चाहिए, ताकि टूलचेन रिज़ॉल्यूशन के दौरान इस प्लैटफ़ॉर्म का इस्तेमाल, एक्ज़ीक्यूशन प्लैटफ़ॉर्म के तौर पर किया जा सके.
ज़रूरी सेटिंग, पैरंट प्लैटफ़ॉर्म से इनहेरिट नहीं की जाती हैं.
|
टूल चेन
नियम का सोर्स देखेंtoolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)
यह नियम, किसी खास टूलचेन के टाइप और सीमाओं के बारे में बताता है, ताकि टूलचेन रिज़ॉल्यूशन के दौरान उसे चुना जा सके. ज़्यादा जानकारी के लिए, टूलचेन पेज देखें.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
exec_compatible_with
|
लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट तौर पर constraint_value की सूची, जिसे किसी प्लैटफ़ॉर्म पर टारगेट बनाने के लिए, उस प्लैटफ़ॉर्म पर टारगेट बनाने के लिए, इस टूलचेन को चुना जाना चाहिए.
|
target_compatible_with
|
लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट तौर पर constraint_value की सूची, जो टारगेट किए गए प्लैटफ़ॉर्म के लिए ज़रूरी है, ताकि उस प्लैटफ़ॉर्म के लिए टारगेट की गई बिल्डिंग के लिए, इस टूलचेन को चुना जा सके.
|
target_settings
|
लेबल की सूची; डिफ़ॉल्ट config_setting की सूची, जो टारगेट कॉन्फ़िगरेशन से मेल खानी चाहिए, ताकि टूलचेन रिज़ॉल्यूशन के दौरान इस टूलचेन को चुना जा सके.
|
toolchain
|
नाम; यह ज़रूरी है यह टारगेट, उस टूल या टूल सुइट को दिखाता है जो इस टूलचैन को चुनने पर उपलब्ध कराया जाता है. |
toolchain_type
|
लेबल; कॉन्फ़िगर नहीं किया जा सकता; ज़रूरी है toolchain_type टारगेट का लेबल, जो इस टूलचैन की भूमिका के बारे में बताता है.
|
toolchain_type
नियम का सोर्स देखेंtoolchain_type(name, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
यह नियम, टूलचेन का एक नया टाइप तय करता है -- एक आसान टारगेट, जो टूल की एक क्लास को दिखाता है. यह क्लास, अलग-अलग प्लैटफ़ॉर्म के लिए एक ही भूमिका निभाती है.
ज़्यादा जानकारी के लिए, टूलचेन पेज देखें.
उदाहरण
यह किसी कस्टम नियम के लिए टूलचेन का टाइप तय करता है.
toolchain_type( name = "bar_toolchain_type", )
इसका इस्तेमाल bzl फ़ाइल में किया जा सकता है.
bar_binary = rule( implementation = _bar_binary_impl, attrs = { "srcs": attr.label_list(allow_files = True), ... # No `_compiler` attribute anymore. }, toolchains = ["//bar_tools:toolchain_type"] )
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |