C++ टूलचेन कॉन्फ़िगरेशन

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

खास जानकारी

कंपाइलर को सही विकल्पों के साथ इस्तेमाल करने के लिए, Bazel को कंपाइलर के इंटरनल के बारे में कुछ जानकारी चाहिए. जैसे, शामिल डायरेक्ट्री और अहम फ़्लैग. दूसरे शब्दों में, Bazel को कंपाइलर के काम करने के तरीके को समझने के लिए, उसके आसान मॉडल की ज़रूरत होती है.

बेज़ल को यह जानकारी होनी चाहिए:

  • कंपाइलर, thinLTO, मॉड्यूल, डाइनैमिक लिंकिंग या PIC (पोज़िशन इंडिपेंडेंट कोड) के साथ काम करता है या नहीं.
  • ज़रूरी टूल के पाथ, जैसे कि gcc, ld, ar, objcopy वगैरह.
  • बिल्ट-इन सिस्टम में डायरेक्ट्री शामिल होती हैं. Bazel को इनकी ज़रूरत इस बात की पुष्टि करने के लिए होती है कि सोर्स फ़ाइल में शामिल सभी हेडर, BUILD फ़ाइल में सही तरीके से एलान किए गए थे.
  • डिफ़ॉल्ट sysroot.
  • कंपाइलेशन, लिंक करने, संग्रहित करने के लिए किन फ़्लैग का इस्तेमाल करना है.
  • काम करने वाले कंपाइलेशन मोड (opt, dbg, fastbuild) के लिए, किन फ़्लैग का इस्तेमाल करना है.
  • ऐसे वैरिएबल बनाएं जो कंपाइलर के लिए ज़रूरी हों.

अगर कंपाइलर में एक से ज़्यादा आर्किटेक्चर के लिए सहायता है, तो Bazel को उन्हें अलग से कॉन्फ़िगर करना होगा.

CcToolchainConfigInfo एक ऐसा प्रोवाइडर है जो Bazel के C++ नियमों के काम करने के तरीके को कॉन्फ़िगर करने के लिए, ज़रूरी जानकारी देता है. डिफ़ॉल्ट रूप से, Baज़र, आपके बिल्ड के लिए CcToolchainConfigInfo को अपने-आप कॉन्फ़िगर कर देता है, लेकिन आप ऐसा कर सकते हैं इसे मैन्युअल तरीके से कॉन्फ़िगर करने का विकल्प होता है. इसके लिए, आपको स्टारलार्क नियम की ज़रूरत होगी जो CcToolchainConfigInfo उपलब्ध कराता है और आपको एट्रिब्यूट की वैल्यू के तौर पर toolchain_config cc_toolchain को आपके नियम में जोड़ा गया. CcToolchainConfigInfo बनाने के लिए, इस नंबर पर कॉल करें cc_common.create_cc_toolchain_config_info(). आपको @rules_cc//cc:cc_toolchain_config_lib.bzl में, उन सभी स्ट्रक्चर के लिए Starlark कन्स्ट्रक्टर मिल सकते हैं जिनकी आपको प्रोसेस में ज़रूरत होगी.

जब C++ टारगेट, विश्लेषण के चरण में आता है, तो Baज़र सही विकल्प चुन लेता है cc_toolchain BUILD फ़ाइल के आधार पर टारगेट करता है और इसमें बताए गए टारगेट से CcToolchainConfigInfo कंपनी cc_toolchain.toolchain_config एट्रिब्यूट की वैल्यू सबमिट करें. cc_toolchain का टारगेट यह जानकारी CcToolchainProvider के ज़रिए, C++ टारगेट को भेजती है.

उदाहरण के लिए, कंपाइल या लिंक की कार्रवाई, जिसे इस तरह के नियम से इंस्टैंशिएट किया जाता है cc_binary या cc_library को यह जानकारी देनी होगी:

  • इस्तेमाल किया जाने वाला कंपाइलर या लिंकर
  • कंपाइलर/लिंकर के लिए कमांड-लाइन फ़्लैग
  • --copt/--linkopt विकल्पों से पास किए गए कॉन्फ़िगरेशन फ़्लैग
  • एनवायरमेंट वैरिएबल
  • सैंडबॉक्स में ऐसी आर्टफ़ैक्ट जिनमें कार्रवाई पूरी होती है

सैंडबॉक्स में ज़रूरी आर्टफ़ैक्ट को छोड़कर, ऊपर दी गई सारी जानकारी, cc_toolchain के टारगेट किए गए Starlark टारगेट में दी गई है.

सैंडबॉक्स में भेजे जाने वाले आर्टफ़ैक्ट के बारे में cc_toolchain में बताया गया है टारगेट. उदाहरण के लिए, cc_toolchain.linker_files एट्रिब्यूट की मदद से ये काम किए जा सकते हैं सैंडबॉक्स में भेजने के लिए, लिंकर बाइनरी और टूलचेन लाइब्रेरी को तय करना.

टूलचेन चुनना

