2012-01-23 10 views
46

Próbuję zbudować projekt Android za pomocą ndk, ale mam pewne problemy.Android.mk, dołącz wszystkie pliki cpp

Oto plik Android.mk że działa:

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) 

Czy istnieje sposób, że pozwala mi określić wszystkie pliki * .cpp w katalogu, nie wymieniając je ręcznie pod LOCAL_SRC_FILES?

Do tej pory próbowałem używać LOCAL_SRC_FILES = $ (wildcard * .cpp), ale teraz działało, wydaje się, że żadne pliki nie zostaną wybrane.

Odpowiedz

71

Można spróbować coś takiego ...

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

... Zmień [DIRECTORY] do rzeczywistego katalogu z plikami. Jeśli znajdują się w tym samym katalogu, co plik .mk, usuń tę część. Utwórz zmienną FILE_LIST, aby znaleźć wszystkie pliki .cpp w katalogu [DIRECTORY]. Następnie użyj go w liście plików. Linia LOCAL_SRC_FILES usunie wtedy LOCAL_PATH ze spisu.

+0

Dzięki, zadziałało! – gq3

+1

@DiscGolfer Dlaczego usuwasz 'LOCAL_PATH' z listy? – Narek

+1

@Narek Musisz zdefiniować 'LOCAL_PATH: = $ (call my-dir)' u góry 'Android.mk'. Przechowuje ścieżkę względną od katalogu głównego NDK do bieżącego pliku. Tak więc w powyższym wierszu 'LOCAL_SRC_FILES' usunąłem' LOCAL_PATH' z listy, ponieważ ścieżki do plików są względne do 'LOCAL_PATH'. Co spowodowałoby, że ścieżki byłyby nieważne, gdyby nie zostały usunięte. – DRiFTy

20

Używam tego skryptu dla mojego Android.mk zaoszczędził mi tyle czasu!

#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 jest sedno

+0

Każdemu, kto tego używa, upewnij się, że definicja ta jest umieszczona w pliku Makefile _ przed każdym kodem, który z niego korzysta, w przeciwnym razie wywołanie go nie powiedzie się. –

+0

tylko notatkę, to jest idealne rozwiązanie –

+0

Jak wykluczyć ścieżkę z FILE_LIST? I po co pisać $ (FILE_LIST: $ (LOCAL_PATH) /% =%), a nie tylko $ (FILE_LIST), gdy przypisuję FILE_LIST do LOCAL_SRC_FILES? –

2

Jak o tak:

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

Jeśli chcesz się obawiać, że ekspansja * zawiera $ (LOCAL_PATH) /, to może być OK:

LOCAL_SRC_FILES := $(subst $(LOCAL_PATH)/./,,$(wildcard $(LOCAL_PATH)/./*.cpp)) 
Powiązane problemy