Bu sayfada, ndk-build
tarafından kullanılan Android.mk
derleme dosyasının söz dizimi açıklanmaktadır.
Genel bakış
Android.mk
dosyası, projenizin jni/
dizininin bir alt dizininde bulunur ve kaynaklarınız ile paylaşılan kitaplıklarınızı derleme sistemine açıklar.
Bu, derleme sisteminin bir veya daha fazla kez ayrıştırdığı küçük bir GNU model dosyası parçasıdır. Android.mk
dosyası Application.mk
, derleme sistemi ve ortam değişkenlerinizin tanımlanmamış bıraktığı proje genelindeki ayarları tanımlamak için kullanışlıdır. Ayrıca belirli modüller için proje genelindeki ayarları geçersiz kılabilir.
Android.mk
söz dizimi, kaynaklarınızı modüller halinde gruplandırmanıza olanak tanır.
Modül statik bir kitaplık, paylaşılan bir kitaplık veya bağımsız yürütülebilir bir kitaplıktır. Her Android.mk
dosyasında bir veya daha fazla modül tanımlayabilir ve aynı kaynak dosyayı birden fazla modülde kullanabilirsiniz. Derleme sistemi, paylaşılan kitaplıkları yalnızca uygulama paketinize yerleştirir. Ayrıca statik kitaplıklar da paylaşılan kitaplıklar oluşturabilir.
Paketleme kitaplıklarına ek olarak, derleme sistemi sizin için çeşitli diğer ayrıntıları işler. Örneğin, Android.mk
dosyanızda oluşturulan dosyalar arasındaki başlık dosyalarını veya açık bağımlılıkları listelemenize gerek yoktur. NDK derleme sistemi bu ilişkileri sizin için otomatik olarak hesaplar. Bu nedenle, gelecekteki NDK sürümlerinde Android.mk
dosyanıza dokunmadan yeni araç zinciri/platform desteğinden faydalanabileceksiniz.
Bu dosyanın söz dizimi, tam Android Açık Kaynak Projesi ile dağıtılan Android.mk
dosyalarındaki kullanılana çok yakın. Bunları kullanan derleme sistemi uygulaması farklı olsa da bunların benzerliği, uygulama geliştiricilerin kaynak kodu harici kitaplıklar için yeniden kullanmasını kolaylaştırmak amacıyla bilinçli bir tasarım kararıdır.
Temel Bilgiler
Söz dizimini ayrıntılı olarak incelemeden önce Android.mk
dosyasının içeriği hakkında temel bilgileri edinerek başlamanız önerilir. Bu bölümde, Hello-JNI örneğindeki Android.mk
dosyası kullanılarak dosyadaki her satırın oynadığı rol açıklanır.
Android.mk
dosyası, LOCAL_PATH
değişkenini tanımlayarak başlamalıdır:
LOCAL_PATH := $(call my-dir)
Bu değişken, geliştirme ağacındaki kaynak dosyaların konumunu gösterir. Burada, derleme sistemi tarafından sağlanan my-dir
makro işlevi, geçerli dizinin (Android.mk
dosyasının kendisini içeren dizin) yolunu döndürür.
Sonraki satırda, derleme sisteminin sağladığı CLEAR_VARS
değişkeni tanımlanır.
include $(CLEAR_VARS)
CLEAR_VARS
değişkeni, sizin için LOCAL_MODULE
, LOCAL_SRC_FILES
ve LOCAL_STATIC_LIBRARIES
gibi birçok LOCAL_XXX
değişkenini temizleyen özel bir GNU Makefile dosyasını işaret eder. LOCAL_PATH
ifadesinin silinmediğini unutmayın. Sistem, tüm derleme denetimi dosyalarını tek bir GNU Yürütme bağlamını kullanarak ayrıştırıp tüm değişkenlerin genel olduğu bu değişken, değerini korumalıdır. Her bir modülü açıklamadan önce bu değişkeni (yeniden) bildirmeniz gerekir.
Daha sonra LOCAL_MODULE
değişkeni, oluşturmak istediğiniz modülün adını depolar. Bu değişkeni uygulamanızdaki her modül için bir kez kullanın.
LOCAL_MODULE := hello-jni
Her modül adı benzersiz olmalı ve boşluk içermemelidir. Derleme sistemi, paylaşılan kitaplık dosyasının son dosyasını oluştururken LOCAL_MODULE
öğesine atadığınız ada otomatik olarak uygun önek ve son eki ekler. Örneğin, yukarıda görünen örnek, libhello-jni.so
adlı bir kitaplık oluşturulmasıyla sonuçlanır.
Bir sonraki satırda kaynak dosyalar sıralanır. Alanlar, birden çok dosyayı sınırlandırır:
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES
değişkeni, bir modül içinde derlenecek C ve/veya C++ kaynak dosyalarının listesini içermelidir.
Son satır, sistemin her şeyi birbirine bağlamasına yardımcı olur:
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY
değişkeni, en son include
tarihinden itibaren LOCAL_XXX
değişkenlerinde tanımladığınız tüm bilgileri toplayan bir GNU Makefile komut dosyasına işaret eder. Bu komut dosyası neyin oluşturulacağını ve nasıl yapılacağını belirler.
Örnek dizinlerinde, yorum yapabileceğiniz Android.mk
dosyalarının bulunduğu daha karmaşık örnekler bulunmaktadır. Ayrıca, Sample: Native-activity bölümünde bu örneğin Android.mk
dosyasının ayrıntılı bir açıklaması bulunur. Son olarak, Değişkenler ve makrolar, bu bölümdeki değişkenler hakkında daha fazla bilgi sağlar.
Değişkenler ve makrolar
Derleme sistemi, Android.mk
dosyasında kullanılacak birçok olası değişken sağlar.
Bu değişkenlerin çoğu önceden atanmış değerlerle gelir. Diğerlerini siz atarsınız.
Bu değişkenlere ek olarak kendi isteğe bağlı değişkenlerinizi de tanımlayabilirsiniz. Bunu yaparsanız NDK derleme sisteminin aşağıdaki değişken adlarını ayırdığını unutmayın:
LOCAL_
ile başlayan adlar (ör.LOCAL_MODULE
).PRIVATE_
,NDK_
veyaAPP
ile başlayan adlar. Derleme sistemi bunları dahili olarak kullanır.my-dir
gibi küçük harfli adlar. Derleme sistemi bunları da dahili olarak kullanır.
Bir Android.mk
dosyasında kendi kolaylık değişkenlerinizi tanımlamanız gerekiyorsa adlarının başına MY_
dizesini eklemenizi öneririz.
NDK tanımlı değişkenleri içerir
Bu bölümde, Android.mk
dosyanızı ayrıştırmadan önce derleme sisteminin tanımladığı GNU Yapma değişkenleri açıklanmaktadır. Belirli koşullar altında NDK, bu değişkenlerin bazıları için her seferinde farklı bir tanım kullanarak Android.mk
dosyanızı birkaç kez ayrıştırabilir.
TEMİZLEME_VARS
Bu değişken, aşağıdaki "Geliştirici tarafından tanımlanan değişkenler" bölümünde listelenen neredeyse tüm LOCAL_XXX
değişkenlerinin tanımını kaldıran bir derleme komut dosyasına işaret eder. Yeni bir modülü açıklamadan önce bu komut dosyasını eklemek için bu değişkeni kullanın. Bu özelliğin kullanımıyla ilgili
söz dizimi şu şekildedir:
include $(CLEAR_VARS)
BUILD_EXECUTABLE
Bu değişken, LOCAL_XXX
değişkenlerinizde sağladığınız modülle ilgili tüm bilgileri toplayan ve listelediğiniz kaynaklardan yürütülebilir bir hedefin nasıl oluşturulacağını belirleyen derleme komut dosyasına işaret eder. Bu komut dosyasını kullanmak için en azından LOCAL_MODULE
ve LOCAL_SRC_FILES
değişkenlerine değer atamış olmanız gerektiğini unutmayın (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri bölümüne bakın).
Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_EXECUTABLE)
DERLEME_PAYLAŞILAN_KİTAPLIK
Bu değişken, LOCAL_XXX
değişkenlerinizde sağladığınız modülle ilgili tüm bilgileri toplayan ve listelediğiniz kaynaklardan hedef bir paylaşılan kitaplığın nasıl oluşturulacağını belirleyen derleme komut dosyasına işaret eder. Bu komut dosyasını kullanmak için en azından LOCAL_MODULE
ve LOCAL_SRC_FILES
değişkenlerine değer atamış olmanız gerektiğini unutmayın (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri bölümüne bakın).
Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_SHARED_LIBRARY)
Shared-library değişkeni, derleme sisteminin .so
uzantısına sahip bir kitaplık dosyası oluşturmasına neden olur.
DERLEME_STATİK_KİTAPLIĞI
Statik kitaplık oluşturmak için kullanılan bir BUILD_SHARED_LIBRARY
varyantı. Derleme sistemi statik kitaplıkları projenize/paketlerinize kopyalamaz ancak paylaşılan kitaplıklar oluşturmak için bunları kullanabilir (aşağıdaki LOCAL_STATIC_LIBRARIES
ve LOCAL_WHOLE_STATIC_LIBRARIES
bölümlerine bakın). Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_STATIC_LIBRARY)
static-library değişkeni, derleme sisteminin .a
uzantısına sahip bir kitaplık oluşturmasına neden olur.
PREBUILT_SHARED_LIBRARY
Önceden oluşturulmuş paylaşılan kitaplığı belirtmek için kullanılan bir derleme komut dosyasına işaret eder. BUILD_SHARED_LIBRARY
ve BUILD_STATIC_LIBRARY
durumundan farklı olarak, burada LOCAL_SRC_FILES
değeri bir kaynak dosya olamaz. Bunun yerine, foo/libfoo.so
gibi önceden oluşturulmuş bir paylaşılan kitaplığa giden tek bir yol olmalıdır. Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PREBUILTS
değişkenini kullanarak başka bir modülde önceden oluşturulmuş bir kitaplığa da başvurabilirsiniz. Önceden oluşturulmuş kitaplıkları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma bölümüne bakın.
ÖNCEKİ_STATİK_KİTAPLIK
PREBUILT_SHARED_LIBRARY
ile aynıdır, ancak önceden oluşturulmuş statik kitaplık içindir. Önceden oluşturulmuş kitaplıkları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma bölümüne bakın.
Hedef bilgisi değişkenleri
Derleme sistemi, genellikle Application.mk
dosyanızda tanımlanan APP_ABI
değişkeni tarafından belirtilen ABI başına Android.mk
öğesini bir kez ayrıştırır. APP_ABI
değeri all
ise derleme sistemi, Android.mk
değerini NDK'nın desteklediği ABI başına bir kez ayrıştırır. Bu bölümde, Android.mk
öğesini her ayrıştırırken derleme sisteminin tanımladığı değişkenler açıklanmaktadır.
TARGET_ARCH
Derleme sisteminin bu Android.mk
dosyasını ayrıştırırken hedeflediği CPU ailesi. Bu değişken şunlardan biri olur: arm
, arm64
, x86
veya x86_64
.
TARGET_PLATFORM
Derleme sisteminin bu Android.mk
dosyasını ayrıştırırken hedeflediği Android API seviye numarası. Örneğin, Android 5.1 sistem görüntüleri Android API düzeyi 22'ye karşılık gelir: android-22
. Platform adlarının ve karşılık gelen Android sistem görüntülerinin tam listesi için Yerel API'ler bölümüne bakın. Aşağıdaki örnekte, bu değişkeni kullanmak için kullanılan söz dizimi gösterilmektedir:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
Derleme sisteminin hedeflediği ABI, bu Android.mk
dosyasını ayrıştırır.
Tablo 1'de, desteklenen her CPU ve mimari için kullanılan ABI ayarı gösterilmektedir.
CPU ve mimari | Ayar |
---|---|
ARMv7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
i686 | x86 |
x86-64 | x86_64 |
Aşağıdaki örnekte, hedef CPU-ve ABI kombinasyonu olarak ARMv8 AArch64'ün nasıl kontrol edileceği gösterilmektedir:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
Mimari ABI'leri ve ilişkili uyumluluk sorunları hakkında daha fazla ayrıntı için Android ABI'leri bölümüne bakın.
Gelecekteki yeni hedef ABI'ler farklı değerlere sahip olacaktır.
TARGET_ABI
Hedef Android API düzeyi ile ABI'nın birleşimi. Bu, özellikle gerçek bir cihaz için belirli bir hedef sistem görüntüsüne göre test yapmak istediğinizde yararlı olur. Örneğin, Android API düzeyi 22'de çalışan bir 64 bit ARM cihazı olup olmadığını kontrol etmek için:
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
Modül açıklaması değişkenleri
Bu bölümdeki değişkenler, modülünüzü derleme sistemine tanımlar. Her modül açıklaması şu temel akışa uymalıdır:
CLEAR_VARS
değişkenini kullanarak modülle ilişkili değişkenleri başlatın veya tanımını kaldırın.- Modülü tanımlamak için kullanılan değişkenlere değer atayın.
BUILD_XXX
değişkenini kullanarak NDK derleme sistemini modül için uygun derleme komut dosyasını kullanacak şekilde ayarlayın.
YEREL_YOL
Bu değişken, geçerli dosyanın yolunu vermek için kullanılır. Bunu Android.mk
dosyanızın başında tanımlamanız gerekir. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:
LOCAL_PATH := $(call my-dir)
CLEAR_VARS
öğesinin işaret ettiği komut dosyası, bu değişkeni temizlemiyor. Bu nedenle, Android.mk
dosyanızda birden fazla modül açıklansa bile bunu yalnızca tek bir kez tanımlamanız gerekir.
YEREL_MODULE
Bu değişken modülünüzün adını depolar. Tüm modül adları arasında benzersiz olmalı ve boşluk içermemelidir. Herhangi bir komut dosyasını (CLEAR_VARS
ile ilgili olanın dışında) eklemeden önce bunu tanımlamanız gerekir. lib
ön ekini ya da .so
veya .a
dosya uzantısını eklemeniz gerekmez. Derleme sistemi bu değişiklikleri otomatik olarak yapar. Android.mk
ve Application.mk
dosyalarınız genelinde modülünüzü değiştirilmemiş adıyla kullanın. Örneğin, aşağıdaki satır libfoo.so
adlı paylaşılan kitaplık modülünün oluşturulmasıyla sonuçlanır:
LOCAL_MODULE := "foo"
Oluşturulan modülün lib
ve LOCAL_MODULE
değerinden farklı bir ada sahip olmasını istiyorsanız oluşturulan modüle istediğiniz adı vermek için LOCAL_MODULE_FILENAME
değişkenini kullanabilirsiniz.
LOCAL_MODULE_FILENAME
Bu isteğe bağlı değişken, derleme sisteminin oluşturduğu dosyalar için varsayılan olarak kullandığı adları geçersiz kılmanıza olanak tanır. Örneğin, LOCAL_MODULE
dosyanızın adı foo
ise sistemi, oluşturduğu dosyayı libnewfoo
çağırmaya zorlayabilirsiniz. Aşağıdaki örnekte, bunun nasıl yapılacağı gösterilmektedir:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
Bu örnek, paylaşılan bir kitaplık modülü için libnewfoo.so
adlı bir dosya oluşturur.
LOCAL_SRC_FILES (YEREL_SRC_DOSYALARI)
Bu değişken, derleme sisteminin modülü oluşturmak için kullandığı kaynak dosyaların listesini içerir. Derleme sistemi ilişkili tüm bağımlılıkları otomatik olarak hesapladığından yalnızca derleme sisteminin derleyiciye gerçekten geçirdiği dosyaları listeleyin. Hem göreli (LOCAL_PATH
için) hem de mutlak dosya yollarını kullanabileceğinizi unutmayın.
Mutlak dosya yollarından kaçınmanızı öneririz. Göreli yollar, Android.mk
dosyanızı daha taşınabilir hale getirir.
LOCAL_PBM_EXTENSION
C++ kaynak dosyalarınızda .cpp
dışında bir dosya uzantısı belirtmek için bu isteğe bağlı değişkeni kullanabilirsiniz. Örneğin, aşağıdaki satır uzantıyı .cxx
olarak değiştirir. (Ayar, noktayı içermelidir.)
LOCAL_CPP_EXTENSION := .cxx
Birden çok uzantıyı belirtmek için bu değişkeni kullanabilirsiniz. Örneğin:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_PPP_FEATURES
Kodunuzun belirli C++ özelliklerine dayalı olduğunu belirtmek için bu isteğe bağlı değişkeni kullanabilirsiniz. Derleme işlemi sırasında doğru derleyici ve bağlayıcı işaretlerini etkinleştirir. Bu değişken, önceden oluşturulmuş ikili programlar için ikili programın hangi özelliklere bağlı olduğunu da açıklayarak nihai bağlantının doğru şekilde çalışmasına yardımcı olur. -frtti
ve -fexceptions
değerlerini doğrudan LOCAL_CPPFLAGS
tanımınızda etkinleştirmek yerine bu değişkeni kullanmanızı öneririz.
Bu değişkenin kullanılması derleme sisteminin her modül için uygun işaretleri kullanmasına olanak tanır. LOCAL_CPPFLAGS
kullanımı, derleyicinin gerçek ihtiyaçtan bağımsız olarak tüm modüller için belirtilen tüm işaretleri kullanmasına neden olur.
Örneğin, kodunuzun RTTI (Çalışma Zamanı Türü Bilgisi) kullandığını belirtmek için şunu yazın:
LOCAL_CPP_FEATURES := rtti
Kodunuzun C++ istisnaları kullandığını belirtmek için şunu yazın:
LOCAL_CPP_FEATURES := exceptions
Bu değişken için birden çok değer de belirtebilirsiniz. Örneğin:
LOCAL_CPP_FEATURES := rtti features
Değerleri açıkladığınız sıra önemli değildir.
LOCAL_C_DAHİLİ
Tüm kaynakları (C, C++ ve Assembly) derlerken dahil etme arama yoluna eklemek üzere NDK root
dizinine göre bir yol listesi belirtmek için bu isteğe bağlı değişkeni kullanabilirsiniz. Örneğin:
LOCAL_C_INCLUDES := sources/foo
Hatta:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
LOCAL_CFLAGS
veya LOCAL_CPPFLAGS
aracılığıyla ilgili dahil etme bayraklarını ayarlamadan önce bu değişkeni tanımlayın.
Derleme sistemi ayrıca ndk-gdb ile yerel hata ayıklamayı başlatırken LOCAL_C_INCLUDES
yollarını da otomatik olarak kullanır.
YEREL_CFLAGLAR
Bu isteğe bağlı değişken, C ve C++ kaynak dosyaları oluştururken derleme sisteminin ileteceği derleyici bayraklarını ayarlar. Bu özellik, ek makro tanımları belirtmek veya derleme seçenekleri belirtmek için yararlı olabilir. Yalnızca C++ ile ilgili işaretleri belirtmek için LOCAL_CPPFLAGS
öğesini kullanın.
Android.mk
dosyanızda optimizasyon/hata ayıklama düzeyini değiştirmemeye çalışın.
Derleme sistemi, Application.mk
dosyasındaki ilgili bilgileri kullanarak bu ayarı sizin için otomatik olarak işleyebilir. Bu şekilde yapılması, derleme sisteminin hata ayıklama sırasında kullanılan yararlı veri dosyaları oluşturmasına olanak tanır.
Aşağıdakileri yazarak ek dahil etme yollarını belirtmek mümkündür:
LOCAL_CFLAGS += -I<path>,
Bununla birlikte, bu amaçla LOCAL_C_INCLUDES
kullanılması daha iyidir, çünkü böylece ndk-gdb ile yerel hata ayıklama için mevcut yolların kullanılabilmesi de mümkün olur.
YEREL_PBMFLAGS
Yalnızca C++ kaynak dosyaları oluşturulurken iletilecek isteğe bağlı bir derleyici işareti grubu. Derleyicinin komut satırında LOCAL_CFLAGS
öğesinden sonra görünürler. Hem C hem de C++ ile ilgili işaretleri belirtmek için LOCAL_CFLAGS
öğesini kullanın.
YEREL_STATİK_KİTAPLIKLAR
Bu değişken, mevcut modülün bağlı olduğu statik kitaplık modüllerinin listesini depolar.
Mevcut modül, paylaşılan veya yürütülebilir bir kitaplıksa bu değişken, bu kitaplıkların sonuçta elde edilen ikili dosyaya bağlanmasını zorunlu kılar.
Mevcut modül statik bir kitaplıksa bu değişken, geçerli modüle bağlı olarak diğer modüllerin de listelenen kitaplıklara bağlı olacağını gösterir.
LOCAL_SHARED_LIBRARIES
Bu değişken, bu modülün çalışma zamanında bağlı olduğu paylaşılan kitaplık modüllerinin listesidir. Bu bilgiler, bağlantı zamanında ve ilgili bilgilerin oluşturulan dosyaya yerleştirilmesi için gereklidir.
LOCAL_WHOLE_STATIC_LIBRARIES
Bu değişken, LOCAL_STATIC_LIBRARIES
değişkenidir ve bağlayıcının ilişkili kitaplık modüllerini tüm arşivler olarak işlemesi gerektiğini ifade eder. Tüm arşivler hakkında daha fazla bilgi için --whole-archive
işaretiyle ilgili GNU ld dokümanlarına bakın.
Bu değişken, birkaç statik kitaplık arasında döngüsel bağımlılıklar olduğunda yararlıdır. Paylaşılan bir kitaplık oluşturmak için bu değişkeni kullandığınızda, derleme sistemi, statik kitaplıklarınızdaki tüm nesne dosyalarını nihai ikili dosyaya eklemeye zorlar. Ancak bu durum yürütülebilir dosyalar oluşturulurken geçerli değildir.
LOCAL_LDLIBS
Bu değişken, paylaşılan kitaplığınızı oluştururken veya yürütülebilir dosyayı oluştururken kullanılacak ek bağlayıcı işaretlerinin listesini içerir. Belirli sistem kitaplıklarının adını iletmek için -l
önekini kullanabilmenizi sağlar. Örneğin, aşağıdaki örnek, bağlayıcıya yükleme sırasında /system/lib/libz.so
öğesine bağlantı veren bir modül oluşturmasını söyler:
LOCAL_LDLIBS := -lz
Bu NDK sürümünde bağlantı oluşturabileceğiniz açığa çıkan sistem kitaplıklarının listesi için Yerel API'ler bölümüne bakın.
LOCAL_LDFLAGS
Paylaşılan kitaplığınızı veya yürütülebilir dosyayı oluştururken derleme sisteminin kullanacağı diğer bağlayıcı işaretlerinin listesi. Örneğin, ld.bfd
bağlayıcıyı ARM/X86'da kullanmak için:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
Varsayılan olarak, derleme sistemi paylaşılan bir dosyayı derlemeye çalışırken tanımlanmamış bir referansla karşılaştığında tanımsız simge hatası verir. Bu hata, kaynak kodunuzdaki hataları yakalamanıza yardımcı olabilir.
Bu kontrolü devre dışı bırakmak için değişkeni true
olarak ayarlayın. Bu ayarın, paylaşılan kitaplığın çalışma zamanında yüklenmesine neden olabileceğini unutmayın.
YEREL_ARM_MODU
Derleme sistemi, varsayılan olarak ARM hedefi ikili kodlarını parmak modunda oluşturur. Bu modda her talimat 16 bit genişliğindedir ve thumb/
dizinindeki STL kitaplıklarına bağlanır. Bu değişkenin arm
olarak tanımlanması, derleme sistemini modülün nesne dosyalarını 32 bit arm
modunda oluşturmaya zorlar. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:
LOCAL_ARM_MODE := arm
Ayrıca kaynak dosya adlarına .arm
son eki ekleyerek derleme sistemine arm
modunda yalnızca belirli kaynakları derlemesi talimatını verebilirsiniz. Örneğin, aşağıdaki örnek, derleme sistemine bar.c
öğesini her zaman ARM modunda derlemesini, ancak foo.c
öğesini LOCAL_ARM_MODE
değerine göre derlemesini söyler.
LOCAL_SRC_FILES := foo.c bar.c.arm
YEREL_ARM_NEON
Bu değişken yalnızca armeabi-v7a
ABI'yi hedeflerken önemlidir. C ve C++ kaynaklarınızda ARM Gelişmiş SIMD (NEON) derleyici iç öğelerinin ve Assembly dosyalarındaki NEON talimatlarının kullanılmasına olanak tanır.
Tüm ARMv7 tabanlı CPU'ların NEON talimat grubu uzantılarını desteklemediğini unutmayın. Bu nedenle, çalışma zamanında bu kodu güvenli bir şekilde kullanabilmek için çalışma zamanı algılaması gerçekleştirmeniz gerekir. Daha fazla bilgi için Neon desteği ve CPU özellikleri sayfalarına göz atın.
Alternatif olarak, derleme sisteminin yalnızca NEON desteğiyle belirli kaynak dosyaları derlemesini belirtmek için .neon
son ekini kullanabilirsiniz. Aşağıdaki örnekte derleme sistemi, baş parmak ve neon destekli foo.c
, başparmak destekli bar.c
ve ARM ve NEON destekli zoo.c
kodunu derler:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
Her iki soneki de kullanıyorsanız .neon
karakterinden önce .arm
gelmelidir.
LOCAL_DISABLE_FORMAT_STRING_KONTROLLER
Derleme sistemi, varsayılan olarak kodu biçim dizesi korumasıyla derler. Bu işlem, printf
tarzı bir işlevde sabit olmayan bir biçim dizesi kullanılırsa derleyici hatası verilmesini sağlar. Bu koruma varsayılan olarak etkindir ancak bu değişkenin değerini true
olarak ayarlayarak devre dışı bırakabilirsiniz. Bunu, ikna edici bir neden olmadan
yapmanızı önermiyoruz.
YEREL_EXPORT_CFLAGS
Bu değişken, LOCAL_STATIC_LIBRARIES
veya LOCAL_SHARED_LIBRARIES
değişkenleri aracılığıyla bunu kullanan diğer tüm modüllerin LOCAL_CFLAGS
tanımına eklemek üzere bir dizi C/C++ derleyici işareti kaydeder.
Örneğin, şu modül çiftini göz önünde bulundurun: foo
ve bar
modülüne bağlı olarak bunlar 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)
Burada derleme sistemi, bar.c
derlenirken -DFOO=1
ve -DBAR=2
işaretlerini derleyiciye iletir. Ayrıca, dışa aktarılan işaretleri modülünüzün LOCAL_CFLAGS
öğesinin başına ekler. Böylece bunları kolayca geçersiz kılabilirsiniz.
Buna ek olarak, modüller arasındaki ilişki geçişlidir: zoo
, bar
öğesine (ve dolayısıyla foo
) bağımlıysa zoo
, foo
ürününden dışa aktarılan tüm işaretleri de devralır.
Son olarak, derleme sistemi yerel olarak derleme yaparken (yani bayraklarını dışa aktardığı modülü oluştururken) dışa aktarılan işaretleri kullanmaz. Dolayısıyla, yukarıdaki örnekte bu işlev foo/foo.c
derlenirken derleyiciye -DFOO=1
iletmez. Yerel olarak derlemek için LOCAL_CFLAGS
kullanın.
YEREL_EXPORT_CPPFLAGS
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır, ancak yalnızca C++ işaretleri için geçerlidir.
LOCAL_EXPORT_C_includeS
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır, ancak C için yolları içerir. Örneğin, bar.c
öğesinin foo
modülünün başlıklarını içermesi gerektiği durumlarda yararlıdır.
LOCAL_EXPORT_LDFLAGS
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır, ancak bağlayıcı işaretleri için geçerlidir.
LOCAL_EXPORT_LDLIBS
Bu değişken LOCAL_EXPORT_CFLAGS
ile aynıdır ve derleme sistemine belirli sistem kitaplıklarının adlarını derleyiciye iletmesini bildirir. Belirttiğiniz her kitaplığın adının başına -l
ekleyin.
Derleme sisteminin, içe aktarılan bağlayıcı işaretlerini modülünüzün LOCAL_LDLIBS
değişkeninin değerine eklediğini unutmayın. Bunu, Unix bağlayıcılarının çalışma şeklinden kaynaklanır.
Bu değişken, foo
modülü statik bir kitaplık olduğunda ve sistem kitaplığına bağlı bir koda sahip olduğunda genellikle yararlıdır. Daha sonra bağımlılığı dışa aktarmak için LOCAL_EXPORT_LDLIBS
kullanabilirsiniz. Örneğin:
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)
Bu örnekte derleme sistemi, libbar.so
derlemesinde bağlayıcı komutunun sonuna -llog
öğesini yerleştirmektedir. Bu işlem, bağlayıcıya libbar.so
ürününün foo
öğesine bağlı olması nedeniyle sistem günlük kaydı kitaplığına da bağlı olduğunu belirtir.
LOCAL_SHORT_COMMANDS
Modülünüzde çok sayıda kaynak ve/veya bağımlı statik ya da paylaşılan kitaplık varsa bu değişkeni true
olarak ayarlayın. Bunun yapılması derleme sistemini, ara nesne dosyaları veya bağlantı kitaplıkları içeren arşivler için @
söz dizimini kullanmaya zorlar.
Bu özellik, komut satırının en fazla 8.191 karakter kabul ettiği ve karmaşık projeler için çok küçük olabilen Windows'da yararlı olabilir. Ayrıca, neredeyse tüm derleyici işaretlerini liste dosyalarına yerleştirerek tek tek kaynak dosyaların derlemesini de etkiler.
true
dışındaki değerlerin varsayılan davranışa geri döneceğini unutmayın. Projenizdeki tüm modüllerde bu davranışı zorunlu kılmak için Application.mk
dosyanızda APP_SHORT_COMMANDS
de tanımlayabilirsiniz.
Derlemeyi yavaşlattığı için bu özelliğin varsayılan olarak etkinleştirilmesi önerilmez.
LOCAL_THIN_ARCHIVE
Statik kitaplıklar oluştururken bu değişkeni true
olarak ayarlayın. Bunun yapılması ince bir arşiv oluşturur. Bu, nesne dosyalarını içermeyen, yalnızca normalde içerdikleri gerçek nesnelere giden dosya yollarını içeren bir kitaplık dosyasıdır.
Bu, derleme çıktınızın boyutunu küçültmek için yararlıdır. Dezavantajı, bu tür kitaplıkların farklı bir konuma taşınamamasıdır (içlerindeki tüm yollar görelidir).
Geçerli değerler true
, false
veya boştur. Application.mk
dosyanızda APP_THIN_ARCHIVE
değişkeni aracılığıyla varsayılan bir değer ayarlanabilir.
LOCAL_FILTER_ASM
Bu değişkeni, derleme sisteminin kullanarak LOCAL_SRC_FILES
için belirttiğiniz dosyalardan ayıklanan veya oluşturulan derleme dosyalarını filtrelemek için kullanacağı bir kabuk komutu olarak tanımlayın. Bu değişkenin tanımlanması aşağıdakilerin ortaya çıkmasına neden olur:
- Derleme sistemi, herhangi bir C veya C++ kaynak dosyasından geçici bir derleme dosyası oluşturur, ancak bunları bir nesne dosyasında derlemek yerine oluşturur.
- Derleme sistemi,
LOCAL_FILTER_ASM
içindeki kabuk komutunu herhangi bir geçici derleme dosyasında veLOCAL_SRC_FILES
içinde listelenen herhangi bir derleme dosyasında yürüterek başka bir geçici derleme dosyası oluşturur. - Derleme sistemi, filtrelenmiş bu derleme dosyalarını bir nesne dosyasında derler.
Örneğin:
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" derleyiciye, "2" filtreye ve "3" derleyiciye karşılık gelir. Filtre, giriş dosyasının adını ilk bağımsız değişken ve çıkış dosyasının adını ikinci bağımsız değişken olarak alan bağımsız bir kabuk komutu olmalıdır. Örneğin:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
NDK tarafından sağlanan işlev makroları
Bu bölümde, NDK'nın sağladığı GNU Yapma işlevi makroları açıklanmaktadır. Değerlendirmek için $(call <function>)
kullanın. Bu öğeler, metin biçiminde bilgiler döndürür.
benim-dir
Bu makro, genellikle mevcut Android.mk
dizini olan en son dahil edilen makefile dosyasının yolunu döndürür. my-dir
, Android.mk
dosyanızın başında LOCAL_PATH
öğesini tanımlamak için yararlıdır. Örneğin:
LOCAL_PATH := $(call my-dir)
GNU Make'nin çalışma şekli nedeniyle, bu makronun gerçekte döndürdüğü şey, derleme komut dosyalarını ayrıştırırken derleme sisteminin dahil ettiği son model dosyasının yoludur. Bu nedenle, başka bir dosya ekledikten sonra my-dir
işlevini çağırmamalısınız.
Örneğin, aşağıdaki örneği inceleyin:
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
Buradaki sorun, my-dir
için yapılan ikinci çağrının LOCAL_PATH
öğesini $PATH
yerine $PATH/foo
olarak tanımlamasıdır, çünkü en son ekleme işlemi burada işaret edilmiştir.
Android.mk
dosyasındaki diğer her şeyden sonra ek kapsamlar koyarak bu sorunu önleyebilirsiniz. Örneğin:
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
Dosyayı bu şekilde yapılandırmak mümkün değilse ilk my-dir
çağrısının değerini başka bir değişkene kaydedin. Örneğin:
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
all-subdir-makefiles (tüm-subdir-dosyalari)
Geçerli my-dir
yolunun tüm alt dizinlerinde bulunan Android.mk
dosyalarının listesini döndürür.
Derleme sistemine derin iç içe yerleştirilmiş kaynak dizin hiyerarşileri sağlamak için bu işlevi kullanabilirsiniz. Varsayılan olarak NDK, yalnızca Android.mk
dosyasını içeren dizinde dosyaları arar.
bu yapıdosyası
Geçerli model dosyasının yolunu döndürür (derleme sisteminin işlev çağırdığı).
üst-yapma dosyası
Dahil etme ağacındaki üst model dosyasının yolunu (geçerli dosyayı içeren model dosyasının yolu) döndürür.
büyük-ebeveyn-yapma-dosyasi
Dahil etme ağacındaki grandparent makefile yolunu (geçerli dosyayı içeren makefile yolunun yolu) döndürür.
içe aktarma modülü
Bir modülün Android.mk
dosyasını modülün adıyla bulup eklemenize olanak tanıyan işlev. Aşağıda tipik bir örnek verilmiştir:
$(call import-module,<name>)
Bu örnekte derleme sistemi, NDK_MODULE_PATH
ortamınızın referans verdiği dizinler listesinde <name>
etiketli modülü arar ve Android.mk
dosyasını sizin için otomatik olarak ekler.