टूलचेन चुनने का लॉजिक इस तरह काम करता है:

  1. उपयोगकर्ता ने BUILD फ़ाइल और पॉइंट में cc_toolchain_suite टारगेट तय किया है का उपयोग करके लक्ष्य के लिए बेज़ल --crosstool_top विकल्प.

  2. cc_toolchain_suite टारगेट में कई टूलचेन का इस्तेमाल होता है. --cpu और --compiler फ़्लैग की वैल्यू से यह तय होता है कि उनमें से कौनसा टूलचेन चुना जाए. यह सिर्फ़ --cpu फ़्लैग की वैल्यू या --cpu | --compiler की संयुक्त वैल्यू के आधार पर तय होता है. प्रोजेक्ट चुनने की प्रोसेस इस तरह से होती है:

    • अगर --compiler बताया गया है, तो Baze cc_toolchain_suite.toolchains से संबंधित एंट्री विशेषता --cpu | --compiler वाली होनी चाहिए. अगर Bazel को कोई मिलती-जुलती एंट्री नहीं मिलती है, तो वह गड़बड़ी का मैसेज दिखाता है.

    • अगर --compiler विकल्प नहीं दिया गया है, तो Bazel सिर्फ़ --cpu के साथ cc_toolchain_suite.toolchains एट्रिब्यूट से उससे जुड़ी एंट्री चुनता है.

    • अगर कोई फ़्लैग तय नहीं किया गया है, तो Bazel होस्ट सिस्टम की जांच करता है और अपनी खोज के आधार पर --cpu वैल्यू चुनता है. जांच करने के तरीके का कोड देखें.

टूलचेन चुनने के बाद, संबंधित feature और action_config Starlark नियम में मौजूद ऑब्जेक्ट बिल्ड के कॉन्फ़िगरेशन को कंट्रोल करते हैं (यानी कि आइटम पर बाद में बताया गया है). इन मैसेज की मदद से, Bazel बाइनरी में बदलाव किए बिना, Bazel में C++ की सभी सुविधाएं लागू की जा सकती हैं. C++ के नियमों में, कई खास कार्रवाइयों की सुविधा उपलब्ध है. Baज़ल के सोर्स कोड में होने चाहिए.

सुविधाएं

सुविधा एक ऐसी इकाई है जिसके लिए कमांड-लाइन फ़्लैग, कार्रवाई, एक्ज़ीक्यूशन एनवायरमेंट पर कंस्ट्रेंट या डिपेंडेंसी में बदलाव करने पर. सुविधा हो सकता है कि यह BUILD फ़ाइलों को कॉन्फ़िगरेशन चुनने की अनुमति देने जैसा आसान हो फ़्लैग का इस्तेमाल कर सकते हैं, जैसे कि treat_warnings_as_errors या C++ के नियमों के साथ इंटरैक्ट कर सकते हैं और कंपाइलेशन में नई कार्रवाइयों और इनपुट को शामिल करें, जैसे header_modules या thin_lto.

आम तौर पर, CcToolchainConfigInfo में सुविधाओं की एक सूची होती है. इसमें हर सुविधा में एक या एक से ज़्यादा फ़्लैग ग्रुप होते हैं. हर फ़्लैग ग्रुप में, उन फ़्लैग की सूची होती है जो खास Bazel कार्रवाइयों पर लागू होते हैं.

विशेषता को नाम से तय किया जाता है, जो स्टारलार्क को पूरी तरह से अलग करने की अनुमति देता है बेज़ल रिलीज़ से नियम कॉन्फ़िगरेशन. दूसरे शब्दों में, बेज़ल रिलीज़ में CcToolchainConfigInfo कॉन्फ़िगरेशन के काम करने के तरीके पर तब तक असर पड़ता है, जब तक कि कॉन्फ़िगरेशन के लिए नई सुविधाओं का इस्तेमाल करने की ज़रूरत नहीं है.

किसी सुविधा को इनमें से किसी एक तरीके से चालू किया जाता है:

  • सुविधा के enabled फ़ील्ड को true पर सेट किया गया है.
  • बेज़ल या नियम के मालिक ने इसे साफ़ तौर पर चालू किया हो.
  • उपयोगकर्ता इसे --feature बेज़ल विकल्प या features नियम के ज़रिए चालू करता है एट्रिब्यूट की वैल्यू सबमिट करें.

सुविधाओं में एक-दूसरे पर निर्भरता हो सकती है. ये कमांड-लाइन फ़्लैग, BUILD फ़ाइल सेटिंग, और अन्य वैरिएबल पर निर्भर करती हैं.

सुविधाओं के साथ ऐसेट जोड़ना

आम तौर पर, डिपेंडेंसी को सीधे Basel के ज़रिए मैनेज किया जाता है, जो अपने-आप लागू होने वाली साथ ही, सुविधाओं की प्रकृति से जुड़े विवादों को मैनेज करती है और बिल्ड में परिभाषित किया गया है. टूलचेन स्पेसिफ़िकेशन की मदद से, Starlark नियम में सीधे तौर पर इस्तेमाल करने के लिए ज़्यादा सटीक पाबंदियां लगाई जा सकती हैं. यह नियम, सुविधा के इस्तेमाल और उसके दायरे को कंट्रोल करता है. इनके उदाहरण हैं:

सीमा जानकारी
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
सुविधा-लेवल. यह सुविधा सिर्फ़ तब काम करती है, जब ज़रूरी बताई गई सुविधाएं चालू हों. उदाहरण के लिए, जब कोई सुविधा सिर्फ़ कुछ खास बिल्ड मोड (opt, dbg या fastbuild) में काम करती है. अगर `requires` में एक से ज़्यादा `feature_set`s शामिल हैं, तो सुविधा तब काम करती है, जब कोई भी `feature_set`s पूरी हो (जब बताई गई सभी सुविधाएं चालू हों).
implies = ['feature']

