प्लैटफ़ॉर्म और टूलचेन के नियम

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 .

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

नियम

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

नाम; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट None है

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

अगर किसी कंस्ट्रेंट सेटिंग की कोई डिफ़ॉल्ट वैल्यू है, तो जब भी किसी प्लैटफ़ॉर्म में उस सेटिंग के लिए कोई कंस्ट्रेंट वैल्यू शामिल नहीं होती, तब यह ठीक वैसा ही होता है जैसा प्लैटफ़ॉर्म ने डिफ़ॉल्ट वैल्यू तय की थी. अगर कोई डिफ़ॉल्ट वैल्यू नहीं है, तो उस प्लैटफ़ॉर्म के लिए, पाबंदी की सेटिंग को तय नहीं माना जाता. ऐसे में, प्लैटफ़ॉर्म किसी भी पाबंदी वाली सूची (जैसे, config_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",
)
इसके बाद, प्लैटफ़ॉर्म यह एलान कर सकते हैं कि उनके पास x86_64, arm वगैरह के विकल्प के तौर पर mips आर्किटेक्चर है.

तर्क

विशेषताएं
name

नाम; यह ज़रूरी है

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

constraint_setting

लेबल; कॉन्फ़िगर नहीं किया जा सकता; ज़रूरी है

वह constraint_setting जिसके लिए यह constraint_value एक संभावित विकल्प है.

प्लैटफ़ॉर्म

नियम का सोर्स देखें
platform(name, constraint_values, deprecation, distribs, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)

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

उदाहरण

यह एक ऐसा प्लैटफ़ॉर्म तय करता है जो ARM पर Linux चलाने वाले किसी भी एनवायरमेंट के बारे में बताता है.

platform(
    name = "linux_arm",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)

प्लैटफ़ॉर्म इनहेरिटेंस

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

किसी प्लैटफ़ॉर्म में पाबंदी की सेटिंग की वैल्यू की जांच करते समय, सबसे पहले सीधे constraint_values एट्रिब्यूट के ज़रिए सेट की गई वैल्यू की जांच की जाती है. इसके बाद, पैरंट की पाबंदी की वैल्यू की जांच की जाती है. इससे, पैरंट प्लैटफ़ॉर्म की चेन बार-बार बढ़ रही है. इस तरह, सीधे किसी प्लैटफ़ॉर्म पर सेट की गई कोई भी वैल्यू, पैरंट पर सेट की गई वैल्यू को बदल देगी.

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

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

  1. अगर remote_execution_property चाइल्ड प्लैटफ़ॉर्म पर सेट नहीं है, तो माता-पिता के remote_execution_properties का इस्तेमाल किया जाएगा.
  2. अगर चाइल्ड प्लैटफ़ॉर्म पर remote_execution_property सेट है और उसमें लिटरल स्ट्रिंग {PARENT_REMOTE_EXECUTION_PROPERTIES} है, तो उस मैक्रो को पैरंट के remote_execution_property एट्रिब्यूट के कॉन्टेंट से बदल दिया जाएगा.
  3. अगर चाइल्ड प्लैटफ़ॉर्म पर 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

लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट तौर पर []

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

इस सूची में मौजूद हर constraint_value, किसी अलग constraint_setting के लिए होना चाहिए. उदाहरण के लिए, ऐसा प्लैटफ़ॉर्म नहीं बनाया जा सकता जिसके लिए, प्रोसेसर के आर्किटेक्चर को @platforms//cpu:x86_64 और @platforms//cpu:arm, दोनों के तौर पर सेट करना ज़रूरी हो.

exec_properties

डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; nonconfigurable; डिफ़ॉल्ट {} है

स्ट्रिंग का एक मैप, जो रिमोट तौर पर कार्रवाइयों को लागू करने के तरीके पर असर डालता है. Basel ने इसे समझने की कोशिश नहीं की. इसे ओपेक डेटा के तौर पर देखा जाता है जिसे रिमोट एक्ज़ीक्यूशन प्रोटोकॉल के प्लैटफ़ॉर्म फ़ील्ड के ज़रिए फ़ॉरवर्ड किया जाता है. इसमें पैरंट प्लैटफ़ॉर्म के exec_properties एट्रिब्यूट का कोई भी डेटा शामिल है. अगर चाइल्ड और पैरंट प्लैटफ़ॉर्म एक ही कुंजी तय करते हैं, तो बच्चे की वैल्यू रखी जाती हैं. खाली स्ट्रिंग वाली वैल्यू से जुड़ी सभी की, डिक्शनरी से हटा दी जाती हैं. यह एट्रिब्यूट, इस्तेमाल नहीं किए जा रहे remote_execution_properties की जगह पूरी तरह से इस्तेमाल किया जा सकता है.
parents

लेबल की सूची; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट तौर पर []

platform टारगेट का लेबल, जिसे इस प्लैटफ़ॉर्म को इनहेरिट करना चाहिए. हालांकि, एट्रिब्यूट में सूची शामिल की जाती है, लेकिन इसमें एक से ज़्यादा प्लैटफ़ॉर्म नहीं होने चाहिए. सीधे इस प्लैटफ़ॉर्म पर सेट नहीं की गई कोई भी constraint_settings, पैरंट प्लैटफ़ॉर्म में दिखेगी. ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म इनहेरिटेंस सेक्शन देखें.
remote_execution_properties

स्ट्रिंग; कॉन्फ़िगर नहीं की जा सकती; डिफ़ॉल्ट "" है

रुका हुआ विज्ञापन. इसके बजाय, कृपया exec_properties एट्रिब्यूट का इस्तेमाल करें. रिमोट तरीके से प्रोग्राम चलाने वाले प्लैटफ़ॉर्म को कॉन्फ़िगर करने के लिए इस्तेमाल की जाने वाली स्ट्रिंग. असल बिल्ड, इसकी जानकारी को समझने की कोशिश नहीं करते. इसे ऐसे डेटा के तौर पर माना जाता है जिसका इस्तेमाल किसी खास SpawnRunner के ज़रिए किया जा सकता है. इसमें पैरंट प्लैटफ़ॉर्म के "remote_execution_properties" एट्रिब्यूट का डेटा शामिल हो सकता है. इसके लिए, "{PARENT_REMOTE_EXECUTION_PROPERTIES}" मैक्रो का इस्तेमाल करें. ज़्यादा जानकारी के लिए, प्लैटफ़ॉर्म इनहेरिटेंस सेक्शन देखें.

टूल चेन

नियम का सोर्स देखें
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

नाम; यह ज़रूरी है

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