Red de conocimiento informático - Conocimiento informático - Cómo configurar automáticamente el LOCAL de Android.mk

Cómo configurar automáticamente el LOCAL de Android.mk

Cuando utilice Cocos2d-x para desarrollar juegos de Android, debe especificar el código fuente que se compilará en la variable LOCAL_SRC_FILES del archivo Android.mk y los archivos de encabezado en la variable LOCAL_C_INCLUDES. Cuando hay cada vez más archivos de proyecto, este tipo de modificación manual es una pérdida de tiempo. Afortunadamente, Android.mk es en realidad un archivo MAKE y podemos completar automáticamente esta parte del trabajo con la ayuda de la sintaxis del archivo MAKE.

Usar comandos externos

La forma más sencilla es llamar al comando externo del shell. Primero, especificamos el directorio raíz de los archivos fuente que se buscarán y lo configuramos en la variable SRC_ROOT. La variable LOCAL_C_INCLUDES es una forma directa de buscar en el directorio raíz utilizando el comando find -tipo d. LOCAL_SRC_FILES es un poco más complicado. Primero usamos el comando find -type f para obtener todas las rutas de archivos comunes y luego especificamos el patrón coincidente del nombre del archivo del código fuente (por ejemplo, estoy usando c++, así que lo especifiqué). la variable SRC_SUFFIX para almacenar el sufijo general del archivo de código fuente de C++) y luego use el comando filter para filtrar todas las rutas de archivo de código fuente.

El código completo es el siguiente:

# Advertencia: se utiliza el comando Shell, solo puede ejecutarse en sistemas operativos tipo UNIX.

# Si desea ejecutar en Windows, reemplace esto con una regla Makefile.

SRC_SUFFIX := *.cpp *.c

SRC_ROOT := $(LOCAL_PATH)/.../..../.../Clases

ALL_FILES := $(shell buscar $(SRC_ROOT) -tipo f)

SRC_FILES := $(filtro$(subst *,%,$(SRC\_SUFFIX)),$(ALL_FILES) )

LOCAL_SRC_FILES := hellocpp/main.cpp

LOCAL_SRC_FILES += $(SRC\_FILES:$(LOCAL_PATH)/%=%)

SRC_DIRS : = $(shell find $(SRC_ROOT) - tipo d)

LOCAL_C_INCLUDES:= $(SRC_DIRS)

Usa sintaxis pura de Makefile

Usar comandos externos es lo mejor manera La solución más simple y práctica, pero como se señaló en los comentarios del código anterior, este método solo funciona en sistemas Unix. Para aplicaciones multiplataforma, se requiere la sintaxis pura de Makefile.

Sabemos que el comando comodín de Makefile se puede utilizar para implementar parcialmente funciones similares a las de búsqueda. Por ejemplo, para buscar archivos .c en el directorio actual, puede usar $(comodín *.c), pero desafortunadamente, los comodines no son lo suficientemente potentes y los resultados de este comando no incluyen archivos .c en los subdirectorios. Para este propósito, podemos tomar prestado el comodín recursivo escrito por los maestros en StackOverflow usando la sintaxis pura de Makefile:

# Comodín recursivo

rwildcard = $(foreach d,$(comodín $1\ * ),$( call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))) Este comando rwildcard tiene dos parámetros. El primer parámetro 1 es el directorio y el segundo. parámetro El parámetro 2 es el patrón coincidente.

El comando primero usa $(comodín $1*) para obtener todos los archivos y subdirectorios en el directorio, y luego los itera: si la variable $d actual es un directorio, rwildcard realizará una llamada recursiva contra $d/directorio si $; d es un archivo normal. La llamada recursiva finalizará porque $(comodín $d/*) no puede encontrar un archivo coincidente.

El código completo es el siguiente:

SRC_SUFFIX := *.cpp *.c

SRC_ROOT := $(LOCAL_PATH)/.../. ... /.../Clases

# Comodín recursivo

rwildcard = $(foreach d,$(comodín $1\*),$(call rwildcard,$d/, $2) $ (filtro $(subst *,%,$2),$d)))

SRC_FILES:= $(call rwildcard,$(SRC_ROOT)/,$(SRC_SUFFIX))

LOCAL_SRC_FILES := hellocpp/main.cpp

LOCAL_SRC_FILES += $(SRC\ _FILES:$(LOCAL_PATH)/%=%)

Filtrar archivos fuente que no necesita ser compilado

p>

El método anterior tiene un requisito previo aplicable, es decir, cada archivo fuente en $SRC_ROOT debe compilarse. A veces, esta condición no es cierta, por ejemplo, en un proyecto que utiliza esta escoria, hay algunas bibliotecas externas cuyo código fuente no necesita ser compilado (por ejemplo, la biblioteca Asio configurada en ASIO_HEADER_ONLY). En este momento, es necesario excluir esta parte del código fuente de LOCAL_SRC_FILES.

Primer método: filtrar

El primer método es utilizar el comando filtrar del Makefile:

# La biblioteca ASIO está configurada en ASIO_HEADER_ONLY, por lo que Se excluirá del código fuente

EXCLUDE_SRC_FILES := $(SRC_ROOT)/3rdParty/Asio/asio/impl/%.cpp

EXCLUDE := $(filter $(EXCLUDE_SRC_FILES) , $(SRC_FILES))

SRC_FILES := $(Filtrar $(EXCLUDE_SRC_FILES),$(SRC_FILES)) Este método es factible, pero el filtrado no se puede utilizar para la coincidencia de patrones de directorios de varios niveles , por lo que este enfoque expone demasiados detalles sobre la ruta del código fuente de la biblioteca externa. ¿Es posible especificar nombres de bibliotecas o palabras clave para excluir y luego filtrar los archivos fuente coincidentes en función de esta información?

Segundo método: mejorar rwildcard

El segundo método es agregar un criterio de filtro a rwildcard: si el directorio/nombre de archivo actual coincide con la palabra clave que se va a filtrar, entonces no hacer nada; de lo contrario, el comando de filtro se seguirá llamando y ejecutando de forma recursiva.

# La biblioteca ASIO está configurada en ASIO_HEADER_ONLY, por lo que será excluida

EXCLUDE_LIB := Asio

# Comodín recursivo

rwildcard = $( foreach d,$(comodín $1\*),$(if $(findstring $(EXCLUDE_LIB),$d),,$(call rwildcard,$d/,$2) $(filtro $(subst *,% ,$2),$d)))

SRC_FILES:= $(call rwildcard,$(SRC_ROOT)/,$(SRC_SUFFIX)) Este método es mejor y puede excluir directamente las búsquedas recursivas con comodines, pero rwildcard se convierte en más complejo y menos legible.

El tercer método: FILTER_OUT_PATTERN

El último método también proviene del filtro de salida modificado por el maestro StackOverflow usando la sintaxis pura de Makefile, pero es esencialmente similar a la implementación del segundo. método Esto no se explicará en detalle aquí:

# La biblioteca ASIO está configurada en ASIO_HEADER_ONLY, por lo que se excluirá del código fuente

EXCLUDE_SRC_PATTERN: = asio

FILTER_OUT_PATTERN = $ (foreach v,$(2),$(if $(findstring $(1),$(v)),,$(v)))

SRC_FILES := $(llamar FILTER\_OUT\ _PATTERN,$(EXCLUDE_SRC_PATTERN),$(SRC_FILES))