सुविधा-लेवल. इस सुविधा का मतलब, बताई गई सुविधाओं से है. किसी सुविधा को चालू करने पर, उससे जुड़ी सभी सुविधाएं भी चालू हो जाती हैं (यानी, यह बार-बार काम करती है).

साथ ही, फ़ंक्शन के सामान्य सबसेट को फ़ैक्टर करने की सुविधा भी देता है सैनिटाइज़र के सामान्य हिस्सों जैसी सुविधाओं का सेट. डिफ़ॉल्ट रूप से चालू होने वाली सुविधाओं को बंद नहीं किया जा सकता.

provides = ['feature']

सुविधा के लेवल पर. इससे पता चलता है कि यह सुविधा आपस में जुड़ी कई सुविधाओं में से एक है खास वैकल्पिक सुविधाएं. उदाहरण के लिए, सभी सैनिटाइज़र के लिए provides = ["sanitizer"] का इस्तेमाल किया जा सकता है.

अगर उपयोगकर्ता एक साथ दो या उससे ज़्यादा ऐसी सुविधाओं के लिए पूछता है जो एक-दूसरे के साथ काम नहीं करती हैं, तो गड़बड़ी को ठीक करने की प्रोसेस को बेहतर बनाने के लिए, विकल्पों की सूची दिखाई जाती है.

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
फ़्लैग सेट-लेवल. किसी फ़ीचर में, एक से ज़्यादा फ़्लैग सेट तय किए जा सकते हैं. with_features के बारे में बताने पर, फ़्लैग सेट सिर्फ़ बड़ा होगा बिल्ड कमांड को सबमिट करें, अगर कम से कम एक with_feature_set हो जिसके लिए बताए गए features सेट में मौजूद सभी सुविधाएं चालू है और not_features में बताई गई सभी सुविधाएं चालू हैं सेट बंद हैं. अगर with_features का मान नहीं दिया गया है, तो फ़्लैग सेट तय की गई हर कार्रवाई के लिए बिना किसी शर्त के लागू होता है.

कार्रवाइयां

कार्रवाइयों से, इन स्थितियों में बदलाव करने की सुविधा मिलती है यह कार्रवाई किए बिना ही कार्रवाई पूरी होती है. अगर आप action_config किसी कार्रवाई को शुरू करने वाली टूल बाइनरी के बारे में बताता है, जबकि feature कॉन्फ़िगरेशन (फ़्लैग) के बारे में बताता है, जो यह तय करता है कि टूल कार्रवाई शुरू होने पर काम करता है.

यह बताने के लिए कि Basel की कौनसी कार्रवाइयाँ हैं, उनके रेफ़रंस वाली सुविधाएँ वे प्रभावित करती हैं, क्योंकि कार्रवाइयों से बेज़ल ऐक्शन ग्राफ़ में बदलाव हो सकता है. कॉन्टेंट बनाने सेवा देने वाली CcToolchainConfigInfo कंपनी के पास ऐसी कार्रवाइयां हैं जिनमें फ़्लैग और टूल मौजूद हैं जैसे कि c++-compile. हर कार्रवाई के लिए फ़्लैग असाइन किए जाते हैं और उन्हें किसी सुविधा से जोड़कर.

हर कार्रवाई के नाम से, एक ही तरह की कार्रवाई के बारे में पता चलता है. यह कार्रवाई Basel ने की है, जैसे कि कंपाइल या लिंक करना. हालांकि, दो पक्षों के जुड़ाव के दो पहलू कार्रवाइयां और Babel कार्रवाई प्रकार, जहां Basel कार्रवाई प्रकार एक Java क्लास का संदर्भ देता है जो किसी कार्रवाई को लागू करता है (जैसे कि CppCompileAction). खास तौर पर, "असेंबलर की कार्रवाइयां" और "कंपाइलर ऐक्शन" नीचे दी गई टेबल में, CppCompileAction, जबकि लिंक से जुड़ी कार्रवाइयां CppLinkAction हैं.

असेंबलर ऐक्शन

कार्रवाई जानकारी
preprocess-assemble डेटा को पहले से प्रोसेस करके इकट्ठा करना. आम तौर पर, .S फ़ाइलों के लिए.
assemble प्रीप्रोसेसिंग के बिना असेंबल करें. आम तौर पर, .s फ़ाइलों के लिए.

कंपाइलर की कार्रवाइयां

कार्रवाई जानकारी
cc-flags-make-variable CC_FLAGS को जेन रूल में लागू करता है.
c-compile C के तौर पर कंपाइल करें.
c++-compile C++ के तौर पर कंपाइल करें.
c++-header-parsing हेडर फ़ाइल पर कंपाइलर के पार्सर को चलाएं, ताकि यह पक्का किया जा सके कि हेडर में सभी जानकारी मौजूद है. ऐसा न करने पर, कंपाइल करने से जुड़ी गड़बड़ियां हो सकती हैं. लागू होता है का इस्तेमाल सिर्फ़ ऐसे टूलचेन के लिए करना चाहिए जो मॉड्यूल के साथ काम करते हैं.
कार्रवाई जानकारी
c++-link-dynamic-library शेयर की गई ऐसी लाइब्रेरी जोड़ें जिसमें सभी डिपेंडेंसी शामिल हों.
c++-link-nodeps-dynamic-library सिर्फ़ cc_library सोर्स वाली शेयर की गई लाइब्रेरी को लिंक करें.
c++-link-executable रन करने के लिए तैयार फ़ाइनल लाइब्रेरी जोड़ें.

