नियम
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
नियम का सोर्स देखेंcc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
इससे एक ऐसी बाइनरी बनती है जिसे चलाया जा सकता है.
टारगेट का
name
, उस सोर्स फ़ाइल के नाम जैसा होना चाहिए जो ऐप्लिकेशन का मुख्य एंट्री पॉइंट है. इसमें एक्सटेंशन शामिल नहीं होना चाहिए.
उदाहरण के लिए, अगर आपका एंट्री पॉइंट main.cc
में है, तो आपका नाम main
होना चाहिए.
इंप्लिसिट आउटपुट टारगेट
name.stripped
(सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो): बाइनरी का ऐसा वर्शन जिसमें कुछ सुविधाएं नहीं होतीं. डीबग सिंबल हटाने के लिए,strip -g
को बाइनरी पर चलाया जाता है.--stripopt=-foo
का इस्तेमाल करके, कमांड लाइन पर स्ट्रिप के अन्य विकल्प दिए जा सकते हैं.name.dwp
(सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो): अगर Fission चालू है, तो यह डिबग करने के लिए जानकारी देने वाला पैकेज है. यह रिमोट तौर पर डिप्लॉय की गई बाइनरी को डिबग करने के लिए सही है. इसके अलावा: एक खाली फ़ाइल.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट ये |
srcs
|
लेबल की सूची; डिफ़ॉल्ट
असेंबलर की फ़ाइलों (.s, .asm) को पहले से प्रोसेस नहीं किया जाता. आम तौर पर, इन्हें असेंबलर का इस्तेमाल करके बनाया जाता है. पहले से प्रोसेस की गई असेंबली फ़ाइलों (.S) को पहले से प्रोसेस किया जाता है और आम तौर पर, C/C++ कंपाइलर का इस्तेमाल करके बनाया जाता है.
सभी
अगर
... और उन फ़ाइलों को बनाने वाले सभी नियम (उदाहरण के लिए, |
data
|
लेबल की सूची; डिफ़ॉल्ट data के बारे में सामान्य टिप्पणियां देखने के लिए, ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं.
अगर अगर आपका C++ कोड इन डेटा फ़ाइलों को इस तरह ऐक्सेस कर सकता है:
|
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
conlyopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज में feature
|
cxxopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल करने की कमांड लाइन में और उस पर निर्भर हर नियम में भी इसे जोड़ा जाता है. हर स्ट्रिंग में एक ही Bourne shell टोकन होना चाहिए. बहुत सावधानी बरतें, क्योंकि इससे कई तरह के असर पड़ सकते हैं. अगर आपको नहीं पता कि GTIN सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
dynamic_deps
|
लेबल की सूची; डिफ़ॉल्ट cc_shared_library की अन्य डिपेंडेंसी हैं, जिन पर मौजूदा टारगेट निर्भर करता है.
|
hdrs_check
|
स्ट्रिंग; डिफ़ॉल्ट रूप से |
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -isystem path_to_package/include_entry जनरेट करेगा.
इसका इस्तेमाल सिर्फ़ तीसरे पक्ष की उन लाइब्रेरी के लिए किया जाना चाहिए जो #include स्टेटमेंट लिखने के Google के स्टाइल के मुताबिक नहीं हैं.
COPTS के उलट, ये फ़्लैग इस नियम और उस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: उन नियमों के बारे में नहीं जिन पर यह निर्भर करता है!) बहुत सावधान रहें, क्योंकि इसकी वजह से काफ़ी नुकसान हो सकता है. अगर आपको कोई संदेह है, तो COPTS में "-I" फ़्लैग जोड़ें.
जोड़े गए |
link_extra_lib
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी |
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से LINKOPTS में जोड़ा जाता है.
इस सूची के हर उस एलिमेंट को |
linkshared
|
बूलियन; डिफ़ॉल्ट तौर पर linkshared=True शामिल करें. यह विकल्प डिफ़ॉल्ट रूप से बंद होता है.
इस फ़्लैग की मौजूदगी का मतलब है कि
|
linkstatic
|
बूलियन; डिफ़ॉल्ट तौर पर cc_binary और
cc_test के लिए: स्टैटिक मोड में बाइनरी को लिंक करें. cc_library.link_static के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प, बाइल्ड टूल को उपयोगकर्ता लाइब्रेरी के लिए, किसी एक्सीक्यूटेबल को लिंक करने के तीन तरीके हैं:
अगर
प्रोडक्शन में |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है, लेकिन इसके डिपेंडेंट में नहीं. हर स्ट्रिंग में एक ही Bourne शेल टोकन होना चाहिए.
|
malloc
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी |
module_interfaces
|
लेबल की सूची; डिफ़ॉल्ट C++ स्टैंडर्ड में, मॉड्यूल इंटरफ़ेस फ़ाइल एक्सटेंशन के लिए कोई पाबंदी नहीं है
इसका इस्तेमाल, फ़्लैग
|
nocopts
|
स्ट्रिंग; डिफ़ॉल्ट रूप से COPTS (इसमें नियम के copts एट्रिब्यूट में साफ़ तौर पर बताई गई वैल्यू भी शामिल हैं) को इस नियम को कंपाइल करने के लिए COPTS से हटा दिया जाएगा.
third_party के अलावा, इस एट्रिब्यूट की ज़रूरत नहीं होनी चाहिए या इसका इस्तेमाल नहीं किया जाना चाहिए. वैल्यू को "Make" वैरिएबल के बदले किसी और तरीके से पहले से प्रोसेस नहीं किया जाता.
|
reexport_deps
|
लेबल की सूची; डिफ़ॉल्ट |
stamp
|
पूर्णांक; डिफ़ॉल्ट वैल्यू
स्टैंप की गई बाइनरी को तब तक फिर से नहीं बनाया जाता, जब तक उनकी डिपेंडेंसी में बदलाव न हो जाए. |
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_import
नियम का सोर्स देखेंcc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, 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 = True,
)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
Unix पर:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
# libmylib.ifso is an interface library for libmylib.so which will be passed to linker
interface_library = "libmylib.ifso",
# libmylib.so will be available for runtime
shared_library = "libmylib.so",
)
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",
)
system_provided=True
से लिंक करना
Unix पर:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
# libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
# This indicates that Bazel is not responsible for making libmylib.so available.
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 = True,
)
Unix पर:
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
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",
)
बाकी प्रक्रिया, Unix और Windows पर एक जैसी है:
# first will link to libmylib.a (or libmylib.lib)
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = True, # default value
)
# second will link to libmylib.so (or libmylib.lib)
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = False,
)
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 को नए वर्शन में अपग्रेड करें. |
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -isystem path_to_package/include_entry जनरेट करेगा.
इसका इस्तेमाल सिर्फ़ तीसरे पक्ष की उन लाइब्रेरी के लिए किया जाना चाहिए जो #include स्टेटमेंट लिखने के Google के स्टाइल के मुताबिक नहीं हैं.
COPTS के उलट, ये फ़्लैग इस नियम और उस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: उन नियमों के बारे में नहीं जिन पर यह निर्भर करता है!) बहुत सावधान रहें, क्योंकि इसकी वजह से काफ़ी नुकसान हो सकता है. अगर आपको कोई संदेह है, तो COPTS में "-I" फ़्लैग जोड़ें.
डिफ़ॉल्ट |
interface_library
|
लेबल; डिफ़ॉल्ट इस्तेमाल किए जा सकने वाले फ़ाइल टाइप:
|
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से LINKOPTS में जोड़ा जाता है.
इस सूची के हर उस एलिमेंट को |
objects
|
लेबल की सूची; डिफ़ॉल्ट |
pic_objects
|
लेबल की सूची; डिफ़ॉल्ट |
pic_static_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, conlyopts, copts, cxxopts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
C++ से कंपाइल की गई लाइब्रेरी के लिए, cc_library()
का इस्तेमाल करें.
ज़रूरत के हिसाब से, नतीजा .so
, .lo
या .a
हो सकता है.
अगर स्टैटिक लिंकिंग की मदद से कोई ऐसी चीज़ बनाई जाती है जो cc_library
पर निर्भर करती है, तो उस पर निर्भर लाइब्रेरी के नियम का आउटपुट .a
फ़ाइल होता है. अगर आपने
alwayslink=True
डाला है, तो आपको .lo
फ़ाइल मिलेगी.
शेयर की गई लाइब्रेरी के लिए, आउटपुट फ़ाइल का असली नाम libfoo.so
है. इसमें foo, नियम का नाम है. दूसरी तरह की लाइब्रेरी के नाम, .lo
और .a
पर खत्म होते हैं. अगर आपको किसी खास शेयर की गई लाइब्रेरी का नाम चाहिए, तो उदाहरण के लिए, किसी Python मॉड्यूल को तय करने के लिए, लाइब्रेरी को मनमुताबिक नाम पर कॉपी करने के लिए genrule का इस्तेमाल करें.
हेडर शामिल करने की जांच
बिल्ड में इस्तेमाल की जाने वाली सभी हेडर फ़ाइलों को cc_*
नियमों के hdrs
या srcs
में एलान किया जाना चाहिए.
यह नियम लागू है.
cc_library
नियमों के लिए, hdrs
में मौजूद हेडर में लाइब्रेरी का सार्वजनिक इंटरफ़ेस होता है. साथ ही, इन्हें लाइब्रेरी के hdrs
और srcs
में मौजूद फ़ाइलों से सीधे तौर पर शामिल किया जा सकता है. इसके अलावा, cc_*
नियमों के hdrs
और 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 के साथ इस सुविधा के साथ काम करते हैं.
उदाहरण
हम alwayslink
फ़्लैग का इस्तेमाल करके, लिंकर को इस कोड को लिंक करने के लिए मजबूर करते हैं, भले ही मुख्य बाइनरी कोड इसका रेफ़रंस न देता हो.
cc_library(
name = "ast_inspector_lib",
srcs = ["ast_inspector_lib.cc"],
hdrs = ["ast_inspector_lib.h"],
visibility = ["//visibility:public"],
deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
# alwayslink as we want to be able to call things in this library at
# debug time, even if they aren't used anywhere in the code.
alwayslink = 1,
)
यह उदाहरण
third_party/python2_4_3/BUILD
से लिया गया है.
कुछ कोड, dl
लाइब्रेरी का इस्तेमाल करता है, ताकि वह किसी दूसरी डाइनैमिक लाइब्रेरी को लोड कर सके. इसलिए, यह नियम dl
लाइब्रेरी को लिंक करने के लिए, -ldl
लिंक विकल्प के बारे में बताता है.
cc_library(
name = "python2_4_3",
linkopts = [
"-ldl",
"-lutil",
],
deps = ["//third_party/expat"],
)
यह उदाहरण third_party/kde/BUILD
से लिया गया है.
हम पहले से बनी .so
फ़ाइलों को डिपो में सेव रखते हैं.
हेडर फ़ाइलें, include
नाम की सबडायरेक्ट्री में मौजूद होती हैं.
cc_library(
name = "kde",
srcs = [
"lib/libDCOP.so",
"lib/libkdesu.so",
"lib/libkhtml.so",
"lib/libkparts.so",
...more .so files...,
],
includes = ["include"],
deps = ["//third_party/X11"],
)
यह उदाहरण third_party/gles/BUILD
से लिया गया है.
तीसरे पक्ष के कोड में अक्सर कुछ defines
और
linkopts
की ज़रूरत होती है.
cc_library(
name = "gles",
srcs = [
"GLES/egl.h",
"GLES/gl.h",
"ddx.c",
"egl.c",
],
defines = [
"USE_FLOAT",
"__GL_FLOAT",
"__GL_COMMON",
],
linkopts = ["-ldl"], # uses dlopen(), dl library
deps = [
"es",
"//third_party/X11",
],
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट ये
ये C++ लाइब्रेरी के नियमों के नाम होने चाहिए.
जब इस नियम की लाइब्रेरी को लिंक करने वाली बाइनरी बनाई जाती है, तो
"deps" नाम के बावजूद, इस लाइब्रेरी के सभी क्लाइंट यहां नहीं आते. रन-टाइम डेटा डिपेंडेंसी, पहले से कंपाइल की गई तीसरे पक्ष की लाइब्रेरी को लिंक करने के लिए, किसी आइटम को इस लाइब्रेरी से लिंक किए बिना उस पर निर्भर करने के लिए, |
srcs
|
लेबल की सूची; डिफ़ॉल्ट
असेंबलर की फ़ाइलों (.s, .asm) को पहले से प्रोसेस नहीं किया जाता. आम तौर पर, इन्हें असेंबलर का इस्तेमाल करके बनाया जाता है. पहले से प्रोसेस की गई असेंबली फ़ाइलों (.S) को पहले से प्रोसेस किया जाता है और आम तौर पर, C/C++ कंपाइलर का इस्तेमाल करके बनाया जाता है.
सभी
अगर
... और उन फ़ाइलों को बनाने वाले सभी नियम (उदाहरण के लिए, |
data
|
लेबल की सूची; डिफ़ॉल्ट data के बारे में सामान्य टिप्पणियां देखने के लिए, ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं.
अगर अगर आपका C++ कोड इन डेटा फ़ाइलों को इस तरह ऐक्सेस कर सकता है:
|
hdrs
|
लेबल की सूची; डिफ़ॉल्ट लाइब्रेरी के इंटरफ़ेस के बारे में बताने वाली हेडर फ़ाइलों को यहां एलान करना सबसे सही होता है. इन हेडर को इस नियम या उससे जुड़े नियमों में सोर्स के ज़रिए शामिल करने के लिए उपलब्ध कराया जाएगा.
जिन हेडर को इस लाइब्रेरी के क्लाइंट को शामिल नहीं करना है उन्हें
|
additional_compiler_inputs
|
लेबल की सूची; डिफ़ॉल्ट |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
alwayslink
|
बूलियन; डिफ़ॉल्ट तौर पर srcs में दी गई फ़ाइलों की सभी ऑब्जेक्ट फ़ाइलों को लिंक करेगी. भले ही, कुछ फ़ाइलों में बाइनरी का रेफ़रंस देने वाला कोई सिंबल न हो.
यह तब काम आता है, जब बाइनरी में कोड से आपके कोड को साफ़ तौर पर कॉल नहीं किया जाता. उदाहरण के लिए, अगर आपका कोड किसी सेवा से मिलने वाला कॉलबैक पाने के लिए रजिस्टर करता है.
अगर Windows पर VS 2017 के साथ alwayslink काम नहीं करता है, तो इसकी वजह पहले से मौजूद समस्या है. कृपया अपने VS 2017 को नए वर्शन में अपग्रेड करें. |
conlyopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज में feature
|
cxxopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल करने की कमांड लाइन में और उस पर निर्भर हर नियम में भी इसे जोड़ा जाता है. हर स्ट्रिंग में एक ही Bourne shell टोकन होना चाहिए. बहुत सावधानी बरतें, क्योंकि इससे कई तरह के असर पड़ सकते हैं. अगर आपको नहीं पता कि GTIN सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
hdrs_check
|
स्ट्रिंग; डिफ़ॉल्ट रूप से |
implementation_deps
|
लेबल की सूची; डिफ़ॉल्ट deps के उलट, इन लाइब्रेरी के हेडर और शामिल किए गए पाथ (और उन सभी ट्रांज़िटिव डिपेंडेंसी) का इस्तेमाल सिर्फ़ इस लाइब्रेरी को कंपाइल करने के लिए किया जाता है, न कि उन लाइब्रेरी के लिए जिन पर यह निर्भर करती है. implementation_deps के साथ बताई गई लाइब्रेरी अब भी उन बाइनरी टारगेट में लिंक हैं जो इस लाइब्रेरी पर निर्भर हैं.
|
include_prefix
|
स्ट्रिंग; डिफ़ॉल्ट रूप से सेट होने पर, इस नियम के इस प्रीफ़िक्स को जोड़ने से पहले, यह एट्रिब्यूट सिर्फ़ |
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -isystem path_to_package/include_entry जनरेट करेगा.
इसका इस्तेमाल सिर्फ़ तीसरे पक्ष की उन लाइब्रेरी के लिए किया जाना चाहिए जो #include स्टेटमेंट लिखने के Google के स्टाइल के मुताबिक नहीं हैं.
COPTS के उलट, ये फ़्लैग इस नियम और उस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: उन नियमों के बारे में नहीं जिन पर यह निर्भर करता है!) बहुत सावधान रहें, क्योंकि इसकी वजह से काफ़ी नुकसान हो सकता है. अगर आपको कोई संदेह है, तो COPTS में "-I" फ़्लैग जोड़ें.
जोड़े गए |
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से cc_binary.linkopts देखें.
linkopts एट्रिब्यूट, ऐसे किसी भी टारगेट पर भी लागू होता है जो deps एट्रिब्यूट के ज़रिए, सीधे या अप्रत्यक्ष रूप से इस लाइब्रेरी पर निर्भर करता है. इसके अलावा, यह एट्रिब्यूट उन अन्य एट्रिब्यूट पर भी लागू होता है जिन्हें इसी तरह से माना जाता है: cc_binary का malloc एट्रिब्यूट.डिपेंडेंसी लिंकऑप्ट, डिपेंडेंट लिंकऑप्ट से पहले दिखते हैं. इसका मतलब है कि डिपेंडेंसी लिंकऑप्ट, कमांड लाइन में बाद में दिखते हैं. --linkopt में बताए गए लिंकऑप्ट, नियम के लिंकऑप्ट से ज़्यादा प्राथमिकता पाते हैं.
ध्यान दें कि यह भी ध्यान रखें कि "-Wl,-soname" या "-Xlinker -soname" विकल्प काम नहीं करते. साथ ही, इस एट्रिब्यूट में इन विकल्पों को कभी नहीं दिया जाना चाहिए. |
linkstamp
|
लेबल; डिफ़ॉल्ट base पैकेज में ज़रूरी है.
|
linkstatic
|
बूलियन; डिफ़ॉल्ट तौर पर cc_binary और
cc_test के लिए: स्टैटिक मोड में बाइनरी को लिंक करें. cc_library.link_static के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प, बाइल्ड टूल को उपयोगकर्ता लाइब्रेरी के लिए, किसी एक्सीक्यूटेबल को लिंक करने के तीन तरीके हैं:
अगर
प्रोडक्शन में |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है, लेकिन इसके डिपेंडेंट में नहीं. हर स्ट्रिंग में एक ही Bourne शेल टोकन होना चाहिए.
|
module_interfaces
|
लेबल की सूची; डिफ़ॉल्ट C++ स्टैंडर्ड में, मॉड्यूल इंटरफ़ेस फ़ाइल एक्सटेंशन के लिए कोई पाबंदी नहीं है
इसका इस्तेमाल, फ़्लैग
|
strip_include_prefix
|
स्ट्रिंग; डिफ़ॉल्ट रूप से सेट होने पर, इस नियम के अगर यह रिलेटिव पाथ है, तो इसे पैकेज के हिसाब से रिलेटिव पाथ माना जाता है. अगर यह ऐब्सलूट पाथ है, तो इसे रिपॉज़िटरी से रिलेटिव पाथ माना जाता है. इस प्रीफ़िक्स को हटाने के बाद, यह एट्रिब्यूट सिर्फ़ |
textual_hdrs
|
लेबल की सूची; डिफ़ॉल्ट इस सेक्शन में उन हेडर फ़ाइलों के बारे में बताया जाता है जिन्हें अपने-आप कंपाइल नहीं किया जा सकता. इसका मतलब है कि मान्य कोड बनाने के लिए, उन्हें हमेशा दूसरी सोर्स फ़ाइलों में टेक्स्ट के तौर पर शामिल करना ज़रूरी होता है. |
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_shared_library
नियम का सोर्स देखेंcc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, 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
होगा, न कि 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
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
शेयर की गई लाइब्रेरी से, किसी भी टारगेट
ध्यान दें कि यह एट्रिब्यूट, उन टारगेट में डिपेंडेंसी एज नहीं जोड़ रहा है. इसके बजाय, डिपेंडेंसी एज को इस सिंटैक्स का इस्तेमाल किया जा सकता है:
|
roots
|
लेबल की सूची; डिफ़ॉल्ट |
shared_lib_name
|
स्ट्रिंग; डिफ़ॉल्ट रूप से |
static_deps
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
user_link_flags
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
|
win_def_file
|
लेबल; डिफ़ॉल्ट इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_static_library
नियम का सोर्स देखेंcc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
--experimental_cc_static_library
फ़्लैग के साथ किया जा सकता है.
टारगेट और उनकी ट्रांज़िशन डिपेंडेंसी की सूची से स्टैटिक लाइब्रेरी बनाता है.
इस स्टैटिक लाइब्रेरी में, deps
में दिए गए टारगेट की ऑब्जेक्ट फ़ाइलें और उनकी ट्रांज़िशन डिपेंडेंसी शामिल होती हैं. साथ ही, PIC
ऑब्जेक्ट को प्राथमिकता दी जाती है.
आउटपुट ग्रुप
linkdeps
यह एक टेक्स्ट फ़ाइल है, जिसमें deps
में शामिल टारगेट की उन ट्रांज़िशन डिपेंडेंसी के लेबल होते हैं जिन्होंने स्टैटिक लाइब्रेरी में कोई ऑब्जेक्ट फ़ाइल नहीं दी, लेकिन कम से कम एक स्टैटिक, डाइनैमिक या इंटरफ़ेस लाइब्रेरी दी. बनाई गई स्टैटिक लाइब्रेरी के लिए, हो सकता है कि लिंक करने के समय ये लाइब्रेरी उपलब्ध हों.
linkopts
एक टेक्स्ट फ़ाइल, जिसमें deps
में दिए गए टारगेट की सभी ट्रांज़िशन डिपेंडेंसी के लिए, उपयोगकर्ता से मिला linkopts
शामिल होता है.
डुप्लीकेट सिंबल
डिफ़ॉल्ट रूप से, cc_static_library
नियम यह जांच करता है कि बनाई गई स्टैटिक लाइब्रेरी में कोई डुप्लीकेट सिंबल न हो. अगर ऐसा होता है, तो गड़बड़ी का मैसेज दिखता है और बिल्ड पूरा नहीं होता. इस मैसेज में, डुप्लीकेट सिंबल और उनमें मौजूद ऑब्जेक्ट फ़ाइलों की सूची होती है.
इस जांच को हर टारगेट या हर पैकेज के लिए बंद किया जा सकता है. इसके लिए, features = ["-symbol_check"]
सेट करें या --features=-symbol_check
की मदद से, इसे पूरी तरह बंद करें.
symbol_check
के लिए टूलचेन की सहायता
Bazel के साथ शिप किए गए, अपने-आप कॉन्फ़िगर होने वाले C++ टूलचेन, सभी प्लैटफ़ॉर्म पर symbol_check
सुविधा के साथ काम करते हैं. कस्टम टूलचेन, इनमें से किसी एक तरीके से इसके लिए सहायता जोड़ सकते हैं:
ACTION_NAMES.validate_static_library
ऐक्शन को लागू करना औरsymbol_check
सुविधा की मदद से उसे चालू करना. ऐक्शन में सेट किए गए टूल को दो आर्ग्युमेंट के साथ शुरू किया जाता है. पहला आर्ग्युमेंट, डुप्लीकेट सिंबल की जांच करने के लिए स्टैटिक लाइब्रेरी है और दूसरा आर्ग्युमेंट, उस फ़ाइल का पाथ है जिसे जांच पूरी होने पर बनाया जाना चाहिए.symbol_check
सुविधा की मदद से, संग्रह करने वाले टूल के फ़्लैग जोड़े जाते हैं. इनकी वजह से, डुप्लीकेट सिंबल पर स्टैटिक लाइब्रेरी बनाने की कार्रवाई पूरी नहीं हो पाती.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट जिन डिपेंडेंसी में कोई ऑब्जेक्ट फ़ाइल नहीं होती उन्हें स्टैटिक लाइब्रेरी में शामिल नहीं किया जाता. हालांकि, उनके लेबल को |
cc_test
नियम का सोर्स देखेंcc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
cc_test()
नियम, टेस्ट को कंपाइल करता है. यहां, टेस्ट कुछ टेस्टिंग कोड के चारों ओर बाइनरी रैपर होता है.
डिफ़ॉल्ट रूप से, C++ टेस्ट डाइनैमिक तौर पर लिंक होते हैं.
यूनिट टेस्ट को स्टैटिक तौर पर लिंक करने के लिए, linkstatic=True
बताएं.
यह बताना अच्छा होगा कि आपके टेस्ट के लिए
linkstatic
की ज़रूरत क्यों है; शायद यह साफ़ तौर पर न दिख रहा हो.
इंप्लिसिट आउटपुट टारगेट
name.stripped
(सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो): बाइनरी का ऐसा वर्शन जिसमें कुछ सुविधाएं नहीं होतीं. डीबग सिंबल हटाने के लिए,strip -g
को बाइनरी पर चलाया जाता है.--stripopt=-foo
का इस्तेमाल करके, कमांड लाइन पर स्ट्रिप के अन्य विकल्प दिए जा सकते हैं.name.dwp
(सिर्फ़ तब बनाया जाता है, जब साफ़ तौर पर अनुरोध किया गया हो): अगर Fission चालू है, तो यह डिबग करने के लिए जानकारी देने वाला पैकेज है. यह रिमोट तौर पर डिप्लॉय की गई बाइनरी को डिबग करने के लिए सही है. इसके अलावा: एक खाली फ़ाइल.
cc_binary() आर्ग्युमेंट देखें. हालांकि, जांच के लिए stamp
आर्ग्युमेंट डिफ़ॉल्ट रूप से 0 पर सेट होता है और cc_test
में अतिरिक्त
एट्रिब्यूट होते हैं, जो सभी जांच नियमों (*_test) के लिए सामान्य होते हैं.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट ये |
srcs
|
लेबल की सूची; डिफ़ॉल्ट
असेंबलर की फ़ाइलों (.s, .asm) को पहले से प्रोसेस नहीं किया जाता. आम तौर पर, इन्हें असेंबलर का इस्तेमाल करके बनाया जाता है. पहले से प्रोसेस की गई असेंबली फ़ाइलों (.S) को पहले से प्रोसेस किया जाता है और आम तौर पर, C/C++ कंपाइलर का इस्तेमाल करके बनाया जाता है.
सभी
अगर
... और उन फ़ाइलों को बनाने वाले सभी नियम (उदाहरण के लिए, |
data
|
लेबल की सूची; डिफ़ॉल्ट data के बारे में सामान्य टिप्पणियां देखने के लिए, ज़्यादातर बिल्ड नियमों के मुताबिक तय किए गए सामान्य एट्रिब्यूट पर जाएं.
अगर अगर आपका C++ कोड इन डेटा फ़ाइलों को इस तरह ऐक्सेस कर सकता है:
|
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट उदाहरण के लिए, बाइनरी टारगेट में एम्बेड करने के लिए, यहां इकट्ठा की गई Windows .res फ़ाइलें दी जा सकती हैं. |
conlyopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से
बाइनरी टारगेट को संकलित करने से पहले, इस एट्रिब्यूट की हर स्ट्रिंग को दिए गए क्रम में
अगर पैकेज में feature
|
cxxopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल करने की कमांड लाइन में और उस पर निर्भर हर नियम में भी इसे जोड़ा जाता है. हर स्ट्रिंग में एक ही Bourne shell टोकन होना चाहिए. बहुत सावधानी बरतें, क्योंकि इससे कई तरह के असर पड़ सकते हैं. अगर आपको नहीं पता कि GTIN सही है या नहीं, तो इसके बजाय, local_defines में वैल्यू जोड़ें.
|
dynamic_deps
|
लेबल की सूची; डिफ़ॉल्ट cc_shared_library की अन्य डिपेंडेंसी हैं, जिन पर मौजूदा टारगेट निर्भर करता है.
|
hdrs_check
|
स्ट्रिंग; डिफ़ॉल्ट रूप से |
includes
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -isystem path_to_package/include_entry जनरेट करेगा.
इसका इस्तेमाल सिर्फ़ तीसरे पक्ष की उन लाइब्रेरी के लिए किया जाना चाहिए जो #include स्टेटमेंट लिखने के Google के स्टाइल के मुताबिक नहीं हैं.
COPTS के उलट, ये फ़्लैग इस नियम और उस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: उन नियमों के बारे में नहीं जिन पर यह निर्भर करता है!) बहुत सावधान रहें, क्योंकि इसकी वजह से काफ़ी नुकसान हो सकता है. अगर आपको कोई संदेह है, तो COPTS में "-I" फ़्लैग जोड़ें.
जोड़े गए |
link_extra_lib
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी |
linkopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से LINKOPTS में जोड़ा जाता है.
इस सूची के हर उस एलिमेंट को |
linkshared
|
बूलियन; डिफ़ॉल्ट तौर पर linkshared=True शामिल करें. यह विकल्प डिफ़ॉल्ट रूप से बंद होता है.
इस फ़्लैग की मौजूदगी का मतलब है कि
|
linkstatic
|
बूलियन; डिफ़ॉल्ट तौर पर cc_binary और
cc_test के लिए: स्टैटिक मोड में बाइनरी को लिंक करें. cc_library.link_static के लिए: नीचे देखें.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प, बाइल्ड टूल को उपयोगकर्ता लाइब्रेरी के लिए, किसी एक्सीक्यूटेबल को लिंक करने के तीन तरीके हैं:
अगर
प्रोडक्शन में |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से -D जोड़ा जाता है. साथ ही, इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है, लेकिन इसके डिपेंडेंट में नहीं. हर स्ट्रिंग में एक ही Bourne शेल टोकन होना चाहिए.
|
malloc
|
लेबल; डिफ़ॉल्ट
डिफ़ॉल्ट रूप से, C++ बाइनरी |
module_interfaces
|
लेबल की सूची; डिफ़ॉल्ट C++ स्टैंडर्ड में, मॉड्यूल इंटरफ़ेस फ़ाइल एक्सटेंशन के लिए कोई पाबंदी नहीं है
इसका इस्तेमाल, फ़्लैग
|
nocopts
|
स्ट्रिंग; डिफ़ॉल्ट रूप से COPTS (इसमें नियम के copts एट्रिब्यूट में साफ़ तौर पर बताई गई वैल्यू भी शामिल हैं) को इस नियम को कंपाइल करने के लिए COPTS से हटा दिया जाएगा.
third_party के अलावा, इस एट्रिब्यूट की ज़रूरत नहीं होनी चाहिए या इसका इस्तेमाल नहीं किया जाना चाहिए. वैल्यू को "Make" वैरिएबल के बदले किसी और तरीके से पहले से प्रोसेस नहीं किया जाता.
|
reexport_deps
|
लेबल की सूची; डिफ़ॉल्ट |
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_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, 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
|
लेबल; डिफ़ॉल्ट |
as_files
|
लेबल; डिफ़ॉल्ट |
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 आर्टफ़ैक्ट का कलेक्शन. |
output_licenses
|
स्ट्रिंग की सूची; डिफ़ॉल्ट रूप से |
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)
अब काम नहीं करता: यह नियम काम नहीं करता और इसे हटा दिया जाएगा.
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
fdo_prefetch_hints
नियम का सोर्स देखेंfdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
यह किसी ऐसे एफ़डीओ की प्रीफ़ेच की हिंट प्रोफ़ाइल को दिखाता है जो वर्कस्पेस में मौजूद है. उदाहरण:
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
profile
|
लेबल; ज़रूरी है हिंट प्रोफ़ाइल का लेबल. हिंट फ़ाइल में .afdo एक्सटेंशन होता है लेबल, fdo_absolute_path_profile नियम पर भी ले जा सकता है. |
fdo_profile
नियम का सोर्स देखेंfdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
यह फ़ाइल फ़ोल्डर में मौजूद एफ़डीओ प्रोफ़ाइल को दिखाता है. उदाहरण:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
memprof_profile
|
लेबल; डिफ़ॉल्ट |
profile
|
लेबल; ज़रूरी है एफ़डीओ प्रोफ़ाइल का लेबल या उसे जनरेट करने वाला नियम. FDO फ़ाइल में इनमें से कोई एक एक्सटेंशन हो सकता है: इंडेक्स नहीं की गई LLVM प्रोफ़ाइल के लिए .profraw, इंडेक्स की गई LLVM प्रोफ़ाइल के लिए .profdata, LLVM profraw प्रोफ़ाइल को होस्ट करने वाली .zip, AutoFDO प्रोफ़ाइल के लिए .afdo, और XBinary प्रोफ़ाइल के लिए .xfdo. लेबल, fdo_absolute_path_profile नियम पर भी ले जा सकता है. |
proto_profile
|
लेबल; डिफ़ॉल्ट |
memprof_profile
नियम का सोर्स देखेंmemprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
यह वर्कस्पेस में मौजूद MEMPROF प्रोफ़ाइल को दिखाता है. उदाहरण:
memprof_profile(
name = "memprof",
profile = "//path/to/memprof:profile.afdo",
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
profile
|
लेबल; ज़रूरी है MEMPROF प्रोफ़ाइल का लेबल. प्रोफ़ाइल में .profdata एक्सटेंशन (इंडेक्स की गई/सिंबल वाली memprof प्रोफ़ाइल के लिए) या .zip एक्सटेंशन होना चाहिए. यह एक्सटेंशन, memprof.profdata फ़ाइल वाली zip फ़ाइल के लिए होता है. लेबल, fdo_absolute_path_profile नियम पर भी ले जा सकता है. |
propeller_optimize
नियम का सोर्स देखेंpropeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
Workspace में Propeller ऑप्टिमाइज़ेशन प्रोफ़ाइल दिखाता है. उदाहरण:
propeller_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; यह ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
cc_profile
|
लेबल; ज़रूरी है अलग-अलग कंपाइल ऐक्शन में पास की गई प्रोफ़ाइल का लेबल. इस फ़ाइल का एक्सटेंशन .txt है. |
ld_profile
|
लेबल; ज़रूरी है लिंक करने की कार्रवाई में दी गई प्रोफ़ाइल का लेबल. इस फ़ाइल का एक्सटेंशन .txt है. |