Questa pagina descrive la sintassi del file di compilazione Android.mk
utilizzato da
ndk-build
.
Panoramica
Il file Android.mk
si trova in una sottodirectory della directory jni/
del progetto e descrive le origini e le librerie condivise al sistema di compilazione.
Si tratta in realtà di un piccolo frammento di file make GNU che il sistema di compilazione analizza una o più volte. Il file Android.mk
è utile per definire le impostazioni a livello di progetto che Application.mk
, il sistema di compilazione e le variabili di ambiente lasciano predefinite. Può anche sostituire le impostazioni a livello di progetto per moduli specifici.
La sintassi di Android.mk
ti consente di raggruppare le origini in moduli.
Un modulo è una libreria statica, una libreria condivisa o un eseguibile autonomo. Puoi definire uno o più moduli in ogni file Android.mk
e utilizzare lo stesso file di origine in più moduli. Il sistema di compilazione inserisce solo le librerie condivise nel pacchetto dell'applicazione. Inoltre, le librerie statiche possono generare librerie condivise.
Oltre alla pacchettizzazione delle librerie, il sistema di compilazione gestisce per te una serie di altri dettagli. Ad esempio, non è necessario elencare i file di intestazione o le dipendenze esplicite tra i file generati nel file Android.mk
. Il sistema di build NDK
calcola automaticamente queste relazioni per te. Di conseguenza, dovresti essere in grado di usufruire del nuovo supporto della piattaforma/toolchain nelle release NDK future senza dover modificare il file Android.mk
.
La sintassi di questo file è molto simile a quella utilizzata nei file Android.mk
distribuiti con l'intero Android Open Source Project. Sebbene l'implementazione del sistema di compilazione che le utilizza sia diversa, la loro somiglianza è una decisione di progettazione intenzionale volta a semplificare il riutilizzo del codice sorgente per le librerie esterne da parte degli sviluppatori di applicazioni.
Nozioni di base
Prima di esplorare la sintassi in dettaglio, è utile comprendere le nozioni di base sul contenuto di un file Android.mk
. A questo scopo, questa sezione utilizza il file Android.mk
nell'esempio Hello-JNI, spiegando il ruolo di ogni riga del file.
Un file Android.mk
deve iniziare definendo la variabile LOCAL_PATH
:
LOCAL_PATH := $(call my-dir)
Questa variabile indica la posizione dei file di origine nell'albero di sviluppo. Qui, la funzione macro my-dir
, fornita dal sistema di compilazione, restituisce il percorso della directory corrente (la directory contenente il file Android.mk
stesso).
La riga successiva dichiara la variabile CLEAR_VARS
, il cui valore viene fornito dal sistema di compilazione.
include $(CLEAR_VARS)
La variabile CLEAR_VARS
punta a uno speciale Makefile GNU che cancella per te molte
variabili LOCAL_XXX
, come LOCAL_MODULE
, LOCAL_SRC_FILES
e
LOCAL_STATIC_LIBRARIES
. Tieni presente che questa operazione non consente di cancellare LOCAL_PATH
. Questa variabile deve mantenere il proprio valore perché il sistema analizza tutti i file di controllo della compilazione in un unico contesto di esecuzione di GNU Make in cui tutte le variabili sono globali. Devi
(ri)dichiarare questa variabile prima di descrivere ogni modulo.
Successivamente, la variabile LOCAL_MODULE
memorizza il nome del modulo da compilare. Utilizza questa variabile una volta per modulo nell'applicazione.
LOCAL_MODULE := hello-jni
Ogni nome del modulo deve essere univoco e non deve contenere spazi. Il sistema di compilazione,
quando genera il file finale della libreria condivisa, aggiunge automaticamente il prefisso e il suffisso corretti al nome che assegni a LOCAL_MODULE
. Ad esempio,
l'esempio riportato sopra genera una libreria denominata
libhello-jni.so
.
La riga successiva enumera i file di origine, con gli spazi che delimitano più file:
LOCAL_SRC_FILES := hello-jni.c
La variabile LOCAL_SRC_FILES
deve contenere un elenco di file di origine C e/o C++ da integrare in un modulo.
L'ultima riga aiuta il sistema a collegare tutto:
include $(BUILD_SHARED_LIBRARY)
La variabile BUILD_SHARED_LIBRARY
punta a uno script GNU Makefile che
raccoglie tutte le informazioni definite nelle variabili LOCAL_XXX
a partire dall'ultimo
include
. Questo script determina cosa creare e come farlo.
Nelle directory dei Samples sono disponibili esempi più complessi, con file Android.mk
commentati che puoi esaminare. Inoltre, Sample: native-activity fornisce una spiegazione dettagliata del file Android.mk
del Sample. Infine, la sezione Variabili e macro fornisce ulteriori informazioni sulle variabili di questa sezione.
Variabili e macro
Il sistema di compilazione fornisce molte possibili variabili da utilizzare nel file Android.mk
.
Molte di queste variabili sono dotate di valori preassegnati. Le altre, invece, le assegni tu.
Oltre a queste variabili, puoi anche definirne di tue. In questo caso, tieni presente che il sistema di build NDK riserva i seguenti nomi di variabili:
- Nomi che iniziano con
LOCAL_
, ad esempioLOCAL_MODULE
. - Nomi che iniziano con
PRIVATE_
,NDK_
oAPP
. Il sistema di compilazione li utilizza internamente. - Nomi in minuscolo, ad esempio
my-dir
. Il sistema di compilazione li utilizza anche internamente.
Se devi definire le tue variabili di utilità in un file Android.mk
, consigliamo di anteporre MY_
ai relativi nomi.
Variabili di inclusione definite da NDK
Questa sezione illustra le variabili GNU Make definite dal sistema di compilazione
prima di analizzare il file Android.mk
. In determinate circostanze, l'NDK
potrebbe analizzare il file Android.mk
più volte, utilizzando ogni volta una definizione diversa
per alcune di queste variabili.
CLEAR_VARS
Questa variabile punta a uno script di build che non definisce quasi tutte le variabili LOCAL_XXX
elencate nella sezione "Variabili definite dallo sviluppatore" di seguito. Utilizza questa
variabile per includere questo script prima di descrivere un nuovo modulo. La sintassi per utilizzarlo è:
include $(CLEAR_VARS)
BUILD_EXECUTABLE
Questa variabile rimanda a uno script di build che raccoglie tutte le informazioni sul modulo che hai fornito nelle variabili LOCAL_XXX
e determina come creare un eseguibile di destinazione dalle origini elencate. Tieni presente che per utilizzare questo
script è necessario che tu abbia già assegnato valori a LOCAL_MODULE
e
LOCAL_SRC_FILES
almeno (per maggiori informazioni su queste variabili, consulta
Variabili di descrizione del modulo).
La sintassi per l'utilizzo di questa variabile è:
include $(BUILD_EXECUTABLE)
CREA_LIBRERIA_CONDIVISA
Questa variabile rimanda a uno script di build che raccoglie tutte le informazioni sul modulo che hai fornito nelle variabili LOCAL_XXX
e determina come creare una libreria condivisa di destinazione dalle origini elencate. Tieni presente che per utilizzare questo
script è necessario che tu abbia già assegnato valori a LOCAL_MODULE
e
LOCAL_SRC_FILES
almeno (per maggiori informazioni su queste variabili, consulta
Variabili di descrizione del modulo).
La sintassi per l'utilizzo di questa variabile è:
include $(BUILD_SHARED_LIBRARY)
Una variabile della libreria condivisa fa sì che il sistema di compilazione generi un file della libreria con estensione .so
.
LIBRERIA_STATIC_DI_CREAZIONE
Una variante di BUILD_SHARED_LIBRARY
utilizzata per creare una libreria statica. Il sistema di compilazione non copia le librerie statiche nel progetto o nei pacchetti, ma può utilizzarle per creare librerie condivise (vedi LOCAL_STATIC_LIBRARIES
e LOCAL_WHOLE_STATIC_LIBRARIES
di seguito). La sintassi per l'utilizzo di questa variabile è:
include $(BUILD_STATIC_LIBRARY)
Una variabile static-library fa sì che il sistema di compilazione generi una libreria con un'estensione.a
.
PREBUILT_SHARED_LIBRARY
Punta a uno script di build utilizzato per specificare una libreria condivisa predefinita. A differenza
del caso di BUILD_SHARED_LIBRARY
e BUILD_STATIC_LIBRARY
, qui il valore di
LOCAL_SRC_FILES
non può essere un file di origine. Deve invece essere un unico percorso a
una libreria condivisa predefinita, come foo/libfoo.so
. La sintassi per l'utilizzo di questa variabile è:
include $(PREBUILT_SHARED_LIBRARY)
Puoi anche fare riferimento a una libreria predefinita in un altro modulo utilizzando la variabile LOCAL_PREBUILTS
. Per ulteriori informazioni sull'utilizzo dei precompilati, consulta
Utilizzare le librerie precompilate.
LIBRERIA_STATIC_PREBUILT
Lo stesso di PREBUILT_SHARED_LIBRARY
, ma per una libreria statica precompilata. Per
scoprire di più sull'utilizzo delle librerie predefinite, consulta Utilizzare le librerie predefinite.
Variabili di informazioni target
Il sistema di compilazione analizza Android.mk
una volta per ogni ABI specificata dalla variabile APP_ABI
, che in genere viene definita nel file Application.mk
. Se APP_ABI
è all
, il sistema di compilazione analizza Android.mk
una volta per ogni ABI supportato dall'NDK. Questa sezione descrive le variabili che il sistema di compilazione definisce ogni volta che analizza Android.mk
.
TARGET_ARCH
La famiglia di CPU a cui è destinato il sistema di compilazione durante l'analisi di questo Android.mk
file. Questa variabile può essere una delle seguenti: arm
, arm64
, x86
o x86_64
.
TARGET_PLATFORM
Il numero del livello API Android di destinazione del sistema di compilazione durante l'analisi del fileAndroid.mk
. Ad esempio, le immagini di sistema di Android 5.1 corrispondono al livello API Android 22: android-22
. Per un elenco completo dei nomi delle piattaforme e delle immagini di sistema Android corrispondenti, consulta API native. L'esempio seguente mostra la sintassi per l'utilizzo di questa variabile:
ifeq ($(TARGET_PLATFORM),android-22)
# ... do something ...
endif
TARGET_ARCH_ABI
L'ABI a cui il sistema di compilazione esegue il targeting durante l'analisi del file Android.mk
.
La tabella 1 mostra l'impostazione ABI utilizzata per ciascuna CPU e architettura supportate.
CPU e architettura | Impostazione |
---|---|
ARMv7 | armeabi-v7a |
ARMv8 AArch64 | arm64-v8a |
i686 | x86 |
x86-64 | x86_64 |
L'esempio seguente mostra come verificare la presenza di ARMv8 AArch64 come combinazione CPU-e ABI di destinazione:
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
# ... do something ...
endif
Per ulteriori dettagli sulle ABI dell'architettura e sui problemi di compatibilità associati, consulta le ABI di Android.
I nuovi ABI target avranno valori diversi in futuro.
TARGET_ABI
Una concatenazione del livello API Android target e dell'ABI. È particolarmente utile quando vuoi eseguire il test in base a un'immagine di sistema di destinazione specifica per un dispositivo reale. Ad esempio, per controllare un dispositivo ARM a 64 bit in esecuzione sul livello API Android 22:
ifeq ($(TARGET_ABI),android-22-arm64-v8a)
# ... do something ...
endif
Variabili di descrizione del modulo
Le variabili in questa sezione descrivono il modulo al sistema di compilazione. Ogni descrizione del modulo deve seguire questo flusso di base:
- Inizializza o non definisci le variabili associate al modulo utilizzando la variabile
CLEAR_VARS
. - Assegna dei valori alle variabili utilizzate per descrivere il modulo.
- Imposta il sistema di compilazione NDK in modo che utilizzi lo script di compilazione appropriato per il modulo, utilizzando la variabile
BUILD_XXX
.
LOCAL_PATH
Questa variabile viene utilizzata per indicare il percorso del file corrente. Devi definirlo
all'inizio del file Android.mk
. L'esempio seguente mostra come fare:
LOCAL_PATH := $(call my-dir)
Lo script a cui punta CLEAR_VARS
non cancella questa variabile. Pertanto,
devi definirlo una sola volta, anche se il file Android.mk
descrive più moduli.
MODULO_LOCALE
Questa variabile memorizza il nome del modulo. Deve essere univoco tra i nomi di tutti
i moduli e non deve contenere spazi. Devi definirlo prima di includere qualsiasi script (diverso da quello per CLEAR_VARS
). Non devi aggiungere il prefisso lib
o l'estensione del file .so
o .a
; il sistema di compilazione apporta queste modifiche automaticamente. In tutti i file Android.mk
e Application.mk
, fai riferimento al modulo con il nome non modificato. Ad esempio, la seguente riga genera la generazione di un modulo della libreria condivisa denominato libfoo.so
:
LOCAL_MODULE := "foo"
Se vuoi che il modulo generato abbia un nome diverso da lib
+ il valore
LOCAL_MODULE
, puoi utilizzare la variabile LOCAL_MODULE_FILENAME
per assegnare al
modulo generato un nome a tua scelta.
LOCAL_MODULE_FILENAME
Questa variabile facoltativa consente di eseguire l'override dei nomi che il sistema di compilazione utilizza per impostazione predefinita per i file che genera. Ad esempio, se il nome di LOCAL_MODULE
è foo
, puoi forzare il sistema a chiamare il file che genera libnewfoo
. L'esempio seguente mostra come eseguire questa operazione:
LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
Per un modulo della libreria condivisa, questo esempio genera un file denominato libnewfoo.so
.
LOCAL_SRC_FILES
Questa variabile contiene l'elenco dei file di origine che il sistema di compilazione utilizza per generare il modulo. Elenca solo i file effettivamente passati dal sistema di compilazione al compilatore, poiché il sistema di compilazione calcola automaticamente eventuali dipendenze associate. Tieni presente che puoi utilizzare percorsi dei file sia relativi (a LOCAL_PATH
) che assoluti.
Ti consigliamo di evitare percorsi file assoluti; i percorsi relativi rendono il file Android.mk
più portabile.
LOCAL_CPP_EXTENSION
Puoi utilizzare questa variabile facoltativa per indicare un'estensione di file diversa da.cpp
per i file di origine C++. Ad esempio, la riga seguente cambia
l'estensione in .cxx
. L'impostazione deve includere il punto.
LOCAL_CPP_EXTENSION := .cxx
Puoi utilizzare questa variabile per specificare più estensioni. Ad esempio:
LOCAL_CPP_EXTENSION := .cxx .cpp .cc
LOCAL_CPP_FEATURES
Puoi utilizzare questa variabile facoltativa per indicare che il codice si basa su funzionalità C++ specifiche. Attiva i flag del compilatore e del linker corretti durante il processo di compilazione. Per i binari precompilati, questa variabile dichiara anche le funzionalità da cui dipende il binario, contribuendo a garantire il corretto funzionamento del collegamento finale. Ti
consigliamo di utilizzare questa variabile anziché attivare -frtti
e
-fexceptions
direttamente nella definizione di LOCAL_CPPFLAGS
.
L'uso di questa variabile consente al sistema di compilazione di utilizzare i flag appropriati per ciascun modulo. L'utilizzo di LOCAL_CPPFLAGS
fa sì che il compilatore utilizzi tutti i flag specificati per tutti i moduli, indipendentemente dalle esigenze effettive.
Ad esempio, per indicare che il codice utilizza RTTI (RunTime Type Information), scrivi:
LOCAL_CPP_FEATURES := rtti
Per indicare che il codice utilizza eccezioni C++, scrivi:
LOCAL_CPP_FEATURES := exceptions
Puoi anche specificare più valori per questa variabile. Ad esempio:
LOCAL_CPP_FEATURES := rtti features
L'ordine in cui descrivi i valori non è importante.
LOCAL_C_INCLUDES
Puoi utilizzare questa variabile facoltativa per specificare un elenco di percorsi, relativi alla directory root
NDK, da aggiungere al percorso di ricerca delle include durante la compilazione di tutti i sorgenti (C, C++ e assembly). Ad esempio:
LOCAL_C_INCLUDES := sources/foo
Oppure:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo
Definisci questa variabile prima di impostare eventuali flag di inclusione corrispondenti tramite
LOCAL_CFLAGS
o LOCAL_CPPFLAGS
.
Il sistema di compilazione utilizza automaticamente anche i percorsi LOCAL_C_INCLUDES
quando avvia il debugging nativo con ndk-gdb.
LOCAL_ASFLAG
Indicatori che verranno passati a Clang durante la compilazione dei file .s
o .S
.
ASMFLAG LOCALI
Contrassegni che verranno passati a Yasm durante la creazione di file .asm
.
CFLAG LOCALI
Indicatori che verranno passati a Clang durante la compilazione di file di origine C, C++ e di alcuni assembly (.s
e .S
, ma non .asm
). Questa operazione può essere utile per specificare ulteriori definizioni di macro o opzioni di compilazione. Usa
LOCAL_CPPFLAGS
per specificare i flag solo per C++. Utilizza LOCAL_CONLYFLAGS
per
specificare flag solo per C.
Cerca di non modificare il livello di ottimizzazione/debug nel file Android.mk
.
Il sistema di compilazione può gestire automaticamente questa impostazione per te, utilizzando le
informazioni pertinenti nel file Application.mk
. In questo modo il sistema di compilazione può generare file di dati utili utilizzati durante il debug.
È possibile specificare percorsi di inclusione aggiuntivi scrivendo:
LOCAL_CFLAGS += -I<path>,
Tuttavia, è preferibile utilizzare LOCAL_C_INCLUDES
per questo scopo, poiché
in questo modo è possibile utilizzare anche i percorsi disponibili per il debug nativo con
ndk-gdb.
LOCAL_CONLYFLAG
Flag che verranno passati a Clang durante la compilazione delle sorgenti C. A differenza di
LOCAL_CFLAGS
, LOCAL_CONLYFLAGS
non verrà passato a Clang durante la compilazione
C++ o delle origini assembly.
CPPFLAG LOCALI
Un insieme facoltativo di flag del compilatore che verranno passati durante la compilazione solo dei file di codice sorgente C++. Verranno visualizzati dopo LOCAL_CFLAGS
sulla riga di comando del compilatore. Utilizza LOCAL_CFLAGS
per specificare i flag sia per C che per C++.
LOCAL_STATIC_LIBRARIES
Questa variabile memorizza l'elenco dei moduli delle librerie statiche su cui dipende il modulo corrente.
Se il modulo attuale è una libreria condivisa o un eseguibile, questa variabile fornirà il collegamento di queste librerie nel file binario risultante.
Se il modulo attuale è una libreria statica, questa variabile indica semplicemente che altri moduli a seconda di quello attuale dipenderanno anch'essi dalle librerie elencate.
LIBRERIE_LOCAL_SHARED_LIBRARI
Questa variabile è l'elenco dei moduli delle librerie condivise su cui questo modulo dipende in fase di esecuzione. Queste informazioni sono necessarie al momento del collegamento e per incorporare le informazioni corrispondenti nel file generato.
LIBRERIE_STATICHE_INTERE_LOCALI
Questa variabile è una variante di LOCAL_STATIC_LIBRARIES
ed indica che il linker deve trattare i moduli della libreria associati come interi archivi. Per
maggiori informazioni su interi archivi, consulta la documentazione di GNU ld per il
flag --whole-archive
.
Questa variabile è utile quando sono presenti dipendenze circolari tra diverse librerie statiche. Quando utilizzi questa variabile per creare una libreria condivisa, questo obbliga il sistema di compilazione ad aggiungere tutti i file oggetto delle tue librerie statiche al programma binario finale. Lo stesso non vale, però, per la generazione di file eseguibili.
LIBRE_LOCALI
Questa variabile contiene l'elenco di flag linker aggiuntivi da utilizzare nella creazione
della libreria condivisa o dell'eseguibile. Ti consente di utilizzare il prefisso -l
per trasmettere
il nome di librerie di sistema specifiche. Ad esempio, l'esempio seguente indica al linker di generare un modulo che collega a /system/lib/libz.so
al momento del caricamento:
LOCAL_LDLIBS := -lz
Per l'elenco delle librerie di sistema esposte a cui puoi collegarti in questa release NDK, consulta API native.
FLAG_LOCALI
L'elenco di altri flag del linker da utilizzare dal sistema di compilazione durante la compilazione della biblioteca o dell'eseguibile condiviso. Ad esempio, per utilizzare il linker ld.bfd
su
ARM/X86:
LOCAL_LDFLAGS += -fuse-ld=bfd
LOCAL_ALLOW_UNDEFINED_SYMBOLS
Per impostazione predefinita, quando il sistema di compilazione rileva un riferimento non definito durante il tentativo di creare un file condiviso, genera un errore di simbolo indefinito. Questo errore può aiutarti a individuare i bug nel tuo codice sorgente.
Per disattivare questo controllo, imposta questa variabile su true
. Tieni presente che questa impostazione potrebbe
causare il caricamento della libreria condivisa in fase di runtime.
LOCAL_ARM_MODE
Per impostazione predefinita, il sistema di build genera binari di destinazione ARM in modalità thumb,
dove ogni istruzione ha una larghezza di 16 bit ed è collegata alle librerie STL nella directory
thumb/
. La definizione di questa variabile come arm
forza il sistema di compilazione a generare i file oggetto del modulo in modalità arm
a 32 bit. L'esempio seguente mostra come eseguire questa operazione:
LOCAL_ARM_MODE := arm
Puoi anche indicare al sistema di compilazione di compilare solo origini specifiche in modalità arm
aggiungendo il suffisso .arm
ai nomi dei file di origine. Ad esempio, l'esempio seguente indica al sistema di compilazione di compilare sempre bar.c
in modalità ARM, ma di creare foo.c
in base al valore di LOCAL_ARM_MODE
.
LOCAL_SRC_FILES := foo.c bar.c.arm
LOCAL_ARM_NEON
Questa variabile è importante solo se scegli come target l'ABI armeabi-v7a
. Consente
l'utilizzo dei componenti intrinseci del compilatore ARM Advanced SIMD (NEON) nelle origini C e C++, nonché le istruzioni NEON nei file Assembly.
Tieni presente che non tutte le CPU basate su ARMv7 supportano le estensioni del set di istruzioni NEON. Per questo motivo, devi eseguire un rilevamento del runtime per poter utilizzare questo codice in modo sicuro in fase di runtime. Per ulteriori informazioni, consulta Supporto Neon e Funzionalità CPU.
In alternativa, puoi utilizzare il suffisso .neon
per specificare che il sistema di compilazione deve compilare solo file di origine specifici con il supporto di NEON. Nell'esempio seguente, il sistema di compilazione compila foo.c
con il supporto di Thumb e Neon, bar.c
con il supporto di Thumb e zoo.c
con il supporto di ARM e NEON:
LOCAL_SRC_FILES = foo.c.neon bar.c zoo.c.arm.neon
Se utilizzi entrambi i suffissi, .arm
deve precedere .neon
.
LOCAL_DISABLE_FORMAT_STRING_CHECKS
Per impostazione predefinita, il sistema di compilazione compila il codice con la protezione delle stringhe di formato. In questo modo viene forzato un errore del compilatore se in una funzione in stile printf
viene utilizzata una stringa di formato non costante. Questa protezione è attiva per impostazione predefinita, ma puoi disattivarla impostando il valore di questa variabile su true
. Sconsigliamo di farlo
senza un motivo convincente.
ESPORTAZIONE_LOCALE_CFLAGS
Questa variabile registra un insieme di flag del compilatore C/C++ da aggiungere alla definizione di LOCAL_CFLAGS
di qualsiasi altro modulo che lo utilizza tramite le variabili LOCAL_STATIC_LIBRARIES
o LOCAL_SHARED_LIBRARIES
.
Ad esempio, considera la seguente coppia di moduli: foo
e bar
, che
dipende da 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)
Qui il sistema di compilazione passa i flag -DFOO=1
e -DBAR=2
al compilatore
durante la compilazione di bar.c
. Inoltre, antepone i flag esportati all'oggetto LOCAL_CFLAGS
del modulo per consentirti di eseguirne facilmente l'override.
Inoltre, la relazione tra i moduli è transitiva: se zoo
dipende da bar
, che a sua volta dipende da foo
, zoo
eredita anche tutti i flag esportati da foo
.
Infine, il sistema di compilazione non utilizza i flag esportati durante la compilazione locale
(ovvero la compilazione del modulo di cui sta esportando i flag). Pertanto, nell'esempio precedente, non passa -DFOO=1
al compilatore durante la creazione di foo/foo.c
. Per
creare in locale, utilizza invece LOCAL_CFLAGS
.
LOCAL_EXPORT_CPPFLAGS
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
, ma solo per i flag C++.
LOCAL_EXPORT_C_INCLUDES
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
, ma per C include i percorsi. È utile nei casi in cui, ad esempio, bar.c
debba includere le intestazioni del modulo foo
.
LOCAL_EXPORT_LDFLAGS
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
, ma per i flag linker.
LOCAL_EXPORT_LDLIBS
Questa variabile è uguale a LOCAL_EXPORT_CFLAGS
e indica al sistema di build di passare i nomi delle librerie di sistema specifiche al compilatore. Anteponi -l
al nome di ogni libreria specificata.
Tieni presente che il sistema di compilazione aggiunge i flag del linker importati al valore della variabile LOCAL_LDLIBS
del modulo. Questo accade a causa del funzionamento dei linker di Unix.
Questa variabile è in genere utile quando il modulo foo
è una libreria statica e ha codice che dipende da una libreria di sistema. Puoi quindi utilizzare LOCAL_EXPORT_LDLIBS
per
esportare la dipendenza. Ad esempio:
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)
In questo esempio, il sistema di compilazione inserisce -llog
alla fine del comando linker
quando crea libbar.so
. In questo modo, il linker viene informato che, poiché libbar.so
dipende da foo
, dipende anche dalla libreria di registrazione di sistema.
LOCAL_SHORT_COMMANDS
Imposta questa variabile su true
quando il modulo ha un numero molto elevato di origini
e/o librerie statiche o condivise dipendenti. In questo modo, il sistema di build deve
utilizzare la sintassi @
per gli archivi contenenti file di oggetti intermedi o
librerie di collegamento.
Questa funzionalità può essere utile su Windows, dove la riga di comando accetta un massimo di 8191 caratteri, che potrebbero essere troppo piccoli per progetti complessi. Riguarda anche la compilazione di singoli file di origine, inserendo quasi tutti i flag del compilatore anche all'interno dei file di elenco.
Tieni presente che qualsiasi valore diverso da true
ripristinerà il comportamento predefinito. Puoi anche definire APP_SHORT_COMMANDS
nel file Application.mk
per forzare questo comportamento per tutti i moduli del progetto.
Sconsigliamo di abilitare questa funzionalità per impostazione predefinita, poiché rallenta la build.
ARCHIVIO_LOCALE_THIN
Imposta questa variabile su true
quando crei librerie statiche. In questo modo verrà generato un archivio thin, un file della raccolta che non contiene file oggetto, ma solo percorsi dei file agli oggetti effettivi che normalmente conterrebbe.
Questo è utile per ridurre le dimensioni dell'output della compilazione. Lo svantaggio è che queste librerie non possono essere spostate in un'altra posizione (tutti i percorsi al loro interno sono relativi).
I valori validi sono true
, false
o vuoto. Puoi impostare un valore predefinito nel file Application.mk
tramite la variabile APP_THIN_ARCHIVE
.
LOCAL_FILTER_ASM
Definisci questa variabile come un comando shell che il sistema di compilazione utilizzerà per filtrare i file di assembly estratti o generati dai file specificati per LOCAL_SRC_FILES
. La definizione di questa variabile comporta quanto segue:
- Il sistema di compilazione genera un file assembly temporaneo da qualsiasi file di codice sorgente C o C++, anziché compilarli in un file oggetto.
- Il sistema di compilazione esegue il comando shell in
LOCAL_FILTER_ASM
su qualsiasi file di Assembly temporaneo e su qualsiasi file di assembly elencato inLOCAL_SRC_FILES
, generando così un altro file di assembly temporaneo. - Il sistema di compilazione compila questi file di assembly filtrati in un file oggetto.
Ad esempio:
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" corrisponde al compilatore, "2" al filtro e "3" all'assemblatore. Il filtro deve essere un comando a shell autonomo che prende il nome del file di input come primo argomento e il nome del file di output come secondo. Ad esempio:
myasmfilter $OBJS_DIR/foo.S.original $OBJS_DIR/foo.S
myasmfilter bar.S $OBJS_DIR/bar.S
Macro di funzioni fornite dall'NDK
Questa sezione spiega le macro di funzioni GNU Make fornite dall'NDK. Utilizza
$(call <function>)
per valutarle; restituiscono informazioni di testo.
mia-dir
Questa macro restituisce il percorso dell'ultimo makefile incluso, che in genere è la directory Android.mk
attuale. my-dir
è utile per definireLOCAL_PATH
all'inizio del file Android.mk
. Ad esempio:
LOCAL_PATH := $(call my-dir)
Per via del funzionamento di GNU Make, la macro restituisce il percorso dell'ultimo makefile incluso dal sistema di compilazione durante l'analisi degli script di build. Per questo motivo, non devi chiamare my-dir
dopo aver incluso un altro file.
Considera ad esempio il seguente:
LOCAL_PATH := $(call my-dir)
# ... declare one module
include $(LOCAL_PATH)/foo/`Android.mk`
LOCAL_PATH := $(call my-dir)
# ... declare another module
Il problema qui è che la seconda chiamata a my-dir
definisce LOCAL_PATH
come
$PATH/foo
anziché $PATH
, perché era lì che puntava la sua inclusione più recente.
Puoi evitare questo problema inserendo altri include dopo tutto il resto nel file Android.mk
. Ad esempio:
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
Se non è possibile strutturare il file in questo modo, salva il valore della prima chiamata a my-dir
in un'altra variabile. Ad esempio:
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
tutti-subdir-makefiles
Restituisce l'elenco dei file Android.mk
che si trovano in tutte le sottodirectory del percorso my-dir
corrente.
Puoi utilizzare questa funzione per fornire al sistema di compilazione gerarchie di directory di origine nidificate in modo approfondito. Per impostazione predefinita, NDK cerca solo i file nella directory contenente il file Android.mk
.
this-makefile
Restituisce il percorso del file make corrente (da cui il sistema di compilazione ha chiamato la funzione).
parent-makefile
Restituisce il percorso del makefile principale nell'albero di inclusione (il percorso del makefile che includeva quello corrente).
makefile-antenato
Restituisce il percorso del file make del nonno nell'albero di inclusione (il percorso del file make che include quello corrente).
modulo-importazione
Una funzione che consente di trovare e includere il file Android.mk
di un modulo in base al nome del modulo. Un esempio tipico è il seguente:
$(call import-module,<name>)
In questo esempio, il sistema di compilazione cerca il modulo con tag <name>
nell'elenco di directory a cui fa riferimento la variabile di ambiente NDK_MODULE_PATH
e include automaticamente il file Android.mk
.