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 alt dizinindedir ve kaynaklarınızı ve paylaşılan kitaplıklarınızı derleme sistemine açıklar. Derleme sisteminin bir veya daha fazla kez ayrıştırdığı çok küçük bir GNU makefile parçasıdır. Android.mk dosyası; proje genelinde, Application.mk, derleme sistemi ve ortam değişkenlerinizin tanımlanmamış olarak kaldığı ayarları tanımlamak için yararlı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 bir yürütülebilir dosyadı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.

Derleme sistemi, paketleme kitaplıklarının yanı sıra diğer birçok ayrıntıyı da sizin için işler. Örneğin, Android.mk dosyanızda başlık dosyalarını veya oluşturulan dosyalar arasındaki açık bağımlılıkları listelemenize gerek yoktur. NDK derleme sistemi, bu ilişkileri sizin için otomatik olarak hesaplar. Sonuç olarak, Android.mk dosyanıza dokunmadan gelecekteki NDK sürümlerinde yeni araç zinciri/platform desteğinden yararlanabilirsiniz.

Bu dosyanın söz dizimi, tam Android Açık Kaynak Projesi ile dağıtılan Android.mk dosyalarında kullanılan söz dizimine çok yakın. Bunları kullanan derleme sistemi uygulaması farklı olsa da benzerlikleri, uygulama geliştiricilerinin harici kitaplıklar için kaynak kodunu yeniden kullanmasını kolaylaştırmayı amaçlayan özel bir tasarım kararıdır.

Temel Bilgiler

Söz dizimini ayrıntılı olarak incelemeden önce, Android.mk dosyasının içeriğine dair temel bilgileri edinerek işe başlamanız önerilir. Bu bölümde dosyadaki her satırın oynadığı rolü açıklayan Hello-JNI örneğindeki Android.mk dosyası kullanılı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ın konumunu belirtir. 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.

Bir sonraki satırda, derleme sisteminin sağladığı CLEAR_VARS değişkeni tanımlanmaktadı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 temizlemediğini unutmayın. Sistem tüm derleme kontrolü dosyalarını tek bir GNU Make (Yürütme) bağlamı içinde ayrıştırdığı için, bu değişkenin değerini koruması gerekir. Burada tüm değişkenler geneldir. Her bir modülü açıklamadan önce bu değişkeni bildirmeniz gerekir.

Daha sonra, LOCAL_MODULE değişkeni, oluşturmak istediğiniz modülün adını depolar. Bu değişkeni, uygulamanızda modül başına bir kez kullanın.

LOCAL_MODULE := hello-jni

Her modül adı benzersiz olmalı ve boşluk içermemelidir. Derleme sistemi, paylaşılan son kitaplık dosyasını oluşturduğunda LOCAL_MODULE öğesine atadığınız ada son eki ve son eki otomatik olarak ekler. Örneğin, yukarıda görünen örnek, libhello-jni.so adlı bir kitaplık oluşturur.

Sonraki satır, kaynak dosyaları numaralandırma özelliğiyle birden fazla dosyayı sınırlayan alanlar içerir:

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES değişkeni, bir modüle eklenecek 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 beri 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 geliştirileceğini ve nasıl yapılacağını belirler.

Örnek dizinlerinde, inceleyebileceğiniz Android.mk dosyayı içeren daha karmaşık örnekler mevcuttur. Ayrıca Örnek: local-activity, söz konusu örneğin Android.mk dosyasının ayrıntılı bir açıklamasını sağlar. 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 belirlersiniz.

Bu değişkenlere ek olarak, kendi rastgele 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.
  • Küçük harfler (ör. my-dir) Derleme sistemi de bunları dahili olarak kullanır.

Bir Android.mk dosyasında kendi kolaylık değişkenlerinizi tanımlamanız gerekiyorsa bunların adlarını MY_ şeklinde ayarlamanızı öneririz.

NDK tanımlı değişkenleri dahil et

Bu bölümde, Android.mk dosyanızı ayrıştırmadan önce derleme sisteminin tanımladığı GNU Make değişkenleri açıklanmaktadır. Belirli koşullarda NDK, Android.mk dosyanızı her seferinde bu değişkenlerden bazıları için farklı bir tanım kullanarak birkaç kez ayrıştırabilir.

