有没有办法在Android ndk静态库之间强制构建顺序?

时间:2015-12-13 11:09:00

标签: android android-ndk

我们有一个相当大的项目,为Windows,Android和iOS构建,我正在尝试并行化android构建。由于历史原因,在构建期间,所有标头都将导出到单个目录,其包含路径也基于此单个目录。这意味着如果模块A依赖于模块B,那么它期望模块B复制出自己的标头。

根据NDK文档,除了确定动态库的传递依赖性之外,NDK make脚本忽略了静态库之间的依赖关系,但由于我们只构建静态库,这对我们没有帮助。

我以为我可以使用LOCAL_EXPORT_C_INCLUDES来导出适当的路径,除非有些模块在不同的路径下导出标头而不是存储库中存在标头。

Visual Aid:

.
|-- Output
|   |-- Android
|       |-- includes/Foo/Bar
|-- Foo
|   |-- Bar
|   |   |-- Android
|   |   |   |-- stuff.h
|   |   |-- Windows
|   |   |   |-- stuff.h
...

文件qux.cpp会将标题stuff.h包含为#include <Foo/Bar/stuff.h>stuff.h位于Output文件夹中,但{{1}时无法正常工作在stuff.h

1 个答案:

答案 0 :(得分:1)

毕竟, ndk-build 是GNU make的包装器。这使您有能力强制执行依赖。

在这里,我们将滥用 ndk-build 的PCH功能。如果您在库中使用PCH,则需要一个不同的解决方法。

假设我们有两个静态库, libS2.a 应该在 libS1.a 之后编译。您将对 Android.mk 文件进行一些修改:

…
include $(CLEAR_VARS)
LOCAL_MODULE    := S1
LOCAL_SRC_FILES := …
include $(BUILD_STATIC_LIBRARY)              # builds libS1.a

FIRST_LIBRARY := $(LOCAL_BUILT_MODULE)       #### added #1

include $(CLEAR_VARS)
LOCAL_MODULE    := S2
LOCAL_PCH       := pch.h                     #### added #2
LOCAL_SRC_FILES := …
include $(BUILD_STATIC_LIBRARY)              # builds libS2.a

$(LOCAL_PATH)/$(LOCAL_PCH): $(FIRST_LIBRARY) #### added #3
    touch $@                                 #### added #4, starts with TAB

如您所见,我们只添加了4行。不要错过touch之前的TAB字符。

要使这个技巧起作用,重要的是第一个库放在之前第二个。