एआर (ऑगमेंटेड रिएलिटी) ऐक्शन

एआर ऐक्शन, ar के ज़रिए ऑब्जेक्ट फ़ाइलों को संग्रह लाइब्रेरी (.a फ़ाइलें) में इकट्ठा करते हैं और नाम में कुछ सेमेटिक कोड डालते हैं.

कार्रवाई जानकारी
c++-link-static-library स्टैटिक लाइब्रेरी (संग्रह) बनाएं.

एलटीओ की कार्रवाइयां

कार्रवाई जानकारी
lto-backend थिनएलटीओ ऐक्शन, बिटकोड को नेटिव ऑब्जेक्ट में कंपाइल करता है.
lto-index थिनएलटीओ ऐक्शन, ग्लोबल इंडेक्स जनरेट कर रहा है.

action_config का इस्तेमाल किया जा रहा है

action_config स्टारलार्क स्ट्रक्चर है, जो बेज़ल के बारे में बताती है कार्रवाई के दौरान शुरू करने के लिए टूल (बाइनरी) तय करके कार्रवाई और फ़्लैग, सुविधाओं के हिसाब से. ये फ़्लैग, कार्रवाई को लागू करने पर पाबंदियां लगाते हैं.

action_config() कंस्ट्रक्टर में ये पैरामीटर हैं:

एट्रिब्यूट जानकारी
action_name यह कार्रवाई जिससे गेम को खास तौर पर अपडेट किया गया है. बेज़ल इस एट्रिब्यूट का इस्तेमाल, हर कार्रवाई के टूल और उसे लागू करने के बारे में जानने के लिए करते हैं ज़रूरतें.
tools यह कोड एक्ज़ीक्यूट करने के लिए इस्तेमाल किया जाता है. कार्रवाई पर लागू किया गया टूल सुविधा के सेट के साथ सूची में पहला टूल मौजूद है जो सुविधा से मेल खाता है कॉन्फ़िगरेशन. डिफ़ॉल्ट मान देना ज़रूरी है.
flag_sets फ़्लैग की सूची, जो कार्रवाइयों के ग्रुप पर लागू होती है. यह वैल्यू, किसी सुविधा के लिए तय की गई वैल्यू जैसी ही होनी चाहिए.
env_sets एनवायरमेंट कंस्ट्रेंट की एक सूची, जो कार्रवाइयों के एक ग्रुप पर लागू होती है. यह वैल्यू, किसी सुविधा के लिए तय की गई वैल्यू जैसी ही होनी चाहिए.

action_config के लिए दूसरी सुविधाओं की ज़रूरत पड़ सकती है और उन्हें लागू किया जा सकता है. action_config सुविधाओं के साथ जुड़ाव के बारे में ऊपर बताया गया है. यह व्यवहार, किसी सुविधा के व्यवहार से मिलता-जुलता है.

आखिरी दो एट्रिब्यूट, सुविधाओं के एट्रिब्यूट के मुकाबले ग़ैर-ज़रूरी हैं. इन्हें इसलिए शामिल किया गया है, क्योंकि Bazel की कुछ कार्रवाइयों के लिए कुछ फ़्लैग या एनवायरमेंट वैरिएबल की ज़रूरत होती है. साथ ही, हमारा मकसद action_config+feature के ग़ैर-ज़रूरी पेयर से बचना है. आम तौर पर, किसी एक सुविधा को एक से ज़्यादा action_config के साथ शेयर करना प्राथमिकता दी जाती है.

एक ही टूलचेन में, एक ही action_name के साथ एक से ज़्यादा action_config तय नहीं किए जा सकते. इससे टूल पाथ में आसानी से कोई जानकारी नहीं मिलती और action_config के पीछे के इंटेंट को लागू करता है - कि किसी कार्रवाई की प्रॉपर्टी टूलचेन में एक ही जगह पर साफ़ तौर पर बताई गई हों.

टूल कंस्ट्रक्टर का इस्तेमाल करना

action_config, अपने tools पैरामीटर की मदद से टूल का सेट तय कर सकता है. tool() कंस्ट्रक्टर, ये पैरामीटर इस्तेमाल करता है:

फ़ील्ड जानकारी
path उस टूल का पाथ जिस पर दावा किया गया है (मौजूदा जगह के हिसाब से).
with_features सुविधा के सेट की ऐसी सूची जिसमें से कम से कम किसी एक को पूरा करना ज़रूरी है इस टूल का इस्तेमाल करें.

