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şlayanLOCAL_MODULE
gibi adlar.PRIVATE_
,NDK_
veyaAPP
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.
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:
CLEAR_VARS
değişkenini kullanarak modülle ilişkili değişkenleri başlatın veya tanımlarını kaldırın.- Modülü tanımlamak için kullanılan değişkenlere değerler atayın.
- 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.c
'ü LOCAL_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_CFLAGS
tanı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:
- Derleme sistemi, C veya C++ kaynak dosyalarını nesne dosyasına derlemek yerine geçici bir derleme dosyası oluşturur.
- Derleme sistemi,
LOCAL_FILTER_ASM
içindeki kabuk komutunu herhangi bir geçici derleme dosyasında veLOCAL_SRC_FILES
'te listelenen herhangi bir derleme dosyasında yürütür. Böylece başka bir geçici derleme dosyası oluşturur. - 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.