2012-01-23 2 views
46

Я пытаюсь создать проект Android с помощью ndk, но у меня возникли некоторые проблемы.Android.mk, включая все файлы cpp

Вот файл Android.mk, который работает:

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) 

Есть ли способ, что позволяет мне указать все * .cpp файлы в каталоге, не перечисляя их вручную под LOCAL_SRC_FILES?

До сих пор я пытался использовать LOCAL_SRC_FILES = $ (wildcard * .cpp), но теперь он работал, кажется, что файлы не выбраны.

ответ

71

Вы могли бы попробовать что-то вроде этого ...

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

... Изменение [DIRECTORY] фактического каталога файлов. Если они находятся в том же каталоге, что и ваш файл .mk, удалите эту часть. Создайте переменную FILE_LIST, чтобы найти все файлы .cpp в каталоге [DIRECTORY]. Затем используйте его в списке файлов. После этого линия LOCAL_SRC_FILES удалит LOCAL_PATH из списка.

+0

Спасибо, это сработало! – gq3

+1

@DiscGolfer Почему вы удаляете 'LOCAL_PATH' из списка? – Narek

+1

@Narek Вы должны определить 'LOCAL_PATH: = $ (вызов my-dir)' вверху вашего 'Android.mk'. Это относится относительный путь от вашего корня NDK к текущему файлу. Итак, в строке 'LOCAL_SRC_FILES', приведенной выше, я удалил' LOCAL_PATH' из списка, потому что пути к файлам относятся к 'LOCAL_PATH'. Который сделал бы пути недействительными, если их не удалить. – DRiFTy

20

Я использую этот скрипт для своего Android.mk, так много времени спасал!

#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 является сутью

+0

Чтобы кто-нибудь, используя это, убедитесь, что это определение помещено в ваш Makefile _before_ любой код, который его использует, в противном случае вызовы к нему будут терпеть неудачу. –

+0

просто примечание, это идеальное решение –

+0

Как исключить путь из FILE_LIST? И зачем писать $ (FILE_LIST: $ (LOCAL_PATH) /% =%), а не только $ (FILE_LIST), когда я назначаю FILE_LIST LOCAL_SRC_FILES? –

2

Как насчет так:

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

Если бы побоялся, что расширение * содержит $ (local_path) /, это может быть в порядке:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/./,,$(wildcard $(LOCAL_PATH)/./*.cpp)) 
Смежные вопросы