2012-01-23 14 views
46

ndk'yi kullanarak bir Android projesi oluşturmaya çalışıyorum, ancak bazı sıkıntılara rastladım.Android.mk, tüm cpp dosyalarını dahil et

İşte çalışır Android.mk dosyasıdır:

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) 

LOCAL_SRC_FILES altında onları el listeleme olmadan beni dizindeki tüm * .cpp dosyaları belirtmek için izin veren bir yolu var mı?

Şimdiye kadar LOCAL_SRC_FILES = $ (joker * .cpp) kullanmayı denedim, ancak şimdi işe yaradı, hiçbir dosya seçilmiyor gibi görünüyor.

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

Böyle bir şey deneyebilirsiniz

cevap

71

... ... dosyaların gerçek dizine [DIRECTORY] değiştirin. Onlar, .mk dosyanızla aynı dizinde bulunuyorsa, o bölümü kaldırın. [DIRECTORY] dizininin altındaki tüm .cpp dosyalarını bulmak için FILE_LIST değişken oluşturun. Daha sonra dosya listelemede kullanın. LOCAL_SRC_FILES satırı, LOCAL_PATH listelerinden kaldırır.

+0

Teşekkürler, işe yaradı! – gq3

+1

@DiscGolfer Neden 'LOCAL_PATH' listeden kaldırılsın? – Narek

+1

@Narek 'LOCAL_PATH: = $ (my-dir) 'işlevini' Android.mk'nizin üstünde tanımlamanız gerekir. Bu, NDK kökünüzden geçerli dosyaya giden göreli yolu tutar. Yani, yukarıdaki LOCAL_SRC_FILES satırında, 'LOCAL_PATH' listesini kaldırdım çünkü dosya yolları' LOCAL_PATH' ile ilgili. Kaldırılmadığı takdirde yolları geçersiz kılar. – DRiFTy

20

Android.mk'im için bu betiği kullanıyorum, bu kadar zaman harcadım!

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

korkmak ederseniz * genişlemesi içerdiğini $ (LOCAL_PATH) /, Tamam olabilir:

#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

ne dersiniz böyle özü

+0

Bunu kullanan herhangi biri için, bu tanımın Makefile _before_ 'i kullanan herhangi bir kodun içine yerleştirildiğinden emin olun, aksi halde çağrıları sessizce başarısız olur. –

+0

sadece bir not, bu mükemmel bir çözümdür –

+0

FILE_LIST dosyasının yolu nasıl hariç tutulur? Ve FILE_LIST'i LOCAL_SRC_FILES olarak atadığımda neden $ (FILE_LIST) değil, $ (FILE_LIST: $ (LOCAL_PATH) /% =%) yazılır? –

2

olduğunu

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