SİL

Bu değişken, aşağıdaki "Geliştirici tanımlı değişkenler" bölümünde listelenen neredeyse tüm LOCAL_XXX değişkenlerinin tanımsız olan 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. Söz diziminin kullanımı:

include $(CLEAR_VARS)

DERLEME_HARİÇ TUTULACAK

Bu değişken, LOCAL_XXX değişkenlerinizde sağladığınız modülle ilgili tüm bilgileri toplayan bir derleme komut dosyasına işaret eder ve listelediğiniz kaynaklardan yürütülebilir bir hedefin nasıl oluşturulacağını belirler. Bu komut dosyasını kullanmak için en azından LOCAL_MODULE ve LOCAL_SRC_FILES değerlerine değer atamanız gerektiğini unutmayın (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri konusuna bakın).

Bu değişkeni kullanma söz dizimi şu şekildedir:

include $(BUILD_EXECUTABLE)

DERLEME_PAYLAŞIMI

Bu değişken, LOCAL_XXX değişkenlerinizde sağladığınız modülle ilgili tüm bilgileri toplayan bir derleme komut dosyasına işaret eder ve listelediğiniz kaynaklardan nasıl hedef paylaşılan kitaplık oluşturulacağını belirler. Bu komut dosyasını kullanmak için en azından LOCAL_MODULE ve LOCAL_SRC_FILES değerlerine değer atamanız gerektiğini unutmayın (bu değişkenler hakkında daha fazla bilgi için Modül açıklaması değişkenleri konusuna bakın).

Bu değişkeni kullanma söz dizimi şu şekildedir:

include $(BUILD_SHARED_LIBRARY)

Paylaşılan kitaplık değişkeni, derleme sisteminin .so uzantısıyla bir kitaplık dosyası oluşturmasına neden olur.

DERLEME_STATIC_LIBRARY

Statik kitaplık oluşturmak için kullanılan BUILD_SHARED_LIBRARY varyantı. Derleme sistemi, statik kitaplıkları projenize/paketlerinize kopyalamaz ancak paylaşılan kitaplıklar oluşturmak için kullanabilir (aşağıdaki LOCAL_STATIC_LIBRARIES ve LOCAL_WHOLE_STATIC_LIBRARIES bölümlerine bakın). Bu değişkeni kullanma söz dizimi şu şekildedir:

include $(BUILD_STATIC_LIBRARY)

Statik kitaplık değişkeni, derleme sisteminin .a uzantısıyla bir kitaplık oluşturmasına neden olur.

ÖNCEKİ_PAYLAŞILMIŞ_KİTAPLIK

Önceden oluşturulmuş bir paylaşılan kitaplık belirtmek için kullanılan bir derleme komut dosyasına işaret eder. BUILD_SHARED_LIBRARY ve BUILD_STATIC_LIBRARY örneğinden farklı olarak burada LOCAL_SRC_FILES değeri bir kaynak dosyası olamaz. Bunun yerine, foo/libfoo.so gibi önceden oluşturulmuş bir paylaşılan kitaplık için tek bir yol olmalıdır. Bu değişkeni kullanma söz dizimi şu şekildedir:

include $(PREBUILT_SHARED_LIBRARY)

Ayrıca LOCAL_PREBUILTS değişkenini kullanarak başka bir modüldeki, önceden oluşturulmuş bir kitaplığı da referans alabilirsiniz. Önceden oluşturulmuş kitaplıkları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma konulu makaleyi inceleyin.

ÖNCELİK_STATIC_LIBRARY

PREBUILT_SHARED_LIBRARY ile aynıdır ancak önceden oluşturulmuş statik bir kitaplık içindir. Önceden oluşturulmuş şablonları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma başlıklı makaleye bakın.

Hedef bilgi değişkenleri

