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 derleme sistemine kaynaklarınızı ve paylaşılan kitaplıklarınızı açıklar. Bu, derleme sisteminin bir veya daha fazla kez ayrıştırdığı küçük bir GNU makefile parçasıdır. Android.mk dosyası; Application.mk, derleme sistemi ve ortam değişkenlerinin tanımsız bıraktığı proje genelindeki ayarları tanımlamak için kullanışlıdır. Ayrıca, belirli modüller için proje genelindeki ayarları da geçersiz kılabilir.

Android.mk söz dizimi, kaynaklarınızı modüller halinde gruplandırmanıza olanak tanır. Modül, statik kitaplık, paylaşılan kitaplık veya bağımsız bir yürütülebilir dosya olabilir. 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, paylaşılan kitaplıklar oluşturabilir.

Derleme sistemi, kitaplıkları paketlemeye ek olarak sizin için çeşitli ayrıntıları da 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ı listelemeniz gerekmez. NDK derleme sistemi bu ilişkileri sizin için otomatik olarak hesaplar. Sonuç olarak, gelecekteki NDK sürümlerinde Android.mk dosyanıza dokunmak zorunda kalmadan 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 benzer. Bu kodları kullanan derleme sistemi uygulaması farklı olsa da benzerlikleri, uygulama geliştiricilerin harici kitaplıklar için kaynak kodunu yeniden kullanmalarını kolaylaştırmayı amaçlayan, bilinçli bir tasarım kararıdır.

Temel Bilgiler

Söz dizimini ayrıntılı olarak incelemeden önce, Android.mk dosyasının temel özelliklerini anlayarak başlamak faydalı olacaktır. Bu bölümde, Hello-JNI örneğindeki Android.mk dosyası bu amaç doğrultusunda kullanılarak dosyadaki her satırın oynadığı rolü açıklanmaktadır.

Android.mk dosyası, LOCAL_PATH değişkenini tanımlayarak başlamalıdır:

LOCAL_PATH := $(call my-dir)

Bu değişken, kaynak dosyaların geliştirme ağacındaki konumunu gösterir. Burada, derleme sistemi tarafından sağlanan my-dir makro işlevi, geçerli dizinin (Android.mk dosyasını içeren dizin) yolunu döndürür.

Sonraki satırda, derleme sisteminin sağladığı değeri içeren 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'a işaret eder. LOCAL_PATH öğesinin temizlenmediğini unutmayın. Sistem, tüm derleme kontrol dosyalarını tüm değişkenlerin global olduğu tek bir GNU Make yürütme bağlamında ayrıştırdığından bu değişkenin değerini korumalıdır. Her modülü açıklamadan önce bu değişkeni (yeniden) tanımlamanız gerekir.

Ardından LOCAL_MODULE değişkeni, derlemek 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, nihai paylaşılan kitaplık dosyasını oluşturduğunda LOCAL_MODULE öğesine atadığınız ada uygun öneki ve son eki otomatik olarak ekler. Örneğin, yukarıda gösterilen örnekte libhello-jni.so adlı bir kitaplık oluşturulur.

Sonraki satırda, kaynak dosyalar boşluklarla ayrılarak listelenir:

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES değişkeni, modülde derlemek için C ve/veya C++ kaynak dosyalarının listesini içermelidir.

Son satır, sistemin her şeyi bir araya getirmesine yardımcı olur:

