小编joz*_*ols的帖子

Android Gradle避免CMake项目不必要的重建

我有多种口味的Android Gradle + CMake(NDK)项目.在切换到之前未构建的flavor之后,子项目中的C++源文件/库被不必要地重建.这是一种预期的输出文件夹是特定于风味的,并且在第一次构建时不存在:

./app/.externalNativeBuild/cmake/prodDebug/armeabi/libs/mylib/libmylib.a
./app/.externalNativeBuild/cmake/devDebug/armeabi/libs/mylib/libmylib.a
Run Code Online (Sandbox Code Playgroud)

但是我有许多口味和大型库要构建,并且不想重建不依赖于风味的C++库 - 在构建时,每个风格都应该有相同的库.我试图通过指定不同的输出目录来解决这个问题,因此它不依赖于味道:

add_subdirectory("libs/mylib" "${CMAKE_CURRENT_SOURCE_DIR}/libs/mylib/output")
Run Code Online (Sandbox Code Playgroud)

现在每个flavor都共享mylib库的相同输出目录,但是这个时间库在切换flavor时会一直重建.使用没有Gradle的普通CMake时,所有工作都按预期工作.从Android Studio/Gradle编译时有没有办法修复不必要的重建?

EDIT1:顺便说一句,即使版本没有指定任何C++标志等,重建也完成了 - 基本上它们只是不同的应用程序/版本名称:

    dev {
        applicationIdSuffix ".dev"
        versionNameSuffix "-dev"
    }
    prod {
        applicationIdSuffix ".prod"
        versionNameSuffix "-prod"
    }
Run Code Online (Sandbox Code Playgroud)

编辑2:还有另一个重建问题.当更改任何CMakeLists.txt(也是子项目)时,它会触发树的整个重建 - 所有父项目,子项目(甚至是不相关的项目)都会被重建.目前,这是使用Gradle/Android Studio构建NDK项目的一个障碍.

c++ android cmake gradle android-ndk

12
推荐指数
1
解决办法
585
查看次数

CMake FetchContent 多次下载外部依赖

我开始使用 FetchContent 来自动下载外部依赖项。与旧方法相比,它工作得很好,但我有一个可能与 FetchContent 本身无关的问题 - 外部依赖项被多次下载。我实际上是为 Android 平台构建的,但这并不重要。我这样称呼 CMakecmake -B build/arm64-v8a ...cmake -B build/x86 .... 我需要为每个 ABI(arm64-v8a、x86、...)使用单独的构建文件夹以避免重建,因为我经常在 ABI 之间切换。但是当我使用简单的 FetchContent 结构时:

FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.8.0
)

FetchContent_GetProperties(googletest)
if(NOT googletest_POPULATED)
  FetchContent_Populate(googletest)
  add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
endif()
Run Code Online (Sandbox Code Playgroud)

它将为每个 ABI 下载一次外部项目(换句话说 - 每次使用不同构建文件夹的 CMake 调用一次),因为googletest_POPULATED在使用不同构建文件夹的下一次 CMake 调用中不可见。如果源文件下载一次就太棒了。

所以,我想通过SOURCE_DIRFetchContent_Declare先保存源升一级(在build/_deps/googletest-src没有build/<abi>/_deps/googletest-src文件夹)。它正确保存了源,但仍会触发重新下载,因为似乎googletest-subbuild文件夹(位于 下build/<abi>/_deps)管理googletest_POPULATED标志。

我怎样才能解决这个问题?

android cmake

0
推荐指数
1
解决办法
3214
查看次数

标签 统计

android ×2

cmake ×2

android-ndk ×1

c++ ×1

gradle ×1