नियम
- 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 के साथ पहले जोड़ा जाता है. साथ ही, इस टारगेट के साथ कंपाइल कमांड लाइन में जोड़ा जाता है.
साथ ही, उस पर निर्भर हर नियम के साथ भी जोड़ा जाता है. बहुत सावधान रहें, क्योंकि इसका असर
दूर तक हो सकता है. अगर आपको नहीं पता कि एमपीएन सही है या नहीं, तो
local_defines में वैल्यू जोड़ें.
|
includes
|
स्ट्रिंग की सूची;
"वैरिएबल बनाएं" विकल्प पर निर्भर.
हर स्ट्रिंग को हेडर को src या एचडीआर में जोड़ा जाना चाहिए. ऐसा न करने पर, कंपाइलेशन सैंडबॉक्स (डिफ़ॉल्ट तौर पर) होने पर, वे डिपेंडेंट नियमों के लिए उपलब्ध नहीं होंगे. |
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 के साथ हमेशा लिंक काम नहीं करता है, तो कृपया अपने 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)
हेडर शामिल किए जाने की जांच करना
बिल्ड में इस्तेमाल की जाने वाली सभी हेडर फ़ाइलों का एलान, cc_*
में से hdrs
या
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 |
बार-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
को शामिल करने की अनुमति है, जिसमें baz.h
शामिल हो सकता है और हालांकि, baz-impl.h
को शामिल किया जा सकता है. तकनीकी रूप से,
.cc
फ़ाइल के कंपाइलेशन में, hdrs
या srcs
में मौजूद किसी भी हेडर
फ़ाइल को ट्रांज़िटिव deps
बंद होने पर, किसी भी cc_library
में
ट्रांज़िशन के लिए शामिल किया जा सकता है. इस
मामले में, foo.cc
को कंपाइल करते समय कंपाइलर
baz.h
और baz-impl.h
पढ़ सकता है. हालांकि, foo.cc
में
#include "baz.h"
नहीं होना चाहिए. इसकी अनुमति के लिए, baz
को foo
के deps
में जोड़ना ज़रूरी है.
शामिल करने की जांच से जुड़े नियमों को लागू करने के लिए, Bazel, टूलचेन के साथ काम करता है.
layering_check
सुविधा, टूलचेन के साथ काम करनी चाहिए और
साफ़ तौर पर इसके लिए अनुरोध किया जाना चाहिए. उदाहरण के लिए,
--features=layering_check
कमांड-लाइन फ़्लैग या
package
फ़ंक्शन के features
पैरामीटर के ज़रिए. Bazel की दी गई टूलचेन, सिर्फ़ Unix और macOS पर क्लैंग के साथ काम करती हैं.
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; ये टारगेट, |
srcs
|
लेबल की सूची; सभी
सभी अगर किसी नियम का नाम
अनुमति वाली
...और उन फ़ाइलों को बनाने वाले कोई भी नियम. अलग-अलग एक्सटेंशन में gcc कन्वेंशन के हिसाब से अलग-अलग प्रोग्रामिंग भाषाओं को दिखाया जाता है. |
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_libraries तक सीमित है और इसे |
include_prefix
|
स्ट्रिंग; अगर यह सेट हो जाता है, तो इस नियम के इस प्रीफ़िक्स को जोड़ने से पहले, |
includes
|
स्ट्रिंग की सूची;
"वैरिएबल बनाएं" विकल्प पर निर्भर.
हर स्ट्रिंग को हेडर को src या एचडीआर में जोड़ा जाना चाहिए. ऐसा न करने पर, कंपाइलेशन सैंडबॉक्स (डिफ़ॉल्ट तौर पर) होने पर, वे डिपेंडेंट नियमों के लिए उपलब्ध नहीं होंगे. |
linkopts
|
स्ट्रिंग की सूची; LINKOPTS में जोड़ा जाता है.
इस सूची के जिस एलिमेंट की शुरुआत |
linkstamp
|
लेबल; base पैकेज में होनी चाहिए.
|
linkstatic
|
बूलियन; डिफ़ॉल्ट cc_binary और
cc_test के लिए: बाइनरी को स्टैटिक
मोड में लिंक करें. cc_library.linkstatic के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह नीति चालू की जाती है और यह बाइनरी या टेस्ट है, तो इस विकल्प से बिल्ड टूल को उपयोगकर्ता की लाइब्रेरी में मौजूद एक्ज़ीक्यूटेबल लिंक करने के तीन अलग-अलग तरीके हैं:
अगर
अगर |
local_defines
|
स्ट्रिंग की सूची; -D से पहले जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है,
लेकिन डिपेंडेंट के साथ नहीं.
|
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
नियमों की सूची, जिसके लिए C++ कोड जनरेट करना है.
|
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
को स्टैटिक रूप से लिंक किया गया है. साथ ही, बाद वाला लिंक ट्रांज़िटिव डिपेंडेंसी है. यह bar
को लिंक नहीं करता, क्योंकि इसे dynamic_dep
bar_shared
ने पहले ही डाइनैमिक तौर पर उपलब्ध कराया है.
foo_shared
यह कंट्रोल करने के लिए लिंकर स्क्रिप्ट *.lds फ़ाइल का इस्तेमाल करता है कि किन सिंबल को एक्सपोर्ट किया जाना चाहिए. cc_shared_library
नियम लॉजिक यह कंट्रोल नहीं करता है कि कौनसे सिंबल एक्सपोर्ट किए जाएंगे. यह सिर्फ़ उसी का इस्तेमाल करता है जिसे एक्सपोर्ट माना जाता है. ऐसा, विश्लेषण के चरण के दौरान गड़बड़ियां देने के लिए किया जाता है. ऐसा तब होता है, जब शेयर की गई दो लाइब्रेरी एक ही टारगेट को एक्सपोर्ट करती हों.
यह माना जाता है कि cc_shared_library
की हर डायरेक्ट डिपेंडेंसी को एक्सपोर्ट किया जाता है. इसलिए, Bazel, विश्लेषण के दौरान यह मान लेता है कि foo_shared
से foo
को एक्सपोर्ट किया जा रहा है. यह नहीं माना जाता है कि 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
टारगेट के साथ स्टैटिक रूप से लिंक करने की ज़रूरत नहीं है और न ही इसे जोड़ा जा सकता है. इसलिए, यह 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
|
स्ट्रिंग की सूची;
यह समझ लिया जाता है कि किसी भी टारगेट
ध्यान दें कि यह एट्रिब्यूट उन टारगेट में डिपेंडेंसी एज नहीं जोड़ रहा है. इसके बजाय, इस सिंटैक्स का इस्तेमाल किया जा सकता है: foo/BUILD में किसी भी टारगेट के लिए foo/BUILD या इससे नीचे के किसी भी पैकेज के लिए |
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_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)
फ़ाइल फ़ोल्डर में प्रोपेलर ऑप्टिमाइज़ेशन प्रोफ़ाइल के बारे में बताता है. उदाहरण:
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 के साथ पहले जोड़ा जाता है. साथ ही, इस टारगेट के साथ कंपाइल कमांड लाइन में जोड़ा जाता है.
साथ ही, उस पर निर्भर हर नियम के साथ भी जोड़ा जाता है. बहुत सावधान रहें, क्योंकि इसका असर
दूर तक हो सकता है. अगर आपको नहीं पता कि एमपीएन सही है या नहीं, तो
local_defines में वैल्यू जोड़ें.
|
includes
|
स्ट्रिंग की सूची;
"वैरिएबल बनाएं" विकल्प पर निर्भर.
हर स्ट्रिंग को हेडर को src या एचडीआर में जोड़ा जाना चाहिए. ऐसा न करने पर, कंपाइलेशन सैंडबॉक्स (डिफ़ॉल्ट तौर पर) होने पर, वे डिपेंडेंट नियमों के लिए उपलब्ध नहीं होंगे. |
link_extra_lib
|
लेबल;
डिफ़ॉल्ट रूप से, C++ बाइनरी को |
linkopts
|
स्ट्रिंग की सूची; LINKOPTS में जोड़ा जाता है.
इस सूची के जिस एलिमेंट की शुरुआत |
linkstatic
|
बूलियन; डिफ़ॉल्ट cc_binary और
cc_test के लिए: बाइनरी को स्टैटिक
मोड में लिंक करें. cc_library.linkstatic के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह नीति चालू की जाती है और यह बाइनरी या टेस्ट है, तो इस विकल्प से बिल्ड टूल को उपयोगकर्ता की लाइब्रेरी में मौजूद एक्ज़ीक्यूटेबल लिंक करने के तीन अलग-अलग तरीके हैं:
अगर
अगर |
local_defines
|
स्ट्रिंग की सूची; -D से पहले जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है,
लेकिन डिपेंडेंट के साथ नहीं.
|
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++ टूलचेन कॉन्फ़िगरेशन और टूलचेन चुनने से जुड़े दस्तावेज़ों की पूरी जानकारी के लिए, यह
पेज
भी देखें.
tags = ["manual"]
का इस्तेमाल करें, ताकि bazel build //...
को शुरू करते समय टूलचेन को बेवजह बनाए और कॉन्फ़िगर
होने से रोका जा सके
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
all_files
|
लेबल; आवश्यक cc_toolchain के सभी आर्टफ़ैक्ट का कलेक्शन. इन आर्टफ़ैक्ट को रूल_सीसी से जुड़ी सभी कार्रवाइयों में इनपुट के तौर पर जोड़ा जाएगा. उन कार्रवाइयों को छोड़कर जो नीचे दिए गए एट्रिब्यूट से आर्टफ़ैक्ट के ज़्यादा सटीक सेट का इस्तेमाल करती हैं. 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
|
लेबल; आवश्यक ऑब्जेकॉपी कार्रवाइयों के लिए ज़रूरी सभी 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
Bazel को पास किया जाएगा. साथ ही, "<cpu>|<compiler>" का इस्तेमाल तब किया जाएगा, जब
--cpu और --compiler , Bazel को पास किए जाएंगे. उदाहरण:
cc_toolchain_suite( name = "toolchain", toolchains = { "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc", "piii": ":my_cc_toolchain_for_piii_using_default_compiler", }, ) |