通过Gradle和Android NDK强制CMake进入详细模式

22

我正在使用Gradle和CMake在命令行编译一个Android NDK项目。 以前,我使用Ant和ndk-build,但我正在尝试完全将该项目迁移到Gradle和CMake。

在我的build.gradle中,我有以下几行代码来调用CMake:

externalNativeBuild {
    cmake {
        path "src/main/cpp/CMakeLists.txt"
    }
}

现在我该如何强制CMake在执行编译器和链接器之前将所有编译器调用打印到控制台上?具体来说,我想看看CMake如何运行编译器和链接器。

我已经尝试过以下方法,但都无济于事:

1)在我的CMakeLists.txt中加入了以下代码:

set(CMAKE_VERBOSE_MAKEFILE on)

没有产生任何效果。

2) 我是这样开始构建的:

./gradlew build --info

Gradle打印了一些东西,但没有编译器的调用。

3) 就像这样:

./gradlew build --debug

Gradle打印了许多内容,但没有编译器调用。

因此,这三个尝试都没有达到我想要的效果,这让我想知道如何查看CMake如何在我的各个源文件上运行clang?


1
请检查项目根目录下的 .externalNativeBuild 文件夹;其中可能包含与您相关的所有信息。 - Alex Cohn
1
确实,非常好,谢谢!有一个 build.ninja 日志文件,其中包含所有必要的信息。如果您想将您的评论发布为答案,我会接受它。 - Andreas
还有一些更新:我终于到达我的台式机手动测试了这些标志。 - Alex Cohn
3个回答

44
免责声明:以下描述适用于我更新答案时的Android Gradle Plugin(AGP)最新版本(aug '21)。如有兴趣,请查看编辑历史记录
@artyomd所指出的,对于AGP 4.2.0及更高版本,您可以将android.native.buildOutput gradle属性设置为verbose以强制进行cmake日志记录。
在Android Studio中,gradle会在模块根目录下为每个具有NDK集成(通过CMake或ndk-build)的模块创建.cxx目录。
对于CMake,gradle插件非常详细。对于每个构建变体,它都会创建单独的子目录,例如.cxx/cmake/debug/x86.cxx/cmake/release/armeabi-v7a等。
每个目录都包含一些有用的文件:cmake_build_command.txt描述了传递给CMake的实际参数;android_gradle_build.json显示gradle插件为您的二进制文件推导的参数;从build.ninja文件中,您可以推断出这些参数是如何应用于每个编译或链接步骤的。
对于ndk-buildandroid_gradle_build.json文件也非常有用。ndkBuild_build_command.txt列出了传递给ndk-build命令的所有参数,而ndkBuild_build_output.txt则是该命令的完整输出。您可以轻松地将V=1添加到参数中,例如:
externalNativeBuild {
  ndkBuild {
    cppFlags "-std=c++11"
    arguments "APP_STL=c++_static", "APP_OPTIM=release", "NDK_DEBUG=0", "V=1"
    abiFilters "armeabi-v7a"
  }
}

对于CMake,相关的参数是"-DCMAKE_VERBOSE_MAKEFILE=ON"(参见解释和替代方案):

externalNativeBuild {
  cmake {
    cppFlags "-std=c++11"
    arguments "-DCMAKE_VERBOSE_MAKEFILE=ON"
    abiFilters "armeabi-v7a"
  }
}

但是,正如@user7860670所观察到的那样,最近版本的AGP忽略了这个标志。

没有CMAKE_VERBOSE_MAKEFILE,Gradle控制台将显示:

:app:externalNativeBuildDebug
Build native-lib armeabi-v7a
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so

加上"-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"参数,我曾经获得了大量输出:

:app:externalNativeBuildDebug
Build native-lib armeabi-v7a

[1/2] /Users/alex/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/alex/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/alex/Library/Android/sdk/ndk-bundle/platforms/android-14/arch-arm  -Dnative_lib_EXPORTS -isystem /Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -isystem /Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/backward -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info  -fPIC -MD -MT CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -MF CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o -c /Users/alex/test/egl/app/src/main/cpp/native-lib.cpp
[2/2] : && /Users/alex/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++  --target=armv5te-none-linux-androideabi --gcc-toolchain=/Users/alex/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 --sysroot=/Users/alex/Library/Android/sdk/ndk-bundle/platforms/android-14/arch-arm -fPIC -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security  -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv5te -mtune=xscale -msoft-float -fno-integrated-as -mthumb -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info  -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ../../../../build/intermediates/cmake/debug/obj/armeabi-v7a/libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  -llog -lEGL -lGLESv2 -lm "/Users/alex/Library/Android/sdk/ndk-bundle/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_static.a" "-latomic" && :

不再使用了。据我所知,这些信息已由Gradle插件过滤并完全丢失。我只能手动恢复它:运行该命令

/Users/alex/Library/Android/sdk/cmake/3.10.2.4988404/bin/cmake --build app/.cxx/cmake/debug/armeabi-v7a

您可以使用Android Studio的终端窗口(Alt-F12)来进行操作。当使用-DCMAKE_VERBOSE_MAKEFILE=ON将C++与Gradle同步时,这将调用ninja并带有-v标志。

请注意,预期文件.cxx/cmake/debug/armeabi-v7a/cmake_build_output.txt不包含有趣的信息(除非您遇到了与CMake配置本身相关的问题)。

P.S. 对于这个3.6.0 Gradle插件,如果您有编译错误,则整个编译器的命令行将显示在“构建输出”窗口中,无论您是否设置了CMAKE_VERBOSE_MAKEFILE。实际上会显示两次:一次是黑底白字(我不使用暗色主题),第二次是棕色底白字,在此之后。

FAILURE: Build failed with an exception.

* What went wrong:

4
你的错误在于将具有CMakeLists.txt路径的"externalNativeBuild"块与"arguments"一起放置;但是"arguments"应该放在另一个块内,即在"android.defaultConfig"中。 - Alex Cohn
7
PS 我无法想象是什么心态想出了在 android.build.gradle DSL 中给完全不同的实体相同的名称的想法。 - Alex Cohn
4
注意:"-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" 看起来不再起作用。对我来说, "-DCMAKE_VERBOSE_MAKEFILE=ON" 起作用了。不确定发生了什么变化,我只是安装了Android Studio。 - Fake Name
2
"-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON" 被完全忽略了(cmake 服务器发出相应的警告),"-DCMAKE_VERBOSE_MAKEFILE=ON" 似乎也不再起作用。 - user7860670
1
最后,要更改构建目录(最近命名为.cxx),在另一个线程中找到了正确的解决方案,并提供了示例!请参见CMake文档以获取详细信息。 - Top-Master
显示剩余10条评论

3

作为一种丑陋的解决方案,我已经用自己的可执行文件替换了ninja,将所有命令传递给真正的ninja可执行文件并附加"-v"参数。


-5

尝试更新您的Gradle版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接