51

I'm trying to build an Android project using the ndk, but I have run into some troubles.

Here's the Android.mk file that works:

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)

Is there a way that allows me to specify all the *.cpp files in the directory, without listing them manually under LOCAL_SRC_FILES?

So far I tried using LOCAL_SRC_FILES = $(wildcard *.cpp), but it did now work, it seems that no files get selected.

gq3
  • 839
  • 1
  • 8
  • 20

4 Answers4

76

You could try something like this...

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

... Change [DIRECTORY] to the actual directory of the files. If they are in the same directory as your .mk file then remove that part. Create the FILE_LIST variable to find all of the .cpp files under the [DIRECTORY] directory. Then use it in the file listing. The LOCAL_SRC_FILES line will then remove the LOCAL_PATH from the listing.

DRiFTy
  • 11,269
  • 11
  • 61
  • 77
  • 1
    @DiscGolfer Why you remove `LOCAL_PATH` from the listing? – Narek May 30 '14 at 23:27
  • 1
    @Narek You must define `LOCAL_PATH := $(call my-dir)` at the top of your `Android.mk`. This holds the relative path from your NDK root to the current file. So, in the `LOCAL_SRC_FILES` line above, I removed the `LOCAL_PATH` from the listing because the file paths are relative to `LOCAL_PATH`. Which would make the paths invalid if not removed. – DRiFTy May 31 '14 at 00:25
  • What does the "wildcard" part mean? Makes sense that LOCAL_PATH will get expanded into a path, is "wildard" a predefined value? Is something supposed to be substituted for "wildcard"? – Alyoshak Oct 02 '14 at 03:45
  • @Alyoshak The wildcard keyword is a standard makefile function that matches and creates a list of filenames based on the pattern we give it. The only part you need to modify is the pattern being used (aka the path to your .cpp files) – DRiFTy Oct 02 '14 at 10:46
  • 2
    What does $(FILE_LIST:$(LOCAL_PATH)/%=%) mean? – Sergei Vasilenko Nov 04 '16 at 10:48
  • 1
    @Delargo This removes the `LOCAL_PATH` from each file path in the `FILE_LIST`. Itbasically makes the `LOCAL_SRC_FILES` list contain only relative paths to your files. – DRiFTy Nov 16 '16 at 17:11
22

I've been using this script for my Android.mk saved me so much time!

#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 is the gist

NiTe Luo
  • 321
  • 2
  • 6
3

How about like this:

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

If you'd be afraid that expansion of * contains $(LOCAL_PATH)/, it might be OK:

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

Using this:

LOCAL_SRC_FILES += $($(wildcard $(LOCAL_PATH)/*.cpp):$(LOCAL_PATH)/%=%)