include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY değişkeni, en yeni include tarihinden bu yana 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, inceleyebileceğiniz yorumlanmış Android.mk dosyalarıyla daha karmaşık örnekler vardır. Ayrıca, Örnek: Native-activity, söz konusu örneğin Android.mk dosyasıyla ilgili ayrıntılı bir açıklama sunar. 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ılabilecek birçok olası değişken sağlar. Bu değişkenlerin çoğu önceden atanan değerlerle gelir. Diğerleri siz atarsınız.

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ı sakladığını unutmayın:

  • LOCAL_ ile başlayan LOCAL_MODULE gibi adlar.
  • PRIVATE_, NDK_ veya APP ile başlayan adlar. Derleme sistemi bunları dahili olarak kullanır.
  • Küçük harfli adlar (ö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 adlarının başına MY_ eklemenizi öneririz.

NDK tarafından tanımlanan dahil etme değişkenleri

Bu bölümde, derleme sisteminin Android.mk dosyanızı ayrıştırmadan önce tanımladığı GNU Yapma değişkenleri ele alınmaktadır. NDK, belirli durumlarda Android.mk dosyanızı her seferinde bu değişkenlerin bazıları için farklı bir tanım kullanarak birkaç kez ayrıştırabilir.

TEMİZLE_VARS

Bu değişken, aşağıdaki "Geliştirici tanımlı değişkenler" bölümünde listelenen hemen hemen 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 kullanım için söz dizimi şöyledir:

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 listelenen kaynaklardan hedef bir yürütülebilir dosyanın nasıl oluşturulacağını belirleyen bir derleme komut dosyasını işaret eder. Bu komut dosyasını kullanabilmek 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şkenin kullanımıyla ilgili söz dizimi:

include $(BUILD_EXECUTABLE)

BUILD_SHARED_LIBRARY

Bu değişken, LOCAL_XXX değişkenlerinizde sağladığınız modülle ilgili tüm bilgileri toplayan ve listelenen kaynaklardan hedef bir paylaşılan kitaplığın nasıl oluşturulacağını belirleyen bir derleme komut dosyasını işaret eder. Bu komut dosyasını kullanabilmek 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)

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

BUILD_STATIC_LIBRARY

Statik kitaplık oluşturmak için kullanılan BUILD_SHARED_LIBRARY varyantı. Derleme sistemi, statik kitaplıkları projenize/paketlerinize kopyalamamaktadır ancak paylaşılan kitaplıklar oluşturmak için bunları kullanabilir (aşağıdaki LOCAL_STATIC_LIBRARIES ve LOCAL_WHOLE_STATIC_LIBRARIES bölümüne bakın). Bu değişkenin kullanımıyla ilgili söz dizimi:

include $(BUILD_STATIC_LIBRARY)

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

PREBUILT_SHARED_LIBRARY

Önceden oluşturulmuş bir paylaşılan kitaplığı belirtmek için kullanılan bir derleme komut dosyasını gösterir. BUILD_SHARED_LIBRARY ve BUILD_STATIC_LIBRARY durumundan farklı olarak, burada LOCAL_SRC_FILES değeri bir kaynak dosya olamaz. Bunun yerine, önceden oluşturulmuş bir paylaşılan kitaplığa giden tek bir yol olmalıdır (ör. foo/libfoo.so). 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üldeki önceden oluşturulmuş bir kitaplığa da referans verebilirsiniz. Hazır kitaplıkları kullanma hakkında daha fazla bilgi için Hazır kitaplıkları kullanma başlıklı makaleyi inceleyin.

PREBUILT_STATIC_KİTAPLIĞI

PREBUILT_SHARED_LIBRARY ile aynıdır, ancak önceden oluşturulmuş statik bir kitaplıktır. Önceden oluşturulmuş kitaplıkları kullanma hakkında daha fazla bilgi için Önceden oluşturulmuş kitaplıkları kullanma başlıklı makaleyi inceleyin.

Hedef bilgi değişkenleri

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

TARGET_ARCH

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

TARGET_PLATFORM

Bu Android.mk dosyasını ayrıştırırken derleme sisteminin hedeflediği Android API düzeyi numarası. Örneğin, Android 5.1 sistem resimleri 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 gereken söz dizimi gösterilmektedir:

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

HEDEF_ARCH_ABI

Bu Android.mk dosyasını ayrıştırırken derleme sisteminin 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
RM7 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 bilgi için Android ABI'leri başlıklı makaleyi inceleyin.

Gelecekte yeni hedef ABI'lerin değerleri farklı olacaktır.

HEDEF_ABI

