50 votes

Android.mk, inclure tous les fichiers cpp

J'essaie de construire un projet Android en utilisant le ndk, mais j'ai rencontré quelques problèmes.

Voici le fichier Android.mk qui fonctionne :

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)

Existe-t-il un moyen qui me permette de spécifier tous les fichiers *.cpp du répertoire, sans les lister manuellement sous LOCAL_SRC_FILES ?

Jusqu'à présent, j'ai essayé d'utiliser LOCAL_SRC_FILES = $(wildcard *.cpp), mais cela ne fonctionne pas, il semble qu'aucun fichier ne soit sélectionné.

75voto

DiscGolfer Points 4655

Vous pourriez essayer quelque chose comme ça...

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

... Changez [DIRECTORY] vers le répertoire réel des fichiers. S'ils se trouvent dans le même répertoire que votre .mk alors supprimez cette partie. Créez le FILE_LIST pour trouver toutes les .cpp sous l'onglet [DIRECTORY] répertoire. Utilisez-le ensuite dans la liste des fichiers. Le site LOCAL_SRC_FILES supprimera alors la ligne LOCAL_PATH de la liste.

1 votes

@DiscGolfer Pourquoi vous supprimez LOCAL_PATH de la liste ?

1 votes

@Narek Vous devez définir LOCAL_PATH := $(call my-dir) en haut de votre Android.mk . Il contient le chemin relatif de la racine de votre NDK vers le fichier actuel. Ainsi, dans le fichier LOCAL_SRC_FILES ci-dessus, j'ai supprimé le LOCAL_PATH de la liste parce que les chemins de fichiers sont relatifs à LOCAL_PATH . Ce qui rendrait les chemins invalides s'ils ne sont pas supprimés.

0 votes

Que signifie la partie "wildcard" ? Il est logique que LOCAL_PATH soit développé en un chemin, mais "wildcard" est-il une valeur prédéfinie ? Quelque chose doit-il être substitué à "wildcard" ?

22voto

NiTe Luo Points 21

J'ai utilisé ce script pour mon Android.mk m'a fait gagner tellement de temps !

#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)/%=%)

Ici Voici l'essentiel

0 votes

Pour que personne ne l'utilise, assurez-vous que cette définition est placée dans votre Makefile avant tout code qui l'utilise, sinon les appels à celui-ci échoueront silencieusement.

0 votes

Juste une note, c'est la solution parfaite

0 votes

Comment exclure le chemin d'accès de FILE_LIST ? Et pourquoi écrire $(FILE_LIST:$(LOCAL_PATH)/%=%), et pas seulement $(FILE_LIST) lorsque j'assigne FILE_LIST à LOCAL_SRC_FILES ?

3voto

user2356722 Points 11

Et comme ça :

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

Si vous craignez que l'expansion de * contienne $(LOCAL_PATH)/, cela pourrait être correct :

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

0voto

赵国涛 Points 1

En utilisant ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X