C++ नियमों के साथ इंटिग्रेट करना

समस्या की शिकायत करें सोर्स देखें

इस पेज पर, अलग-अलग लेवल पर C++ के नियमों को इंटिग्रेट करने का तरीका बताया गया है.

C++ टूलचेन को ऐक्सेस करना

C++ के नियमों को प्लैटफ़ॉर्म और टूलचेन में लगातार माइग्रेट करने की वजह से, आपको @bazel_tools//tools/cpp:toolchain_utils.bzl पर उपलब्ध हेल्पर फ़ंक्शन का इस्तेमाल करना चाहिए. यह टूलचेन बंद और चालू होने पर, दोनों ही स्थितियों में काम करता है. अपने नियम में C++ टूलचेन पर निर्भर रहने के लिए, _cc_toolchain नाम का Label एट्रिब्यूट जोड़ें. इसके बाद, एट्रिब्यूट को @bazel_tools//tools/cpp:current_cc_toolchain (cc_toolchain_alias नियम का उदाहरण, जो चुने गए C++ टूलचेन के बारे में बताता है) की ओर पॉइंट करें. इसके बाद, नियम लागू करते समय, find_cpp_toolchain(ctx) का इस्तेमाल करके CcToolchainInfo पाएं. काम करने का एक पूरा उदाहरण नियमों_cc के उदाहरण में देखा जा सकता है.

C++ टूलचेन का इस्तेमाल करके, कमांड लाइन और एनवायरमेंट वैरिएबल जनरेट करना

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

C++ नियम, सुविधा कॉन्फ़िगरेशन के आधार पर कमांड लाइन बनाने के खास तरीके का इस्तेमाल करते हैं. कमांड लाइन बनाने के लिए, आपको इन चीज़ों की ज़रूरत होगी:

  • features और action_configs - ये CcToolchainConfigInfo से लिए गए हैं. इन्हें CcToolchainInfo में इनकैप्सुलेट करता है
  • FeatureConfiguration - cc_common.configure_features से वापस किया गया
  • cc टूलचेन कॉन्फ़िगरेशन वैरिएबल - cc_common.create_compile_variables या cc_common.create_link_variables से दिखाया जाता है.

हालांकि, कुछ खास टूल से जुड़े गेटर मौजूद होते हैं, जैसे कि compiler_executable. इनके बजाय, get_tool_for_action को प्राथमिकता दें, क्योंकि खास टूल से जुड़े गैटर को आखिर में हटा दिया जाएगा.

काम करने का एक पूरा उदाहरण नियमों_cc के उदाहरण में देखा जा सकता है.

Starlark के ऐसे नियमों को लागू करना जो C++ के नियमों पर निर्भर करते हैं और/या जो C++ के नियमों पर निर्भर करते हैं

C++ के ज़्यादातर नियमों में, CcInfo के बारे में बताया गया है. यह सेवा देने वाली कंपनी CompilationContext और LinkingContext को शामिल करती है. इनकी मदद से, लिंक करने के लिए सभी ट्रांज़िटिव हेडर या लाइब्रेरी जैसी जानकारी को ऐक्सेस किया जा सकता है. CcInfo से और CcToolchainInfo पसंद के मुताबिक बनाए गए Starlark नियमों से, वह सारी जानकारी मिलनी चाहिए जो उन्हें चाहिए.

अगर कोई कस्टम Starlark नियम CcInfo देता है, तो यह C++ के नियमों का संकेत है कि वे भी इस पर निर्भर हो सकते हैं. हालांकि, सावधानी बरतें - अगर आपको ग्राफ़ के ज़रिए CcInfo को सिर्फ़ बाइनरी नियम पर लागू करना है, जो इसके बाद इसका इस्तेमाल करता है, तो CcInfo को किसी दूसरी कंपनी में रैप करें. उदाहरण के लिए, अगर java_library नियम को java_binary तक की नेटिव डिपेंडेंसी का इस्तेमाल करना है, तो उसे सीधे तौर पर CcInfo नहीं देना चाहिए (java_library के आधार पर cc_binary समझ में नहीं आता है). यह इसे पूरी तरह से इकट्ठा कर लेगा, जैसे कि JavaCcInfo.

काम करने का एक पूरा उदाहरण नियमों_cc के उदाहरण में देखा जा सकता है.

C++ नियमों के लॉजिक और कार्रवाइयों का दोबारा इस्तेमाल करना

अभी तक स्थिर नहीं है. एपीआई के स्थिर हो जाने के बाद, यह सेक्शन अपडेट कर दिया जाएगा. अप-टू-डेट जानकारी के लिए, #4570 को फ़ॉलो करें.