Hedef Android API düzeyi ile ABI'nin birleşimi. Bu özellikle gerçek bir cihaz için belirli bir hedef sistem resmiyle test yapmak istediğinizde kullanışlıdır. Örneğin, Android API düzeyi 22'yi çalıştıran 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 açıklar. Her modül açıklaması şu temel akışa uygun olmalıdır:

  1. CLEAR_VARS değişkenini kullanarak modülle ilişkili değişkenleri 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, mevcut 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 tarafından işaret edilen komut dosyası, bu değişkeni temizlemez. Bu nedenle, Android.mk dosyanız birden fazla modülü tanımlasa bile bu modülü 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. Herhangi bir komut dosyası (CLEAR_VARS için olan komut dosyası dışında) eklemeden önce bu özelliği tanımlamanız gerekir. lib ön ekini veya .so ya da .a dosya uzantısını eklemeniz gerekmez. Derleme sistemi bu değişiklikleri otomatik olarak yapar. Android.mk ve Application.mk dosyalarınızda modülünüze değiştirilmemiş adıyla başvurun. Örneğin, aşağıdaki satır libfoo.so adlı bir paylaşılan kitaplık modülü oluşturulmasına neden olur:

LOCAL_MODULE := "foo"

Oluşturulan modülün lib + LOCAL_MODULE değerinden farklı bir ada sahip olmasını istiyorsanız oluşturulan modüle kendi seçtiğiniz bir 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'ünüzün adı foo ise sistemi, oluşturduğu dosyayı libnewfoo olarak ç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

Bu değişken, derleme sisteminin modülü oluşturmak için kullandığı kaynak dosyalarının listesini içerir. Derleme sistemi ilişkili bağımlılıkları otomatik olarak hesapladığından yalnızca derleme sisteminin gerçekten derleyiciye aktardığı dosyaları listeleyin. Hem göreli (LOCAL_PATH ile) hem de mutlak dosya yollarını kullanabileceğinizi unutmayın.

Mutlak dosya yollarını kullanmaktan kaçının. Göreli yollar, Android.mk dosyanızın taşınabilirliğini artırır.

LOCAL_CPP_EXTENSION

C++ kaynak dosyalarınız için .cpp dışında bir dosya uzantısı belirtmek üzere 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ı belirtmek için bu değişkeni kullanabilirsiniz. Örneğin:

LOCAL_CPP_EXTENSION := .cxx .cpp .cc

YEREL_ABM_ÖZELLİKLERİ

Kodunuzun belirli C++ özelliklerini kullandığını 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. Önceden derlenmiş ikili programlar için bu değişken, ikili programın hangi özelliklere bağlı olduğunu da belirtir. Böylece nihai bağlantının doğru şekilde çalıştığından emin olabilirsiniz. -frtti ve -fexceptions'yi 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ılması, 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ü bilgileri) kullandığını belirtmek için şunları yazın:

LOCAL_CPP_FEATURES := rtti

Kodunuzda C++ istisnalarının kullanıldığını belirtmek için şunları yazın:

LOCAL_CPP_FEATURES := exceptions

Bu değişken için birden çok değer de belirtebilirsiniz. Örnek:

LOCAL_CPP_FEATURES := rtti features

Değerleri tanımlama sırası önemli değildir.

YEREL_C_DAHİL

Bu isteğe bağlı değişkeni, tüm kaynakları (C, C++ ve Assembly) derleirken dahil edilecek arama yoluna eklemek için NDK root dizine göre bir yol listesi belirtmek üzere kullanabilirsiniz. Örnek:

LOCAL_C_INCLUDES := sources/foo

Hatta:

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

LOCAL_CFLAGS veya LOCAL_CPPFLAGS aracılığıyla ilgili dahil etme işaretlerini ayarlamadan önce bu değişkeni tanımlayın.

Derleme sistemi, ndk-gdb ile yerel hata ayıklama işlemini başlatırken de LOCAL_C_INCLUDES yollarını otomatik olarak kullanır.

LOCAL_ASFLAGS

.s veya .S dosyası oluştururken Clang'a aktarılacak işaretler.

YEREL_ASMFLAGS

.asm dosyaları oluşturulurken yasm'a aktarılacak işaretler.

YEREL_CFLAGS

C, C++ ve bazı derleme (.asm değil, .s ve .S) kaynak dosyalarını derlemeden Clang'a iletilecek işaretler. Bu özellik, ek makro tanımları veya derleme seçenekleri belirtmek için faydalı olabilir. Yalnızca C++ işaretlerini belirtmek için LOCAL_CPPFLAGS kullanın. Yalnızca C için işaretleri belirtmek üzere LOCAL_CONLYFLAGS 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 yöntem, derleme sisteminin hata ayıklama sırasında kullanılan faydalı veri dosyaları oluşturmasına olanak tanır.