Derleme sistemi APP_ABI değişkeni tarafından belirtilen her ABI başına Android.mk değerini genellikle ayrıştırır. Bu genellikle Application.mk dosyanızda tanımlanır. APP_ABI all ise derleme sistemi NDK'nın desteklediği ABI başına bir kez Android.mk ayrıştırır. Bu bölümde, Android.mk her ayrıştırıldığında derleme sisteminin tanımladığı değişkenler açıklanmaktadır.

HEDEF_ARŞİ

Derleme sisteminin bu Android.mk dosyasını ayrıştırırken hedeflediği CPU ailesi. Bu değişken şunlardan biri olacaktır: arm, arm64, x86 veya x86_64.

HEDEF_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 listesini Yerel API'ler bölümünde bulabilirsiniz. Aşağıdaki örnekte, bu değişkenin kullanımıyla ilgili söz dizimi gösterilmektedir:

ifeq ($(TARGET_PLATFORM),android-22)
    # ... do something ...
endif

HEDEF_ARÇ_ABI

Derleme sisteminin bu Android.mk dosyasını ayrıştırırken hedeflediği ABI. 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
7 RM armeabi-v7a
ARMv8 AArch64 arm64-v8a
I686 x86
x86-64 x86_64

Aşağıdaki örnekte, hedef CPU-ABI kombinasyonu olarak ARMv8 AArch64'ün nasıl kontrol edileceği gösterilmektedir:

ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
  # ... do something ...
endif

Mimari ABI'lar ve ilişkili uyumluluk sorunları hakkında daha fazla bilgi için Android ABI'lara bakın.

Gelecekte yeni hedef ABI'lar farklı değerlere sahip olacaktır.

HEDEF_ABI

Hedef Android API düzeyi ile ABI'nin birleştirilmesi. Özellikle belirli bir cihaz için belirli bir hedef sistem resmiyle test yapmak istediğinizde kullanışlıdır. Örneğin, Android API düzeyi 22'de çalışan 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, derleme sisteminize modülünüzü açıklar. Her modül açıklaması şu temel akışa uygun olmalıdır:

  1. Modülle ilişkili değişkenleri CLEAR_VARS değişkeniyle başlatın veya tanımlarını kaldırın.
  2. Modülü tanımlamak için kullanılan değişkenlere değerler atayın.
  3. NDK derleme sistemini, BUILD_XXX değişkenini kullanarak modül için uygun derleme komut dosyasını kullanacak şekilde ayarlayın.

YEREL_YOL

Bu değişken, geçerli dosyanın yolunu belirtmek için kullanılır. 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 noktasının bu değişkeni temizlemediği komut dosyası. Bu nedenle, Android.mk dosyanızda birden fazla modül açıklansa bile bunu yalnızca bir kez tanımlamanız gerekir.

YEREL_MODÜLÜ

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. Komut dosyalarını (CLEAR_VARS uzantısı hariç) eklemeden önce tanımlamanız gerekir. lib önekini veya .so veya .a dosya uzantısını eklemeniz gerekmez. Bu değişiklikleri, derleme sistemi otomatik olarak yapar. Android.mk ve Application.mk dosyalarınız genelinde modülünüzü değiştirmeden değiştirin. Örneğin, aşağıdaki satır libfoo.so adlı paylaşılan bir kitaplık modülü oluşturulmasına neden olur:

LOCAL_MODULE := "foo"

Oluşturulan modülün lib dışında bir ada sahip olmasını istiyorsanız + LOCAL_MODULE değeri için, oluşturulan modüle kendi seçtiğiniz bir ad vermek üzere LOCAL_MODULE_FILENAME değişkenini kullanabilirsiniz.

YEREL_MODULE_DOSYA

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 adınız foo ise sistemi, oluşturduğu dosyayı libnewfoo çağırmaya zorlayabilirsiniz. Aşağıdaki örnekte, bu işlemin nasıl yapılacağı gösterilmektedir:

LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo

Bu örnekte paylaşılan kitaplık modülü için libnewfoo.so adında bir dosya oluşturulur.

YEREL_SRC_DOSYALAR

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ıları otomatik olarak hesapladığı için yalnızca derleme sisteminin derleyiciye ilettiği dosyaları listeleyin. Göreli (LOCAL_PATH) ve 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.

YEREL_CPP_UZANTI

