Bu sayfada,Android.mk
ndk-build.
Genel Bakış
Android.mk dosyası, projenizin jni/ dizininin bir alt dizininde yer alır
dizinini oluşturur ve kaynaklarınızı ve 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 makefile parçasıdır. Android.mk dosyası, Application.mk, derleme sistemi ve ortam değişkenlerinizin tanımlı bırakmadığı 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üller statik bir kitaplık, paylaşılan kitaplık veya bağımsız
yürütülebilir. Her Android.mk dosyasında bir veya daha fazla modül tanımlayabilirsiniz.
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, paketleme kitaplıklarına ek olarak
bazı ipuçları vereceğim. Ö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 yapısı
sistem bu ilişkileri sizin için otomatik olarak hesaplar. Bu sayede, Android.mk dosyanıza dokunmak zorunda kalmadan gelecekteki NDK sürümlerinde yeni araç zinciri/platform desteğinden yararlanabilirsiniz.
Bu dosyanın söz dizimi, Android Open Source Project'in tamamıyla dağıtılan Android.mk dosyalarında kullanılana çok yakındır. Derleme sistemi
bunları kullanan uygulamanın farklı olması, benzerliklerin kasıtlı
uygulama geliştiricilerinin, uygulama geliştirmelerini kolaylaştırmak amacıyla
kaynak kodundan
yararlanabilirsiniz.
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ı kullanılarak dosyanın her satırının işlevi 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 yolunu (Android.mk dosyasını içeren dizin) döndürür.
Bir sonraki satırda, derleme sistemi değeri olan CLEAR_VARS değişkeni belirtilir
sağlar.
include $(CLEAR_VARS)
CLEAR_VARS değişkeni, birçok öğeyi temizleyen özel bir GNU Makefile'a işaret ediyor
Sizin için LOCAL_XXX gibi LOCAL_MODULE, LOCAL_SRC_FILES ve
LOCAL_STATIC_LIBRARIES. Bu işlem LOCAL_PATH değerini temizlemez. Bu
sistem tüm derleme kontrolü dosyalarını ayrıştırdığı için değişkenin değerini korumalıdır
tek bir GNU Tüm değişkenlerin global olduğu yürütme bağlamı sunar. Şunu yapmalısınız:
her modülü açıklamadan önce bu değişkeni (yeniden) tanımlayın.
Daha sonra, LOCAL_MODULE değişkeni eklemek istediğiniz modülün adını
seçeceğiz. 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, nihai paylaşılan kitaplık dosyasını oluştururken LOCAL_MODULE'ye atadığınız ada otomatik olarak uygun ön ek ve son ek ekler. Örneğin,
yukarıda görünen örnek,
libhello-jni.so
Sonraki satır, kaynak dosyaları numaralandırır ve birden çok değeri boşluklarla sınırlandırır. dosyalar:
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES değişkeni, C ve/veya C++ kaynak dosyalarının listesini içermelidir
bir yöntem de vardır.
Son satır, sistemin her şeyi birbirine bağlamasına yardımcı olur:
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY değişkeni, aynı türde bir GNU Makefile komut dosyasına
en fazla dönüşüm elde ettikten sonra, LOCAL_XXX değişkende tanımladığınız tüm bilgileri
son include. Bu komut dosyası, nelerin oluşturulacağını ve nasıl yapılacağını belirler.
Örnek dizinlerinde, açıklama eklenmiş daha karmaşık örnekler vardır.
Bakabileceğiniz Android.mk dosya var. Ayrıca, Örnek: yerel etkinlik
, söz konusu örneğin Android.mk dosyasıyla ilgili ayrıntılı bir açıklama sunar. Son olarak, Değişkenler ve makrolar bölümünde bu bölümdeki değişkenler hakkında daha fazla bilgi verilmektedir.
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 atanmış değerlerle gelir. Diğerlerini siz atarsınız.
Bu değişkenlere ek olarak kendi rastgele değişkenlerinizi de tanımlayabilirsiniz. Bu durumda, 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_veyaAPPile başlayan adlar. Derleme sistemi içgüdülerini güçlendiriyor.- Küçük harfli adlar (ör.
my-dir). Derleme sistemi, bunu dahili olarak olur.
Bir Android.mk dosyasında kendi kolaylık değişkenlerinizi tanımlamanız gerekirse,
adlarının başına MY_ eklemelerini öner.
NDK tarafından tanımlanan içerme değişkenleri
Bu bölümde, derleme sisteminin tanımladığı GNU Yapma değişkenleri ele alınmaktadır
Android.mk dosyanızı ayrıştırmadan önce. Belirli durumlarda NDK, her seferinde bu değişkenlerin bazıları için farklı bir tanım kullanarak Android.mk dosyanızı birkaç kez ayrıştırabilir.
TEMİZLE_VARS
Bu değişken, neredeyse tüm LOCAL_XXX tanımını kaldıran bir derleme komut dosyasına işaret ediyor
"Geliştirici tanımlı değişkenler"de listelenen değişkenler bölümüne bakın. Yeni bir modülü açıklamadan önce bu komut dosyasını dahil etmek için bu değişkeni kullanın. Kullanım söz dizimi:
include $(CLEAR_VARS)
BUILD_EXECUTABLE
Bu değişken, Google Analytics 4 ile ilgili tüm bilgileri toplayan bir derleme
LOCAL_XXX değişkenlerinizde sağladığınız modülü ve
listelediğiniz kaynaklardan yürütülebilir bir hedef dosya derleyin. 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)
PAYLAŞILAN_KİTAPLIK
Bu değişken, Google Analytics 4 ile ilgili tüm bilgileri toplayan bir derleme
LOCAL_XXX değişkenlerinizde sağladığınız modülü ve
listelediğiniz kaynaklardan paylaşılan bir hedef kitaplık oluşturun. 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_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_KİTAPLIĞI
Statik kitaplık oluşturmak için kullanılan BUILD_SHARED_LIBRARY varyantı. İlgili içeriği oluşturmak için kullanılan
derleme sistemi, statik kitaplıkları projenize/paketlerinize kopyalamaz ancak
bunları paylaşılan kitaplıklar oluşturmak için kullanabilir (bkz. LOCAL_STATIC_LIBRARIES ve
LOCAL_WHOLE_STATIC_LIBRARIES). Bu değişkeni kullanmak için söz dizimi şöyledir:
include $(BUILD_STATIC_LIBRARY)
Statik kitaplık değişkeni, derleme sisteminin .a uzantılı 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. Beğenmekten vazgeç
BUILD_SHARED_LIBRARY ve BUILD_STATIC_LIBRARY için geçerlidir. Burada
LOCAL_SRC_FILES kaynak dosya olamaz. Bunun yerine, değer teslim etmek için
foo/libfoo.so gibi önceden oluşturulmuş paylaşılan bir kitaplık. Bu değişkenin söz dizimi şu şekildedir:
include $(PREBUILT_SHARED_LIBRARY)
Ayrıca
LOCAL_PREBUILTS değişkeni Önceden oluşturulmuş öğeleri kullanma hakkında daha fazla bilgi için
Önceden oluşturulmuş kitaplıkları kullanın.
PREBUILT_STATIC_KİTAPLIĞI
PREBUILT_SHARED_LIBRARY ile aynıdır ancak önceden oluşturulmuş statik kitaplıklar için kullanılı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 her
Android.mk ayrıştırır.
TARGET_ARCH
Derleme sisteminin bu Android.mk dosyasını ayrıştırırken hedeflediği CPU ailesidir. Bu değişken şunlardan biri olacaktır: arm, arm64, x86 veya x86_64.
HEDEF_PLATFORM
Bunu ayrıştırırken derleme sisteminin hedeflediği Android API düzeyi numarası
Android.mk dosyası oluşturun. Örneğin, Android 5.1 sistem resimleri Android API düzeyi 22'ye karşılık gelir: android-22. Platform adlarının tam listesi ve
ilgili Android sistem görüntüleri için Yerel API'ler bölümüne bakın. İlgili içeriği oluşturmak için kullanılan
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'ler ve ilgili uyumluluk sorunları hakkında daha fazla bilgi için Android ABI'lerine bakın.
Gelecekteki yeni hedef ABI'ler farklı değerlere sahip olacak.
HEDEF_ABI
Hedef Android API düzeyi ile ABI'nin birleşimi. Bu, özellikle de belirli bir hedef sistem görüntüsüne göre test etmek istediğinizde Ö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, derleme sistemine modülünüzü tanımlar. Her biri modülün açıklaması şu temel akışı izlemelidir:
-
CLEAR_VARSdeğişkeni - Modülü tanımlamak için kullanılan değişkenlere değerler atayın.
- NDK derleme sistemini, modül için uygun derleme komut dosyasını kullanacak şekilde ayarlayın,
BUILD_XXXdeğişkeni kullanılır.
YEREL_YOL
Bu değişken, geçerli dosyanın yolunu vermek için kullanılır. Tanımlayın
Android.mk dosyanızın başına ekleyin. 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.
LOCAL_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 dosyaları (CLEAR_VARS için olandan farklı). lib
öneki veya .so ya da .a dosya uzantısı; derleme sistemi bunları
pek çok yolu vardır. Android.mk ve Application.mk dosyalarınızda modülünüze değiştirilmemiş adıyla atıfta bulunun. Ö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 sistemi tarafından verilen adları geçersiz kılmanıza
varsayılan olarak kullanır. Örneğin,
LOCAL_MODULE foo. Sistemi, oluşturduğu dosyayı çağırmaya zorlayabilirsiniz
libnewfoo. Aşağıdaki örnekte bunun nasıl yapılacağı gösterilmektedir:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
Bu örnek, paylaşılan 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 listesini içerir. Yalnızca derleme sisteminin gerçekten aktardığı dosyaları listeleyin
tarafından otomatik olarak hesaplandığından, derleyici için
ve bildirmeyi konuştuk. Hem göreli (LOCAL_PATH ile ilişkili) hem de mutlak dosya yolları 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.
YEREL_PBM_UZANTIsı
İsteğe bağlı bu değişkeni
C++ kaynak dosyalarınız için .cpp. Örneğin, aşağıdaki satırda uzantı .cxx olarak değiştirilmiştir. (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 bir koda dayalı olduğunu belirtmek için bu isteğe bağlı değişkeni
C++ özellikleri hakkında daha fazla bilgi edinin. Derleme sırasında doğru derleyici ve bağlayıcı işaretlerini etkinleştirir
bahsedeceğim. Ö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ı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, kodunuzun RTTI (Çalışma Zamanı Türü Bilgisi) kullandığını belirtmek için yaz:
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 fazla değer de belirtebilirsiniz. Örnek:
LOCAL_CPP_FEATURES := rtti features
Değerleri açıklama sırası önemli değildir.
LOCAL_C_INCLUDES
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 dosyaları derlenirken Clang'a iletilecek işaretler.
YEREL_ASMFLAGS
.asm dosyaları oluşturulurken yasm'a aktarılacak işaretler.
LOCAL_CFLAGS
C, C++ ve bazı uygulamalar oluştururken Clang'a geçirilecek işaretler
derleme (.s ve .S; ancak .asm değil) kaynak dosyaları. Bu sayede,
ek makro tanımları veya derleme seçenekleri belirtmek için yararlı olabilir. Tekliflerinizi otomatikleştirmek ve optimize etmek için
Yalnızca C++ için işaretleri belirtmek üzere LOCAL_CPPFLAGS. Şunlar için LOCAL_CONLYFLAGS kullanın:
yalnızca C için işaretleri belirtin.
Android.mk dosyanızdaki optimizasyon/hata ayıklama düzeyini değiştirmemeye çalışın.
Derleme sistemi
Application.mk dosyasındaki alakalı bilgiler bulunmalıdır. Bu şekilde yapmak, 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ı 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'den sonra görünür. Hem C hem de C++ için işaretleri belirtmek üzere LOCAL_CFLAGS kullanın.
YEREL_STATIC_KİTAPLIKLAR
Bu değişken, geçerli değişiklik gösterir.
Geçerli modül paylaşılan bir kitaplık veya yürütülebilir bir modülse bu değişken bu kitaplıkları elde edilen ikili değere bağlanmaya zorlar.
Geçerli modül statik bir kitaplıksa bu değişken mevcut modüllere bağlı olan diğer modüller de listelenen kitaplıklar.
LOCAL_SHARED_LIBRARIES
Bu değişken, bu modülün üzerinde yer aldığı paylaşılan kitaplıkların modüllerinin listesidir. çalışma zamanına bağlıdır. Bu bilgi, bağlantı anında ve ilgili bilgileri içeren bir dosyayı Google'a ekleyin.
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ç kullanıcı arasında döngüsel bağımlılıklar olduğunda işe yarar. olması gerekir. Paylaşılan bir kitaplık oluşturmak için bu değişkeni kullandığınızda derleme sistemini, statik kitaplıklarınızdaki tüm nesne dosyalarını iki kat daha fazla belirir. Ancak yürütülebilir dosyalar oluşturulurken aynı durum geçerli değildir.
LOCAL_LDLIBS
Bu değişken, binada kullanılan ek bağlayıcı flag'lerinin listesini içerir
paylaşılan kitaplığınızda veya yürütülebilir dosyalarda görünür. -l ön ekini kullanarak
belirli sistem kitaplıklarının adını yazın. Örneğin, aşağıdaki örnekte bağlayıcıya yükleme sırasında /system/lib/libz.so'e bağlantı veren bir modül oluşturması söylenmektedir:
LOCAL_LDLIBS := -lz
Bu NDK'da bağlantı oluşturabileceğiniz, açığa çıkmış sistem kitaplıklarının listesi için sürümü için Yerel API'ler bölümüne bakın.
LOCAL_LDFLAGS
Derleme sisteminizin derleme sırasında kullanacağı, derleme sistemi için
paylaşılan kitaplık veya yürütülebilir dosya. Örneğin, ARM/X86'te ld.bfd bağlayıcıyı kullanmak için:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
Derleme sistemi tanımlanmamış bir referansla karşılaştığında varsayılan olarak paylaşılan bir değer oluşturmaya çalışırken tanımsız sembol hatası atar. 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 olur.
YEREL_ARM_MODU
Derleme sistemi varsayılan olarak ARM hedef ikili programlarını thumb modunda oluşturur. Bu modda her talimat 16 bit genişliğindedir ve thumb/ dizinindeki STL kitaplıklarıyla bağlantılıdır. Bu değişkenin arm olarak tanımlanması, derleme sistemini
modülün nesne dosyalarını 32 bit arm modunda oluşturur. Aşağıdaki örnek
bunun nasıl yapılacağını gösterir:
LOCAL_ARM_MODE := arm
Kaynak dosya adlarına .arm son ekini ekleyerek derleme sistemine yalnızca belirli kaynakları arm modunda derlemesini de bildirebilirsiniz. Örneğin,
Aşağıdaki örnek, derleme sistemine bar.c öğesini her zaman ARM modunda derlemesini söyler,
ancak LOCAL_ARM_MODE değerine göre foo.c oluşturmak için kullanılır.
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
Bu değişken yalnızca armeabi-v7a ABI'yi hedeflediğinizde önemlidir. Google
C ve C++ cihazlarınızda ARM Advanced SIMD (NEON) derleyici yerleşik özelliklerinin kullanılmasına olanak tanır
ve Assembly dosyalarındaki NEON talimatlarını içerir.
ARMv7 tabanlı tüm CPU'ların NEON talimat seti uzantılarını desteklemediğini unutmayın. Bu nedenle, dosyayı güvenli bir şekilde kullanabilmek için çalışma zamanı algılaması bu kodu girmeniz gerekir. Daha fazla bilgi için Neon destek sayfasına bakın ve CPU özellikleri.
Alternatif olarak, .neon sonekini kullanarak derleme sisteminin
NEON desteğiyle yalnızca belirli kaynak dosyaları derleyin. Aşağıdaki örnekte,
derleme sistemi, foo.c öğesini baş ve neon desteğiyle, bar.c öğesini ise
başparmak desteği ve ARM ve NEON desteğiyle zoo.c:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
Her iki soneki de kullanırsanız .arm, .neon tarihinden ö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 isterseniz devre dışı bırakabilirsiniz
bu değişkenin değerini true olarak ayarlayarak bunu görebilirsiniz. Bunu yapmanızı önermiyoruz
bir nedeni olabilir.
YEREL_DIŞA_AKIŞ_CFLAGS
Bu değişken, LOCAL_CFLAGS öğesine eklenecek bir dizi C/C++ derleyici işareti kaydeder
kullanan diğer modüllerin tanımlarını
LOCAL_STATIC_LIBRARIES veya LOCAL_SHARED_LIBRARIES değişkenleri.
Örneğin, şu modül çiftlerini ele alalım: foo ve bar.
foo öğesine 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 dosyasını derlerken -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ü derleme) dışa aktarılan işaretleri kullanmaz. Bu nedenle, yukarıdaki örnekte foo/foo.c derlenirken -DFOO=1 derleyiciye iletilmez. Yerel olarak derlemek için bunun yerine LOCAL_CFLAGS kullanın.
LOCAL_EXPORT_CPPFLAGS
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. Google
Örneğin, bar.c öğesinin üstbilgilerini içermesi gerektiği durumlarda yararlıdır:
foo modülü.
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 iletir. Başına -l ekle
adını yazın.
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ı bir kod içerir. Ardından LOCAL_EXPORT_LDLIBS ile şunları yapabilirsiniz:
dışa aktarması gerekir. Ö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 bağlayıcı komutunun sonuna -llog komutunu yerleştiriyor
libbar.so derlendiğinde. 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 fazla kaynak olduğunda bu değişkeni true olarak ayarlayın
ve/veya bağımlı statik ya da paylaşılan kitaplıklar. 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 maksimum 8191 karakterden oluşan bir metin girin. Bu değer, karmaşık projeler için çok küçük olabilir. Aynı zamanda tek tek kaynak dosyaların derlenmesini etkiler ve neredeyse tüm derleyiciler işaretleri de içerir.
true dışındaki tüm değerlerin varsayılan davranışa döneceğini unutmayın. Siz
zorlamak için Application.mk dosyanızda APP_SHORT_COMMANDS tanımlayabilirsiniz
bu davranışı projenizdeki tüm modüller için geçerli hale getirir.
Derlemenin daha hızlı yüklenmesini sağladığından bu özelliğin varsayılan olarak etkinleştirilmesini önermiyoruz yavaşlar.
LOCAL_THIN_ARCHIVE
Statik kitaplıklar oluştururken bu değişkeni true olarak ayarlayın. Bu işlem, nesne dosyaları yerine normalde içereceği gerçek nesnelerin dosya yollarını içeren bir kitaplık dosyası olan ince bir arşiv oluşturur.
Bu, derleme çıktınızın boyutunu azaltma açısından yararlıdır. Bunun dezavantajı, bu tür kitaplıkların farklı bir konuma taşınamamasıdır (içlerindeki tüm yollar görecelidir).
Geçerli değerler true, false veya boş değerlerdir.
APP_THIN_ARCHIVE değişkeni üzerinden Application.mk dosyasını yükleyebilirsiniz.
LOCAL_FILTER_ASM
Bu değişkeni, derleme sisteminin filtrelemek için kullanacağı kabuk komutu olarak tanımlayın
belirttiğiniz dosyalardan çıkarılan veya oluşturulan derleme dosyaları
LOCAL_SRC_FILES Bu değişkenin tanımlanması, aşağıdaki durumların oluşmasına neden olur:
- Derleme sistemi herhangi bir C veya C++ kaynağından geçici bir derleme dosyası oluşturur dosyası olarak derleyebilirsiniz.
- Derleme sistemi, kabuk komutunu
LOCAL_FILTER_ASMprojesindeLOCAL_SRC_FILESdizininde listelenen herhangi bir derleme dosyasında, oluşturarak başka bir geçici derleme dosyası oluşturabilirsiniz. - Derleme sistemi, filtrelenmiş bu derleme dosyalarını bir nesne dosyasında derler.
Ö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, "2" filtreye ve "3" de derleyiciye karşılık gelir. Filtre, ilk bağımsız değişkeni giriş dosyasının adı, ikinci bağımsız değişkeni ise çıkış dosyasının adı olan 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. Tekliflerinizi otomatikleştirmek ve optimize etmek için
Değerlendirmek için $(call <function>); metinsel bilgiler döndürürler.
my-dir
Bu makro, eklenen son Makefile yolunu döndürür. Bu yöntem genellikle
mevcut Android.mk dizini. my-dir, şunun tanımlanması için yararlıdır:
Android.mk dosyanızın başında LOCAL_PATH. Örnek:
LOCAL_PATH := $(call my-dir)
GNU Make'sinin çalışma şekli nedeniyle bu makronun gerçekte döndürdüğü şey,
derleme sisteminin derleme komut dosyalarını ayrıştırırken eklediği son oluşturma dosyası. Örneğin,
Bu nedenle, başka bir dosya ekledikten sonra my-dir öğesini ç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ı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 mümkün değilse
ilk my-dir çağrısı başka bir değişkene dönüştürülür. Ö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 oluşturma dosyasının yolunu döndürür (derleme sisteminin işlevi) kullanabilirsiniz.
parent-makefile
Dahil etme ağacındaki üst oluşturma dosyasının yolunu ( hazır dosyayı da içerir.
büyük-ana-yapı-dosyası
Dahil etme ağacındaki ( dosyayı tekrar yükleyebilirsiniz.
içe aktarma modülü
Modülün adına göre modülün Android.mk dosyasını bulup dahil etmenize olanak tanıyan bir işlev. Aşağıda tipik bir örnek verilmiştir:
$(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.