Android.mk PREBUILT_SHARED_LIBRARY 如何从脚本生成 LOCAL_SRC_FILES 文件?
Android.mk PREBUILT_SHARED_LIBRARY how to generate LOCAL_SRC_FILES file from script?
我有一个 NDK 项目,我在其中使用交叉编译器和标准 gnu make utils 构建共享库。这是通过单独的脚本完成的。但是为了在我的项目中使用这些库,我希望我的 Android.mk
进程调用我的脚本来生成共享库(如果尚未构建),然后让 Android.mk
包装它使用 PREBUILT_SHARED_LIBRARY
流程。
目前,如果我 运行 我的脚本离线生成 libmy_so.so
,那么下面的 makefile 将起作用。但是,如果我没有先明确 运行 脚本,我会收到以下错误:
Android NDK: ERROR:/path_to_project/Android.mk:my_module: LOCAL_SRC_FILES points to a missing file
而且我的脚本从未被调用,所以 make 过程在尝试解决依赖关系之前就失败了。
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
开始,但这是一个丑陋的 hack。
找到破解方法 - 更好的方法?
我发现了一个黑客。 NDK 中的 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
副本)并注释掉了这些行以阻止错误。然后诀窍是让一些首先评估的目标取决于我想要生成的文件。在深入研究 NDK 中的 .mk 脚本后,我发现 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
这显然不太理想,因为我想确保我的 makefile 与更新版本的 NDK 一起成熟,但它确实起到了作用。仍然对更优雅的解决方案感兴趣。
我有一个 NDK 项目,我在其中使用交叉编译器和标准 gnu make utils 构建共享库。这是通过单独的脚本完成的。但是为了在我的项目中使用这些库,我希望我的 Android.mk
进程调用我的脚本来生成共享库(如果尚未构建),然后让 Android.mk
包装它使用 PREBUILT_SHARED_LIBRARY
流程。
目前,如果我 运行 我的脚本离线生成 libmy_so.so
,那么下面的 makefile 将起作用。但是,如果我没有先明确 运行 脚本,我会收到以下错误:
Android NDK: ERROR:/path_to_project/Android.mk:my_module: LOCAL_SRC_FILES points to a missing file
而且我的脚本从未被调用,所以 make 过程在尝试解决依赖关系之前就失败了。
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
开始,但这是一个丑陋的 hack。
找到破解方法 - 更好的方法?
我发现了一个黑客。 NDK 中的 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
副本)并注释掉了这些行以阻止错误。然后诀窍是让一些首先评估的目标取决于我想要生成的文件。在深入研究 NDK 中的 .mk 脚本后,我发现 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
这显然不太理想,因为我想确保我的 makefile 与更新版本的 NDK 一起成熟,但它确实起到了作用。仍然对更优雅的解决方案感兴趣。