Aşağıdakileri yazarak ek dahil etme yolları belirtebilirsiniz:

LOCAL_CFLAGS += -I<path>,

Ancak bu amaçla LOCAL_C_INCLUDES kullanmak daha iyidir. Böylece, ndk-gdb ile yerel hata ayıklama için kullanılabilen yolları da kullanabilirsiniz.

YEREL_KONLYFLAGS

C kaynaklarını derlediğinde Clang'a iletilecek işaretler. LOCAL_CFLAGS'ün aksine LOCAL_CONLYFLAGS, C++ veya derleme kaynakları derlenirken Clang'a iletilmez.

LOCAL_CPPFLAGS

Yalnızca C++ kaynak dosyaları derlenirken iletilecek isteğe bağlı bir derleyici işaretleri grubu. Bunlar, derleyicinin komut satırında LOCAL_CFLAGS işaretinden sonra görünür. Hem C hem de C++ için işaretleri belirtmek üzere LOCAL_CFLAGS öğesini kullanın.

YEREL_STATIC_KİTAPLIKLAR

Bu değişken, geçerli modülün bağlı olduğu statik kitaplık modüllerinin listesini depolar.

Geçerli modül paylaşılan bir kitaplık veya yürütülebilir bir dosyaysa bu değişken, bu kitaplıkların elde edilen ikili programa bağlanmasını zorunlu kılar.

Mevcut modül statik bir kitaplıksa bu değişken, mevcut modüle bağlı 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ı sırasında ve oluşturulan dosyaya ilgili bilgileri yerleştirmek için gereklidir.

YEREL_WHOLE_STATIC_KİTAPLIKLAR

Bu değişken, LOCAL_STATIC_LIBRARIES değişkeninin bir varyantıdır ve bağlayıcının ilişkili kitaplık modüllerini bütün arşivler olarak ele alması gerektiğini ifade eder. Arşivlerin tamamı hakkında daha fazla bilgi için --whole-archive işaretçisi ile ilgili GNU ld belgelerine bakın.

Bu değişken, birkaç statik kitaplık arasında döngüsel bağımlılıklar olduğunda kullanışlı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 programa eklemeye zorlar. Ancak yürütülebilir dosyalar oluşturulurken aynı durum geçerli değildir.

LOCAL_LDLIBS

Bu değişken, paylaşılan kitaplığınızı veya yürütülebilir dosyanızı oluştururken kullanabileceğiniz ek bağlayıcı işaretlerinin listesini içerir. Belirli sistem kitaplıklarının adını iletmek için -l ön ekini 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öylenir:

LOCAL_LDLIBS := -lz

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

LOCAL_LDFLAGS

Derleme sisteminin, paylaşılan kitaplığınızı veya yürütülebilir dosyanızı oluştururken kullanacağı diğer bağlayıcı işaretlerinin listesi. Örneğin, ARM/X86'da ld.bfd bağlayıcısını kullanmak için:

LOCAL_LDFLAGS += -fuse-ld=bfd

LOCAL_ALLOW_UNDEFINED_SYMBOLS

Varsayılan olarak, derleme sistemi paylaşılan bir derleme oluşturmaya çalışırken tanımlanmamış bir referansla karşılaştığında tanımlanmamış sembol hatasını 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.

LOCAL_ARM_MODE

Varsayılan olarak derleme sistemi, her talimat 16 bit genişliğinde ve thumb/ dizinindeki STL kitaplıklarına bağlı olan thumb modunda ARM hedef ikili programları oluşturur. Bu değişkeni arm olarak tanımlamak, 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 örnekte derleme sistemine bar.c'ü her zaman ARM modunda derlemesi, ancak foo.cLOCAL_ARM_MODE değerine göre derlemesi söylenmektedir.

LOCAL_SRC_FILES := foo.c bar.c.arm

LOCAL_ARM_NEON

Bu değişken yalnızca armeabi-v7a ABI'yi hedeflediğinizde önemlidir. C ve C++ kaynaklarınızda ARM Gelişmiş SIMD (NEON) derleyici içsel işlevlerinin yanı sıra Assembly dosyalarında NEON talimatlarının kullanılmasına olanak tanır.