İsteğe bağlı bu değişkeni, C++ kaynak dosyalarınızda .cpp dışında bir dosya uzantısını belirtmek için kullanabilirsiniz. Örneğin, aşağıdaki satır uzantıyı .cxx olarak değiştirir. (Ayar, noktayı içermelidir.)

LOCAL_CPP_EXTENSION := .cxx

Bu değişkeni birden çok uzantı belirtmek için kullanabilirsiniz. Örneğin:

LOCAL_CPP_EXTENSION := .cxx .cpp .cc

YEREL_CPP_ÖZELLİKLERİ

Bu isteğe bağlı değişkeni, kodunuzun belirli C++ özelliklerini temel aldığını belirtmek için kullanabilirsiniz. Oluşturma işlemi sırasında doğru derleyici ve bağlayıcı işaretlerini etkinleştirir. Bu değişken, önceden oluşturulmuş ikili dosyalar için ikili programın hangi özelliklere bağlı olduğunu da bildirir. Böylece nihai bağlantının doğru şekilde çalıştığından emin olabilirsiniz. -frtti ve -fexceptions parametrelerini doğrudan LOCAL_CPPFLAGS tanımınızda etkinleştirmek yerine bu değişkeni kullanmanızı öneririz.

Bu değişken kullanıldığında derleme sistemi, her bir modül için uygun işaretleri kullanabilir. LOCAL_CPPFLAGS kullanıldığında derleyici, gerçek ihtiyaçtan bağımsız olarak tüm modüller için belirtilen tüm işaretleri kullanır.

Örneğin, kodunuzda RTTI (Çalışma Zamanı Türü Bilgileri) kullanıldığını belirtmek için şunu yazın:

LOCAL_CPP_FEATURES := rtti

Kodunuzun C++ istisnalarını 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 hangi sırayla açıkladığınız önemli değildir.

YEREL_C_INCLUDES

Tüm kaynakları (C, C++ ve Assembly) derlerken dahil etme arama yoluna ekleme yapmak için NDK root dizinine göre bir yol listesi belirtmek amacıyla bu isteğe bağlı değişkeni kullanabilirsiniz. Örneğin:

LOCAL_C_INCLUDES := sources/foo

Hatta:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo

İlgili değişken işaretlemelerini LOCAL_CFLAGS veya LOCAL_CPPFLAGS aracılığıyla ayarlamadan önce bu değişkeni tanımlayın.

Derleme sistemi, ndk-gdb ile yerel hata ayıklamayı başlatırken LOCAL_C_INCLUDES yollarını da otomatik olarak kullanır.

YEREL_CFLAGS

İsteğe bağlı bu değişken, C ve C++ kaynak dosyalarını oluştururken derleme sisteminin iletmesi için derleyici işaretleri ayarlar. Bunu yapmak, ek makro tanımlar belirtmek veya derleme seçenekleri için yararlı olabilir. Yalnızca C++ için işaretleri belirtmek üzere LOCAL_CPPFLAGS kullanın.

Android.mk dosyanızdaki 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, derleme sistemi hata ayıklama sırasında kullanılan yararlı veri dosyaları oluşturabilir.

Aşağıdakileri ekleyerek ek dahil etme yolları belirtmek mümkündür:

LOCAL_CFLAGS += -I<path>,

Ancak, bu amaçla LOCAL_C_INCLUDES kullanımı daha iyidir, çünkü bu şekilde yerel hata ayıklama için ndk-gdb ile kullanılabilen yolları da kullanabilirsiniz.

YEREL_CPPFLAGS

C++ kaynak dosyaları oluşturulurken iletilecek isteğe bağlı derleyici işaretleri grubu yalnızca. Bunlar, derleyicinin komut satırında LOCAL_CFLAGS karakterinden sonra görünür. C ve C++ işaretlemelerini belirtmek için LOCAL_CFLAGS 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.

Geçerli modül paylaşılan kitaplık veya yürütülebilir türdeyse bu değişken, söz konusu kitaplıkların sonuç olarak ikili sisteme bağlanmasını sağlar.

