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

समस्या की शिकायत करें सोर्स देखें Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

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

मैक्रो एक ऐसा फ़ंक्शन होता है जो नियमों को इंस्टैंटिएट करता है. मैक्रो दो तरह के होते हैं: सिंबॉलिक मैक्रो (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, यह पता लगाने के लिए डिपेंडेंसी विश्लेषण का इस्तेमाल करता है कि कौनसी फ़ाइलें लोड की जानी चाहिए, किन नियमों का विश्लेषण किया जाना चाहिए, और कौनसी कार्रवाइयां की जानी चाहिए. उदाहरण के लिए, अगर किसी नियम से ऐसी कार्रवाइयां जनरेट होती हैं जिनकी ज़रूरत आपको मौजूदा बिल्ड के लिए नहीं है, तो उन्हें लागू नहीं किया जाएगा.

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

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

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

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