Android.mk

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_ veya APP 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.

Tablo 1. Farklı CPU'lar ve mimariler için ABI ayarları.

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:

  1. CLEAR_VARS değişkenini kullanarak modülle ilişkili değişkenleri başlatın veya tanımını kaldırın.
  2. Modülü tanımlamak için kullanılan değişkenlere değer atayın.
  3. 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:

  1. 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.
  2. Derleme sistemi, LOCAL_FILTER_ASM içindeki kabuk komutunu herhangi bir geçici derleme dosyasında ve LOCAL_SRC_FILES içinde listelenen herhangi bir derleme dosyasında yürüterek başka bir geçici derleme dosyası oluşturur.
  3. 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.