Geçerli modül statik bir kitaplıksa bu değişken, geçerli modüle bağlı diğer modüllerin de listelenen kitaplıklara bağlı olacağını gösterir.

YEREL_PAYLAŞILMIŞ_LIBRARİLER

Bu değişken, çalışma zamanının gerekli olduğu paylaşılan kitaplık modüllerinin listesidir. Bu bilgiler, bağlantı anında ve karşılık gelen bilgileri oluşturulan dosyaya yerleştirmek için gereklidir.

YEREL_WHOLE_STATIC_LIBRARIES

Bu değişken, LOCAL_STATIC_LIBRARIES varyantıdır ve bağlayıcının, ilgili kitaplık modüllerini tüm arşivler olarak değerlendirmesi gerektiğini belirtir. Arşivlerin tümü hakkında daha fazla bilgi edinmek için --whole-archive işaretiyle ilgili GNU ld dokümanlarına bakın.

Bu değişken, çeşitli statik kitaplıklar arasında döngüsel bağımlılıklar olduğunda yararlıdır. Bu değişkeni paylaşılan bir kitaplık oluşturmak için kullandığınızda derleme sistemi, statik kitaplıklarınızdaki tüm nesne dosyalarını nihai ikili dosyaya eklemeye zorlar. Ancak yürütülebilir dosyalar oluşturulurken de aynı durum söz konusu değildir.

YEREL_LDLIB

Bu değişken, paylaşılan kitaplığınızı oluşturmak veya yürütmek için kullanabileceğiniz ek bağlayıcı işaretlerinin listesini içerir. Belirli sistem kitaplıklarının adlarını iletmek için -l önekini kullanmanızı sağlar. Örneğin, aşağıdaki örnekte bağlayıcıya yükleme sırasında /system/lib/libz.so ile bağlantı oluşturan bir modül oluşturması söylenmektedir:

LOCAL_LDLIBS := -lz

Bu NDK sürümünde bağlantı oluşturabileceğiniz kullanıma açık sistem kitaplıklarının listesi için Yerel API'ler bölümüne bakın.

YEREL_LDFLAGS

Paylaşılan kitaplığınızı oluştururken veya yürütülebilirken derleme sisteminin kullanacağı diğer bağlayıcı işaretlerinin listesi. Örneğin, ARM/X86 sürümünde ld.bfd bağlayıcısını kullanmak için:

LOCAL_LDFLAGS += -fuse-ld=bfd

YEREL_ALLOW_UNDEFINED_SYMBOLS

Varsayılan olarak, derleme sistemi paylaşılan bir yapı oluşturmaya çalışırken karşılaşılan tanımlanmamış bir referansla karşılaştığında tanımlanmamış bir simge hatası verir. Bu hata, kaynak kodunuzdaki hataları yakalamanıza yardımcı olabilir.

Bu kontrolü devre dışı bırakmak için bu 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_MOD

Varsayılan olarak derleme sistemi, ilk parmak modunda ARM hedef ikili programları oluşturur. Burada, 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 yalnızca arm modunda belirli kaynakları derlemesi için talimat verebilirsiniz. Örneğin aşağıdaki örnek, derleme sistemine bar.c öğesini her zaman ARM modunda derlemesini, ancak foo.c değerini LOCAL_ARM_MODE değerine göre derlemesini bildirir.

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çgörülerinin yanı sıra Assembly dosyalarında NEON talimatların kullanılmasına olanak tanır.

ARMv7 tabanlı CPU'ların NEON talimat kümesi 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 başlıklı makaleleri inceleyin.

Alternatif olarak, derleme sisteminin yalnızca belirli kaynak dosyalarını NEON desteğiyle derlemesini belirtmek için .neon son ekini kullanabilirsiniz. Aşağıdaki örnekte derleme sistemi baş parmak ve neon desteğiyle foo.c, parmak desteği ile bar.c ve ARM ve NEON desteği ile zoo.c derler:

LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon

Her iki son eki de kullanırsanız .arm .neon karakterinden önce gelmelidir.

YEREL_DISABLE_FORMAT_STRING_KONTROL ALANLARI

