2012-01-23 10 views
46

Estoy tratando de crear un proyecto Android usando ndk, pero me he encontrado con algunos problemas.Android.mk, incluya todos los archivos cpp

Aquí está el archivo Android.mk que funciona:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := mylib 
LOCAL_CFLAGS := -Werror 
LOCAL_SRC_FILES := main.cpp, Screen.cpp, ScreenManager.cpp 
LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 

¿Hay una manera que me permite especificar todos los archivos * .cpp en el directorio, sin enumerar de forma manual bajo LOCAL_SRC_FILES?

Hasta ahora he intentado usar LOCAL_SRC_FILES = $ (comodín * .cpp), pero ahora funcionó, parece que no se seleccionó ningún archivo.

Respuesta

71

Usted podría intentar algo como esto ...

FILE_LIST := $(wildcard $(LOCAL_PATH)/[DIRECTORY]/*.cpp) 
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

... Cambiar [DIRECTORY] al directorio real de los archivos. Si están en el mismo directorio que su archivo .mk, elimine esa parte. Cree la variable FILE_LIST para encontrar todos los archivos .cpp en el directorio [DIRECTORY]. Luego úselo en la lista de archivos. La línea LOCAL_SRC_FILES eliminará el LOCAL_PATH del listado.

+0

¡Gracias, funcionó! – gq3

+1

@DiscGolfer ¿Por qué eliminas 'LOCAL_PATH' de la lista? – Narek

+1

@Narek Debe definir 'LOCAL_PATH: = $ (call my-dir)' en la parte superior de su 'Android.mk'. Esto contiene la ruta relativa de su raíz NDK al archivo actual. Por lo tanto, en la línea 'LOCAL_SRC_FILES' anterior, eliminé' LOCAL_PATH' de la lista porque las rutas de los archivos son relativas a 'LOCAL_PATH'. Lo que haría que las rutas sean inválidas si no se eliminan. – DRiFTy

20

He estado usando este script para mi Android.mk ¡me ha ahorrado tanto tiempo!

#traverse all the directory and subdirectory 
define walk 
    $(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e))) 
endef 

#find all the file recursively under jni/ 
ALLFILES = $(call walk, $(LOCAL_PATH)) 
FILE_LIST := $(filter %.cpp, $(ALLFILES)) 

LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

Here es la esencia

+0

Para cualquiera que use esto, asegúrese de que esta definición se coloque en su Makefile antes de cualquier código que la use, de lo contrario las llamadas fallarán silenciosamente. –

+0

solo una nota, esta es la solución perfecta –

+0

¿Cómo excluir la ruta de FILE_LIST? ¿Y por qué escribir $ (FILE_LIST: $ (LOCAL_PATH) /% =%), no solo $ (FILE_LIST) cuando asigno FILE_LIST a LOCAL_SRC_FILES? –

2

¿Qué hay de la siguiente manera:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/,,$(wildcard $(LOCAL_PATH)/*.cpp)) 

Si tendría miedo de que la expansión de * contiene $ (LOCAL_PATH) /, que podría estar bien:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/./,,$(wildcard $(LOCAL_PATH)/./*.cpp)) 
Cuestiones relacionadas