एक्सटेंशन ओवरव्यू

इस पेज पर, मैक्रो और नियमों का इस्तेमाल करके, BUILD भाषा को बढ़ाने का तरीका बताया गया है.

Bazel एक्सटेंशन, .bzl से खत्म होने वाली फ़ाइलें होती हैं. किसी एक्सटेंशन से सिंबल इंपोर्ट करने के लिए, लोड स्टेटमेंट का इस्तेमाल करें.

ज़्यादा बेहतर कॉन्सेप्ट के बारे में जानने से पहले, यह काम करें:

  • Starlark भाषा के बारे में पढ़ें, जिसका इस्तेमाल BUILD और .bzl दोनों फ़ाइलों में किया जाता है.

  • जानें कि दो BUILD फ़ाइलों के बीच वैरिएबल कैसे शेयर किए जा सकते हैं.

मैक्रो और नियम

मैक्रो एक ऐसा फ़ंक्शन है जो नियमों को इंस्टैंशिएट करता है. मैक्रो दो तरह के होते हैं: सिंबॉलिक मैक्रो (Bazel 8 में नया) और लेगसी मैक्रो. मैक्रो के दोनों टाइप अलग-अलग तरीके से तय किए जाते हैं, लेकिन उपयोगकर्ता के नज़रिए से ये लगभग एक जैसे होते हैं. अगर कोई BUILD फ़ाइल बहुत ज़्यादा दोहराव वाली या बहुत जटिल हो जाती है, तो मैक्रो काम का होता है. इसकी मदद से, कुछ कोड को फिर से इस्तेमाल किया जा सकता है. BUILD फ़ाइल को पढ़ते ही, फ़ंक्शन का आकलन किया जाता है. BUILD फ़ाइल का आकलन करने के बाद, Bazel के पास मैक्रो के बारे में बहुत कम जानकारी होती है. अगर आपका मैक्रो, genrule जनरेट करता है, तो Bazel लगभग उसी तरह काम करेगा जैसे आपने BUILD फ़ाइल में उस genrule को तय किया हो. (हालांकि, सिंबॉलिक मैक्रो में तय किए गए टारगेट की विज़िबिलिटी सिमैंटिक अलग होती है: सिंबॉलिक मैक्रो, पैकेज के बाकी हिस्सों से अपने इंटरनल टारगेट छिपा सकता है.)

कोई नियम, मैक्रो से ज़्यादा पावरफ़ुल होता है. यह Bazel के इंटरनल को ऐक्सेस कर सकता है और इस पर पूरी तरह से कंट्रोल कर सकता है कि क्या हो रहा है. उदाहरण के लिए, यह अन्य नियमों को जानकारी पास कर सकता है.

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

आकलन मॉडल

किसी बिल्ड में तीन चरण होते हैं.

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

  • विश्लेषण का चरण. नियमों का कोड (उनका implementation फ़ंक्शन) एक्ज़ीक्यूट किया जाता है और कार्रवाइयां इंस्टैंशिएट की जाती हैं. कोई कार्रवाई बताती है कि इनपुट के सेट से आउटपुट का सेट कैसे जनरेट किया जाए. जैसे, "hello.c पर gcc चलाएं और hello.o पाएं". आपको साफ़ तौर पर यह बताना होगा कि असली कमांड एक्ज़ीक्यूट करने से पहले, कौनसी फ़ाइलें जनरेट की जाएंगी. दूसरे शब्दों में, विश्लेषण का चरण, लोडिंग के चरण से जनरेट किए गए ग्राफ़ को लेता है और कार्रवाई का ग्राफ़ जनरेट करता है.

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

Bazel, .bzl फ़ाइलों और BUILD फ़ाइलों को पढ़ने, पार्स करने, और उनका आकलन करने के लिए, पैरललिज़म का इस्तेमाल करता है. किसी फ़ाइल को हर बिल्ड में ज़्यादा से ज़्यादा एक बार पढ़ा जाता है. साथ ही, आकलन के नतीजे को कैश किया जाता है और फिर से इस्तेमाल किया जाता है. किसी फ़ाइल का आकलन तब ही किया जाता है, जब उसकी सभी डिपेंडेंसी (load() स्टेटमेंट) हल हो जाती हैं. डिजाइन के मुताबिक, .bzl फ़ाइल लोड करने का कोई साइड इफ़ेक्ट नहीं होता. इससे सिर्फ़ वैल्यू और फ़ंक्शन तय होते हैं.

Bazel, डिपेंडेंसी के विश्लेषण का इस्तेमाल करके यह पता लगाता है कि किन फ़ाइलों को लोड करना है, किन नियमों का विश्लेषण करना है, और किन कार्रवाइयों को एक्ज़ीक्यूट करना है. उदाहरण के लिए, अगर कोई नियम ऐसी कार्रवाइयां जनरेट करता है जिनकी आपको मौजूदा बिल्ड के लिए ज़रूरत नहीं है, तो उन्हें एक्ज़ीक्यूट नहीं किया जाएगा.

एक्सटेंशन बनाना

अपने एक्सटेंशन लिखते समय, नीचे दिए गए दोनों लिंक बहुत काम के साबित होंगे. इन्हें अपने पास रखें:

ज़्यादा जानकारी

मैक्रो और नियमों के अलावा, आपको पहलुओं और रिपॉज़िटरी के नियम भी लिखने पड़ सकते हैं.