Derleme sistemi varsayılan olarak, biçim dizesi korumasıyla kod derler. Bu, printf stili bir işlevde sabit olmayan biçim dizesi kullanılırsa derleyici hatasını zorlar. Bu koruma varsayılan olarak etkindir ancak bu değişkenin değerini true olarak ayarlayarak korumayı devre dışı bırakabilirsiniz. Bunu, ikna edici bir neden olmadan yapmanızı önermeyiz.

YEREL_EXPORT_CFLAGS

Bu değişken, LOCAL_STATIC_LIBRARIES veya LOCAL_SHARED_LIBRARIES değişkenleri üzerinden bu modülü kullanan diğer modüllerin LOCAL_CFLAGS tanımına eklenecek bir dizi C/C++ derleyici işareti kaydeder.

Örneğin, foo ve bar parametrelerine bağlı olan şu modül çiftlerini ele alalım: 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 oluştururken -DFOO=1 ve -DBAR=2 işaretlerini derleyiciye iletir. Ayrıca, dışa aktarılan işaretleri modülünüzün LOCAL_CFLAGS öğesine ekler, böylece bunları kolayca geçersiz kılabilirsiniz.

Buna ek olarak, modüller arasındaki ilişki geçişlidir: zoo, bar bağımlıysa foo özelliğini kullanırken zoo, foo üzerinden dışa aktarılan tüm işaretleri de devralır.

Son olarak, derleme sistemi yerel olarak oluştururken (ör. işaretlerini dışa aktardığı modülü oluşturma) dışa aktarılan işaretleri kullanmaz. Dolayısıyla, yukarıdaki örnekte foo/foo.c oluşturulduğunda -DFOO=1 derleyiciye iletilmez. Yerel derleme oluşturmak için LOCAL_CFLAGS politikasını kullanın.

YEREL_EXPORT_CPPFLAGS

Bu değişken LOCAL_EXPORT_CFLAGS ile aynıdır ancak yalnızca C++ işaretleri için kullanılır.

YEREL_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, foo modülündeki başlıkların eklenmesi gerektiğinde yararlıdır.

YEREL_EXPORT_LDFLAGS

Bu değişken LOCAL_EXPORT_CFLAGS ile aynıdır ancak bağlayıcı işaretleri için kullanılır.

YEREL_HARİCİ_LDLIBS

Bu değişken, LOCAL_EXPORT_CFLAGS ile aynı olup 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, modülünüzdeki LOCAL_LDLIBS değişkeninin değerine içe aktarılan bağlayıcı işaretleri eklediğini unutmayın. Bunun nedeni Unix bağlayıcılarının çalışma şeklidir.

Bu değişken genellikle foo modülü statik bir kitaplık olduğunda ve bir sistem kitaplığına dayalı kod içerdiğinde yararlıdır. Daha sonra, bağımlıyı 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 oluştururken bağlayıcı komutunun sonuna -llog ifadesini ekler. Bunu yaptığınızda bağlayıcı, libbar.so için foo'e bağlı olduğundan sistemin günlük kaydı kitaplığına da bağlı olduğunu bildirir.

YEREL_KISA KOMUTLAR

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. Bu, derleme sistemini ara nesne dosyaları veya bağlantı kitaplıkları içeren arşivler için @ söz dizimi kullanmaya zorlar.

Bu özellik, komut satırı en fazla 8.191 karakter kabul eden Windows'da yararlı olabilir. Karmaşık projeler için çok küçük olabilir. Ayrıca, neredeyse tüm derleyici işaretlerini liste dosyalarına yerleştirerek ayrı kaynak dosyaların derlenmesini de etkiler.

true dışındaki tüm değerlerin varsayılan davranışa geri döneceğini unutmayın. Ayrıca, projenizdeki tüm modüller için bu davranışı zorunlu kılmak üzere Application.mk dosyanızda APP_SHORT_COMMANDS tanımlayabilirsiniz.

Derlemeyi yavaşlatacağından bu özelliği varsayılan olarak etkinleştirmenizi önermeyiz.

YEREL_THIN_ARCHIVE

