नियम
- 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 के उलट, ये फ़्लैग इस नियम और इस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: यह उन नियमों के बारे में नहीं है जिन पर यह निर्भर करता है!) बहुत ज़्यादा सावधानी बरतें, क्योंकि इससे काफ़ी असर पड़ सकता है.  अगर आपको किसी तरह का संदेह है, तो सीओपीटीएस में "-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
         | 
        
                     बूलियन; डिफ़ॉल्ट वैल्यू  अगर   | 
      
          includes
         | 
        
                     स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू  -isystem path_to_package/include_entry जनरेट करेगा.
इसका इस्तेमाल सिर्फ़ तीसरे पक्ष की उन लाइब्रेरी के लिए किया जाना चाहिए जो #include स्टेटमेंट लिखने के Google के तरीके का पालन नहीं करती हैं.
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 के उलट, ये फ़्लैग इस नियम और इस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: यह उन नियमों के बारे में नहीं है जिन पर यह निर्भर करता है!) बहुत ज़्यादा सावधानी बरतें, क्योंकि इससे काफ़ी असर पड़ सकता है.  अगर आपको किसी तरह का संदेह है, तो सीओपीटीएस में "-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 जोड़ा जाता है. साथ ही, इसे इस टारगेट के लिए कंपाइल कमांड लाइन में जोड़ा जाता है. हालांकि, इसे इसके डिपेंडेंट में नहीं जोड़ा जाता. 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 से टारगेट हटाएं और सिर्फ़ डाइनैमिक डिपेंडेंसी पर भरोसा करें. इसके अलावा, यह भी पक्का करें कि 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 के उलट, ये फ़्लैग इस नियम और इस पर निर्भर हर नियम के लिए जोड़े जाते हैं. (ध्यान दें: यह उन नियमों के बारे में नहीं है जिन पर यह निर्भर करता है!) बहुत ज़्यादा सावधानी बरतें, क्योंकि इससे काफ़ी असर पड़ सकता है.  अगर आपको किसी तरह का संदेह है, तो सीओपीटीएस में "-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की मदद से किया जाता है. इसकी जानकारी यहां दी गई है. 
  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
         | 
        
                     लेबल; ज़रूरी है 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 ठीक होने तक,   | 
      
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)
यह Workspace में मौजूद 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 एक्सटेंशन है. |