इस पेज पर, उस Android.mk
बिल्ड फ़ाइल के सिंटैक्स की जानकारी दी गई है जिसका इस्तेमाल किया जा रहा है
ndk-build
.
खास जानकारी
Android.mk
फ़ाइल, आपके प्रोजेक्ट की jni/
डायरेक्ट्री की सबडायरेक्ट्री में मौजूद होती है. साथ ही, यह बिल्ड सिस्टम को आपके सोर्स और शेयर की गई लाइब्रेरी के बारे में बताती है.
यह GNU का एक छोटा मेकफ़ाइल फ़्रैगमेंट है, जिसे बिल्ड सिस्टम एक बार पार्स करता है या
वगैरह को कॉपी करने का विकल्प है. Android.mk
फ़ाइल, प्रोजेक्ट के लिए ऐसी सेटिंग तय करने में मदद करती है जिन्हें Application.mk
, बिल्ड सिस्टम, और आपके एनवायरमेंट वैरिएबल तय नहीं करते. यह किसी खास मॉड्यूल के लिए, प्रोजेक्ट-वाइड सेटिंग को भी बदल सकता है.
Android.mk
के सिंटैक्स की मदद से, अपने सोर्स को मॉड्यूल में ग्रुप किया जा सकता है.
मॉड्यूल या तो स्टैटिक लाइब्रेरी, शेयर की गई लाइब्रेरी या स्टैंडअलोन होता है
एक्ज़ीक्यूट किया जा सकता है. हर Android.mk
फ़ाइल में एक या उससे ज़्यादा मॉड्यूल तय किए जा सकते हैं. साथ ही, एक ही सोर्स फ़ाइल का इस्तेमाल कई मॉड्यूल में किया जा सकता है. सिर्फ़ बिल्ड सिस्टम
आपके ऐप्लिकेशन पैकेज में शेयर की गई लाइब्रेरी रखता है. इसके अलावा, स्टैटिक
लाइब्रेरी, शेयर की गई लाइब्रेरी जनरेट कर सकती हैं.
पैकेजिंग लाइब्रेरी के अलावा, बिल्ड सिस्टम अन्य
जानकारी मिलेगी. उदाहरण के लिए, आपको हेडर फ़ाइलों या अश्लील फ़ाइलों की सूची बनाने की ज़रूरत नहीं है
आपकी Android.mk
फ़ाइल में जनरेट की गई फ़ाइलों के बीच उनकी डिपेंडेंसी. एनडीके बिल्ड
सिस्टम आपके लिए इन संबंधों की गणना अपने-आप करता है. इस वजह से,
को आने वाले समय में एनडीके से, नए टूलचेन/प्लैटफ़ॉर्म सहायता का फ़ायदा मिल सकता है
रिलीज़ कर देता है, वह भी Android.mk
फ़ाइल को छुए बिना.
इस फ़ाइल का सिंटैक्स, Android.mk
फ़ाइलों में इस्तेमाल किए गए सिंटैक्स के काफ़ी करीब है
संपूर्ण Android ओपन सोर्स प्रोजेक्ट के साथ वितरित किया जाता है. बिल्ड सिस्टम
उनका इस्तेमाल अलग-अलग तरीके से किया जाता है. उनकी समानता जान-बूझकर
डिज़ाइन से जुड़े फ़ैसले का मकसद, ऐप्लिकेशन डेवलपर के लिए ऐप्लिकेशन का दोबारा इस्तेमाल करना आसान बनाना है
सोर्स कोड डालें.
बुनियादी जानकारी
सिंटैक्स के बारे में ज़्यादा जानने से पहले, यह समझना ज़रूरी है कि Android.mk
फ़ाइल में क्या होता है. यह सेक्शन,
Android.mk
फ़ाइल को उस सिरे के लिए Hello-JNI सैंपल में डाला गया, जो भूमिका के बारे में जानकारी देता है
जिसे फ़ाइल की हर लाइन में चलाया जाता है.
Android.mk
फ़ाइल को LOCAL_PATH
वैरिएबल से शुरू करना चाहिए:
LOCAL_PATH := $(call my-dir)
यह वैरिएबल, डेवलपमेंट में सोर्स फ़ाइलों की जगह के बारे में बताता है
पेड़ यहां, बिल्ड सिस्टम से मिलने वाला मैक्रो फ़ंक्शन my-dir
, मौजूदा डायरेक्ट्री (Android.mk
फ़ाइल वाली डायरेक्ट्री) का पाथ दिखाता है.
अगली लाइन, CLEAR_VARS
वैरिएबल के बारे में बताती है, जिसकी वैल्यू बिल्ड सिस्टम में होती है
उपलब्ध कराता है.
include $(CLEAR_VARS)
CLEAR_VARS
वैरिएबल, एक खास GNU Makefile पर ले जाता है. यह आपके लिए कई LOCAL_XXX
वैरिएबल को हटा देता है. जैसे, LOCAL_MODULE
, LOCAL_SRC_FILES
, और
LOCAL_STATIC_LIBRARIES
. ध्यान दें कि इससे LOCAL_PATH
नहीं हटता. इस वैरिएबल की वैल्यू में बदलाव नहीं होना चाहिए, क्योंकि सिस्टम सभी बिल्ड कंट्रोल फ़ाइलों को एक ही GNU Make एक्सीक्यूशन कॉन्टेक्स्ट में पार्स करता है. इस कॉन्टेक्स्ट में सभी वैरिएबल ग्लोबल होते हैं. आपको ऐसा ज़रूर करना चाहिए
हर मॉड्यूल के बारे में बताने से पहले, इस वैरिएबल के बारे में (फिर से) जानकारी दें.
इसके बाद, LOCAL_MODULE
वैरिएबल उस मॉड्यूल के नाम को सेव करता है जिसे आपको सेव करना है
बिल्ड. अपने ऐप्लिकेशन में हर मॉड्यूल के लिए, इस वैरिएबल का एक बार इस्तेमाल करें.
LOCAL_MODULE := hello-jni
हर मॉड्यूल का नाम यूनीक होना चाहिए और उसमें कोई स्पेस नहीं होना चाहिए. बिल्ड सिस्टम,
जब यह अंतिम शेयर की गई लाइब्रेरी फ़ाइल जनरेट करता है, तो अपने आप उचित
उस नाम के प्रीफ़िक्स और सफ़िक्स का इस्तेमाल करें जिसे आपने LOCAL_MODULE
को असाइन किया है. उदाहरण के लिए, ऊपर दिए गए उदाहरण से libhello-jni.so
नाम की लाइब्रेरी जनरेट होती है.
अगली लाइन में सोर्स फ़ाइलों की जानकारी दी गई है. इसमें एक से ज़्यादा फ़ाइलों के बीच स्पेस का इस्तेमाल किया गया है:
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES
वैरिएबल में C और/या C++ सोर्स फ़ाइलों की सूची होनी चाहिए
जिसे एक मॉड्यूल में बनाया जा सकता है.
आखिरी लाइन, सिस्टम की हर चीज़ को एक साथ जोड़ने में मदद करती है:
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY
वैरिएबल, GNU Makefile स्क्रिप्ट पर ले जाता है. यह स्क्रिप्ट, सबसे हाल ही के include
के बाद से LOCAL_XXX
वैरिएबल में तय की गई सारी जानकारी इकट्ठा करती है. इस स्क्रिप्ट से यह तय होता है कि क्या बनाना है और कैसे बनाना है.
सैंपल डायरेक्ट्री में, टिप्पणी वाली Android.mk
फ़ाइलों के साथ और भी जटिल उदाहरण हैं. इसके अलावा, सैंपल: नेटिव-ऐक्टिविटी, उस सैंपल की Android.mk
फ़ाइल के बारे में पूरी जानकारी देता है. आख़िर में,
वैरिएबल और मैक्रो, इस GA4 में लागू होने वाले वैरिएबल के बारे में ज़्यादा जानकारी देते हैं
सेक्शन में जाएं.
वैरिएबल और मैक्रो
बिल्ड सिस्टम Android.mk
फ़ाइल में इस्तेमाल के लिए, कई संभावित वैरिएबल देता है.
इनमें से कई वैरिएबल, पहले से असाइन की गई वैल्यू के साथ आते हैं. अन्य, जिन्हें आपने असाइन किया है.
इन वैरिएबल के अलावा, अपने हिसाब से भी वैरिएबल तय किए जा सकते हैं. ऐसा करने पर, ध्यान रखें कि NDK बिल्ड सिस्टम इन वैरिएबल के नामों को रिज़र्व रखता है:
LOCAL_
से शुरू होने वाले नाम, जैसे किLOCAL_MODULE
.- ऐसे नाम जो
PRIVATE_
,NDK_
याAPP
से शुरू होते हैं. बिल्ड सिस्टम इनका इस्तेमाल इंटरनल तौर पर करता है. - छोटे अक्षर, जैसे कि
my-dir
. बिल्ड सिस्टम इनका इस्तेमाल अंदरूनी तौर पर, इस तरह करता है करते हैं.
अगर आपको किसी Android.mk
फ़ाइल में, अपने सुविधा वैरिएबल तय करने हैं, तो हम
सुझाव दें कि MY_
से पहले उनके नाम से शुरुआत करें.
एनडीके (NDK) के ज़रिए तय किए गए वैरिएबल
इस सेक्शन में GNU मेक वैरिएबल के बारे में बताया गया है, जिसे बिल्ड सिस्टम तय करता है
अपनी Android.mk
फ़ाइल को पार्स करने से पहले. कुछ मामलों में, एनडीके
किसी और परिभाषा का इस्तेमाल करके, आपकी Android.mk
फ़ाइल को कई बार पार्स कर सकता है
इनमें से कुछ वैरिएबल के लिए एक बार इस्तेमाल किया जा सकता है.
CLEAR_VARS
यह वैरिएबल, ऐसी बिल्ड स्क्रिप्ट पर ले जाता है जो नीचे दिए गए "डेवलपर के तय किए गए वैरिएबल" सेक्शन में मौजूद, LOCAL_XXX
सभी वैरिएबल को अनफ़ाइन करता है. इसका इस्तेमाल करें
वैरिएबल जोड़ें, ताकि नए मॉड्यूल के बारे में बताने से पहले इस स्क्रिप्ट को शामिल किया जा सके. इसके लिए सिंटैक्स
इसका इस्तेमाल करना:
include $(CLEAR_VARS)
बिल्ड_एक्सईसीयूटेबल
यह वैरिएबल एक ऐसी बिल्ड स्क्रिप्ट पर ले जाता है, जो
वह मॉड्यूल जो आपने अपने LOCAL_XXX
वैरिएबल में दिया है. साथ ही, यह भी तय करता है कि
आपने जिन सोर्स को लिस्ट किया है उनसे एक ऐसा टारगेट बनाएं जिसे एक्ज़ीक्यूटेबल बनाया जा सके. ध्यान दें कि इसका इस्तेमाल करके
स्क्रिप्ट के लिए यह ज़रूरी है कि आपने पहले ही LOCAL_MODULE
और
LOCAL_SRC_FILES
, कम से कम (इन वैरिएबल के बारे में ज़्यादा जानकारी के लिए, देखें
मॉड्यूल-ब्यौरा वैरिएबल).
इस वैरिएबल का इस्तेमाल करने के लिए सिंटैक्स यह है:
include $(BUILD_EXECUTABLE)
बिल्ड
यह वैरिएबल एक ऐसी बिल्ड स्क्रिप्ट पर ले जाता है, जो
वह मॉड्यूल जो आपने अपने LOCAL_XXX
वैरिएबल में दिया है. साथ ही, यह भी तय करता है कि
आपने जो सोर्स लिस्ट किए हैं उनसे एक टारगेट शेयर की गई लाइब्रेरी बनाएं. ध्यान दें कि इसका इस्तेमाल करके
स्क्रिप्ट के लिए यह ज़रूरी है कि आपने पहले ही LOCAL_MODULE
और
LOCAL_SRC_FILES
, कम से कम (इन वैरिएबल के बारे में ज़्यादा जानकारी के लिए, देखें
मॉड्यूल-ब्यौरा वैरिएबल).
इस वैरिएबल का इस्तेमाल करने के लिए सिंटैक्स यह है:
include $(BUILD_SHARED_LIBRARY)
शेयर की गई लाइब्रेरी के वैरिएबल की वजह से, बिल्ड सिस्टम .so
एक्सटेंशन वाली लाइब्रेरी फ़ाइल जनरेट करता है.
BUILD_STATIC_LIBRARY
BUILD_SHARED_LIBRARY
का एक वैरिएंट, जिसका इस्तेमाल एक स्टैटिक लाइब्रेरी बनाने के लिए किया जाता है. बिल्ड सिस्टम, स्टैटिक लाइब्रेरी को आपके प्रोजेक्ट/पैकेज में कॉपी नहीं करता. हालांकि, वह शेयर की गई लाइब्रेरी बनाने के लिए उनका इस्तेमाल कर सकता है. इसके बारे में ज़्यादा जानने के लिए, नीचे LOCAL_STATIC_LIBRARIES
और LOCAL_WHOLE_STATIC_LIBRARIES
देखें. इस वैरिएबल का इस्तेमाल करने के लिए सिंटैक्स यह है:
include $(BUILD_STATIC_LIBRARY)
स्टैटिक-लाइब्रेरी वैरिएबल की वजह से, बिल्ड सिस्टम .a
एक्सटेंशन वाली लाइब्रेरी जनरेट करता है.
PREBUILT_SHARED_LIBRARY
पहले से बनी शेयर की गई लाइब्रेरी की जानकारी देने के लिए इस्तेमाल की जाने वाली बिल्ड स्क्रिप्ट पर ले जाता है. इसमें नापसंद करें
BUILD_SHARED_LIBRARY
और BUILD_STATIC_LIBRARY
के मामले में, यहां
LOCAL_SRC_FILES
एक सोर्स फ़ाइल नहीं हो सकती. इसके बजाय, यह foo/libfoo.so
जैसी पहले से बनी शेयर की गई लाइब्रेरी का एक पाथ होना चाहिए. इस वैरिएबल का इस्तेमाल करने का सिंटैक्स यह है:
include $(PREBUILT_SHARED_LIBRARY)
आप
LOCAL_PREBUILTS
वैरिएबल. पहले से बनी लाइब्रेरी इस्तेमाल करने के बारे में ज़्यादा जानने के लिए,
पहले से बनी लाइब्रेरी इस्तेमाल करना लेख पढ़ें.
PREBUILT_आंकड़े_LIBRARY
PREBUILT_SHARED_LIBRARY
जैसा ही, लेकिन पहले से बनी स्टैटिक लाइब्रेरी के लिए. इसके लिए
पहले से बनी लाइब्रेरी का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, पहले से बनी लाइब्रेरी इस्तेमाल करना देखें.
टारगेट की जानकारी वाले वैरिएबल
बिल्ड सिस्टम, APP_ABI
के बताए गए हर एबीआई के लिए, Android.mk
को एक बार पार्स करता है
वैरिएबल की जानकारी देता है, जिसकी जानकारी आम तौर पर आपकी Application.mk
फ़ाइल में दी जाती है. अगर APP_ABI
all
है, तो बिल्ड सिस्टम, NDK के साथ काम करने वाले हर एबीआई के लिए, Android.mk
को एक बार पार्स करता है. इस सेक्शन में उन वैरिएबल के बारे में बताया गया है जिन्हें हर बार Android.mk
को पार्स करने पर, बिल्ड सिस्टम तय करता है.
TARGET_ARCH
बिल्ड सिस्टम, सीपीयू फ़ैमिली को टारगेट कर रहा है, क्योंकि यह इस Android.mk
को पार्स करता है
फ़ाइल से लिए जाते हैं. यह वैरिएबल इनमें से कोई एक होगा: arm
, arm64
, x86
या x86_64
.
TARGET_PLATFORM
Android एपीआई का वह लेवल जिसे बिल्ड सिस्टम टारगेट कर रहा है, क्योंकि वह इस Android.mk
फ़ाइल को पार्स कर रहा है. उदाहरण के लिए, Android 5.1 सिस्टम की इमेज
Android एपीआई लेवल 22: android-22
. प्लैटफ़ॉर्म के नामों और उनसे जुड़ी Android सिस्टम इमेज की पूरी सूची के लिए, नेटिव एपीआई देखें. कॉन्टेंट बनाने
नीचे दिया गया उदाहरण इस वैरिएबल का इस्तेमाल करने के लिए सिंटैक्स दिखाता है:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
इस Android.mk
फ़ाइल को पार्स करते समय, बिल्ड सिस्टम जिस एबीआई को टारगेट कर रहा है.
पहली टेबल में, काम करने वाले हर सीपीयू और आर्किटेक्चर के लिए इस्तेमाल की जाने वाली एबीआई सेटिंग दिखाई गई है.
टेबल 1. अलग-अलग सीपीयू और आर्किटेक्चर के लिए एबीआई सेटिंग.
सीपीयू और आर्किटेक्चर | सेटिंग |
---|---|
ARMv7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
i686 | x86 |
x86-64 | x86_64 |
नीचे दिए गए उदाहरण में, टारगेट के तौर पर ARMv8 AArch64 की जांच करने का तरीका बताया गया है सीपीयू और एबीआई का कॉम्बिनेशन:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
आर्किटेक्चर एबीआई और उसके साथ काम करने से जुड़ी समस्याओं के बारे में ज़्यादा जानकारी के लिए, Android एबीआई देखें.
आने वाले समय में, नए टारगेट एबीआई की वैल्यू अलग-अलग होंगी.
TARGET_ABI
टारगेट किए गए Android एपीआई लेवल और एबीआई को जोड़ने पर बनने वाला स्ट्रिंग. यह सुविधा खास तौर पर तब काम आती है, जब आपको किसी असल डिवाइस के लिए, किसी खास टारगेट सिस्टम इमेज की जांच करनी हो. उदाहरण के लिए, Android API लेवल 22 पर चलने वाले 64-बिट ARM डिवाइस की जांच करने के लिए:
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
मॉड्यूल-ब्यौरे के वैरिएबल
इस सेक्शन में मौजूद वैरिएबल, बिल्ड सिस्टम को आपके मॉड्यूल के बारे में बताते हैं. हर मॉड्यूल के ब्यौरे को इस बुनियादी फ़्लो के हिसाब से होना चाहिए:
- इसका इस्तेमाल करके, मॉड्यूल से जुड़े वैरिएबल को शुरू करें या तय करें
CLEAR_VARS
वैरिएबल. - मॉड्यूल के बारे में बताने वाले वैरिएबल के लिए वैल्यू असाइन करें.
- मॉड्यूल के लिए सही बिल्ड स्क्रिप्ट का इस्तेमाल करने के लिए, एनडीके बिल्ड सिस्टम सेट करें,
BUILD_XXX
वैरिएबल का इस्तेमाल करके.
LOCAL_PATH
इस वैरिएबल का इस्तेमाल, मौजूदा फ़ाइल का पाथ देने के लिए किया जाता है. आपको इसे अपनी Android.mk
फ़ाइल की शुरुआत में तय करना होगा. यहां दिए गए उदाहरण में, ऐसा करने का तरीका बताया गया है:
LOCAL_PATH := $(call my-dir)
वह स्क्रिप्ट जिससे CLEAR_VARS
पॉइंट इस वैरिएबल को साफ़ नहीं करते. इसलिए,
आपको इसे सिर्फ़ एक बार तय करना होगा, भले ही आपकी Android.mk
फ़ाइल
कई मॉड्यूल का वर्णन करता है.
LOCAL_MODULE
यह वैरिएबल आपके मॉड्यूल का नाम सेव करता है. यह सभी मॉड्यूल के बीच अलग होना चाहिए
नाम और स्पेस का इस्तेमाल नहीं किया जाना चाहिए. आपको CLEAR_VARS
के अलावा किसी भी स्क्रिप्ट को शामिल करने से पहले, इसे तय करना होगा. आपको lib
प्रीफ़िक्स या .so
या .a
फ़ाइल एक्सटेंशन जोड़ने की ज़रूरत नहीं है. बिल्ड सिस्टम, ये बदलाव अपने-आप करता है. अपनी सभी Android.mk
और Application.mk
फ़ाइलों में, अपने मॉड्यूल को उसके मूल नाम से रेफ़र करें. उदाहरण के लिए, नीचे दी गई लाइन से libfoo.so
नाम का शेयर की गई लाइब्रेरी मॉड्यूल जनरेट होता है:
LOCAL_MODULE := "foo"
अगर आपको जनरेट किए गए मॉड्यूल का नाम lib
+ LOCAL_MODULE
की वैल्यू के बजाय कुछ और रखना है, तो LOCAL_MODULE_FILENAME
वैरिएबल का इस्तेमाल करके, जनरेट किए गए मॉड्यूल को अपनी पसंद का नाम दिया जा सकता है.
LOCAL_MODULE_FILENAME
इस वैकल्पिक वैरिएबल की मदद से, बिल्ड सिस्टम के नामों को बदला जा सकता है
डिफ़ॉल्ट रूप से, जनरेट की जाने वाली फ़ाइलों का इस्तेमाल करता है. उदाहरण के लिए, अगर आपके LOCAL_MODULE
का नाम foo
है, तो सिस्टम को जनरेट की गई फ़ाइल को libnewfoo
के तौर पर कॉल करने के लिए मजबूर किया जा सकता है. नीचे दिए गए उदाहरण में, ऐसा करने का तरीका बताया गया है:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
शेयर की गई लाइब्रेरी के मॉड्यूल के लिए, यह उदाहरण
libnewfoo.so
.
LOCAL_SRC_FILES
इस वैरिएबल में उन सोर्स फ़ाइलों की सूची होती है जिनका इस्तेमाल, मॉड्यूल जनरेट करने के लिए, बिल्ड सिस्टम करता है. सिर्फ़ उन फ़ाइलों की सूची बनाएं जिन्हें बिल्ड सिस्टम असल में पास करता है
कंपाइलर में बदल सकते हैं, क्योंकि बिल्ड सिस्टम किसी
निर्भरता. ध्यान दें कि आप रिलेटिव (LOCAL_PATH
के हिसाब से) और ऐब्सलूट, दोनों का इस्तेमाल कर सकते हैं
फ़ाइल पाथ.
हमारा सुझाव है कि ऐब्सलूट फ़ाइल पाथ का इस्तेमाल न करें; रिलेटिव पाथ आपके Android.mk
को
फ़ाइल को अधिक पोर्टेबल बना सकता है.
LOCAL_CPP_EXTENSION
इस वैकल्पिक वैरिएबल का इस्तेमाल करके, अपनी C++ सोर्स फ़ाइलों के लिए, .cpp
के अलावा किसी दूसरे फ़ाइल एक्सटेंशन को दिखाया जा सकता है. उदाहरण के लिए, नीचे दी गई लाइन
.cxx
के लिए एक्सटेंशन. (सेटिंग में बिंदु शामिल होना चाहिए.)
LOCAL_CPP_EXTENSION := .cxx
इस वैरिएबल का इस्तेमाल, एक से ज़्यादा एक्सटेंशन तय करने के लिए किया जा सकता है. उदाहरण के लिए:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPP_FEATURES
इस वैकल्पिक वैरिएबल का इस्तेमाल करके यह बताया जा सकता है कि आपका कोड, C++ की कुछ खास सुविधाओं पर निर्भर है. यह बिल्ड प्रोसेस के दौरान, सही कंपाइलर और लिंकर फ़्लैग चालू करता है. पहले से बनी बाइनरी के लिए, यह वैरिएबल यह भी बताता है कि
बाइनरी पर निर्भर करती है. इससे यह पक्का करने में मदद मिलती है कि फ़ाइनल लिंकिंग सही तरीके से काम कर रही है. बुध
सुझाव है कि आप -frtti
को चालू करने के बजाय इस वैरिएबल का इस्तेमाल करें और
-fexceptions
सीधे आपकी LOCAL_CPPFLAGS
परिभाषा में.
इस वैरिएबल का इस्तेमाल करने पर, बिल्ड सिस्टम इनके लिए सही फ़्लैग इस्तेमाल कर पाता है
हर मॉड्यूल की ज़रूरत पड़ेगी. LOCAL_CPPFLAGS
का इस्तेमाल करने पर, कंपाइलर सभी मॉड्यूल के लिए तय किए गए सभी फ़्लैग का इस्तेमाल करता है. भले ही, असल ज़रूरत न हो.
उदाहरण के लिए, यह बताने के लिए कि आपका कोड RTTI (रनटाइम टाइप की जानकारी) का इस्तेमाल करता है, लिखें:
LOCAL_CPP_FEATURES := rtti
यह बताने के लिए कि आपका कोड C++ अपवादों का इस्तेमाल करता है, यह लिखें:
LOCAL_CPP_FEATURES := exceptions
इस वैरिएबल के लिए, एक से ज़्यादा वैल्यू भी दी जा सकती हैं. उदाहरण के लिए:
LOCAL_CPP_FEATURES := rtti features
वैल्यू का क्रम मायने नहीं रखता.
LOCAL_C_INCLUDES
इस वैकल्पिक वैरिएबल का इस्तेमाल पाथ की सूची तय करने के लिए किया जा सकता है.
NDK root
डायरेक्ट्री, सभी को कंपाइल करते समय, 'खोज पाथ शामिल करें' में जोड़ने के लिए
सोर्स (C, C++, और असेंबली). उदाहरण के लिए:
LOCAL_C_INCLUDES := sources/foo
या यहां तक कि:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
इसके ज़रिए कोई भी संबंधित शामिल किए जाने वाले फ़्लैग सेट करने से पहले यह वैरिएबल तय करें
LOCAL_CFLAGS
या LOCAL_CPPFLAGS
.
ndk-gdb की मदद से नेटिव डीबगिंग शुरू करते समय, बिल्ड सिस्टम भी LOCAL_C_INCLUDES
पाथ का अपने-आप इस्तेमाल करता है.
LOCAL_ASFLAGS
.s
या .S
फ़ाइलें बनाते समय, Clang को भेजे जाने वाले फ़्लैग.
LOCAL_ASMFLAGS
.asm
फ़ाइलें बनाते समय, yasm को पास किए जाने वाले फ़्लैग.
LOCAL_CFLAGS
C, C++, और कुछ असेम्बली (.s
और .S
, लेकिन .asm
नहीं) सोर्स फ़ाइलों को बिल्ड करते समय, Clang को पास किए जाने वाले फ़्लैग. ऐसा करने से, मैक्रो की अन्य परिभाषाएं तय करने या कंपाइल करने के विकल्पों के बारे में बताने में मदद मिल सकती है. इस्तेमाल की जाने वाली चीज़ें
सिर्फ़ C++ के लिए फ़्लैग तय करने के लिए LOCAL_CPPFLAGS
. सिर्फ़ C के लिए फ़्लैग तय करने के लिए, LOCAL_CONLYFLAGS
का इस्तेमाल करें.
अपनी Android.mk
फ़ाइल में ऑप्टिमाइज़ेशन/डीबगिंग लेवल को न बदलने की कोशिश करें.
Application.mk
फ़ाइल में मौजूद काम की जानकारी का इस्तेमाल करके, बिल्ड सिस्टम इस सेटिंग को आपके लिए अपने-आप मैनेज कर सकता है. इसे इस तरीके से करने से
बिल्ड सिस्टम का इस्तेमाल किया जा सकता है, ताकि डीबग करने के दौरान इस्तेमाल की जाने वाली काम की डेटा फ़ाइलें जनरेट की जा सकें.
अतिरिक्त पाथ शामिल करने के बारे में जानकारी देने के लिए, यह जानकारी दी जा सकती है:
LOCAL_CFLAGS += -I<path>,
हालांकि, इस काम के लिए LOCAL_C_INCLUDES
का इस्तेमाल करना बेहतर होगा, क्योंकि
इसलिए, नेटिव डीबगिंग के लिए उपलब्ध पाथ का इस्तेमाल
ndk-gdb.
LOCAL_CONLYFLAGS
ऐसे फ़्लैग जिन्हें C स्रोतों को कंपाइल करते समय Clang को भेजा जाएगा. नापसंद करें
कंपाइल करते समय LOCAL_CFLAGS
, LOCAL_CONLYFLAGS
को Clang को पास नहीं किया जाएगा
C++ या असेंबली सोर्स.
LOCAL_CPPFLAGS
कंपाइलर फ़्लैग का एक वैकल्पिक सेट, जो सिर्फ़ C++ सोर्स फ़ाइलें बनाते समय पास किया जाएगा. वे कंपाइलर के LOCAL_CFLAGS
के बाद दिखेंगे
कमांड लाइन. C और C++, दोनों के लिए फ़्लैग तय करने के लिए LOCAL_CFLAGS
का इस्तेमाल करें.
LOCAL_STATIC_LIBRARIES
यह वैरिएबल ऐसे स्टैटिक लाइब्रेरी मॉड्यूल की सूची सेव करता है जिन पर मौजूदा मॉड्यूल निर्भर करता है.
अगर मौजूदा मॉड्यूल कोई शेयर की गई लाइब्रेरी या एक्ज़ीक्यूटेबल है, तो यह वैरिएबल इन लाइब्रेरी को बाइनरी से लिंक करने के लिए कह सकता है.
अगर मौजूदा मॉड्यूल एक स्टैटिक लाइब्रेरी है, तो यह वैरिएबल सिर्फ़ यह बताता है कि मौजूदा मॉड्यूल के आधार पर, अन्य मॉड्यूल की सूची लाइब्रेरी.
LOCAL_SHARED_LIBRARIES
यह वैरिएबल, शेयर की गई लाइब्रेरी के उन मॉड्यूल की सूची होती है जिन पर रनटाइम के दौरान यह मॉड्यूल निर्भर करता है. यह जानकारी लिंक समय पर और एम्बेड करने के लिए आवश्यक है संबंधित जानकारी होती है.
लोकल_डब्ल्यूएचओ
यह वैरिएबल LOCAL_STATIC_LIBRARIES
का एक वैरिएंट है और इससे पता चलता है कि
लिंकर को संबंधित लाइब्रेरी मॉड्यूल के साथ पूरे संग्रह के रूप में इस्तेमाल किया जाना चाहिए. पूरी संग्रह के बारे में ज़्यादा जानकारी के लिए, --whole-archive
फ़्लैग के लिए GNU ld दस्तावेज़ देखें.
यह वैरिएबल तब काम आता है, जब कई स्टैटिक लाइब्रेरी के बीच सर्कुलर डिपेंडेंसी होती हैं. शेयर की गई लाइब्रेरी बनाने के लिए इस वैरिएबल का इस्तेमाल करने पर, यह बिल्ड सिस्टम को आपकी स्टैटिक लाइब्रेरी की सभी ऑब्जेक्ट फ़ाइलों को फ़ाइनल बाइनरी में जोड़ने के लिए मजबूर करेगा. हालांकि, एक्सीक्यूटेबल जनरेट करते समय ऐसा नहीं होता.
LOCAL_LDLIBS
इस वैरिएबल में, बिल्डिंग में इस्तेमाल करने के लिए लिंक करने वाले दूसरे फ़्लैग की सूची शामिल है
शेयर की गई लाइब्रेरी या एक्ज़ीक्यूटेबल. इसकी मदद से, -l
प्रीफ़िक्स का इस्तेमाल करके, किसी खास सिस्टम लाइब्रेरी का नाम पास किया जा सकता है. उदाहरण के लिए, यहां दिए गए उदाहरण में लिंकर को ऐसा मॉड्यूल जनरेट करने के लिए कहा गया है जो लोड होने के समय /system/lib/libz.so
से लिंक होता है:
LOCAL_LDLIBS := -lz
एक्सपोज़ की गई सिस्टम लाइब्रेरी की सूची के लिए, नेटिव एपीआई देखें. इन लाइब्रेरी को इस NDK रिलीज़ में लिंक किया जा सकता है.
LOCAL_LDFLAGS
शेयर की गई लाइब्रेरी या एक्सीक्यूटेबल बनाते समय, बिल्ड सिस्टम के लिए इस्तेमाल किए जाने वाले अन्य लिंकर फ़्लैग की सूची. उदाहरण के लिए, ld.bfd
लिंकर का इस्तेमाल करके
ARM/X86:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
डिफ़ॉल्ट रूप से, जब बिल्ड सिस्टम को कोई ऐसी पहचान फ़ाइल मिलती है जिसके बारे में कोई जानकारी न दी गई हो शेयर की गई फ़ाइल बनाने की कोशिश करते समय, उससे तय नहीं किया गया निशान की गड़बड़ी दिखेगी. यह गड़बड़ी की जानकारी से आपको सोर्स कोड में आने वाली गड़बड़ियों को पहचानने में मदद मिल सकती है.
इस जांच को बंद करने के लिए, इस वैरिएबल को true
पर सेट करें. ध्यान दें कि यह सेटिंग हो सकती है
रनटाइम के दौरान शेयर की गई लाइब्रेरी को लोड करने में मदद करता है.
LOCAL_ARM_मोड
बिल्ड सिस्टम डिफ़ॉल्ट रूप से, थंब मोड में ARM टारगेट बाइनरी जनरेट करता है,
जिसमें हर निर्देश 16 बिट चौड़ा होता है और STL लाइब्रेरी से
thumb/
डायरेक्ट्री. इस वैरिएबल को arm
के तौर पर तय करने से, बिल्ड सिस्टम इस पर काम करता है
32-बिट arm
मोड में मॉड्यूल की ऑब्जेक्ट फ़ाइलें जनरेट करती हैं. यह उदाहरण
दिखाता है कि इसे कैसे किया जा सकता है:
LOCAL_ARM_MODE := arm
बिल्ड सिस्टम को arm
में सिर्फ़ खास सोर्स बनाने के लिए निर्देश भी दिए जा सकते हैं
सोर्स फ़ाइल नामों में .arm
सफ़िक्स जोड़कर मोड का इस्तेमाल करें. उदाहरण के लिए,
नीचे दिया गया उदाहरण बिल्ड सिस्टम को यह बताता है कि bar.c
को हमेशा ARM मोड में कंपाइल किया जाता है,
लेकिन LOCAL_ARM_MODE
की वैल्यू के हिसाब से foo.c
बनाने के लिए.
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
यह वैरिएबल सिर्फ़ तब मायने रखता है, जब armeabi-v7a
एबीआई को टारगेट किया जा रहा हो. यह
यह आपके C और C++ में ARM Advanced SIMD (NEON) कंपाइलर इंट्रिंसिक्स का इस्तेमाल करने की अनुमति देता है
और असेंबली फ़ाइलों में NEON निर्देश भी दिए गए हैं.
ध्यान दें कि सभी ARMv7 पर आधारित सीपीयू, NEON निर्देश सेट के एक्सटेंशन के साथ काम नहीं करते. इस वजह से, आपको रनटाइम पर इस कोड का सुरक्षित तरीके से इस्तेमाल करने के लिए, रनटाइम की पहचान करनी होगी. ज़्यादा जानकारी के लिए, Neon सहायता देखें और सीपीयू की सुविधाएं.
इसके अलावा, .neon
सफ़िक्स का इस्तेमाल करके यह बताया जा सकता है कि बिल्ड सिस्टम, सिर्फ़ NEON के साथ काम करने वाली खास सोर्स फ़ाइलों को ही कंपाइल करता है. नीचे दिए गए उदाहरण में,
बिल्ड सिस्टम, foo.c
को थंब और नियॉन सपोर्ट के साथ कंपाइल करता है, bar.c
थंब सपोर्ट, और ARM और NEON के लिए समर्थन के साथ zoo.c
:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
अगर दोनों सफ़िक्स का इस्तेमाल किया जाता है, तो .neon
से पहले .arm
होना चाहिए.
LOCAL_ROWS_FORMAT_STRING_CHECKS
डिफ़ॉल्ट रूप से, बिल्ड सिस्टम फ़ॉर्मैट स्ट्रिंग सुरक्षा के साथ कोड को कंपाइल करता है. करना
इसलिए अगर किसी नॉन-कॉन्सटेंट फ़ॉर्मैट स्ट्रिंग का इस्तेमाल
printf
-स्टाइल फ़ंक्शन. यह सुरक्षा डिफ़ॉल्ट रूप से चालू होती है. हालांकि, इस वेरिएबल की वैल्यू को true
पर सेट करके, इसे बंद किया जा सकता है. हमारा सुझाव है कि आप ऐसा करने से पहले, अच्छी तरह से सोच-विचार कर लें.
LOCAL_EXPORT_CFLAGS
यह वैरिएबल, C/C++ कंपाइलर फ़्लैग का एक सेट रिकॉर्ड करता है, ताकि LOCAL_STATIC_LIBRARIES
या LOCAL_SHARED_LIBRARIES
वैरिएबल के ज़रिए इस वैरिएबल का इस्तेमाल करने वाले किसी भी दूसरे मॉड्यूल की LOCAL_CFLAGS
परिभाषा में जोड़ा जा सके.
उदाहरण के लिए, यहां दिए गए मॉड्यूल के जोड़े पर विचार करें: foo
और bar
, जो foo
पर निर्भर करता है:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
यहां, bar.c
को बिल्ड करते समय, बिल्ड सिस्टम, कंपाइलर को फ़्लैग -DFOO=1
और -DBAR=2
पास करता है. यह आपके मॉड्यूल के एक्सपोर्ट किए गए फ़्लैग को भी दिखाता है
LOCAL_CFLAGS
ताकि आप इन्हें आसानी से बदल सकें.
इसके अलावा, मॉड्यूल के बीच संबंध संक्रामक होता है: अगर zoo
bar
, जो कि foo
पर निर्भर करता है. इसके बाद, zoo
भी सभी फ़्लैग को इनहेरिट करता है
foo
से एक्सपोर्ट किया गया.
आखिर में, लोकल नेटवर्क बनाते समय बिल्ड सिस्टम, एक्सपोर्ट किए गए फ़्लैग का इस्तेमाल नहीं करता
(जैसे, वह मॉड्यूल बनाना जिसके फ़्लैग को एक्सपोर्ट किया जा रहा है). इसलिए, ऊपर दिए गए उदाहरण में, foo/foo.c
को बिल्ड करते समय, कंपाइलर को -DFOO=1
नहीं भेजा जाता. यहां की यात्रा पर हूं
स्थानीय रूप से बनाने के लिए, इसके बजाय LOCAL_CFLAGS
का उपयोग करें.
LOCAL_EXPORT_CPPFLAGS
यह वैरिएबल LOCAL_EXPORT_CFLAGS
जैसा ही है, लेकिन सिर्फ़ C++ फ़्लैग के लिए.
LOCAL_EXPORT_C_INCLUDES
यह वैरिएबल LOCAL_EXPORT_CFLAGS
जैसा ही है, लेकिन C में पाथ शामिल हैं. यह
उन मामलों में उपयोगी होता है जहां, उदाहरण के लिए, bar.c
में
मॉड्यूल foo
.
लोकल_EXPORT_LDFLAGS
यह वैरिएबल LOCAL_EXPORT_CFLAGS
जैसा ही है, लेकिन लिंकर फ़्लैग के लिए भी यही है.
LOCAL_EXPORT_LDLIBS
यह वैरिएबल LOCAL_EXPORT_CFLAGS
जैसा ही है. यह बिल्ड सिस्टम को बताता है कि वह कंपाइलर को कुछ सिस्टम लाइब्रेरी के नाम पास करे. -l
को आगे जोड़ें
दर्ज करें.
ध्यान दें कि बिल्ड सिस्टम, आपके मॉड्यूल के LOCAL_LDLIBS
वैरिएबल की वैल्यू में इंपोर्ट किए गए लिंकर फ़्लैग जोड़ता है. ऐसा यूनिक्स लिंकर के काम करने के तरीके की वजह से होता है.
आम तौर पर, यह वैरिएबल तब काम आता है, जब foo
मॉड्यूल एक स्टैटिक लाइब्रेरी हो और उसमें
जो सिस्टम लाइब्रेरी पर निर्भर करता है. इसके बाद, डिपेंडेंसी को एक्सपोर्ट करने के लिए LOCAL_EXPORT_LDLIBS
का इस्तेमाल किया जा सकता है. उदाहरण के लिए:
include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)
इस उदाहरण में, बिल्ड सिस्टम -llog
को लिंकर कमांड के आखिर में रखता है
जब यह libbar.so
बनेगा. ऐसा करने से लिंकर को यह पता चलता है कि, क्योंकि libbar.so
foo
पर निर्भर करता है. यह सिस्टम लॉगिंग लाइब्रेरी पर भी निर्भर करता है.
LOCAL_SHORT_COMMANDS
जब आपके मॉड्यूल में बहुत ज़्यादा सोर्स हों, तो इस वैरिएबल को true
पर सेट करें
और/या डिपेंडेंट स्टैटिक या शेयर की गई लाइब्रेरी का इस्तेमाल करें. ऐसा करने से बिल्ड सिस्टम को
इंटरमीडिएट ऑब्जेक्ट फ़ाइलों या लिंकिंग वाले संग्रहों के लिए @
सिंटैक्स का उपयोग करें
लाइब्रेरी.
यह सुविधा Windows पर उपयोगी हो सकती है, जहां कमांड लाइन अधिकतम सिर्फ़ 8,191 वर्णों का हो सकता है, जो मुश्किल प्रोजेक्ट के लिए बहुत छोटा है. यह भी अलग-अलग सोर्स फ़ाइलों के कंपाइलेशन पर असर डालता है. इस प्रोसेस में करीब-करीब पूरा कंपाइलर फ़्लैग भी शामिल कर सकते हैं.
ध्यान दें कि true
के अलावा किसी भी वैल्यू को चुनने पर, डिफ़ॉल्ट सेटिंग लागू हो जाएगी. आपने लोगों तक पहुंचाया मुफ़्त में
लागू करने के लिए, अपनी Application.mk
फ़ाइल में APP_SHORT_COMMANDS
को भी तय कर सकता है
यह व्यवहार आपके प्रोजेक्ट के सभी मॉड्यूल के लिए लागू होगा.
हम इस सुविधा को डिफ़ॉल्ट रूप से सक्षम करने की अनुशंसा नहीं करते, क्योंकि इससे बिल्ड धीरे करना होगा.
LOCAL_THIN_संग्रहित
स्टैटिक लाइब्रेरी बनाते समय, इस वैरिएबल को true
पर सेट करें. ऐसा करने से
एक थिन आर्काइव जनरेट करता है, एक लाइब्रेरी फ़ाइल जिसमें ऑब्जेक्ट फ़ाइलें होती हैं,
लेकिन इसके बजाय सिर्फ़ उन असल ऑब्जेक्ट के लिए पाथ फ़ाइल करें जिन्हें वह आम तौर पर करता है
शामिल हैं.
यह आपके बिल्ड आउटपुट का साइज़ कम करने के लिए फ़ायदेमंद है. इसकी कमी यह है कि ऐसी लाइब्रेरी किसी दूसरी जगह पर नहीं ले जाई जा सकतीं (उनके अंदर के सभी पाथ) सापेक्ष हैं).
मान्य वैल्यू true
, false
या खाली हो सकती हैं. APP_THIN_ARCHIVE
वैरिएबल की मदद से, अपनी Application.mk
फ़ाइल में डिफ़ॉल्ट वैल्यू सेट की जा सकती है.
LOCAL_FILTER_ASM
इस वैरिएबल को शेल कमांड के तौर पर परिभाषित करें. बिल्ड सिस्टम, इनका इस्तेमाल फ़िल्टर करने के लिए करेगा
आपके लिए बताई गई फ़ाइलों से एक्सट्रैक्ट की गई या जनरेट की गई असेंबली फ़ाइलें
LOCAL_SRC_FILES
. इस वैरिएबल को तय करने से ये चीज़ें होती हैं:
- बिल्ड सिस्टम, किसी भी C या C++ सोर्स से अस्थायी असेंबली फ़ाइल जनरेट करता है .
- बिल्ड सिस्टम,
LOCAL_FILTER_ASM
में मौजूद शेल कमांड को किसी भी अस्थायी असेंबली फ़ाइल औरLOCAL_SRC_FILES
में दी गई किसी भी असेंबली फ़ाइल पर लागू करता है. इससे एक और अस्थायी असेंबली फ़ाइल जनरेट होती है. - बिल्ड सिस्टम, फ़िल्टर की गई इन असेंबली फ़ाइलों को ऑब्जेक्ट फ़ाइल में कंपाइल करता है.
उदाहरण के लिए:
LOCAL_SRC_FILES := foo.c bar.S
LOCAL_FILTER_ASM :=
foo.c --1--> $OBJS_DIR/foo.S.original --2--> $OBJS_DIR/foo.S --3--> $OBJS_DIR/foo.o
bar.S --2--> $OBJS_DIR/bar.S --3--> $OBJS_DIR/bar.o
"1", कंपाइलर से जुड़ा है, "2" फ़िल्टर से जुड़ा है, और "3" असेंबलर से जुड़ा है. फ़िल्टर एक स्टैंडअलोन शेल कमांड होना चाहिए जो इनपुट का नाम लेता हो फ़ाइल को अपने पहले तर्क के रूप में और दूसरे तर्क के रूप में आउटपुट फ़ाइल का नाम डालें. उदाहरण के लिए:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
NDK के फ़ंक्शन मैक्रो
इस सेक्शन में, NDK से मिलने वाले GNU Make फ़ंक्शन मैक्रो के बारे में बताया गया है. इस्तेमाल की जाने वाली चीज़ें
इनका आकलन करने के लिए $(call <function>)
; वे टेक्स्ट वाली जानकारी दिखाते हैं.
मेरी-डायर
यह मैक्रो, शामिल की गई आखिरी मेकफ़ाइल का पाथ दिखाता है. आम तौर पर, यह मौजूदा Android.mk
की डायरेक्ट्री होती है. my-dir
, Android.mk
फ़ाइल की शुरुआत में LOCAL_PATH
तय करने के लिए मददगार है. उदाहरण के लिए:
LOCAL_PATH := $(call my-dir)
GNU Make के काम करने के तरीके की वजह से, यह मैक्रो आखिरी मेकफ़ाइल का पाथ दिखाता है. इस मैकफ़ाइल को बिल्ड सिस्टम ने बिल्ड स्क्रिप्ट को पार्स करते समय शामिल किया था. इसके लिए
इस कारण से, कोई अन्य फ़ाइल शामिल करने के बाद आपको my-dir
को कॉल नहीं करना चाहिए.
नीचे दिए गए उदाहरण पर गौर करें:
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
समस्या यह है कि my-dir
को किए गए दूसरे कॉल में LOCAL_PATH
इस तरह परिभाषित होता है
$PATH
के बजाय $PATH/foo
, क्योंकि हाल ही में इसी जगह पर शामिल किया गया था
की ओर इशारा किया.
बाकी सब कुछ के बाद अतिरिक्त चीज़ें शामिल करके आप इस समस्या से बच सकते हैं
Android.mk
फ़ाइल में. उदाहरण के लिए:
LOCAL_PATH := $(call my-dir)
# ... declare one module
LOCAL_PATH := $(call my-dir)
# ... declare another module
# extra includes at the end of the Android.mk file
include $(LOCAL_PATH)/foo/Android.mk
अगर फ़ाइल को इस तरह से व्यवस्थित नहीं किया जा सकता, तो पहले my-dir
कॉल की वैल्यू को किसी दूसरे वैरिएबल में सेव करें. उदाहरण के लिए:
MY_LOCAL_PATH := $(call my-dir)
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(MY_LOCAL_PATH)
# ... declare another module
सभी-सब-दिर-मेकफ़ाइल
मौजूदा my-dir
पाथ की सभी सबडायरेक्ट्री में मौजूद Android.mk
फ़ाइलों की सूची दिखाता है.
इस फ़ंक्शन का इस्तेमाल, डीप-नेस्ट की गई सोर्स डायरेक्ट्री की हैरारकी देने के लिए किया जा सकता है
बिल्ड सिस्टम की ज़रूरत होती है. डिफ़ॉल्ट रूप से, एनडीके सिर्फ़ डायरेक्ट्री में मौजूद फ़ाइलें खोजता है
Android.mk
फ़ाइल शामिल है.
यह-मेकफ़ाइल
मौजूदा मेकफ़ाइल का पाथ दिखाता है. इसी से बिल़्ड सिस्टम, फ़ंक्शन को कॉल करता है.
पैरंट-मेकफ़ाइल
शामिल करने वाले ट्री में पैरंट मेकफ़ाइल का पाथ दिखाता है. यह उस मेकफ़ाइल का पाथ होता है जिसमें मौजूदा मेकफ़ाइल शामिल होती है.
grand-parent-makefile
शामिल करने वाले ट्री में, ग्रैंडपैरंट मेकफ़ाइल का पाथ दिखाता है. यह उस मेकफ़ाइल का पाथ होता है जिसमें मौजूदा मेकफ़ाइल शामिल होती है.
इंपोर्ट-मॉड्यूल
ऐसा फ़ंक्शन जो आपको मॉड्यूल की Android.mk
फ़ाइल को ढूंढने और शामिल करने की सुविधा देता है
मॉड्यूल का नाम. इसका एक सामान्य उदाहरण यहां दिया गया है:
$(call import-module,<name>)
इस उदाहरण में, बिल्ड सिस्टम उन डायरेक्ट्री की सूची में <name>
टैग किए गए मॉड्यूल को ढूंढता है जिनका रेफ़रंस आपके NDK_MODULE_PATH
एनवायरमेंट वैरिएबल में दिया गया है. साथ ही, वह आपके लिए Android.mk
फ़ाइल को अपने-आप शामिल कर लेता है.