Statik kitaplıklar oluştururken bu değişkeni true olarak ayarlayın. Bu işlem ince bir arşiv oluşturur. Bu arşiv, nesne dosyaları içermeyen bir kitaplık dosyasıdır. Ancak bu dosya yerine normalde içerdiği gerçek nesnelere giden dosya yolları oluşur.

Bu, derleme çıkışınızın boyutunu küçültmek için yararlıdır. Dezavantajı, bu tür kitaplıkların farklı bir konuma taşınamaması (içindeki tüm yolların göreceli olmasıdır).

Geçerli değerler true, false veya boş değerlerdir. Application.mk dosyanızda APP_THIN_ARCHIVE değişkeni aracılığıyla varsayılan bir değer ayarlanabilir.

YEREL_FİLTRE_ASM'si

Bu değişkeni, derleme sisteminin LOCAL_SRC_FILES için belirttiğiniz dosyalardan çıkarılan veya oluşturulan derleme dosyalarını filtrelemek amacıyla kullanacağı bir kabuk komutu olarak tanımlayın. Bu değişkenin tanımlanması aşağıdakilerin meydana gelmesine neden olur:

  1. Derleme sistemi, nesne dosyalarında derlemek yerine herhangi bir C veya C++ kaynak dosyasından geçici bir derleme dosyası oluşturur.
  2. Derleme sistemi, geçici komutu herhangi bir geçici derleme dosyasında ve LOCAL_SRC_FILES konumunda listelenen herhangi bir derleme dosyasında LOCAL_FILTER_ASM yürütür. Böylece başka bir geçici derleme dosyası oluşturulur.
  3. Derleme sistemi, bu filtrelenmiş 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"e derleyiciye karşılık gelir. Filtre, giriş bağımsız değişkeninin ilk bağımsız değişkeni 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 Make işlev makroları açıklanmaktadır. Değerlendirilmeleri için $(call <function>) kullanın; metin bilgileri döndürür.

benim-dir

Bu makro, genellikle geçerli Android.mk dizini olan dizinde yer alan son yapım dosyasının yolunu döndürür. my-dir, Android.mk dosyanızın başında LOCAL_PATH tanımlamak için yararlıdır. Örneğin:

LOCAL_PATH := $(call my-dir)

GNU Make'in çalışma şekli nedeniyle, bu makronun döndürdüğü değerler, derleme komut dosyalarını ayrıştırırken derleme sisteminin eklediği son Makefile'ın yoludur. Bu nedenle, başka bir dosya ekledikten sonra my-dir dosyasını çağırmamalısınız.

Örneğin, aşağıdaki örneği ele alalım:

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 çağrısının ikinci çağrının $PATH yerine $PATH/foo olarak tanımlanmasıdır. Çünkü en son eklenen noktası budur.LOCAL_PATH

Android.mk dosyasındaki her şeyden sonra başka eklemeler yaparak 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 uygun 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-dirdir-dosyaları

Mevcut my-dir yolunun tüm alt dizinlerinde bulunan Android.mk dosyalarının listesini döndürür.

Derleme sistemine derin iç içe kaynak dizin hiyerarşileri sağlamak için bu işlevi kullanabilirsiniz. Varsayılan olarak NDK, dizinde yalnızca Android.mk dosyasını içeren dosyaları arar.

bu marka-dosyası

Mevcut Makefile'ın (işlevin derleme olarak adlandırdığı) yolunu döndürür.

ebeveyn yapım dosyası

Dahil etme ağacındaki ana Makefile dosyasının yolunu (şu anki dosyayı dahil eden filefile yolu) döndürür.

büyükanne ve büyükbaba yapmak

Dahil etme ağacındaki büyükannede Makefile dosyasının yolunu (geçerli dosyayı içeren makefile'ın yolu) döndürür.

modülü içe aktar

Bir modülün Android.mk dosyasını, modülün adına göre bulup eklemenize olanak tanıyan bir işlev. Tipik bir örnek:

$(call import-module,<name>)

Bu örnekte derleme sistemi, NDK_MODULE_PATH ortam değişkeninize referans veren dizinler listesinde <name> etiketli modülü arar ve Android.mk dosyasını sizin için otomatik olarak içerir.