ARMv7 tabanlı tüm CPU'ların NEON talimat seti 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ılamayı 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 belirli kaynak dosyalarını NEON desteğiyle derleyeceğini belirtmek için .neon son ekini kullanabilirsiniz. Aşağıdaki örnekte derleme sistemi; foo.c öğesini başparmak ve neon desteğiyle, bar.c öğesini başparmak desteğiyle ve zoo.c öğesini ARM ve NEON desteğiyle derler:

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

Her iki son eki de kullanıyorsanız .arm, .neon'ten önce gelmelidir.

LOCAL_DISABLE_FORMAT_STRING_CHECKS

Derleme sistemi, varsayılan olarak kodu biçim dizesi korumasıyla derler. Bu işlem, printf stilinde bir işlevde sabit olmayan bir biçim dizesi kullanılıyorsa derleyici hatası oluşmasına neden olur. Bu koruma varsayılan olarak açıktır, ancak bu değişkenin değerini true olarak ayarlayarak bunu devre dışı bırakabilirsiniz. Bunun için geçerli bir nedeniniz yoksa bunu yapmanızı önermeyiz.

LOCAL_EXPORT_CFLAGS

Bu değişken, LOCAL_STATIC_LIBRARIES veya LOCAL_SHARED_LIBRARIES değişkenleri aracılığıyla bu değişkeni kullanan diğer tüm modüllerin LOCAL_CFLAGStanımına eklenecek bir dizi C/C++ derleyici işaretçisi kaydeder.

Örneğin, aşağıdaki modül çiftini ele alalım: foo ve bar. bar, foo'e bağlıdır:

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 derleme sırasında -DFOO=1 ve -DBAR=2 işaretlerini derleyiciye iletir. Ayrıca, dışa aktarılan işaretleri modülünüzün LOCAL_CFLAGS önüne ekleyerek bunları kolayca geçersiz kılabilirsiniz.

Ayrıca, modüller arasındaki ilişki geçişlidir: zoo, bar'a bağlıysa ve bar da foo'ye bağlıysa zoo, foo'den dışa aktarılan tüm işaretleri de devralır.

Son olarak, derleme sistemi yerel olarak derleme yaparken (yani işaretlerini dışa aktardığı modülü oluştururken) dışa aktarılan işaretleri kullanmaz. Dolayısıyla, yukarıdaki örnekte foo/foo.c oluşturulurken -DFOO=1 öğesini derleyiciye iletmez. Yerel olarak derlemek için bunun yerine LOCAL_CFLAGS kullanın.

YEREL_DIŞA AKTAR_ÇALIŞAN_PAZARLAMALAR

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

YEREL_DIŞA_AKTAR_C_DAHİL ETME

Bu değişken, LOCAL_EXPORT_CFLAGS ile aynıdır ancak C için yolları içerir. Örneğin, bar.c bileşeninin foo modülünden başlıklar içermesi gerektiği durumlarda faydalıdır.

YEREL_DIŞA_AKIŞ_LDFLAGS

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

YEREL_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 söyler. Belirttiğiniz her kitaplığın adına -l ön ek 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. Unix bağlayıcılarının çalışma şeklinden dolayı bunu yapar.

Bu değişken genellikle foo modülü statik bir kitaplık olduğunda ve sistem kitaplığına bağlı kod içerdiğinde kullanışlıdır. Daha sonra, bağımlılığı dışa aktarmak için LOCAL_EXPORT_LDLIBS kullanabilirsiniz. Örnek:

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 derlemesi sırasında bağlayıcı komutunun sonuna -llog komutunu yerleştiriyor. Bu işlem, libbar.so'ün foo'e bağlı olduğu için sistem günlük kaydı kitaplığına da bağlı olduğunu bağlayıcıya bildirir.

LOCAL_SHORT_COMMANDS

Modülünüzde çok sayıda kaynak ve/veya bağımlı statik veya paylaşılan kitaplık varsa bu değişkeni true olarak ayarlayın. Bu işlem, 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 karakteri kabul ettiği Windows'da faydalı olabilir. Maksimum karakter sayısı karmaşık projeler için çok küçük olabilir. Ayrıca, tek tek kaynak dosyaların derlenmesini de etkiler ve neredeyse tüm derleyici işaretlerini liste dosyalarına da yerleştirir.