किसी दिए गए action_config के लिए, सिर्फ़ एक tool लागू होता है इसके टूल पाथ और इसे लागू करने की ज़रूरी शर्तों को पूरा करता है. किसी टूल को तब तक action_config पर मौजूद tools एट्रिब्यूट के ज़रिए दोहराया जाता है, जब तक कि सुविधा के कॉन्फ़िगरेशन से मैच करने वाला with_feature सेट वाला कोई टूल नहीं मिल जाता. ज़्यादा जानकारी के लिए, इस पेज पर पहले मौजूद सुविधा के बीच के संबंध देखें. आपको अपनी टूल सूचियों के आखिर में, डिफ़ॉल्ट ऐसा टूल जो किसी सुविधा के खाली कॉन्फ़िगरेशन से जुड़ा हो.

इस्तेमाल से जुड़ा उदाहरण

अलग-अलग क्रॉस-प्लैटफ़ॉर्म सेमेटिक्स के साथ Bazel ऐक्शन लागू करने के लिए, सुविधाओं और ऐक्शन का एक साथ इस्तेमाल किया जा सकता है. उदाहरण के लिए, चालू होने पर डीबग सिंबल जनरेट करना macOS के लिए, कंपाइल ऐक्शन में सिंबल जनरेट करना ज़रूरी होता है. इसके बाद, यह एक खास टूल है, जो कंप्रेस किए गए dsim का संग्रह बनाने के लिए किया जाता है और इसके बाद, ऐप्लिकेशन बंडल और .plist बनाने के लिए उस संग्रह को डीकंप्रेस किया जाएगा Xcode द्वारा उपयोग की जा सकने वाली फ़ाइलें.

Basel के साथ, इस प्रोसेस को नीचे बताए गए तरीके से लागू किया जा सकता है. इसके लिए, unbundle-debuginfo का बेज़ल ऐक्शन वाला कॉन्टेंट:

load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")

action_configs = [
    action_config (
        action_name = ACTION_NAMES.cpp_link_executable,
        tools = [
            tool(
                with_features = [
                    with_feature(features=["generate-debug-symbols"]),
                ],
                path = "toolchain/mac/ld-with-dsym-packaging",
            ),
            tool (path = "toolchain/mac/ld"),
        ],
    ),
]

features = [
    feature(
        name = "generate-debug-symbols",
        flag_sets = [
            flag_set (
                actions = [
                    ACTION_NAMES.c_compile,
                    ACTION_NAMES.cpp_compile
                ],
                flag_groups = [
                    flag_group(
                        flags = ["-g"],
                    ),
                ],
            )
        ],
        implies = ["unbundle-debuginfo"],
   ),
]

fission का इस्तेमाल करने वाले Linux या .pdb फ़ाइलें बनाने वाले Windows के लिए, एक ही सुविधा को पूरी तरह से अलग तरीके से लागू किया जा सकता है. उदाहरण के लिए, fission पर आधारित डीबग सिंबल जनरेशन को लागू करने का तरीका कुछ ऐसा दिख सकता है:

load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")

action_configs = [
    action_config (
        name = ACTION_NAMES.cpp_compile,
        tools = [
            tool(
                path = "toolchain/bin/gcc",
            ),
        ],
    ),
]

features = [
    feature (
        name = "generate-debug-symbols",
        requires = [with_feature_set(features = ["dbg"])],
        flag_sets = [
            flag_set(
                actions = [ACTION_NAMES.cpp_compile],
                flag_groups = [
                    flag_group(
                        flags = ["-gsplit-dwarf"],
                    ),
                ],
            ),
            flag_set(
                actions = [ACTION_NAMES.cpp_link_executable],
                flag_groups = [
                    flag_group(
                        flags = ["-Wl", "--gdb-index"],
                    ),
                ],
            ),
      ],
    ),
]

ग्रुप फ़्लैग करना

CcToolchainConfigInfo से आपको फ़्लैग को उन ग्रुप में शामिल करने की अनुमति मिलती है जो किसी खास मकसद के लिए बनाया गया हो. पहले से तय वैरिएबल का इस्तेमाल करके, आपके पास फ़्लैग तय करने का विकल्प होता है फ़्लैग मान के अंदर, जिसे कंपाइलर बिल्ड निर्देश की ज़रूरत है. उदाहरण के लिए:

flag_group (
    flags = ["%{output_execpath}"],
)

इस मामले में, फ़्लैग के कॉन्टेंट को कार्रवाई की आउटपुट फ़ाइल के पाथ से बदल दिया जाएगा.

फ़्लैग ग्रुप, बिल्ड कमांड तक उस क्रम में बड़े किए जाते हैं जिस क्रम में वे दिखते हैं सूची में ऊपर से नीचे, बाएं से दाएं.

जिन फ़्लैग को बिल्ड कमांड में जोड़ने पर, अलग-अलग वैल्यू के साथ दोहराना ज़रूरी होता है उनके लिए, फ़्लैग ग्रुप list टाइप के वैरिएबल को दोहरा सकता है. उदाहरण के लिए, list टाइप का वैरिएबल include_path:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I%{include_paths}"],
)

include_paths सूची में मौजूद हर पाथ एलिमेंट के लिए, -I<path> तक बड़ा हो जाता है. सभी फ़्लैग ग्रुप की जानकारी के मुख्य हिस्से में, फ़्लैग (या flag_groups) को इस तरह बड़ा किया जाता है इकाई. उदाहरण के लिए:

flag_group (
    iterate_over = "include_paths",
    flags = ["-I", "%{include_paths}"],
)

