使用gradle构建cmake ExternalProject

时间:2018-01-04 15:43:22

标签: gradle cmake

我正在尝试使用现有的本机库作为android项目的一部分。我按照有关将android和C ++代码添加到android studio的项目的说明。我得到了一个功能齐全的CMakeLists.txt文件(独立测试)并且我已指示gradle使用它来编译本机代码。

我使用的库使用make,所以我使用ExternalProject_Add来指示cmake如何编译它。以下是相关代码:

ExternalProject_Add(foo
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo/configure
        --host=arm-linux-androideabi
    BUILD_COMMAND ${MAKE}
    INSTALL_COMMAND true)

这是模块的build.gradle的相关部分:

externalNativeBuild {
    cmake {
        path '../cpp/CMakeLists.txt'
    }
}

当我运行./gradlew assembleDebug时,不会编译外部项目。在cmake中添加依赖于bar的可执行文件(名为foo)之后,配置步骤会运行,但构建步骤不会运行。我修改了库的代码,以便编译失败,但是gradle无论如何都会返回成功。)

以下是这些更改后./gradlew assembleDebug输出的最后一行。

configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
[6/10] Performing build step for 'foo'
[7/10] Performing install step for 'foo'
[8/10] Completed 'foo'
[9/10] Building C object CMakeFiles/bar.dir/bar.c.o
[10/10] Linking C executable bar

BUILD SUCCESSFUL in 18s

任何想法发生了什么?我做错了什么?

我使用的是gradle 4.1和cmake 3.6。

2 个答案:

答案 0 :(得分:1)

你应该使用BUILD_IN_SOURCE ON,否则你的BINARY_DIR就在其他地方,所以make什么都不做恕我直言。

答案 1 :(得分:0)

https://stackoverflow.com/a/47636956/192373。您不需要虚构的可执行文件。但是,您确实需要两个单独的目标。

add_library(foolib SHARED IMPORTED)
add_dependencies(foolib foo)
set_target_properties(foolib IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../libfoo/…/libfoo.so)

您不一定需要BUILD_IN_SOURCE ON,最好在BINARY_DIR的某处设置build/intermediates,并将其传递给make