true dışındaki tüm değerlerin varsayılan davranışa döneceğini unutmayın. Bu davranışı projenizdeki tüm modüller için zorlamak üzere Application.mk dosyanızda APP_SHORT_COMMANDS değerini de tanımlayabilirsiniz.

Derlemeyi yavaşlattığı için bu özelliği varsayılan olarak etkinleştirmenizi önermeyiz.

LOCAL_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 dosyası, nesne dosyaları içermez. Bunun yerine, yalnızca, normalde içereceği gerçek nesnelerin dosya yollarını içerir.

Bu, derleme çıktınızın boyutunu azaltma açısından yararlıdır. Dezavantajı, bu tür kitaplıkların farklı bir konuma taşınamaması (içlerindeki tüm yollar görelidir).

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

LOCAL_FILTER_ASM

Bu değişkeni, derleme sisteminin LOCAL_SRC_FILES için belirttiğiniz dosyalardan ayıklanan veya oluşturulan derleme dosyalarını filtrelemek üzere kullanacağı bir kabuk komutu olarak tanımlayın. Bu değişkenin tanımlanması aşağıdakilerin gerçekleşmesine neden olur:

  1. Derleme sistemi, C veya C++ kaynak dosyalarını nesne dosyasına derlemek yerine geçici bir derleme dosyası oluşturur.
  2. Derleme sistemi, LOCAL_FILTER_ASM içindeki kabuk komutunu herhangi bir geçici derleme dosyasında ve LOCAL_SRC_FILES'te listelenen herhangi bir derleme dosyasında yürütür. Böylece başka bir geçici derleme dosyası oluşturur.
  3. Derleme sistemi, filtrelenen bu derleme dosyalarını bir nesne dosyasında derleyebilir.

Örnek:

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, filtre için "2" ve derleyiciye "3" karşılık gelir. Filtre, ilk bağımsız değişken olarak giriş dosyasının adını ve ikinci bağımsız değişken olarak çıkış dosyasının adını alan bağımsız bir kabuk komutu olmalıdır. Örnek:

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şlevi makroları açıklanmaktadır. Değerlendirmek için $(call <function>) kullanın. Metin biçiminde bilgiler döndürürler.

benim-diz

Bu makro, en son eklenen yapma dosyasının yolunu döndürür. Bu yol genellikle geçerli Android.mk dizinidir. my-dir, Android.mk dosyanızın başında LOCAL_PATH değerini tanımlamak için kullanışlıdır. Örnek:

LOCAL_PATH := $(call my-dir)

GNU Make'in çalışma şekli nedeniyle bu makronun aslında döndürdüğü değer, derleme sisteminin derleme komut dosyalarını ayrıştırırken dahil ettiği son makefile'in yoludur. Bu nedenle, başka bir dosya ekledikten sonra my-dir işlevini çağırmamanız gerekir.

Ö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ıda LOCAL_PATH, en son dahil etme işleminin işaret ettiği yer olduğu için $PATH yerine $PATH/foo olarak tanımlanıyor.

Android.mk dosyasında diğer her şeyden sonra ek dahil etme işlemleri ekleyerek bu sorunu önleyebilirsiniz. Örnek:

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. Örnek:

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

tüm-subdir-makefiles

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. NDK, varsayılan olarak yalnızca Android.mk dosyasını içeren dizinde dosya arar.

bu-yapım dosyası

Geçerli makefile'in yolunu döndürür (derleme sisteminin işlevi çağırdığı yer).

parent-makefile

Dahil etme ağacındaki üst makefile'in yolunu (mevcut makefile'i içeren makefile'in yolu) döndürür.

büyük-ana-yapı-dosyası

Dahil etme ağacındaki büyük üst öğe oluşturma dosyasının yolunu (geçerli dosyayı içeren makefile'ın yolu) döndürür.

içe aktarma modülü

Modülün adıyla bir modülün Android.mk dosyasını bulup dahil etmenize olanak tanıyan bir işlev. Bunun tipik bir örneği aşağıdaki gibidir:

$(call import-module,<name>)

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