include_paths सूची में हर पाथ एलिमेंट के लिए, -I <path> तक बड़ा होता है.

किसी वैरिएबल को कई बार दोहराया जा सकता है. उदाहरण के लिए:

flag_group (
    iterate_over = "include_paths",
    flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)

इसमें बड़ा होगा:

-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>

वैरिएबल, डॉट-नोटेशन का इस्तेमाल करके ऐक्सेस किए जा सकने वाले स्ट्रक्चर के मुताबिक हो सकते हैं. इसके लिए उदाहरण:

flag_group (
    flags = ["-l%{libraries_to_link.name}"],
)

स्ट्रक्चर को नेस्ट किया जा सकता है और इनमें क्रम भी हो सकते हैं. नामों में अंतर रखने और साफ़ तौर पर जानकारी देने के लिए, आपको फ़ील्ड के ज़रिए पूरा पाथ बताना होगा. इसके लिए उदाहरण:

flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flags = ["-l%{libraries_to_link.shared_libraries.name}"],
        ),
    ],
)

शर्तों के साथ बड़ा करना

फ़्लैग ग्रुप, expand_if_available, expand_if_not_available, expand_if_true, expand_if_false या expand_if_equal एट्रिब्यूट का इस्तेमाल करके, किसी खास वैरिएबल या उसके फ़ील्ड की मौजूदगी के आधार पर, शर्त के मुताबिक डेटा एक्सपैंशन की सुविधा देते हैं. उदाहरण के लिए:

flag_group (
    iterate_over = "libraries_to_link",
    flag_groups = [
        flag_group (
            iterate_over = "libraries_to_link.shared_libraries",
            flag_groups = [
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--whole_archive"],
                ),
                flag_group (
                    flags = ["-l%{libraries_to_link.shared_libraries.name}"],
                ),
                flag_group (
                    expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
                    flags = ["--no_whole_archive"],
                ),
            ],
        ),
    ],
)

CcToolchainConfigInfo का रेफ़रंस

इस सेक्शन में बिल्ड वैरिएबल, सुविधाओं वगैरह के बारे में जानकारी दी गई है C++ के नियमों को कॉन्फ़िगर करने के लिए ज़रूरी जानकारी.

CcToolchainConfigInfo के बिल्ड वैरिएबल

यहां CcToolchainConfigInfo बिल्ड वैरिएबल का रेफ़रंस दिया गया है.

