खास जानकारी
कंपाइलर को सही विकल्पों के साथ शुरू करने के लिए, Basel को इसके बारे में कुछ जानकारी होनी चाहिए कंपाइलर इंटर्नल, जैसे कि डायरेक्ट्री और ज़रूरी फ़्लैग शामिल करने होंगे. दूसरे शब्दों में, Basel को कंपाइलर के एक आसान मॉडल की ज़रूरत होती है, ताकि काम.
बेज़ल को यह जानकारी होनी चाहिए:
- कंपाइलर थिनएलटीओ, मॉड्यूल, डाइनैमिक लिंकिंग या पीआईसी के साथ काम करता है या नहीं (पोज़िशन इंडिपेंडेंट कोड).
- gcc, ld, ar, objcopy जैसे ज़रूरी टूल तक पहुंचने के लिए पाथ.
- बिल्ट-इन सिस्टम में डायरेक्ट्री शामिल होती हैं. बेज़ल को इनकी ज़रूरत है, ताकि
सोर्स फ़ाइल में शामिल सभी हेडर सही तरीके से
BUILD
फ़ाइल. - डिफ़ॉल्ट सिस्टम.
- कंपाइलेशन, लिंक करने, संग्रहित करने के लिए किन फ़्लैग का इस्तेमाल करना है.
- काम करने वाले कंपाइलेशन मोड (ऑप्ट, डीबीजी, फ़ास्टबिल्ड) के लिए किन फ़्लैग का इस्तेमाल करना है.
- कंपाइलर के लिए खास तौर पर ज़रूरी वैरिएबल बनाएं.
अगर कंपाइलर में एक से ज़्यादा आर्किटेक्चर काम करते हैं, तो Basel को कॉन्फ़िगर करना होगा उन्हें अलग-अलग किया जा सकता है.
CcToolchainConfigInfo
एक ऐसी कंपनी है जो ज़रूरी लेवल की जानकारी देती है
बेज़ल के C++ नियमों के व्यवहार को कॉन्फ़िगर करने के लिए, जानकारी का स्तर. डिफ़ॉल्ट रूप से,
Baज़र, आपके बिल्ड के लिए CcToolchainConfigInfo
को अपने-आप कॉन्फ़िगर कर देता है, लेकिन आप ऐसा कर सकते हैं
इसे मैन्युअल तरीके से कॉन्फ़िगर करने का विकल्प होता है. इसके लिए, आपको स्टारलार्क नियम की ज़रूरत होगी
जो CcToolchainConfigInfo
उपलब्ध कराता है और आपको
एट्रिब्यूट की वैल्यू के तौर पर toolchain_config
cc_toolchain
को आपके नियम में जोड़ा गया.
CcToolchainConfigInfo
बनाने के लिए, इस नंबर पर कॉल करें
cc_common.create_cc_toolchain_config_info()
.
आपको इस प्रोसेस में जिन स्ट्रक्चर की ज़रूरत होगी, उन सभी के लिए Starlark कंस्ट्रक्टर मिल जाएगा
@rules_cc//cc:cc_toolchain_config_lib.bzl
.
जब C++ टारगेट, विश्लेषण के चरण में आता है, तो Baज़र सही विकल्प चुन लेता है
cc_toolchain
BUILD
फ़ाइल के आधार पर टारगेट करता है और
इसमें बताए गए टारगेट से CcToolchainConfigInfo
कंपनी
cc_toolchain.toolchain_config
एट्रिब्यूट की वैल्यू सबमिट करें. cc_toolchain
का टारगेट
यह जानकारी CcToolchainProvider
के ज़रिए, C++ टारगेट को भेजती है.
उदाहरण के लिए, कंपाइल या लिंक की कार्रवाई, जिसे इस तरह के नियम से इंस्टैंशिएट किया जाता है
cc_binary
या cc_library
को यह जानकारी देनी होगी:
- इस्तेमाल करने के लिए कंपाइलर या लिंकर
- कंपाइलर/लिंकर के लिए कमांड-लाइन फ़्लैग
- कॉन्फ़िगरेशन फ़्लैग को
--copt/--linkopt
विकल्पों से पास किया गया है - एनवायरमेंट वैरिएबल
- सैंडबॉक्स में ऐसी आर्टफ़ैक्ट जिनमें कार्रवाई पूरी होती है
सैंडबॉक्स में ज़रूरी आर्टफ़ैक्ट को छोड़कर, ऊपर दी गई सभी जानकारी
Starlark के उस टारगेट में मौजूद है जिस पर cc_toolchain
ले जाता है.
सैंडबॉक्स में भेजे जाने वाले आर्टफ़ैक्ट के बारे में cc_toolchain
में बताया गया है
टारगेट. उदाहरण के लिए, cc_toolchain.linker_files
एट्रिब्यूट की मदद से ये काम किए जा सकते हैं
सैंडबॉक्स में भेजने के लिए, लिंकर बाइनरी और टूलचेन लाइब्रेरी को तय करना.
टूलचेन चुनना
टूलचेन को चुनने का लॉजिक इस तरह काम करता है:
उपयोगकर्ता ने
BUILD
फ़ाइल और पॉइंट मेंcc_toolchain_suite
टारगेट तय किया है का उपयोग करके लक्ष्य के लिए बेज़ल--crosstool_top
विकल्प.cc_toolchain_suite
टारगेट में कई टूलचेन का इस्तेमाल होता है. कॉन्टेंट बनाने--cpu
और--compiler
फ़्लैग की वैल्यू से तय होता है कि इनमें से किस टूलचेन को चुना जाता है. ऐसा सिर्फ़--cpu
फ़्लैग की वैल्यू के आधार पर किया जाता है या संयुक्त--cpu | --compiler
वैल्यू के आधार पर. चुनने की प्रक्रिया ऐसी है: अनुसरण करता है:अगर
--compiler
बताया गया है, तो Bazecc_toolchain_suite.toolchains
से संबंधित एंट्री विशेषता--cpu | --compiler
वाली होनी चाहिए. अगर बेज़ल को न मिले एंट्री करने पर गड़बड़ी दिखती है.अगर
--compiler
विकल्प तय नहीं किया गया है, तो Basel को चुना जाता हैcc_toolchain_suite.toolchains
से जुड़ी हुई एंट्री एट्रिब्यूट की वैल्यू सिर्फ़--cpu
के साथ जोड़ी जा सकती है.अगर कोई फ़्लैग बताया नहीं गया है, तो Basel, होस्ट सिस्टम की जांच करता है और जानकारी के आधार पर
--cpu
की वैल्यू. ज़्यादा जानकारी के लिए, जांच करने के तरीके का कोड.
टूलचेन चुनने के बाद, संबंधित feature
और action_config
Starlark नियम में मौजूद ऑब्जेक्ट बिल्ड के कॉन्फ़िगरेशन को कंट्रोल करते हैं (यानी कि
आइटम पर बाद में बताया गया है). इन मैसेज की मदद से,
बेज़ल में C++ की सभी बेहतरीन सुविधाएँ, बिना किसी बदलाव के
बेज़ल बाइनरी. C++ के नियमों में, कई खास कार्रवाइयों की सुविधा उपलब्ध है.
Baज़ल के सोर्स कोड में होने चाहिए.
सुविधाएं
सुविधा एक ऐसी इकाई है जिसके लिए कमांड-लाइन फ़्लैग, कार्रवाई,
एक्ज़ीक्यूशन एनवायरमेंट पर कंस्ट्रेंट या डिपेंडेंसी में बदलाव करने पर. सुविधा
हो सकता है कि यह BUILD
फ़ाइलों को कॉन्फ़िगरेशन चुनने की अनुमति देने जैसा आसान हो
फ़्लैग का इस्तेमाल कर सकते हैं, जैसे कि treat_warnings_as_errors
या C++ के नियमों के साथ इंटरैक्ट कर सकते हैं और
कंपाइलेशन में नई कार्रवाइयों और इनपुट को शामिल करना
header_modules
या thin_lto
.
आम तौर पर, CcToolchainConfigInfo
में सुविधाओं की एक सूची होती है, जिसमें हर
सुविधा में एक या उससे ज़्यादा फ़्लैग ग्रुप शामिल होते हैं. हर ग्रुप में फ़्लैग की सूची दी जाती है
जो बेज़ल कार्रवाइयों पर लागू होते हैं.
विशेषता को नाम से बताया जाता है, जो स्टारलार्क को पूरी तरह से अलग करने की अनुमति देता है
बेज़ल रिलीज़ से नियम कॉन्फ़िगरेशन. दूसरे शब्दों में, बेज़ल रिलीज़ में
CcToolchainConfigInfo
कॉन्फ़िगरेशन के काम करने के तरीके पर तब तक असर पड़ता है, जब तक कि
कॉन्फ़िगरेशन के लिए नई सुविधाओं का इस्तेमाल करने की ज़रूरत नहीं है.
सुविधा को इनमें से किसी एक तरीके से चालू किया जाता है:
- सुविधा के
enabled
फ़ील्ड कोtrue
पर सेट किया गया है. - बेज़ल या नियम के मालिक ने इसे साफ़ तौर पर चालू किया हो.
- उपयोगकर्ता इसे
--feature
बेज़ल विकल्प याfeatures
नियम के ज़रिए चालू करता है एट्रिब्यूट की वैल्यू सबमिट करें.
सुविधाएं एक-दूसरे पर निर्भर हो सकती हैं. यह कमांड लाइन फ़्लैग, BUILD
फ़ाइल पर निर्भर करती है
सेटिंग, और अन्य वैरिएबल की वैल्यू शामिल करें.
सुविधाओं के साथ ऐसेट जोड़ना
आम तौर पर, डिपेंडेंसी को सीधे Basel की मदद से मैनेज किया जाता है, जो अपने-आप लागू होती है साथ ही, सुविधाओं की प्रकृति से जुड़े विवादों को मैनेज करती है और बिल्ड में परिभाषित किया गया है. टूलचेन स्पेसिफ़िकेशन की मदद से, ज़्यादा जानकारी दी जा सकती है स्टारलार्क नियम में सीधे इस्तेमाल करने के लिए कंस्ट्रेंट जो सुविधा को कंट्रोल करता है सहायता मिलती है और ज़्यादा लोगों तक पहुंचा जा सकता है. इनके उदाहरण हैं:
सीमा | जानकारी |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
सुविधा-लेवल. यह सुविधा सिर्फ़ तब काम करती है, जब तय किया गया हो
सुविधाएं चालू हों. उदाहरण के लिए, जब कोई सुविधा सिर्फ़
कुछ चुनिंदा बिल्ड मोड (opt , dbg या
fastbuild ). अगर `ज़रूरी है` में एक से ज़्यादा `feature_set`हैं
यह सुविधा तब काम करती है, जब कोई भी `feature_set`काम करता है
(जब सभी खास सुविधाएं चालू हों).
|
implies = ['feature'] |
सुविधा-लेवल. यह सुविधा, बताई गई सुविधा(सुविधाओं) को शामिल करती है. किसी सुविधा को चालू करने से, उसमें लागू की गई सभी सुविधाएं भी साफ़ तौर पर चालू हो जाती हैं (इसका मतलब है कि यह बार-बार काम करता है). साथ ही, फ़ंक्शन के सामान्य सबसेट को फ़ैक्टर करने की सुविधा भी देता है सैनिटाइज़र के सामान्य हिस्सों जैसी सुविधाओं का सेट. शामिल सुविधाओं को बंद नहीं किया जा सकता. |
provides = ['feature'] |
सुविधा-लेवल. इससे पता चलता है कि यह सुविधा आपस में जुड़ी कई सुविधाओं में से एक है
खास वैकल्पिक सुविधाएं. उदाहरण के लिए, सभी सैनिटाइज़र
इससे, लोगों के पूछने पर विकल्पों की सूची बनाकर गड़बड़ियों को बेहतर तरीके से मैनेज करना आसान हो जाता है का इस्तेमाल करें. |
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
. हर कार्रवाई के लिए फ़्लैग असाइन किए जाते हैं
और उन्हें किसी सुविधा के साथ जोड़कर बनाया जा सकता है.
हर कार्रवाई के नाम से, एक ही तरह की कार्रवाई के बारे में पता चलता है, जो बेज़ल कर रहा है, जैसे
कंपाइल या लिंक करना. हालांकि, दो पक्षों के जुड़ाव के दो पहलू
कार्रवाइयां और Babel कार्रवाई प्रकार, जहां Basel कार्रवाई प्रकार एक Java क्लास का संदर्भ देता है
जो किसी कार्रवाई को लागू करता है (जैसे कि CppCompileAction
). खास तौर पर,
"असेंबलर की कार्रवाइयां" और "कंपाइलर कार्रवाइयां" नीचे दी गई टेबल में,
CppCompileAction
, जबकि लिंक से जुड़ी कार्रवाइयां CppLinkAction
हैं.
असेंबलर की कार्रवाइयां
कार्रवाई | जानकारी |
preprocess-assemble
|
प्री-प्रोसेसिंग की मदद से असेंबल करें. आम तौर पर, .S फ़ाइलों के लिए.
|
assemble
|
प्री-प्रोसेसिंग के बिना असेंबल करें. आम तौर पर, .s फ़ाइलों के लिए.
|
कंपाइलर की कार्रवाइयां
कार्रवाई | जानकारी |
cc-flags-make-variable
|
CC_FLAGS को जेन रूल में लागू करता है.
|
c-compile
|
सी॰ के तौर पर कंपाइल करें |
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
सुविधाओं के साथ जुड़ाव के बारे में ऊपर बताया गया है. यह व्यवहार
किसी सुविधा के समान है.
आखिरी दो एट्रिब्यूट,
सुविधाएं शामिल होती हैं और उन्हें शामिल किया जाता है, क्योंकि कुछ Basel कार्रवाइयों के लिए कुछ फ़्लैग की ज़रूरत होती है या
एनवायरमेंट वैरिएबल को शामिल करना है. साथ ही, हमारा लक्ष्य है कि ग़ैर-ज़रूरी 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
सेट मिला
(इस पेज पर पहले सुविधा के बीच संबंध देखें
देखें). आपको अपनी टूल सूचियों के आखिर में, डिफ़ॉल्ट
ऐसा टूल जो किसी सुविधा के खाली कॉन्फ़िगरेशन से जुड़ा हो.
इस्तेमाल से जुड़ा उदाहरण
Basel की कार्रवाइयों को लागू करने के लिए, सुविधाओं और कार्रवाइयों का एक साथ इस्तेमाल किया जा सकता है
जिसमें अलग-अलग क्रॉस-प्लैटफ़ॉर्म सिमेंटिक्स शामिल हैं. उदाहरण के लिए, चालू होने पर डीबग सिंबल जनरेट करना
macOS के लिए, कंपाइल ऐक्शन में सिंबल जनरेट करना ज़रूरी होता है. इसके बाद,
यह एक खास टूल की मदद से, कंप्रेस किए गए dS का संग्रह बनाने के लिए किया जाता है और
इसके बाद, ऐप्लिकेशन बंडल और .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"],
),
]
इस सुविधा को Linux के लिए पूरी तरह से अलग तरीके से लागू किया जा सकता है, जो
fission
या Windows के लिए, जो .pdb
फ़ाइलें बनाती है. उदाहरण के लिए,
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_group
s) को इस तरह बड़ा किया जाता है
इकाई. उदाहरण के लिए:
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
|
कंपाइल करें | पहले से प्रोसेस किया गया आउटपुट. सिर्फ़ कंपाइल करने पर लागू होता है
ऐसी कार्रवाइयां जो सिर्फ़ सोर्स फ़ाइलों को प्रीप्रोसेस करती हैं. आम तौर पर, ये कार्रवाइयां तब की जाती हैं, जब
--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 ) फ़ाइल.
|
stripotps
|
स्ट्रिप | 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
|
लिंक | Windows पर MSVC के साथ इस्तेमाल की गई def फ़ाइल की जगह. |
linker_param_file
|
लिंक | बैजर पैरामीटर फ़ाइल के लिए बनाई गई लिंकर पैरामीटर फ़ाइल की जगह कमांड लाइन की लंबाई की सीमा पार करें. |
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 है
लिंक करने की कार्रवाई, गलत नहीं है.
|
is_using_fission
|
कंपाइल, लिंक | इस वैरिएबल के मौजूद होने से पता चलता है कि फ़िशन (हर ऑब्जेक्ट के लिए डीबग की जानकारी)
चालू हो. डीबग की जानकारी, .dwo फ़ाइलों में सेव होगी
को .o फ़ाइलों और कंपाइलर और लिंकर को यह जानने की ज़रूरत है.
|
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 विकल्प सेट है), तो Baze
स्थिर लाइब्रेरी से लिंक नहीं होगा, बल्कि
ऑब्जेक्ट से लिंक करने के लिए, --start-lib/--end-lib लिंकर के विकल्प
सकता है. इससे बिल्ड तेज़ी से बढ़ता है, क्योंकि Basel को निर्माण की ज़रूरत नहीं है
स्टैटिक लाइब्रेरी पर लागू होता है.
|
supports_interface_shared_libraries
|
अगर चालू है (और विकल्प --interface_shared_objects यह है
सेट है), तो Basel उन टारगेट को लिंक करेगा जिनके linkstatic को इस पर सेट किया गया है
शेयर किए गए इंटरफ़ेस के लिए गलत (डिफ़ॉल्ट रूप से cc_test )
लाइब्रेरी. इससे तेज़ी से फिर से लिंक किया जाता है.
|
supports_dynamic_linker
|
C++ के नियमों को चालू करने पर, उन्हें पता चल जाएगा कि टूलचेन लाइब्रेरी. |
static_link_cpp_runtimes
|
अगर यह सुविधा चालू की जाती है, तो Basel के 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++ कॉन्फ़िगरेशन मौजूद होगा. पूरी सूची देखें सुविधाओं के बारे में ज़्यादा जानें. |
लेगसी सुविधाएं, लॉजिक को पैच कर रही हैं
Basel ने टूलचेन की सुविधाओं में ये बदलाव लागू किए. ये बदलाव, पीछे की ओर करने के लिए किए गए हैं साथ काम करता है:
- इस विकल्प की मदद से,
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
(अगर मौजूद नहीं है) सुविधा जोड़ता है
यह सुविधाओं की एक लंबी सूची है. प्लान है कि एक बार इनसे छुटकारा पाएं
स्टारलार्क में क्रॉसटूल
हो गया. दिलचस्पी रखने वाले लोगों के लिए, इसे लागू करने की प्रोसेस को
CppActionConfigs,
और प्रोडक्शन टूलचेन के लिए, no_legacy_features
को जोड़कर
ज़्यादा अलग से बनाया जा सकता है.