2016-04-03 1 views
0

J'ai un projet NDK où je compile les bibliothèques partagées en utilisant le compilateur croisé et les utilitaires gnu make standard. Cela est fait avec un script séparé. Mais dans le but d'utiliser les bibliothèques dans mon projet, je voudrais que mon processus Android.mk appelle mon script pour générer la bibliothèque partagée si elle n'a pas encore été construite, puis l'ajouter à Android.mk en utilisant le processus PREBUILT_SHARED_LIBRARY.Android.mk PREBUILT_SHARED_LIBRARY comment générer le fichier LOCAL_SRC_FILES à partir du script?

Actuellement, si je cours mon script hors ligne pour générer libmy_so.so, alors le makefile suivant fonctionnera. Cependant, si je ne lance pas le script explicitement d'abord, je reçois l'erreur suivante:

Android NDK: ERROR:/path_to_project/Android.mk:my_module: LOCAL_SRC_FILES points to a missing file

et mon script est jamais appelé, de sorte que le processus make échoue avant même d'essayer de résoudre la dépendance.

include $(CLEAR_VARS) 

LOCAL_MODULE  := my_module 
LOCAL_SRC_FILES  := libmy_so.so 
LOCAL_EXPORT_CFLAGS := # some stuff 
LOCAL_EXPORT_LDLIBS := # some stuff 
$(LOCAL_PATH)/libmy_so.so: 
    echo "generate file" 
    $(shell run_script_that_creates_libmy_so.so) 

include $(PREBUILT_SHARED_LIBRARY) 

Y at-il une solution propre à cela? Je suis même prêt à exécuter automatiquement le script en tant qu'étape de prétraitement (mon script peut toujours quitter tranquillement si le fichier existe déjà), mais je n'ai pas trouvé d'incantation permettant à la variable LOCAL_SRC_FILES de pointer vers un fichier inexistant. J'ai envisagé de placer un mannequin libmy_so.so pour commencer, mais c'est un hack moche.

+0

Je pense que vous devriez configurer ndk dans build.gradle et laisser un dépend de ce dont il a besoin. –

+0

Je ne peux pas vraiment utiliser build.gradle directement parce que je crée un outil extensible qui est censé faciliter le travail avec le NDK. Voir [ce projet] (https://github.com/ericwlange/hemroid) pour voir ce que j'essaie de faire. –

Répondre

0

Trouvé un hack - une meilleure façon?

J'ai trouvé un hack. Le makefile prebuilt-library.mk dans le NDK contient les lignes suivantes:

ifndef prebuilt 
$(call __ndk_info,ERROR:$(LOCAL_MAKEFILE):$(LOCAL_MODULE): LOCAL_SRC_FILES points to a missing file) 
$(call __ndk_info,Check that $(prebuilt_path) exists, or that its path is correct) 
$(call __ndk_error,Aborting) 
#endif 

J'ai créé une copie de ce fichier (et prebuilt-shared-library.mk auquel je référence ma copie de prebuilt-library.mk) et commenté ces lignes à arrêter l'erreur. Ensuite, l'astuce consiste à faire en sorte que certaines cibles évaluées en premier dépendent du fichier que je veux générer. Après avoir creusé à travers les scripts .mk dans le NDK, j'ai trouvé que libraries sert le but. En ajoutant libraries: $(LOCAL_PATH)/libmy_so.so à Android.mk, il fera enfin ce que je veux.

include $(CLEAR_VARS) 

LOCAL_MODULE  := my_module 
LOCAL_SRC_FILES  := libmy_so.so 
LOCAL_EXPORT_CFLAGS := # some stuff 
LOCAL_EXPORT_LDLIBS := # some stuff 
$(LOCAL_PATH)/libmy_so.so: 
    echo "generate file" 
    $(shell run_script_that_creates_libmy_so.so) 
libraries: $(LOCAL_PATH)/libmy_so.so 

include /path/to/my/mk/files/prebuilt-shared-library.mk 

Ceci est évidemment moins idéal que je voudrais vous assurer que mes makefiles mature avec les nouvelles versions du NDK, mais il fait l'affaire. Toujours intéressé par des solutions plus élégantes.