Cómo configurar automáticamente el LOCAL de Android.mk
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
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))