वैरिएबल कार्रवाई जानकारी
source_file कंपाइल करना कंपाइल की जाने वाली सोर्स फ़ाइल.
input_file स्ट्रिप हटाने के लिए आर्टफ़ैक्ट.
output_file कंपाइल, स्ट्रिप कंपाइलेशन का आउटपुट.
output_assembly_file कंपाइल करें जनरेट की गई असेंबली फ़ाइल. यह सिर्फ़ तब लागू होता है, जब compile कार्रवाई, आम तौर पर --save_temps फ़्लैग का इस्तेमाल करते समय, असेंबली टेक्स्ट को उत्सर्जित करती है. कॉन्टेंट एक जैसा है output_file.
output_preprocess_file कंपाइल करना पहले से प्रोसेस किया गया आउटपुट. यह सिर्फ़ उन Compile ऐक्शन पर लागू होता है जो सिर्फ़ सोर्स फ़ाइलों को प्रीप्रोसेस करते हैं. आम तौर पर, ऐसा --save_temps फ़्लैग का इस्तेमाल करते समय होता है. कॉन्टेंट एक जैसा है output_file.
includes कंपाइल करें उन फ़ाइलों का क्रम जिन्हें कंपाइलर को बिना किसी शर्त के, कंपाइल किए गए सोर्स में शामिल करना चाहिए.
include_paths कंपाइल करना सीक्वेंस डायरेक्ट्री, जिनमें कंपाइलर, #include<foo.h> और #include "foo.h" का इस्तेमाल करके शामिल किए गए हेडर खोजता है.
quote_include_paths कंपाइल करें -iquote के क्रम में ये शामिल हैं - ऐसी डायरेक्ट्री जिनमें कंपाइलर, #include "foo.h" का इस्तेमाल करके शामिल किए गए हेडर खोजता है.
system_include_paths कंपाइल करें -isystem के क्रम में ये शामिल हैं - ऐसी डायरेक्ट्री जिनमें कंपाइलर, #include <foo.h> का इस्तेमाल करके शामिल किए गए हेडर खोजता है.
dependency_file कंपाइल करना कंपाइलर से जनरेट की गई .d डिपेंडेंसी फ़ाइल.
preprocessor_defines कंपाइल करना defines का क्रम, जैसे कि --DDEBUG.
pic कंपाइल करें आउटपुट को पोज़िशन-इंडिपेंडेंट कोड के तौर पर कंपाइल करता है.
gcov_gcno_file कंपाइल करें gcov कवरेज फ़ाइल.
per_object_debug_info_file कंपाइल करना हर ऑब्जेक्ट के लिए डीबग की जानकारी (.dwp) वाली फ़ाइल.
stripopts स्ट्रिप stripopts का क्रम.
legacy_compile_flags कंपाइल करें लेगसी से फ़्लैग किए गए वीडियो का क्रम CROSSTOOL फ़ील्ड, जैसे कि compiler_flag, optional_compiler_flag, cxx_flag, और optional_cxx_flag.
user_compile_flags कंपाइल करें copt नियम एट्रिब्यूट या --copt, --cxxopt, और --conlyopt फ़्लैग में से किसी एक का फ़्लैग क्रम.
unfiltered_compile_flags कंपाइल करना unfiltered_cxx_flag लेगसी CROSSTOOL फ़ील्ड या unfiltered_compile_flags सुविधा से मिले फ़्लैग का क्रम. इन्हें nocopts नियम एट्रिब्यूट के हिसाब से फ़िल्टर नहीं किया जाता.
sysroot sysroot.
runtime_library_search_directories लिंक लिंकर रनटाइम खोज पाथ में एंट्री (आम तौर पर) -rpath फ़्लैग के साथ सेट किया गया है).
library_search_directories लिंक लिंकर सर्च पाथ में मौजूद एंट्री (आम तौर पर, -L फ़्लैग के साथ सेट की जाती हैं).
libraries_to_link लिंक लिंक करने वाले मैसेज में इनपुट के तौर पर लिंक करने के लिए फ़ाइलें उपलब्ध कराने वाले फ़्लैग.
def_file_path लिंक MSVC के साथ Windows पर इस्तेमाल की जाने वाली def फ़ाइल की जगह.
linker_param_file लिंक कमांड लाइन की लंबाई की सीमा को कम करने के लिए, bazel की बनाई गई लिंकर पैरामीटर फ़ाइल की जगह.
output_execpath लिंक लिंकर के आउटपुट का एक्ज़ीकपैट.
generate_interface_library लिंक "yes" या "no", इस आधार पर कि इंटरफ़ेस लाइब्रेरी जनरेट की जानी चाहिए या नहीं.
interface_library_builder_path लिंक इंटरफ़ेस लाइब्रेरी बिल्डर टूल का पाथ.
interface_library_input_path लिंक इंटरफ़ेस लाइब्रेरी ifso बिल्डर टूल के लिए इनपुट.
interface_library_output_path लिंक ifso बिल्डर टूल का इस्तेमाल करके, इंटरफ़ेस लाइब्रेरी जनरेट करने के लिए पाथ.
legacy_link_flags लिंक लेगसी CROSSTOOL फ़ील्ड से आने वाले लिंकर फ़्लैग.
user_link_flags लिंक --linkopt या linkopts एट्रिब्यूट से मिलने वाले लिंकर फ़्लैग.
linkstamp_paths लिंक लिंकस्टैंप पाथ देने वाला बिल्ड वैरिएबल.
force_pic लिंक इस वैरिएबल की मौजूदगी का मतलब है कि पीआईसी/पीआईई कोड को जनरेट किया जाएगा (बेज़ल विकल्प `--force_pic` पास किया गया था).
strip_debug_symbols लिंक इस वैरिएबल की मौजूदगी से पता चलता है कि डीबग चिह्नों को हटा दिया जाना चाहिए.
is_cc_test लिंक अगर मौजूदा कार्रवाई cc_test लिंक करने की कार्रवाई है, तो True. अगर नहीं, तो False.
is_using_fission कंपाइल, लिंक इस वैरिएबल की मौजूदगी से पता चलता है कि फ़िज़न (हर ऑब्जेक्ट के लिए डीबग जानकारी) चालू है. डीबग की जानकारी, .o फ़ाइलों के बजाय .dwo फ़ाइलों में होगी. कंपाइलर और लिंकर को इसकी जानकारी होनी चाहिए.
fdo_instrument_path कंपाइल करना, लिंक करना उस डायरेक्ट्री का पाथ जिसमें एफ़डीओ की इंस्ट्रुमेंटेशन प्रोफ़ाइल सेव की जाती है.
fdo_profile_path कंपाइल करना एफ़डीओ प्रोफ़ाइल का पाथ.
fdo_prefetch_hints_path कंपाइल करें कैश मेमोरी प्रीफ़ेच प्रोफ़ाइल का पाथ.
cs_fdo_instrument_path कंपाइल करना, लिंक करना उस डायरेक्ट्री का पाथ जिसमें संदर्भ के हिसाब से काम करने वाली एफ़डीओ इंस्ट्रूमेंटेशन प्रोफ़ाइल सेव की जाती है.

लोकप्रिय सुविधाएं

यहां सुविधाओं और उन्हें चालू करने की शर्तों के बारे में बताया गया है.

