2016-04-03 1 views
0

У меня есть проект NDK, где я создаю разделяемые библиотеки, используя кросс-компилятор и стандартные утилиты gnu make utils. Это делается с помощью отдельного скрипта. Но для использования библиотек в моем проекте я хотел бы, чтобы мой процесс Android.mk вызывал мой скрипт для генерации общей библиотеки, если он еще не был создан, а затем имеет Android.mk, обертывая его с помощью процесса PREBUILT_SHARED_LIBRARY.Android.mk PREBUILT_SHARED_LIBRARY Как создать файл LOCAL_SRC_FILES из сценария?

В настоящее время, если я запускаю свой сценарий в автономном режиме для создания libmy_so.so, тогда будет работать следующий make-файл. Однако, если я не запустить сценарий явно первым, я получаю следующее сообщение об ошибке:

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

и мой сценарий никогда не вызывается, так что делает процесс терпит неудачу, прежде чем даже пытаться решить эту зависимость.

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) 

Есть ли чистое решение? Я даже нормально запускаю сценарий автоматически как шаг предварительной обработки (я всегда могу отключить мой скрипт, если файл уже существует), но я не нашел заклинание, которое позволяет переменной LOCAL_SRC_FILES указывать на несуществующий файл. Я подумал о том, чтобы начать создание манекена libmy_so.so, но это уродливый взлом.

+0

Я думаю, вам нужно настроить ndk в build.gradle и позволить одному зависеть от того, что ему нужно. –

+0

Я не могу использовать build.gradle непосредственно для этого, потому что я создаю расширяемый инструмент, который должен облегчить работу с NDK. См. [Этот проект] (https://github.com/ericwlange/hemroid), чтобы увидеть, что я пытаюсь сделать. –

ответ

0

Обнаружен взлом - лучший способ?

Я нашел хак. Makefile prebuilt-library.mk в НДК содержит следующие строки:

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 

Я создал копию этого файла (и prebuilt-shared-library.mk, к которому я ссылаться на мою копию prebuilt-library.mk) и прокомментировал эти строки, чтобы остановить эту ошибку. Тогда трюк заключается в том, чтобы сделать какую-то цель, которая оценивается, сначала зависит от файла, который я хочу сгенерировать. После копания скриптов .mk в NDK я обнаружил, что для этой цели служит libraries. Добавив libraries: $(LOCAL_PATH)/libmy_so.so в Android.mk, он, наконец, сделает то, что я хочу.

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 

Это, очевидно, меньше, чем идеально, как хотелось бы, чтобы убедиться, что мои Makefiles созревают с новыми версиями НДК, но это делает трюк. Все еще интересуются более элегантными решениями.