2012-01-23 2 views
46

Tôi đang cố gắng xây dựng một dự án Android bằng cách sử dụng ndk, nhưng tôi đã gặp phải một số vấn đề.Android.mk, bao gồm tất cả các tệp cpp

Dưới đây là file Android.mk rằng hoạt động:

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) 

Có cách nào cho phép tôi để xác định tất cả các tập tin * .cpp trong thư mục, mà không cần liệt kê chúng bằng tay dưới LOCAL_SRC_FILES?

Cho đến nay tôi đã thử sử dụng LOCAL_SRC_FILES = $ (ký tự đại diện * .cpp), nhưng bây giờ nó đã hoạt động, có vẻ như không có tệp nào được chọn.

Trả lời

71

Bạn có thể thử một cái gì đó như thế này ...

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

... Thay đổi [DIRECTORY] vào thư mục thực tế của các tập tin. Nếu chúng nằm trong cùng thư mục với tệp .mk của bạn thì hãy xóa phần đó. Tạo biến số FILE_LIST để tìm tất cả các tệp .cpp trong thư mục [DIRECTORY]. Sau đó sử dụng nó trong danh sách tập tin. Dòng LOCAL_SRC_FILES sau đó sẽ xóa LOCAL_PATH khỏi danh sách.

+0

Cảm ơn, nó đã hoạt động! – gq3

+1

@DiscGolfer Tại sao bạn xóa 'LOCAL_PATH' khỏi danh sách? – Narek

+1

@Narek Bạn phải xác định 'LOCAL_PATH: = $ (gọi my-dir)' ở đầu 'Android.mk' của bạn. Điều này giữ đường dẫn tương đối từ gốc NDK của bạn đến tệp hiện tại. Vì vậy, trong dòng 'LOCAL_SRC_FILES' ở trên, tôi đã xóa' LOCAL_PATH' khỏi danh sách vì đường dẫn tệp có liên quan đến 'LOCAL_PATH'. Điều này sẽ làm cho đường dẫn không hợp lệ nếu không bị xóa. – DRiFTy

20

Tôi đã sử dụng tập lệnh này cho Android.mk đã lưu lại rất nhiều thời gian!

#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 là ý chính

+0

Để bất cứ ai sử dụng điều này, hãy chắc chắn rằng định nghĩa này được đặt trong Makefile của bạn _before_ bất kỳ mã nào sử dụng nó, nếu không các cuộc gọi đến nó sẽ âm thầm thất bại. –

+0

chỉ là một lưu ý, đây là giải pháp hoàn hảo –

+0

Cách loại trừ đường dẫn khỏi FILE_LIST? Và tại sao viết $ (FILE_LIST: $ (LOCAL_PATH) /% =%), không chỉ $ (FILE_LIST) khi tôi gán FILE_LIST cho LOCAL_SRC_FILES? –

2

Làm thế nào về như thế này:

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

Nếu bạn muốn được sợ rằng mở rộng * chứa $ (LOCAL_PATH) /, nó có thể là OK:

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