सुविधा दस्तावेज़ के रूप में
opt | dbg | fastbuild कंपाइलेशन मोड के आधार पर, डिफ़ॉल्ट रूप से चालू होता है.
static_linking_mode | dynamic_linking_mode यह सुविधा, लिंकिंग मोड के आधार पर डिफ़ॉल्ट रूप से चालू होती है.
per_object_debug_info यह तब चालू होता है, जब supports_fission सुविधा बताई गई हो और चालू है और मौजूदा कंपाइलेशन मोड --fission फ़्लैग.
supports_start_end_lib अगर यह विकल्प चालू है और --start_end_lib विकल्प सेट है, तो Bazel स्टैटिक लाइब्रेरी के साथ लिंक नहीं करेगा. इसके बजाय, वह ऑब्जेक्ट के साथ सीधे लिंक करने के लिए, --start-lib/--end-lib लिंकर के विकल्पों का इस्तेमाल करेगा. इससे बिल्ड की स्पीड बढ़ जाती है, क्योंकि Bazel को स्टैटिक लाइब्रेरी बनाने की ज़रूरत नहीं होती.
supports_interface_shared_libraries अगर चालू है (और विकल्प --interface_shared_objects यह है सेट है), तो Basel उन टारगेट को लिंक करेगा जिनमें linkstatic को इस पर सेट किया गया है शेयर किए गए इंटरफ़ेस के लिए गलत (डिफ़ॉल्ट रूप से cc_test) लाइब्रेरी. इससे, इंक्रीमेंटल रीलिंकिंग की प्रोसेस तेज़ी से पूरी होती है.
supports_dynamic_linker C++ के नियमों को चालू करने पर, उन्हें पता चल जाएगा कि टूलचेन लाइब्रेरी.
static_link_cpp_runtimes अगर यह सुविधा चालू की जाती है, तो Baze C++ रनटाइम को स्टैटिक तरीके से लिंक करेगा और डाइनैमिक लिंकिंग मोड में डाइनैमिक तौर पर इस्तेमाल किया जा सकता है. कलाकृतियां cc_toolchain.static_runtime_lib में बताया गया है या cc_toolchain.dynamic_runtime_lib एट्रिब्यूट (इस पर निर्भर करता है कि लिंकिंग मोड) को लिंक करने की कार्रवाइयों में जोड़ दिया जाएगा.
supports_pic अगर यह विकल्प चालू है, तो टूलचेन को डायनैमिक लाइब्रेरी के लिए PIC ऑब्जेक्ट का इस्तेमाल करने की जानकारी होगी. जब भी पीआईसी कंपाइलेशन की ज़रूरत हो, तब `पिक` वैरिएबल मौजूद होता है. अगर चालू नहीं है डिफ़ॉल्ट रूप से, `--force_pic` को पास कर दिया जाता है. इसके बाद, Baज़ल, `supports_pic` के लिए अनुरोध करेगा और पुष्टि करें कि सुविधा चालू है. सुविधा मौजूद न होने या उपलब्ध न होने पर इसे चालू करने पर, `--force_pic` का इस्तेमाल नहीं किया जा सकेगा.
static_linking_mode | dynamic_linking_mode यह सुविधा, लिंकिंग मोड के आधार पर डिफ़ॉल्ट रूप से चालू होती है.
no_legacy_features बेज़ल को लेगसी सुविधाओं को इनमें जोड़ने से रोकता है C++ कॉन्फ़िगरेशन मौजूद होगा. सुविधाओं की पूरी सूची यहां देखें.

लेगसी सुविधाओं को पैच करने का लॉजिक

Bazel, टूलचेन की सुविधाओं में ये बदलाव करता है, ताकि वे पुराने सिस्टम के साथ काम कर सकें:

  • legacy_compile_flags सुविधा को टूलचेन के सबसे ऊपर ले जाता है
  • default_compile_flags सुविधा को टूलचेन के सबसे ऊपर ले जाता है
  • टूलचेन के सबसे ऊपर dependency_file (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर pic (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर per_object_debug_info (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर preprocessor_defines (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर includes (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर include_paths (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर fdo_instrument (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर fdo_optimize (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर cs_fdo_instrument (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर cs_fdo_optimize (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर fdo_prefetch_hints (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर autofdo (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर build_interface_libraries (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर dynamic_library_linker_tool (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर shared_flag (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर linkstamps (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर output_execpath_flags (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर runtime_library_search_directories (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर library_search_directories (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर archiver_flags (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर libraries_to_link (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर force_pic_flags (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर user_link_flags (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर legacy_link_flags (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर static_libgcc (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर fission_support (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर strip_debug_symbols (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर coverage (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर llvm_coverage_map_format (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • टूलचेन के सबसे ऊपर gcc_coverage_map_format (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • इससे टूलचेन के सबसे नीचे fully_static_link (अगर मौजूद नहीं है) सुविधा जोड़ दी जाती है
  • इससे टूलचेन के सबसे नीचे user_compile_flags (अगर मौजूद नहीं है) सुविधा जोड़ दी जाती है
  • टूलचेन के सबसे नीचे sysroot (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • इससे टूलचेन के सबसे नीचे unfiltered_compile_flags (अगर मौजूद नहीं है) सुविधा जोड़ दी जाती है
  • टूलचेन के सबसे नीचे linker_param_file (अगर मौजूद नहीं है) सुविधा जोड़ता है
  • इससे टूलचेन के सबसे नीचे compiler_input_flags (अगर मौजूद नहीं है) सुविधा जोड़ दी जाती है
  • इससे टूलचेन के सबसे नीचे compiler_output_flags (अगर मौजूद नहीं है) सुविधा जोड़ दी जाती है

यह सुविधाओं की एक लंबी सूची है. Starlark में क्रॉसटूल बन जाने के बाद, इनका इस्तेमाल बंद कर दिया जाएगा. अगर आपको इस बारे में ज़्यादा जानना है, तो CppActionConfigs में इसे लागू करने का तरीका देखें. साथ ही, प्रोडक्शन टूलचेन के लिए no_legacy_features जोड़ें, ताकि टूलचेन को ज़्यादा स्टैंडअलोन बनाया जा सके.