नियम
- cc_binary
- cc_import
- cc_library
- cc_proto_library
- cc_shared_library
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
- cc_test
- cc_toolchain
- cc_toolchain_suite
cc_binary
नियम का सोर्स देखेंcc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
इंप्लिसिट आउटपुट टारगेट
name.stripped
(सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो): बाइनरी का ऐसा वर्शन जिसमें कुछ सुविधाएं हटाई गई हों. डीबग सिंबल हटाने के लिए,strip -g
को बाइनरी पर चलाया जाता है. कमांड लाइन पर,--stripopt=-foo
का इस्तेमाल करके स्ट्रिप के अन्य विकल्प दिए जा सकते हैं. यह आउटपुट सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो.name.dwp
(सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो): अगर Fission चालू है, तो यह डिबग करने के लिए जानकारी देने वाला पैकेज है. यह रिमोट तौर पर डिप्लॉय की गई बाइनरी को डिबग करने के लिए सही है. ऐसा भी हो सकता है: एक खाली फ़ाइल.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट ये |
srcs
|
लेबल की सूची; डिफ़ॉल्ट
सभी अगर किसी नियम का नाम
अनुमति वाले
...और उन फ़ाइलों को बनाने वाले किसी भी नियम के बारे में बताया है. अलग-अलग एक्सटेंशन, gcc कन्वेंशन के मुताबिक अलग-अलग प्रोग्रामिंग भाषाओं को दिखाते हैं. |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज में सुविधा
|
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए, कमपाइल करने की कमांड लाइन में जोड़ा जाता है. साथ ही, इस पर निर्भर हर नियम में भी इसे जोड़ा जाता है. हर स्ट्रिंग में एक ही Bourne shell टोकन होना चाहिए. बहुत सावधानी बरतें, क्योंकि इससे कई चीज़ों पर असर पड़ सकता है. अगर आपको नहीं पता कि जीटीआईएन सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट
"वैरिएबल बनाएं" विकल्प के हिसाब से बदला जा सकता है.
हर स्ट्रिंग को हेडर को srcs या hdrs में जोड़ना ज़रूरी है. ऐसा न करने पर, कंपाइलेशन को सैंडबॉक्स में डालने पर (डिफ़ॉल्ट रूप से), वे हेडर उन नियमों के लिए उपलब्ध नहीं होंगे जिन पर वे निर्भर हैं. |
link_extra_lib
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी को |
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट LINKOPTS में जोड़ा जाता है.
इस सूची के हर उस एलिमेंट को |
linkshared
|
बूलियन; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट है linkshared=True शामिल करें. डिफ़ॉल्ट रूप से, यह विकल्प बंद होता है.
इस फ़्लैग की मौजूदगी का मतलब है कि
|
linkstatic
|
बूलियन; डिफ़ॉल्ट तौर पर cc_binary और
cc_test के लिए: बाइनरी को स्टैटिक
मोड में लिंक करें. cc_library.linkstatic के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प, बाइल्ड टूल को उपयोगकर्ता लाइब्रेरी के लिए, किसी एक्ज़ीक्यूटेबल को लिंक करने के वास्तव में तीन अलग-अलग तरीके हैं:
अगर |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D से पहले जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ी जाती है,
लेकिन इससे जुड़े डिपेंडेंट्स के साथ नहीं.
|
malloc
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी को |
nocopts
|
स्ट्रिंग; डिफ़ॉल्ट रूप से COPTS (इसमें नियम के copts एट्रिब्यूट में साफ़ तौर पर बताई गई वैल्यू भी शामिल हैं) को इस नियम को इकट्ठा करने के मकसद से, COPTS से हटा दिया जाएगा.
इस एट्रिब्यूट की ज़रूरत बहुत कम पड़ती है.
|
stamp
|
पूर्णांक; डिफ़ॉल्ट
स्टैंप की गई बाइनरी को तब तक फिर से नहीं बनाया जाता, जब तक उनकी डिपेंडेंसी में बदलाव न हो जाए. |
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. शेयर की गई लाइब्रेरी को लिंक करते समय, सिंबल एक्सपोर्ट करने के लिए, इसका इस्तेमाल किया जा सकता है. |
cc_import
नियम का सोर्स देखेंcc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, visibility)
cc_import
नियमों की मदद से, उपयोगकर्ता पहले से कंपाइल की गई C/C++ लाइब्रेरी इंपोर्ट कर सकते हैं.
यहां इस्तेमाल के सामान्य उदाहरण दिए गए हैं:
1. स्टैटिक लाइब्रेरी को लिंक करना
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", # If alwayslink is turned on, # libmylib.a will be forcely linked into any binary that depends on it. # alwayslink = 1, )2. शेयर की गई लाइब्रेरी (Unix) को लिंक करना
cc_import( name = "mylib", hdrs = ["mylib.h"], shared_library = "libmylib.so", )3. शेयर की गई लाइब्रेरी को इंटरफ़ेस लाइब्रेरी (Windows) से लिंक करना
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is an import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll will be available for runtime shared_library = "mylib.dll", )4. शेयर की गई लाइब्रेरी को
system_provided=True
(Windows) के साथ लिंक करना
cc_import( name = "mylib", hdrs = ["mylib.h"], # mylib.lib is an import library for mylib.dll which will be passed to linker interface_library = "mylib.lib", # mylib.dll is provided by system environment, for example it can be found in PATH. # This indicates that Bazel is not responsible for making mylib.dll available. system_provided = 1, )5. स्टैटिक या शेयर की गई लाइब्रेरी से लिंक करना
Unix पर:
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", shared_library = "libmylib.so", ) # first will link to libmylib.a cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to libmylib.so cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )Windows पर:
cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.lib", # A normal static library interface_library = "mylib.lib", # An import library for mylib.dll shared_library = "mylib.dll", ) # first will link to libmylib.lib cc_binary( name = "first", srcs = ["first.cc"], deps = [":mylib"], linkstatic = 1, # default value ) # second will link to mylib.dll through mylib.lib cc_binary( name = "second", srcs = ["second.cc"], deps = [":mylib"], linkstatic = 0, )
cc_import
में, शामिल करें एट्रिब्यूट का इस्तेमाल किया जा सकता है. उदाहरण के लिए:
cc_import( name = "curl_lib", hdrs = glob(["vendor/curl/include/curl/*.h"]), includes = [ "vendor/curl/include" ], shared_library = "vendor/curl/lib/.libs/libcurl.dylib", )
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट deps के बारे में सामान्य टिप्पणियां देखने के लिए, ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं.
|
hdrs
|
लेबल की सूची; डिफ़ॉल्ट |
alwayslink
|
बूलियन; डिफ़ॉल्ट तौर पर अगर Windows पर VS 2017 के साथ alwayslink काम नहीं करता है, तो इसकी वजह जानी-पहचानी समस्या है. कृपया अपने VS 2017 को नए वर्शन में अपग्रेड करें. |
interface_library
|
लेबल; डिफ़ॉल्ट इस्तेमाल किए जा सकने वाले फ़ाइल टाइप:
|
shared_library
|
लेबल; डिफ़ॉल्ट इस्तेमाल किए जा सकने वाले फ़ाइल टाइप:
|
static_library
|
लेबल; डिफ़ॉल्ट इस्तेमाल किए जा सकने वाले फ़ाइल टाइप:
|
system_provided
|
बूलियन; डिफ़ॉल्ट तौर पर interface_library बताया जाना चाहिए और shared_library खाली होना चाहिए.
|
cc_library
नियम का सोर्स देखेंcc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
हेडर शामिल करने की जांच
बिल्ड में इस्तेमाल की जाने वाली सभी हेडर फ़ाइलों का एलान, hdrs
या cc_*
के srcs
नियमों में किया जाना चाहिए. यह नियम लागू है.
cc_library
के नियमों के हिसाब से, hdrs
के हेडर, लाइब्रेरी का सार्वजनिक इंटरफ़ेस होते हैं. साथ ही, इन्हें लाइब्रेरी की hdrs
और srcs
, दोनों फ़ाइलों में सीधे शामिल किया जा सकता है. साथ ही, इन्हें hdrs
और cc_*
नियमों की srcs
फ़ाइलों में भी शामिल किया जा सकता है, जो deps
में लाइब्रेरी के बारे में जानकारी देते हैं.
srcs
के हेडर, सिर्फ़ लाइब्रेरी के hdrs
और srcs
की फ़ाइलों से ही शामिल किए जाने चाहिए. हेडर को hdrs
या srcs
में डालने का फ़ैसला करते समय, आपको यह तय करना चाहिए कि क्या आपको इस लाइब्रेरी के उपभोक्ताओं को इसे सीधे तौर पर शामिल करने की अनुमति देनी है. यह फ़ैसला, प्रोग्रामिंग भाषाओं में public
और private
के बीच विज़िबिलिटी तय करने के फ़ैसले जैसा ही है.
cc_binary
और cc_test
नियमों का एक्सपोर्ट किया गया इंटरफ़ेस नहीं होता. इसलिए, इनमें hdrs
एट्रिब्यूट भी नहीं होता. सीधे तौर पर बाइनरी या टेस्ट से जुड़े सभी हेडर, srcs
में शामिल होने चाहिए.
इन नियमों को समझने के लिए, नीचे दिया गया उदाहरण देखें.
cc_binary( name = "foo", srcs = [ "foo.cc", "foo.h", ], deps = [":bar"], ) cc_library( name = "bar", srcs = [ "bar.cc", "bar-impl.h", ], hdrs = ["bar.h"], deps = [":baz"], ) cc_library( name = "baz", srcs = [ "baz.cc", "baz-impl.h", ], hdrs = ["baz.h"], )
इस उदाहरण में, सीधे तौर पर शामिल किए जा सकने वाले एलिमेंट की सूची नीचे दी गई टेबल में दी गई है. उदाहरण के लिए,
foo.cc
के पास सीधे तौर पर foo.h
और bar.h
को शामिल करने की अनुमति है, लेकिन
baz.h
को नहीं.
फ़ाइल शामिल करना | शामिल करने की अनुमति है |
---|---|
foo.h | bar.h |
foo.cc | foo.h bar.h |
bar.h | bar-impl.h baz.h |
bar-impl.h | bar.h baz.h |
bar.cc | bar.h bar-impl.h baz.h |
baz.h | baz-impl.h |
baz-impl.h | baz.h |
baz.cc | baz.h baz-impl.h |
शामिल करने की जांच के नियम सिर्फ़ डायरेक्ट
शामिल किए गए आइटम पर लागू होते हैं. ऊपर दिए गए उदाहरण में, foo.cc
में bar.h
शामिल करने की अनुमति है. bar.h
में baz.h
शामिल हो सकता है और baz.h
में baz-impl.h
शामिल हो सकता है. तकनीकी तौर पर, .cc
फ़ाइल को कंपाइल करने पर, deps
क्लोज़र में मौजूद किसी भी cc_library
में, hdrs
या srcs
में ट्रांज़िटिव तौर पर कोई भी हेडर फ़ाइल शामिल हो सकती है. इस मामले में, foo.cc
को कंपाइल करते समय कंपाइलर, baz.h
और baz-impl.h
को पढ़ सकता है. हालांकि, foo.cc
में #include "baz.h"
नहीं होना चाहिए. इसके लिए,
foo
के deps
में baz
को जोड़ना होगा.
शामिल करने की जांच के नियमों को लागू करने के लिए, Bazel टूलचेन की सहायता पर निर्भर करता है.
यह ज़रूरी है कि layering_check
सुविधा, टूलचेन के साथ काम करती हो और
इसके लिए साफ़ तौर पर अनुरोध किया गया हो. उदाहरण के लिए,
--features=layering_check
कमांड-लाइन फ़्लैग या
package
फ़ंक्शन के
features
पैरामीटर के ज़रिए. Bazel के ज़रिए उपलब्ध कराए गए टूलचेन, सिर्फ़ Unix और macOS पर clang के साथ इस सुविधा के साथ काम करते हैं.
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट ये |
srcs
|
लेबल की सूची; डिफ़ॉल्ट
सभी अगर किसी नियम का नाम
अनुमति वाले
...और उन फ़ाइलों को जनरेट करने वाले नियम. अलग-अलग एक्सटेंशन, gcc कन्वेंशन के मुताबिक अलग-अलग प्रोग्रामिंग भाषाओं को दिखाते हैं. |
hdrs
|
लेबल की सूची; डिफ़ॉल्ट लाइब्रेरी के इंटरफ़ेस के बारे में बताने वाली हेडर फ़ाइलों को एलान करने के लिए, यह सबसे सही जगह है. ये हेडर,
इस नियम में मौजूद सोर्स से या अलग-अलग नियमों में शामिल किए जाने के लिए उपलब्ध कराए जाएंगे.
जिन हेडर को इस लाइब्रेरी के क्लाइंट को शामिल नहीं करना है उन्हें |
additional_compiler_inputs
|
लेबल की सूची; डिफ़ॉल्ट |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
alwayslink
|
बूलियन; डिफ़ॉल्ट तौर पर srcs में दी गई फ़ाइलों की सभी ऑब्जेक्ट फ़ाइलों को लिंक करेगी. भले ही, कुछ फ़ाइलों में बाइनरी का रेफ़रंस देने वाला कोई सिंबल न हो.
यह तब काम आता है, जब साफ़ तौर पर आपके कोड को बाइनरी में कोड के ज़रिए कॉल न किया गया हो. उदाहरण के लिए, जब आपका कोड किसी सेवा से मिलने वाले कॉलबैक
के लिए रजिस्टर होता है.
अगर Windows पर VS 2017 के साथ alwayslink काम नहीं करता है, तो इसकी वजह जानी-पहचानी समस्या है. कृपया अपने VS 2017 को नए वर्शन में अपग्रेड करें. |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज, सुविधा
|
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए, कमपाइल करने की कमांड लाइन में जोड़ा जाता है. साथ ही, इस पर निर्भर हर नियम में भी इसे जोड़ा जाता है. हर स्ट्रिंग में एक ही Bourne shell टोकन होना चाहिए. बहुत सावधानी बरतें, क्योंकि इससे कई चीज़ों पर असर पड़ सकता है. अगर आपको नहीं पता कि जीटीआईएन सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
implementation_deps
|
लेबल की सूची; डिफ़ॉल्ट deps के उलट, इन लाइब्रेरी के हेडर और शामिल किए गए पाथ (और उन सभी ट्रांज़िशन डिपेंडेंसी) का इस्तेमाल सिर्फ़ इस लाइब्रेरी को कंपाइल करने के लिए किया जाता है, न कि उन लाइब्रेरी के लिए जिन पर यह निर्भर करती है. implementation_deps के साथ तय की गई लाइब्रेरी अब भी इस लाइब्रेरी पर निर्भर
बाइनरी टारगेट में लिंक हैं.
फ़िलहाल, इसका इस्तेमाल सिर्फ़ cc_libraries के लिए किया जा सकता है. साथ ही, इसे |
include_prefix
|
स्ट्रिंग; डिफ़ॉल्ट रूप से सेट होने पर, इस नियम के इस प्रीफ़िक्स को जोड़ने से पहले, |
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
"वैरिएबल बनाएं" विकल्प के हिसाब से बदला जा सकता है.
हर स्ट्रिंग को हेडर को srcs या hdrs में जोड़ना ज़रूरी है. ऐसा न करने पर, कंपाइलेशन को सैंडबॉक्स में डालने पर (डिफ़ॉल्ट रूप से), वे हेडर उन नियमों के लिए उपलब्ध नहीं होंगे जिन पर वे निर्भर हैं. |
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से LINKOPTS में जोड़ा जाता है.
इस सूची के हर उस एलिमेंट को |
linkstamp
|
लेबल; डिफ़ॉल्ट base पैकेज में होनी चाहिए.
|
linkstatic
|
बूलियन; डिफ़ॉल्ट cc_binary और
cc_test के लिए: बाइनरी को स्टैटिक
मोड में लिंक करें. cc_library.linkstatic के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प, बाइल्ड टूल को उपयोगकर्ता लाइब्रेरी के लिए, किसी एक्सीक्यूटेबल को लिंक करने के तीन तरीके हैं:
अगर |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए, कमपाइल करने की कमांड लाइन में जोड़ा जाता है, लेकिन इसके डिपेंडेंट में नहीं. हर स्ट्रिंग में एक ही Bourne शेल टोकन होना चाहिए.
|
nocopts
|
स्ट्रिंग; डिफ़ॉल्ट रूप से COPTS (इसमें नियम के copts एट्रिब्यूट में साफ़ तौर पर बताई गई वैल्यू भी शामिल हैं) को इस नियम को कॉम्पाइल करने के लिए, COPTS से हटा दिया जाएगा.
इस एट्रिब्यूट की ज़रूरत शायद ही कभी पड़े.
|
strip_include_prefix
|
स्ट्रिंग; डिफ़ॉल्ट रूप से अगर नीति को सेट किया जाता है, तो इस नियम के अगर यह कोई रिलेटिव पाथ है, तो इसे पैकेज के हिसाब से रिलेटिव पाथ माना जाता है. अगर यह ऐब्सलूट पाथ है, तो इसे रिपॉज़िटरी से रिलेटिव पाथ माना जाता है. इस प्रीफ़िक्स को हटाने के बाद, |
textual_hdrs
|
लेबल की सूची; डिफ़ॉल्ट इस सेक्शन में उन हेडर फ़ाइलों के बारे में बताया जाता है जिन्हें अपने-आप कंपाइल नहीं किया जा सकता. इसका मतलब है कि मान्य कोड बनाने के लिए, उन्हें हमेशा दूसरी सोर्स फ़ाइलों में टेक्स्ट के तौर पर शामिल करना ज़रूरी होता है. |
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_proto_library
नियम का सोर्स देखेंcc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
cc_proto_library
, .proto
फ़ाइलों से C++ कोड जनरेट करता है.
deps
फ़ंक्शन, proto_library
के नियमों पर ले जाने वाला होना चाहिए.
उदाहरण:
cc_library( name = "lib", deps = [":foo_cc_proto"], ) cc_proto_library( name = "foo_cc_proto", deps = [":foo_proto"], ) proto_library( name = "foo_proto", )
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट proto_library के नियमों की सूची.
|
cc_shared_library
नियम का सोर्स देखेंcc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, win_def_file)
इससे एक शेयर की गई लाइब्रेरी बनती है.
उदाहरण
cc_shared_library( name = "foo_shared", deps = [ ":foo", ], dynamic_deps = [ ":bar_shared", ], additional_linker_inputs = [ ":foo.lds", ], user_link_flags = [ "-Wl,--version-script=$(location :foo.lds)", ], ) cc_library( name = "foo", srcs = ["foo.cc"], hdrs = ["foo.h"], deps = [ ":bar", ":baz", ], ) cc_shared_library( name = "bar_shared", shared_lib_name = "bar.so", deps = [":bar"], ) cc_library( name = "bar", srcs = ["bar.cc"], hdrs = ["bar.h"], ) cc_library( name = "baz", srcs = ["baz.cc"], hdrs = ["baz.h"], )
उदाहरण में, foo_shared
, foo
और baz
को स्टैटिक तौर पर लिंक करता है. baz
, ट्रांज़िशन डिपेंडेंसी है. यह bar
को लिंक नहीं करता, क्योंकि यह पहले से ही dynamic_dep
bar_shared
की मदद से डाइनैमिक तौर पर उपलब्ध होता है.
foo_shared
, लिंकर स्क्रिप्ट *.lds फ़ाइल का इस्तेमाल करके यह कंट्रोल करता है कि किन सिंबल को एक्सपोर्ट किया जाना चाहिए. cc_shared_library
नियम वाला लॉजिक, यह कंट्रोल नहीं करता कि कौनसे सिंबल एक्सपोर्ट किए जा सकते हैं. यह सिर्फ़ उस डेटा का इस्तेमाल करता है जिसे एक्सपोर्ट के दौरान गड़बड़ी मिलती है. ऐसा तब होता है, जब शेयर की गई दो लाइब्रेरी एक जैसे टारगेट एक्सपोर्ट करती हैं.
cc_shared_library
की हर डायरेक्ट डिपेंडेंसी को एक्सपोर्ट किया गया माना जाता है. इसलिए, विश्लेषण के दौरान Bazel यह मानता है कि foo
को foo_shared
से एक्सपोर्ट किया जा रहा है. baz
को foo_shared
से एक्सपोर्ट नहीं किया जाता. exports_filter
से मैच होने वाले हर टारगेट को एक्सपोर्ट भी माना जाता है.
उदाहरण में मौजूद हर cc_library
, ज़्यादा से ज़्यादा एक
cc_shared_library
में दिखना चाहिए. अगर हमें baz
को भी bar_shared
से लिंक करना है, तो हमें baz
में tags = ["LINKABLE_MORE_THAN_ONCE"]
जोड़ना होगा.
shared_lib_name
एट्रिब्यूट की वजह से bar_shared
की बनाई हुई फ़ाइल का नाम bar.so
होगा, जबकि Linux का नाम डिफ़ॉल्ट रूप से libbar.so
होगा.
गड़बड़ियां
Two shared libraries in dependencies export the same symbols.
ऐसा तब होता है, जब दो अलग-अलग cc_shared_library
डिपेंडेंसी के साथ कोई टारगेट बनाया जाता है और एक ही टारगेट को एक्सपोर्ट किया जाता है. इस समस्या को ठीक करने के लिए, आपको cc_shared_library
डिपेंडेंसी में से किसी एक में लाइब्रेरी को एक्सपोर्ट होने से रोकना होगा.
Two shared libraries in dependencies link the same library statically
ऐसा तब होगा, जब दो अलग-अलग cc_shared_library
डिपेंडेंसी के साथ नया cc_shared_library
बनाया जा रहा हो, जो एक ही टारगेट को स्टैटिक तौर पर लिंक करते हों.
एक्सपोर्ट करने से जुड़ी गड़बड़ी से मिलती-जुलती.
इस समस्या को ठीक करने का एक तरीका यह है कि लाइब्रेरी को किसी cc_shared_library
डिपेंडेंसी से लिंक करना बंद कर दिया जाए. साथ ही, जिस व्यक्ति ने अब भी लाइब्रेरी को लिंक किया है उसे लाइब्रेरी एक्सपोर्ट करनी होगी, ताकि जिसने लाइब्रेरी को अनलिंक किया है वह सिंबल देख सके. टारगेट को एक्सपोर्ट करने वाली तीसरी लाइब्रेरी का इस्तेमाल करना भी एक तरीका है.
तीसरा तरीका यह है कि समस्या वाले cc_library
को LINKABLE_MORE_THAN_ONCE
के साथ टैग करें. हालांकि, ऐसा बहुत कम किया जाना चाहिए. साथ ही, आपको यह पक्का करना होगा कि cc_library
को एक से ज़्यादा बार लिंक करना वाकई सुरक्षित है.
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
इसका मतलब है कि आपके deps
के ट्रांज़िशन क्लोज़र में मौजूद लाइब्रेरी को, cc_shared_library
की किसी भी डिपेंडेंसी के ज़रिए ऐक्सेस किया जा सकता है. हालांकि, यह पहले से ही dynamic_deps
में किसी दूसरी cc_shared_library
से लिंक है और इसे एक्सपोर्ट नहीं किया गया है.
इसे ठीक करने के लिए, इसे cc_shared_library
डिपेंडेंसी से एक्सपोर्ट करें या इसे एक्सपोर्ट करने वाले तीसरे cc_shared_library
का इस्तेमाल करें.
Do not place libraries which only contain a precompiled dynamic library in deps.
अगर आपके पास पहले से कंपाइल की गई डाइनैमिक लाइब्रेरी है, तो इसे मौजूदा cc_shared_library
टारगेट के साथ स्टैटिक रूप से लिंक करने की ज़रूरत नहीं है और न ही इसे लिंक किया जा सकता है. इसलिए, यह cc_shared_library
के deps
में नहीं है. अगर पहले से कंपाइल की गई यह डाइनैमिक लाइब्रेरी, आपके किसी cc_libraries
की डिपेंडेंसी है, तो cc_library
को सीधे तौर पर उस पर निर्भर करना होगा.
Trying to export a library already exported by a different shared library
आपको यह गड़बड़ी तब दिखेगी, जब मौजूदा नियम के तहत, किसी ऐसे टारगेट को एक्सपोर्ट करने का दावा किया जा रहा हो जिसे आपकी किसी डाइनैमिक डिपेंडेंसी से पहले से ही एक्सपोर्ट किया जा रहा है.
इसे ठीक करने के लिए, deps
से टारगेट को हटाएं और डाइनैमिक डिपेंडेंसी से इस पर भरोसा रखें या पक्का करें कि exports_filter
इस टारगेट को न समझ सके.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट
इन डायरेक्ट डिपार्टमेंट की सभी ट्रांज़िटिव लाइब्रेरी डिपेंडेंसी को शेयर की गई
लाइब्रेरी में लिंक किया जाएगा. ऐसा तब तक होगा, जब तक उन्हें
विश्लेषण के दौरान, नियम लागू करने की प्रोसेस में
लागू करने की वजह से जब भी एक लाइब्रेरी स्टैटिक रूप से एक से ज़्यादा |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट user_link_flags एट्रिब्यूट के ज़रिए किया जा सकता है.
|
dynamic_deps
|
लेबल की सूची; डिफ़ॉल्ट cc_shared_library की अन्य डिपेंडेंसी हैं, जिन पर मौजूदा टारगेट निर्भर करता है.
लागू करने के लिए |
exports_filter
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
शेयर की गई लाइब्रेरी से, किसी भी टारगेट
ध्यान दें कि यह एट्रिब्यूट, उन टारगेट में डिपेंडेंसी एज नहीं जोड़ रहा है. इसके बजाय, डिपेंडेंसी एज को इस सिंटैक्स की अनुमति है:
|
shared_lib_name
|
स्ट्रिंग; डिफ़ॉल्ट रूप से |
user_link_flags
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से cc_shared_library( name = "foo_shared", additional_linker_inputs = select({ "//src/conditions:linux": [ ":foo.lds", ":additional_script.txt", ], "//conditions:default": []}), user_link_flags = select({ "//src/conditions:linux": [ "-Wl,-rpath,kittens", "-Wl,--version-script=$(location :foo.lds)", "-Wl,--script=$(location :additional_script.txt)", ], "//conditions:default": []}), ... ) |
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब करना चाहिए, जब Windows टारगेट किया गया प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
fdo_prefetch_hints
नियम का सोर्स देखेंfdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)
यह FDO प्रीफ़ेच के सुझावों वाली प्रोफ़ाइल दिखाती है, जो वर्कस्पेस में या किसी तय किए गए सटीक पाथ पर मौजूद होती है. उदाहरण:
fdo_prefetch_hints( name = "hints", profile = "//path/to/hints:profile.afdo", ) fdo_profile( name = "hints_abs", absolute_path_profile = "/absolute/path/profile.afdo", )
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
profile
|
लेबल; डिफ़ॉल्ट |
fdo_profile
नियम का सोर्स देखेंfdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)
यह ऐसी एफ़डीओ प्रोफ़ाइल दिखाता है जो वर्कस्पेस में है या बताए गए ऐब्सलूट पाथ पर है. उदाहरण:
fdo_profile( name = "fdo", profile = "//path/to/fdo:profile.zip", ) fdo_profile( name = "fdo_abs", absolute_path_profile = "/absolute/path/profile.zip", )
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
absolute_path_profile
|
स्ट्रिंग; डिफ़ॉल्ट तौर पर |
profile
|
लेबल; डिफ़ॉल्ट |
proto_profile
|
लेबल; डिफ़ॉल्ट |
memprof_profile
नियम का सोर्स देखेंmemprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)
यह MEMPROF प्रोफ़ाइल को दिखाता है, जो वर्कस्पेस में या बताए गए सटीक पाथ पर होता है. उदाहरण:
memprof_profile( name = "memprof", profile = "//path/to/memprof:profile.afdo", ) memprof_profile( name = "memprof_abs", absolute_path_profile = "/absolute/path/profile.afdo", )
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
absolute_path_profile
|
स्ट्रिंग; डिफ़ॉल्ट रूप से |
profile
|
लेबल; डिफ़ॉल्ट |
propeller_optimize
नियम का सोर्स देखेंpropeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
Workspace में Propeller ऑप्टिमाइज़ेशन प्रोफ़ाइल दिखाता है. उदाहरण:
propeller_optimize( name = "layout", cc_profile = "//path:cc_profile.txt", ld_profile = "//path:ld_profile.txt" ) propeller_optimize( name = "layout_absolute", absolute_cc_profile = "/absolute/cc_profile.txt", absolute_ld_profile = "/absolute/ld_profile.txt" )
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
ld_profile
|
लेबल; डिफ़ॉल्ट |
cc_test
नियम का सोर्स देखेंcc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, link_extra_lib, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट ये |
srcs
|
लेबल की सूची; डिफ़ॉल्ट
सभी अगर किसी नियम का नाम
अनुमति वाले
...और उन फ़ाइलों को जनरेट करने वाले नियम. अलग-अलग एक्सटेंशन, जीसीसी के नियमों के मुताबिक अलग-अलग प्रोग्रामिंग भाषाओं को दिखाते हैं. |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज में सुविधा
|
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D से पहले जोड़ा जाता है. इसके बाद, स्ट्रिंग को इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. साथ ही, स्ट्रिंग पर
निर्भर हर नियम में भी इसे जोड़ा जाता है. बहुत सावधानी बरतें, क्योंकि इससे कई चीज़ों पर असर पड़ सकता है. अगर आपको नहीं पता कि जीटीआईएन सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
"वैरिएबल बनाएं" विकल्प के हिसाब से बदला जा सकता है.
हर स्ट्रिंग को हेडर को srcs या hdrs में जोड़ना ज़रूरी है. ऐसा न करने पर, कंपाइलेशन को सैंडबॉक्स में डालने पर (डिफ़ॉल्ट रूप से), वे हेडर उन नियमों के लिए उपलब्ध नहीं होंगे जिन पर वे निर्भर हैं. |
link_extra_lib
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी को |
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट LINKOPTS में जोड़ा जाता है.
इस सूची के हर उस एलिमेंट को |
linkstatic
|
बूलियन; डिफ़ॉल्ट cc_binary और
cc_test के लिए: बाइनरी को स्टैटिक
मोड में लिंक करें. cc_library.linkstatic के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प, बाइल्ड टूल को उपयोगकर्ता लाइब्रेरी के लिए, किसी एक्सीक्यूटेबल को लिंक करने के तीन तरीके हैं:
अगर |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए, कमपाइल करने की कमांड लाइन में जोड़ा जाता है, लेकिन इसके डिपेंडेंट में नहीं. हर स्ट्रिंग में एक ही Bourne शेल टोकन होना चाहिए.
|
malloc
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी को |
nocopts
|
स्ट्रिंग; डिफ़ॉल्ट रूप से COPTS (इसमें नियम के copts एट्रिब्यूट में साफ़ तौर पर बताई गई वैल्यू भी शामिल हैं) को इस नियम को कॉम्पाइल करने के लिए, COPTS से हटा दिया जाएगा.
इस एट्रिब्यूट की ज़रूरत शायद ही कभी पड़े.
|
stamp
|
पूर्णांक; डिफ़ॉल्ट वैल्यू
स्टैंप की गई बाइनरी को तब तक फिर से नहीं बनाया जाता, जब तक उनकी डिपेंडेंसी में बदलाव न हो जाए. |
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब करना चाहिए, जब Windows टारगेट किया गया प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_toolchain
नियम का सोर्स देखेंcc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)
C++ टूलचेन को दिखाता है.
इस नियम की वजह से:
-
C++ कार्रवाइयों के लिए ज़रूरी सभी आर्टफ़ैक्ट इकट्ठा किए जा रहे हैं. ऐसा करने के लिए
all_files
,compiler_files
,linker_files
या_files
से खत्म होने वाले दूसरे एट्रिब्यूट जैसे एट्रिब्यूट इस्तेमाल किए जाते हैं. ये सबसे ज़्यादा ऐसे फ़ाइल ग्रुप हैं जिनमें सभी ज़रूरी फ़ाइलें मौजूद होती हैं. -
C++ ऐक्शन के लिए सही कमांड लाइन जनरेट करना. ऐसा करने के लिए,
CcToolchainConfigInfo
प्रोवाइडर का इस्तेमाल किया जाता है. इसकी जानकारी नीचे दी गई है.
C++ टूलचेन को कॉन्फ़िगर करने के लिए, toolchain_config
एट्रिब्यूट का इस्तेमाल करें.
C++ टूलचेन कॉन्फ़िगरेशन और टूलचेन को चुनने से जुड़े ज़्यादा दस्तावेज़ देखने के लिए, इस
पेज
पर जाएं.
bazel build //...
को कॉल करते समय, टूलचेन को ज़रूरत से ज़्यादा बार बनाने और कॉन्फ़िगर करने से रोकने के लिए, tags = ["manual"]
का इस्तेमाल करें
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
all_files
|
लेबल; ज़रूरी है cc_toolchain के सभी आर्टफ़ैक्ट का कलेक्शन. इन आर्टफ़ैक्ट को, सभी rules_cc से जुड़ी कार्रवाइयों में इनपुट के तौर पर जोड़ा जाएगा. हालांकि, उन कार्रवाइयों को छोड़कर जो यहां दिए गए एट्रिब्यूट से, आर्टफ़ैक्ट के ज़्यादा सटीक सेट का इस्तेमाल कर रही हैं. Bazel मानता है किall_files , आर्टफ़ैक्ट उपलब्ध कराने वाले सभी अन्य एट्रिब्यूट का सुपरसेट है. उदाहरण के लिए, लिंकस्टैंप कंपाइलेशन के लिए, इकट्ठा करने और लिंक करने, दोनों तरह की फ़ाइलों की ज़रूरत होती है. इसलिए, इसमें all_files का इस्तेमाल किया जाता है.
|
ar_files
|
लेबल; डिफ़ॉल्ट कार्रवाइयों को संग्रहित करने के लिए ज़रूरी सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन. |
as_files
|
लेबल; डिफ़ॉल्ट असेंबल करने की कार्रवाइयों के लिए सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन ज़रूरी है. |
compiler_files
|
लेबल; ज़रूरी है कंपाइल करने की कार्रवाइयों के लिए ज़रूरी सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन. |
compiler_files_without_includes
|
लेबल; डिफ़ॉल्ट |
coverage_files
|
लेबल; डिफ़ॉल्ट |
dwp_files
|
लेबल; ज़रूरी है dwp कार्रवाइयों के लिए, सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन ज़रूरी है. |
dynamic_runtime_lib
|
लेबल; डिफ़ॉल्ट इसका इस्तेमाल तब किया जाएगा, जब 'static_link_cpp_runtimes' सुविधा चालू हो और हम डिपेंडेंसी को डाइनैमिक तौर पर लिंक कर रहे हों. |
exec_transition_for_inputs
|
बूलियन; डिफ़ॉल्ट तौर पर |
libc_top
|
लेबल; डिफ़ॉल्ट |
linker_files
|
लेबल; ज़रूरी है कार्रवाइयों को लिंक करने के लिए ज़रूरी सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन. |
module_map
|
लेबल; डिफ़ॉल्ट |
objcopy_files
|
लेबल; ज़रूरी है objcopy ऐक्शन के लिए ज़रूरी सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन. |
static_runtime_lib
|
लेबल; डिफ़ॉल्ट इसका इस्तेमाल तब किया जाएगा, जब 'static_link_cpp_runtimes' सुविधा चालू हो और हम डिपेंडेंसी को स्टैटिक तौर पर लिंक कर रहे हों. |
strip_files
|
लेबल; ज़रूरी है स्ट्रिप से जुड़ी कार्रवाइयों के लिए, सभी cc_toolchain आर्टफ़ैक्ट का कलेक्शन. |
supports_header_parsing
|
बूलियन; डिफ़ॉल्ट |
supports_param_files
|
बूलियन; डिफ़ॉल्ट तौर पर |
toolchain_config
|
लेबल; ज़रूरी है cc_toolchain_config_info की जानकारी देने वाले नियम का लेबल.
|
toolchain_identifier
|
स्ट्रिंग; कॉन्फ़िगर नहीं की जा सकती; डिफ़ॉल्ट रूप से
जब तक #5380 वाली समस्या ठीक नहीं हो जाती, तब तक |
cc_toolchain_suite
नियम का सोर्स देखेंcc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
C++ टूलचेन के कलेक्शन को दिखाता है.
इस नियम की वजह से:
- C++ के सभी ज़रूरी टूलचेन इकट्ठा करना.
-
Bazel को दिए गए
--cpu
और--compiler
विकल्पों के आधार पर, एक टूलचेन चुनना.
C++ टूलचेन के कॉन्फ़िगरेशन और टूलचेन चुनने के दस्तावेज़ के बारे में ज़्यादा जानने के लिए, यह पेज भी देखें.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
toolchains
|
डिक्शनरी को लेबल से मैप करने वाली स्ट्रिंग; कॉन्फ़िगर नहीं की जा सकती; ज़रूरी है "<cpu>" या "<cpu>|<compiler>" स्ट्रिंग सेcc_toolchain लेबल पर मैप. "<cpu>" का इस्तेमाल तब किया जाएगा, जब सिर्फ़ --cpu
Basel को पास किया गया हो. साथ ही, "<cpu>|<compiler>" का इस्तेमाल तब किया जाएगा, जब
--cpu और --compiler , दोनों Basel को पास किए गए हों. उदाहरण:
cc_toolchain_suite( name = "toolchain", toolchains = { "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc", "piii": ":my_cc_toolchain_for_piii_using_default_compiler", }, ) |