Make से Soong में बदलना

Android 7.0 रिलीज़ होने से पहले, Android सिर्फ़ अपने बिल्ड नियमों को बताने और उन्हें लागू करने के लिए, GNU Make का इस्तेमाल करता था. Make बिल्ड सिस्टम का इस्तेमाल और इसे काम करने की सुविधा, कई प्लैटफ़ॉर्म पर उपलब्ध है. हालांकि, Android के स्केल पर यह धीमा हो गया, गड़बड़ियों का खतरा बढ़ गया, और इसे स्केल नहीं किया जा सका. साथ ही, इसकी जांच करना मुश्किल हो गया. Soong बिल्ड सिस्टम, Android बिल्ड के लिए ज़रूरी सुविधाएं देता है.

इसलिए, प्लैटफ़ॉर्म डेवलपर को जल्द से जल्द Make से स्विच करके, Soong का इस्तेमाल करना चाहिए. सहायता पाने के लिए, android-building Google ग्रुप पर सवाल भेजें.

Soong क्या है?

Soong बिल्ड सिस्टम को Android 7.0 (Nougat) में पेश किया गया था, ताकि Make की जगह इसे इस्तेमाल किया जा सके. यह Android के बिल्ड को तेज़ करने के लिए, Kati GNU Make क्लोन टूल और Ninja बिल्ड सिस्टम कॉम्पोनेंट का इस्तेमाल करता है.

सामान्य निर्देशों के लिए, Android Open Source Project (AOSP) में Android Make बिल्ड सिस्टम के बारे में जानकारी देखें. साथ ही, Make से Soong पर स्विच करने के लिए ज़रूरी बदलावों के बारे में जानने के लिए, Android.mk लिखने वालों के लिए बिल्ड सिस्टम में हुए बदलाव देखें.

मुख्य शब्दों की परिभाषाओं के लिए, ग्लॉसरी में बिल्ड से जुड़ी एंट्री देखें. पूरी जानकारी के लिए, Soong की रेफ़रंस फ़ाइलें देखें.

Make और Soong की तुलना

यहां Make कॉन्फ़िगरेशन और Soong कॉन्फ़िगरेशन की तुलना की गई है. दोनों कॉन्फ़िगरेशन, Soong कॉन्फ़िगरेशन (ब्लूप्रिंट या .bp) फ़ाइल में एक ही काम करते हैं.

उदाहरण बनाना

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Soong का उदाहरण

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

टेस्ट के हिसाब से Soong कॉन्फ़िगरेशन के उदाहरणों के लिए, सिंपल बिल्ड कॉन्फ़िगरेशन देखें.

Android.bp फ़ाइल में मौजूद फ़ील्ड के बारे में जानने के लिए, Android.bp फ़ाइल फ़ॉर्मैट देखें.

खास मॉड्यूल

कुछ खास मॉड्यूल ग्रुप में खास विशेषताएं होती हैं.

डिफ़ॉल्ट मॉड्यूल

डिफ़ॉल्ट मॉड्यूल का इस्तेमाल करके, एक ही प्रॉपर्टी को कई मॉड्यूल में दोहराया जा सकता है. उदाहरण के लिए:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

पहले से बने मॉड्यूल

पहले से बने कुछ मॉड्यूल टाइप की मदद से, मॉड्यूल का नाम, सोर्स पर आधारित मॉड्यूल के नाम जैसा ही रखा जा सकता है. उदाहरण के लिए, अगर cc_binary नाम का कोई cc_binary पहले से मौजूद है, तो foo नाम का cc_prebuilt_binary भी हो सकता है. इससे, डेवलपर को यह चुनने की सुविधा मिलती है कि उनके फ़ाइनल प्रॉडक्ट में कौनसा वर्शन शामिल करना है. अगर किसी बिल्ड कॉन्फ़िगरेशन में दोनों वर्शन शामिल हैं, तो पहले से बनाए गए मॉड्यूल की परिभाषा में prefer फ़्लैग की वैल्यू से यह तय होता है कि किस वर्शन को प्राथमिकता दी जाए. ध्यान दें कि पहले से बने कुछ मॉड्यूल के नाम prebuilt से शुरू नहीं होते. जैसे, android_app_import.

नेमस्पेस मॉड्यूल

जब तक Android, Make से Soong पर पूरी तरह से स्विच नहीं हो जाता, तब तक Make प्रॉडक्ट कॉन्फ़िगरेशन में PRODUCT_SOONG_NAMESPACES वैल्यू तय करनी होगी. इसकी वैल्यू, स्पेस से अलग किए गए नेमस्पेस की सूची होनी चाहिए. Soong, इन नेमस्पेस को Make में एक्सपोर्ट करता है, ताकि इन्हें m कमांड से बनाया जा सके. Android को Soong में बदलने की प्रोसेस पूरी होने के बाद, नेमस्पेस चालू करने की जानकारी बदल सकती है.

Soong की मदद से, अलग-अलग डायरेक्ट्री में मौजूद मॉड्यूल के लिए एक ही नाम तय किया जा सकता है. हालांकि, इसके लिए ज़रूरी है कि हर मॉड्यूल को अलग नेमस्पेस में एलान किया गया हो. नेमस्पेस को इस तरह से घोषित किया जा सकता है:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

ध्यान दें कि नेमस्पेस में नाम प्रॉपर्टी नहीं होती. इसका पाथ, अपने-आप नाम के तौर पर असाइन हो जाता है.

ट्री में मौजूद जगह के आधार पर, हर Soong मॉड्यूल को नेमस्पेस असाइन किया जाता है. हर Soong मॉड्यूल को नेमस्पेस में माना जाता है, जो मौजूदा डायरेक्ट्री या सबसे नज़दीकी पैरंट डायरेक्ट्री में Android.bp फ़ाइल में मिले soong_namespace से तय होता है. अगर कोई ऐसा soong_namespace मॉड्यूल नहीं मिलता है, तो मॉड्यूल को डिफ़ॉल्ट रूट नेमस्पेस में माना जाता है.

यहां एक उदाहरण दिया गया है: Soong, नेमस्पेस N में मॉड्यूल M के ज़रिए बताई गई डिपेंडेंसी D को हल करने की कोशिश करता है. यह नेमस्पेस I1, I2, I3 को इंपोर्ट करता है…

  1. अगर D, //namespace:module फ़ॉर्म का एफ़क्यूडीएन है, तो दिए गए मॉड्यूल के नाम के लिए, सिर्फ़ दिए गए नेमस्पेस को खोजा जाता है.
  2. अगर ऐसा नहीं है, तो Soong सबसे पहले नेमस्पेस N में बताए गए D नाम के मॉड्यूल को खोजता है.
  3. अगर वह मॉड्यूल मौजूद नहीं है, तो Soong नेमस्पेस I1, I2, I3… में D नाम का मॉड्यूल खोजता है
  4. आखिर में, Soong रूट नेमस्पेस में खोजता है.