【问题标题】:Add pre-build step to android ndk-build module for header dependency?将预构建步骤添加到 android ndk-build 模块以获取标头依赖项?
【发布时间】:2013-03-03 08:02:54
【问题描述】:

基本上,我想在 Android.mk 文件中做的是:

LOCAL_MODULE := foo
$(LOCAL_MODULE): pre-build
pre-build:
    @echo HI
.PHONY: pre-build
# ...
include $(BUILD_SHARED_LIBRARY)

ndk-build 系统确实适用于 ndk-build foo,并且预构建步骤有效,但如果您在应用程序中使用此库,它不会执行预构建步骤。

特别是,我正在尝试生成一个头文件(带有版本/日期戳等),该文件放置在LOCAL_EXPORT_C_INCLUDES 中使用的路径中,以便使用该库的模块可以使用该头文件。

【问题讨论】:

    标签: android-ndk makefile


    【解决方案1】:

    这就是我所做的,作为一个小技巧。

    您似乎可以相当轻松地添加构建后步骤,但不能添加预构建步骤。

    在您include 构建过程之后,您可以向$(LOCAL_BUILT_MODULE) 添加一个依赖项,这实际上是一个始终执行的构建后过程。

    include $(BUILD_SHARED_LIBRARY)
    $(LOCAL_BUILT_MODULE): post_build
    
    post_build:
        $echo Hi, I'm post-build.
    

    如果你需要花哨和使用,例如,你 $(LOCAL_PATH) 上的东西,那么

    include $(BUILD_SHARED_LIBRARY)
    $(LOCAL_BUILT_MODULE): post_build
    
    define gen_post_build
    post_build:
        $(hide) python $(1)/MyScript.py 
    endef
    
    $(eval $(call gen_post_build,$(LOCAL_PATH)))
    

    【讨论】:

    • 好把戏。上面的解决方案在编译之后但在安装+剥离之前执行构建后步骤。我需要在最后(安装后)运行构建后步骤以将最终的 .so 文件复制到某处。为此,我在依赖项的左侧使用了 'all' 而不是 '$(LOCAL_BUILT_MODULE)'。
    【解决方案2】:

    这是我在为一个或多个架构 (ABI) 构建动态库时发现的一种预构建步骤。这可能不适用于所有情况。

    使用以下内容创建一个 Application.mk 文件(如果您还没有):

    all: pre_build
    pre_build:
        echo "This is the pre-build"
    

    请注意,使用上述“全部”最终会在 Application.mk 中进行预构建,并在 Android.mk 中进行后构建。

    【讨论】:

    • 是的,当您希望单个子项目/库在构建之前为自己做一些事情时,确实将东西放入 Application.mk 并不是一个通用的解决方案。如果该库用于具有不同 Application.mk 文件的不同应用程序,那么您必须为每个 Application.mk 复制该代码。
    • 出于某种原因,我现在才想到的一个想法是创建一个子模块使用的虚拟(空)静态库,并让该虚拟静态库在构建后执行一些操作一步,使用我最初的想法。这是 Microsoft Visual Studio 解决方案中出现的一些(类似但不同)情况的解决方法。
    • 我同意彼得我写的并不理想,但至少它很简单。我刚从 Eclipse 切换到 Android Studio,对 NDK 支持的糟糕状态感到有些震惊。看起来它的 makefile hack 时间更长了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多