नियम
- 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
|
लेबल की सूची; डिफ़ॉल्ट रूप से
सभी अगर किसी नियम का नाम
अनुमति वाले
...और उन फ़ाइलों को जनरेट करने वाले नियम. अलग-अलग एक्सटेंशन, जीसीसी के नियमों के मुताबिक अलग-अलग प्रोग्रामिंग भाषाओं को दिखाते हैं. |
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 जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए, संकलन करने की कमांड लाइन में जोड़ा जाता है, लेकिन इसके डिपेंडेंट में नहीं. हर स्ट्रिंग में एक ही Bourne शेल टोकन होना चाहिए.
|
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. शेयर की गई लाइब्रेरी (यूनिक्स) को लिंक करना
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. स्टैटिक या शेयर की गई लाइब्रेरी
से लिंक किया जा रहा है यूनिक्स पर:
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 के साथ काम नहीं करता है, तो इसकी वजह से आम समस्या, कृपया अपने 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.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
में ट्रांज़िटिव तौर पर कोई भी हेडर फ़ाइल शामिल हो सकती है. तय सीमा में
इस केस में कंपाइलर baz.h
और baz-impl.h
को पढ़ सकता है
foo.cc
को कंपाइल करते समय, लेकिन foo.cc
को
#include "baz.h"
शामिल है. इसके लिए
अनुमति है, baz
को deps
में जोड़ना ज़रूरी है
foo
महीने में से.
बिना किसी भेदभाव के सभी को शामिल करने की जांच से जुड़े नियमों को लागू करने के लिए, Baze, टूलचेन की सुविधा पर निर्भर करता है.
layering_check
सुविधा, टूलचेन के साथ काम करती हो
और साफ़ तौर पर अनुरोध किया गया है, उदाहरण के लिए
--features=layering_check
कमांड लाइन फ़्लैग या
features
पैरामीटर
package
फ़ंक्शन. Bazel के ज़रिए उपलब्ध कराए गए टूलचैन, सिर्फ़ Unix और macOS पर clang के साथ इस सुविधा के साथ काम करते हैं.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट रूप से ये |
srcs
|
लेबल की सूची; डिफ़ॉल्ट रूप से
सभी अगर किसी नियम का नाम
अनुमति वाले
...और उन फ़ाइलों को बनाने वाले किसी भी नियम के बारे में बताया है. अलग-अलग एक्सटेंशन, जीसीसी के नियमों के मुताबिक अलग-अलग प्रोग्रामिंग भाषाओं को दिखाते हैं. |
hdrs
|
लेबल की सूची; डिफ़ॉल्ट लाइब्रेरी के इंटरफ़ेस के बारे में बताने वाली हेडर फ़ाइलों को एलान करने के लिए, यह सबसे सही जगह है. इन हेडर को इस नियम या इससे जुड़े नियमों में, सोर्स के ज़रिए शामिल करने के लिए उपलब्ध कराया जाएगा.
ऐसे हेडर जिन्हें इस लाइब्रेरी के क्लाइंट द्वारा शामिल नहीं किया जाना चाहिए
इसके बजाय, |
additional_compiler_inputs
|
लेबल की सूची; डिफ़ॉल्ट रूप से |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट रूप से उदाहरण के लिए, कंपाइल की गई Windows .res फ़ाइलों को यहां एम्बेड किया जा सकता है, ताकि उन्हें बाइनरी टारगेट. |
alwayslink
|
बूलियन; srcs , भले ही कुछ में बाइनरी से रेफ़र किया गया कोई सिंबल न हो.
यह तब काम आता है, जब आपके कोड को बाइनरी में कोड से साफ़ तौर पर कॉल न किया गया हो. उदाहरण के लिए, अगर आपका कोड किसी सेवा से मिलने वाला कॉलबैक पाने के लिए रजिस्टर करता है.
अगर हमेशा लिंक Windows पर VS 2017 के साथ काम नहीं करता है, तो इसकी वजह से आम समस्या, कृपया अपने VS 2017 को सबसे नए वर्शन में अपग्रेड करें. |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज, सुविधा का एलान करता है
|
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D के साथ जोड़ा जाता है और इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है,
सभी नियम लागू कर सकते हैं. बहुत सावधानी बरतें, क्योंकि इससे कई चीज़ों पर असर पड़ सकता है. अगर आपको नहीं पता कि जीटीआईएन सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
implementation_deps
|
लेबल की सूची; डिफ़ॉल्ट deps , हेडर और इन लाइब्रेरी के पाथ (और उनके सभी
ट्रांज़िटिव डिप) का इस्तेमाल सिर्फ़ इस लाइब्रेरी को कंपाइल करने के लिए किया जाता है, न कि उन लाइब्रेरी के लिए जिन्हें
निर्भर है. implementation_deps के साथ बताई गई लाइब्रेरी अब भी उन बिनेरी टारगेट में लिंक होती हैं जो इस लाइब्रेरी पर निर्भर करती हैं.
फ़िलहाल, इसका इस्तेमाल cc_लाइब्रेरी तक सीमित किया गया है और उसे फ़्लैग किया गया है
|
include_prefix
|
String; अगर नीति को सेट किया जाता है, तो इस नियम के इस प्रीफ़िक्स को जोड़ने से पहले, |
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
|
String; सेट होने पर, इस नियम के अगर यह रिलेटिव पाथ है, तो इसे पैकेज के हिसाब से रिलेटिव पाथ माना जाता है. अगर यह ऐब्सलूट पाथ है, तो इसे रिपॉज़िटरी से रिलेटिव पाथ माना जाता है.
|
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
हमें जोड़ना होगा
tags = ["LINKABLE_MORE_THAN_ONCE"]
से baz
.
shared_lib_name
एट्रिब्यूट की वजह से, bar_shared
से जनरेट की गई फ़ाइल का नाम bar.so
होगा, न कि libbar.so
, जो कि Linux पर डिफ़ॉल्ट रूप से होता है.
गड़बड़ियां
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
टारगेट में स्टैटिक तौर पर लिंक करने की ज़रूरत नहीं है और न ही इसे लिंक किया जा सकता है. इसलिए, यह इसके deps
में नहीं आता है
cc_shared_library
. अगर पहले से कंपाइल की गई यह डाइनैमिक लाइब्रेरी, किसी एक की डिपेंडेंसी है
आपके 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
|
स्ट्रिंग की सूची;
टारगेट
ध्यान दें कि यह एट्रिब्यूट असल में उन टारगेट में डिपेंडेंसी एज नहीं जोड़ रहा है,
इसके बजाय, इस सिंटैक्स की अनुमति है:
foo/BUILD या किसी दूसरे टारगेट में शामिल टारगेट के लिए |
shared_lib_name
|
String; |
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_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
|
String; |
profile
|
लेबल; डिफ़ॉल्ट |
propeller_optimize
नियम का सोर्स देखेंpropeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)
यह फ़ाइल फ़ोल्डर में प्रोपेलर ऑप्टिमाइज़ेशन प्रोफ़ाइल को दिखाता है. उदाहरण:
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
|
लेबल की सूची; डिफ़ॉल्ट रूप से
सभी अगर किसी नियम का नाम
अनुमति वाले
...और उन फ़ाइलों को जनरेट करने वाले नियम. अलग-अलग एक्सटेंशन, अलग-अलग प्रोग्रामिंग भाषाओं को gcc कन्वेंशन के मुताबिक होना चाहिए. |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
इस एट्रिब्यूट की हर स्ट्रिंग, दिए गए क्रम में
अगर पैकेज, सुविधा का एलान करता है
|
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कमपाइल करने की कमांड लाइन में जोड़ा जाता है. साथ ही, इस पर निर्भर हर नियम में भी इसे जोड़ा जाता है. हर स्ट्रिंग में एक ही Bourne shell टोकन होना चाहिए. बहुत सावधानी बरतें, क्योंकि इससे कई चीज़ों पर असर पड़ सकता है. संदेह होने पर, 'तय करें' वैल्यू
इसके बजाय, 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
|
Integer;
स्टैंप वाली बाइनरी तब तक फिर से नहीं बनाई जाती, जब तक उनकी डिपेंडेंसी नहीं बदलती. |
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
एट्रिब्यूट का इस्तेमाल करें.
इसे भी देखें
पेज
पढ़ें.
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
|
String; कॉन्फ़िगर नहीं किया जा सकता; डिफ़ॉल्ट रूप से
समस्या #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++ के सभी ज़रूरी टूलचेन इकट्ठा करना.
-
--cpu
और--compiler
विकल्पों के आधार पर एक टूलचेन चुनना को भेजा गया.
C++ टूलचेन के कॉन्फ़िगरेशन और टूलचेन चुनने के दस्तावेज़ के बारे में ज़्यादा जानने के लिए, यह पेज भी देखें.
तर्क
विशेषताएं | |
---|---|
name |
नाम; आवश्यक इस टारगेट के लिए यूनीक नाम. |
toolchains
|
स्ट्रिंग को लेबल पर मैप करने वाली डिक्शनरी; कॉन्फ़िगर नहीं की जा सकती; ज़रूरी है "<cpu>" या "<cpu>|<compiler>" स्ट्रिंग सेcc_toolchain लेबल पर मैप. "<cpu>" का इस्तेमाल सिर्फ़ तब किया जाएगा, जब --cpu
बेज़ल को पास किया जाता है, और "<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", }, ) |