नियम
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
नियम का सोर्स देखेंcc_binary(name, deps, srcs, data, additional_linker_inputs, args, aspect_hints, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, package_metadata, 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
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू ये linkopts में रेफ़रंस करने की अनुमति भी है. हालांकि, कृपया इस्तेमाल के इस उदाहरण के लिए additional_linker_inputs पर विचार करें.
|
srcs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू सभी प्योर असेंबलर फ़ाइलों (.s, .asm) को पहले से प्रोसेस नहीं किया जाता है. इन्हें आम तौर पर असेंबलर का इस्तेमाल करके बनाया जाता है. प्रीप्रोसेस की गई असेंबली फ़ाइलें (.S) प्रीप्रोसेस की जाती हैं. इन्हें आम तौर पर C/C++ कंपाइलर का इस्तेमाल करके बनाया जाता है.
सभी
अगर
इस्तेमाल किए जा सकने वाले
... और उन फ़ाइलों को जनरेट करने वाले नियम (जैसे, |
data
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू data
ज़्यादातर बिल्ड नियमों के हिसाब से तय किए गए सामान्य एट्रिब्यूट के बारे में सामान्य टिप्पणियां देखें.
अगर अगर आपका C++ कोड, इन डेटा फ़ाइलों को इस तरह ऐक्सेस कर सकता है:
|
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू
उदाहरण के लिए, कंपाइल की गई Windows .res फ़ाइलों को यहां दिया जा सकता है, ताकि उन्हें बाइनरी टारगेट में एम्बेड किया जा सके. |
conlyopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू
इस एट्रिब्यूट में मौजूद हर स्ट्रिंग को, बाइनरी टारगेट कंपाइल करने से पहले
अगर पैकेज में सुविधा
|
cxxopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू -D से पहले जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. इसके अलावा, इसे इस पर निर्भर हर नियम में भी जोड़ा जाता है. बहुत सावधानी बरतें, क्योंकि इससे काफ़ी असर पड़ सकता है. इस टारगेट पर निर्भर रहने वाले हर टारगेट में, ये डेफ़िनिशन जोड़ी जाती हैं. अगर आपको नहीं पता कि 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 जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. हालांकि, इसे इसके डिपेंडेंट में नहीं जोड़ा जाता. defines के उलट, इस टारगेट के लिए सिर्फ़ कंपाइल कमांड लाइन में डेफ़िनिशन जोड़े जाते हैं.
|
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, aspect_hints, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, package_metadata, pic_objects, pic_static_library, restricted_to, shared_library, static_library, strip_include_prefix, 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
में include एट्रिब्यूट काम करता है. उदाहरण के लिए:
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
|
लेबल; डिफ़ॉल्ट वैल्यू इन फ़ाइल टाइप का इस्तेमाल किया जा सकता है:
|
strip_include_prefix
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू इस विकल्प को सेट करने पर, इस नियम के अगर यह रिलेटिव पाथ है, तो इसे पैकेज के हिसाब से रिलेटिव पाथ माना जाता है. अगर यह ऐब्सलूट पाथ है, तो इसे रिपॉज़िटरी के हिसाब से रिलेटिव पाथ माना जाता है.
यह एट्रिब्यूट सिर्फ़ |
system_provided
|
बूलियन; डिफ़ॉल्ट वैल्यू interface_library की वैल्यू तय होनी चाहिए और shared_library खाली होना चाहिए.
|
cc_library
नियम का सोर्स देखेंcc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, aspect_hints, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, package_metadata, 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
फ़ाइल के कंपाइलेशन में, 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 पर 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 = True,
)
यह उदाहरण 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
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू
इस एट्रिब्यूट में मौजूद हर स्ट्रिंग को, बाइनरी टारगेट कंपाइल करने से पहले
अगर पैकेज में सुविधा
|
cxxopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू -D से पहले जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. इसके अलावा, इसे इस पर निर्भर हर नियम में भी जोड़ा जाता है. बहुत सावधानी बरतें, क्योंकि इससे काफ़ी असर पड़ सकता है. इस टारगेट पर निर्भर रहने वाले हर टारगेट में, ये डेफ़िनिशन जोड़ी जाती हैं. अगर आपको नहीं पता कि 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 में दिए गए linkopts को, नियम के linkopts की तुलना में ज़्यादा प्राथमिकता दी जाती है.
ध्यान दें कि यह भी ध्यान रखना ज़रूरी है कि "-Wl,-soname" या "-Xlinker -soname" विकल्प काम नहीं करते हैं. इसलिए, इस एट्रिब्यूट में इन्हें कभी भी शामिल नहीं करना चाहिए. |
linkstamp
|
लेबल; डिफ़ॉल्ट वैल्यू base पैकेज में होना चाहिए.
|
linkstatic
|
बूलियन; डिफ़ॉल्ट वैल्यू cc_binary और cc_test के लिए: बाइनरी को स्टैटिक मोड में लिंक करें. cc_library.link_static के लिए: यहां दिया गया तरीका अपनाएं.
डिफ़ॉल्ट रूप से, यह विकल्प
अगर यह विकल्प चालू है और यह बाइनरी या टेस्ट है, तो यह विकल्प बिल्ड टूल को बताता है कि जब भी संभव हो, उपयोगकर्ता लाइब्रेरी के लिए किसी एक्ज़ीक्यूटेबल को लिंक करने के तीन अलग-अलग तरीके हैं:
अगर
प्रोडक्शन में |
local_defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू -D जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. हालांकि, इसे इसके डिपेंडेंट में नहीं जोड़ा जाता. defines के उलट, इस टारगेट के लिए सिर्फ़ कंपाइल कमांड लाइन में डेफ़िनिशन जोड़े जाते हैं.
|
module_interfaces
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू C++ स्टैंडर्ड में, मॉड्यूल इंटरफ़ेस फ़ाइल के एक्सटेंशन के बारे में कोई पाबंदी नहीं है
इस सुविधा का इस्तेमाल, |
strip_include_prefix
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू इस विकल्प को सेट करने पर, इस नियम के अगर यह रिलेटिव पाथ है, तो इसे पैकेज के हिसाब से रिलेटिव पाथ माना जाता है. अगर यह ऐब्सलूट पाथ है, तो इसे रिपॉज़िटरी के हिसाब से रिलेटिव पाथ माना जाता है.
यह एट्रिब्यूट सिर्फ़ |
textual_hdrs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू यह ऐसी हेडर फ़ाइलों के लिए लोकेशन है जिन्हें खुद से कंपाइल नहीं किया जा सकता. इसका मतलब है कि मान्य कोड बनाने के लिए, उन्हें हमेशा अन्य सोर्स फ़ाइलों में टेक्स्ट के तौर पर शामिल करना होता है. |
win_def_file
|
लेबल; डिफ़ॉल्ट वैल्यू इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_shared_library
नियम का सोर्स देखेंcc_shared_library(name, deps, additional_linker_inputs, aspect_hints, compatible_with, deprecation, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, 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
होगा. हालांकि, Linux पर डिफ़ॉल्ट रूप से इसका नाम libbar.so
होता है.
गड़बड़ियां
Two shared libraries in dependencies export the same symbols.
ऐसा तब होगा, जब दो अलग-अलग cc_shared_library
डिपेंडेंसी एक ही टारगेट को एक्सपोर्ट कर रही हों. इस समस्या को ठीक करने के लिए, आपको cc_shared_library
डिपेंडेंसी में से किसी एक में लाइब्रेरी एक्सपोर्ट करने की सुविधा बंद करनी होगी.
Two shared libraries in dependencies link the same library statically
ऐसा तब होगा, जब दो अलग-अलग cc_shared_library
डिपेंडेंसी के साथ नया cc_shared_library
बनाया जा रहा हो और दोनों एक ही टारगेट को स्टैटिक तौर पर लिंक करती हों.
यह एक्सपोर्ट से जुड़ी गड़बड़ी की तरह ही है.
इस समस्या को ठीक करने का एक तरीका यह है कि लाइब्रेरी को cc_shared_library
की किसी एक डिपेंडेंसी से लिंक करना बंद कर दें. साथ ही, जो लाइब्रेरी अब भी लिंक है उसे लाइब्रेरी एक्सपोर्ट करनी होगी, ताकि जो लाइब्रेरी लिंक नहीं है उसे सिंबल दिखते रहें. दूसरा तरीका यह है कि टारगेट को एक्सपोर्ट करने वाली किसी तीसरे पक्ष की लाइब्रेरी का इस्तेमाल किया जाए.
तीसरा तरीका यह है कि cc_library
को LINKABLE_MORE_THAN_ONCE
के साथ टैग किया जाए. हालांकि, ऐसा बहुत कम करना चाहिए. साथ ही, आपको यह पक्का करना चाहिए कि cc_library
को एक से ज़्यादा बार लिंक करना सुरक्षित हो.
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
इसका मतलब है कि आपकी deps
के ट्रांज़िटिव क्लोज़र में मौजूद कोई लाइब्रेरी, cc_shared_library
की किसी डिपेंडेंसी के बिना ही ऐक्सेस की जा सकती है. हालांकि, यह dynamic_deps
में किसी अन्य cc_shared_library
से पहले ही लिंक हो चुकी है और इसे एक्सपोर्ट नहीं किया गया है.
इसका समाधान यह है कि इसे cc_shared_library
डिपेंडेंसी से एक्सपोर्ट करें या इसे एक्सपोर्ट करने वाली तीसरी cc_shared_library
को बाहर निकालें.
Do not place libraries which only contain a precompiled dynamic library in deps.
अगर आपके पास पहले से कंपाइल की गई डाइनैमिक लाइब्रेरी है, तो इसे मौजूदा cc_shared_library
टारगेट में स्टैटिक तौर पर लिंक करने की ज़रूरत नहीं है. साथ ही, इसे लिंक नहीं किया जा सकता. इसलिए, यह deps
के cc_shared_library
में शामिल नहीं है. अगर यह पहले से कंपाइल की गई डाइनैमिक लाइब्रेरी, आपके किसी cc_libraries
की डिपेंडेंसी है, तो cc_libraries
को सीधे तौर पर इस पर निर्भर होना चाहिए.cc_library
Trying to export a library already exported by a different shared library
अगर मौजूदा नियम के तहत, ऐसे टारगेट को एक्सपोर्ट करने का दावा किया जा रहा है जिसे आपकी किसी डाइनैमिक डिपेंडेंसी से पहले ही एक्सपोर्ट किया जा रहा है, तो आपको यह गड़बड़ी दिखेगी.
इसे ठीक करने के लिए, deps
से टारगेट हटाएं और सिर्फ़ डाइनैमिक डिपेंडेंसी पर भरोसा करें. इसके अलावा, यह भी पक्का करें कि deps
इस टारगेट को कैप्चर न करे.exports_filter
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू
इन डायरेक्ट डिपेंडेंसी की किसी भी ट्रांज़िटिव लाइब्रेरी डिपेंडेंसी को इस शेयर की गई लाइब्रेरी में लिंक किया जाएगा. हालांकि, ऐसा तब तक किया जाएगा, जब तक उन्हें
विश्लेषण के दौरान, नियम लागू करने की प्रोसेस में
अगर एक ही लाइब्रेरी को एक से ज़्यादा |
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू user_link_flags एट्रिब्यूट का इस्तेमाल करें.
|
dynamic_deps
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू cc_shared_library डिपेंडेंसी हैं जिन पर मौजूदा टारगेट निर्भर करता है.
|
exports_filter
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू
शेयर की गई लाइब्रेरी से किसी भी टारगेट
ध्यान दें कि यह एट्रिब्यूट, उन टारगेट में डिपेंडेंसी एज नहीं जोड़ रहा है. डिपेंडेंसी एज को इस सिंटैक्स का इस्तेमाल किया जा सकता है: foo/BUILD में मौजूद किसी भी टारगेट के लिए
|
roots
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू |
shared_lib_name
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू |
static_deps
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
user_link_flags
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू
|
win_def_file
|
लेबल; डिफ़ॉल्ट वैल्यू इस एट्रिब्यूट का इस्तेमाल सिर्फ़ तब किया जाना चाहिए, जब Windows टारगेट प्लैटफ़ॉर्म हो. इसका इस्तेमाल, शेयर की गई लाइब्रेरी को लिंक करते समय सिंबल एक्सपोर्ट करने के लिए किया जा सकता है. |
cc_static_library
नियम का सोर्स देखेंcc_static_library(name, deps, aspect_hints, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
इससे बनने वाली स्टैटिक लाइब्रेरी में, deps
में दी गई सूची में शामिल टारगेट की ऑब्जेक्ट फ़ाइलें होती हैं. साथ ही, उनकी ट्रांज़िटिव डिपेंडेंसी भी होती हैं. इसमें PIC
ऑब्जेक्ट को प्राथमिकता दी जाती है.
आउटपुट ग्रुप
linkdeps
यह एक टेक्स्ट फ़ाइल होती है. इसमें deps
में दी गई उन ट्रांज़िटिव डिपेंडेंसी के लेबल होते हैं जिन्होंने स्टैटिक लाइब्रेरी में कोई ऑब्जेक्ट फ़ाइल नहीं दी है. हालांकि, वे कम से कम एक स्टैटिक, डाइनैमिक या इंटरफ़ेस लाइब्रेरी उपलब्ध कराती हैं. लिंक करने के समय, स्टैटिक लाइब्रेरी के लिए इन लाइब्रेरी का उपलब्ध होना ज़रूरी हो सकता है.
linkopts
यह एक टेक्स्ट फ़ाइल होती है. इसमें उपयोगकर्ता की ओर से दी गई linkopts
होती है. यह deps
में दी गई सभी ट्रांज़िटिव डिपेंडेंसी की होती है.
डुप्लीकेट सिंबल
डिफ़ॉल्ट रूप से, 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, aspect_hints, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, dynamic_deps, env, env_inherit, exec_compatible_with, exec_group_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, package_metadata, 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
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू ये linkopts में रेफ़रंस करने की अनुमति भी है. हालांकि, कृपया इस्तेमाल के इस उदाहरण के लिए additional_linker_inputs पर विचार करें.
|
srcs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू सभी प्योर असेंबलर फ़ाइलों (.s, .asm) को पहले से प्रोसेस नहीं किया जाता है. इन्हें आम तौर पर असेंबलर का इस्तेमाल करके बनाया जाता है. प्रीप्रोसेस की गई असेंबली फ़ाइलें (.S) प्रीप्रोसेस की जाती हैं. इन्हें आम तौर पर C/C++ कंपाइलर का इस्तेमाल करके बनाया जाता है.
सभी
अगर
इस्तेमाल किए जा सकने वाले
... और उन फ़ाइलों को जनरेट करने वाले नियम (जैसे, |
data
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू data
ज़्यादातर बिल्ड नियमों के हिसाब से तय किए गए सामान्य एट्रिब्यूट के बारे में सामान्य टिप्पणियां देखें.
अगर अगर आपका C++ कोड, इन डेटा फ़ाइलों को इस तरह ऐक्सेस कर सकता है:
|
additional_linker_inputs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू
उदाहरण के लिए, कंपाइल की गई Windows .res फ़ाइलों को यहां दिया जा सकता है, ताकि उन्हें बाइनरी टारगेट में एम्बेड किया जा सके. |
conlyopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
copts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू
इस एट्रिब्यूट में मौजूद हर स्ट्रिंग को, बाइनरी टारगेट कंपाइल करने से पहले
अगर पैकेज में सुविधा
|
cxxopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
defines
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू -D से पहले जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. इसके अलावा, इसे इस पर निर्भर हर नियम में भी जोड़ा जाता है. बहुत सावधानी बरतें, क्योंकि इससे काफ़ी असर पड़ सकता है. इस टारगेट पर निर्भर रहने वाले हर टारगेट में, ये डेफ़िनिशन जोड़ी जाती हैं. अगर आपको नहीं पता कि 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 जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. हालांकि, इसे इसके डिपेंडेंट में नहीं जोड़ा जाता. defines के उलट, इस टारगेट के लिए सिर्फ़ कंपाइल कमांड लाइन में डेफ़िनिशन जोड़े जाते हैं.
|
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, aspect_hints, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_group_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, package_metadata, 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
provider का इस्तेमाल किया जाता है. इसकी जानकारी यहां दी गई है.
C++ टूलचेन को कॉन्फ़िगर करने के लिए, toolchain_config
एट्रिब्यूट का इस्तेमाल करें.
C++ टूलचेन कॉन्फ़िगरेशन और टूलचेन चुनने से जुड़े दस्तावेज़ के बारे में ज़्यादा जानकारी के लिए, यह
पेज
भी देखें.
tags = ["manual"]
का इस्तेमाल करें, ताकि bazel build //...
को शुरू करते समय टूलचेन को बिना वजह न बनाया और कॉन्फ़िगर न किया जाए
तर्क
विशेषताएं | |
---|---|
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
|
लेबल; ज़रूरी है डीडब्ल्यूपी कार्रवाइयों के लिए ज़रूरी सभी 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 ठीक होने तक, |
fdo_prefetch_hints
नियम का सोर्स देखेंfdo_prefetch_hints(name, aspect_hints, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
यह एक ऐसी FDO प्रीफ़ेच हिंट प्रोफ़ाइल को दिखाता है जो वर्कस्पेस में मौजूद है. उदाहरण:
fdo_prefetch_hints(
name = "hints",
profile = "//path/to/hints:profile.afdo",
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
profile
|
लेबल; ज़रूरी है सुझाव देने वाली प्रोफ़ाइल का लेबल. हिंट फ़ाइल में .afdo एक्सटेंशन होता है लेबल, fdo_absolute_path_profile नियम की ओर भी इशारा कर सकता है. |
fdo_profile
नियम का सोर्स देखेंfdo_profile(name, aspect_hints, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, memprof_profile, package_metadata, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
यह वर्कस्पेस में मौजूद किसी FDO प्रोफ़ाइल को दिखाता है. उदाहरण:
fdo_profile(
name = "fdo",
profile = "//path/to/fdo:profile.zip",
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
memprof_profile
|
लेबल; डिफ़ॉल्ट वैल्यू |
profile
|
लेबल; ज़रूरी है एफ़डीओ प्रोफ़ाइल का लेबल या उसे जनरेट करने वाला नियम. FDO फ़ाइल में इनमें से कोई एक एक्सटेंशन हो सकता है: .profraw, जो इंडेक्स नहीं की गई LLVM प्रोफ़ाइल के लिए होता है, .profdata, जो इंडेक्स की गई LLVM प्रोफ़ाइल के लिए होता है, .zip, जिसमें LLVM profraw प्रोफ़ाइल होती है, .afdo, जो AutoFDO प्रोफ़ाइल के लिए होता है, और .xfdo, जो XBinary प्रोफ़ाइल के लिए होता है. यह लेबल, fdo_absolute_path_profile नियम की ओर भी इशारा कर सकता है. |
proto_profile
|
लेबल; डिफ़ॉल्ट वैल्यू |
memprof_profile
नियम का सोर्स देखेंmemprof_profile(name, aspect_hints, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, 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 फ़ाइल वाली zipfile के लिए) होना चाहिए. यह लेबल, fdo_absolute_path_profile नियम की ओर भी इशारा कर सकता है. |
propeller_optimize
नियम का सोर्स देखेंpropeller_optimize(name, aspect_hints, cc_profile, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, ld_profile, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
यह वर्कस्पेस में Propeller की ऑप्टिमाइज़ेशन प्रोफ़ाइल को दिखाता है. उदाहरण:
propeller_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
तर्क
विशेषताएं | |
---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
cc_profile
|
लेबल; ज़रूरी है प्रोफ़ाइल का लेबल, जिसे अलग-अलग कंपाइल कार्रवाइयों में पास किया गया है. इस फ़ाइल में .txt एक्सटेंशन है. |
ld_profile
|
लेबल; ज़रूरी है लिंक करने की कार्रवाई के लिए पास की गई प्रोफ़ाइल का लेबल. इस फ़ाइल में .txt एक्सटेंशन है. |