通过Gradle和Android NDK强制CMake处于详细模式

通过Gradle和Android NDK强制CMake处于详细模式,gradle,android-ndk,cmake,Gradle,Android Ndk,Cmake,我正在使用Gradle和CMake从命令行编译一个Android NDK项目。以前,我使用的是Ant和ndk build,但我正在尝试将项目完全迁移到Gradle和CMake 在我的build.gradle中,我有以下几行要调用CMake: externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } 现在,我如何强制CMake在发出所有编译器调用之前将它们打印到控制台?具体来说,我想看

我正在使用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
./gradlew build --debug
Gradle打印了一些东西,但没有编译器调用

3) 就像这样:

./gradlew build --info
./gradlew build --debug
Gradle打印了很多东西,但没有编译器调用

因此,这三次尝试都没有达到我想要的效果,这让我想知道如何才能看到CMake如何在我的单个源文件上运行叮当声?

免责声明:以下描述适用于我更新此答案时(1月20日)最新的Android Gradle插件版本。你可能会发现看电视很有趣

在Android Studio中,gradle通过CMake或NDK build在模块根目录下为每个具有NDK集成的模块创建目录
.cxx

对于CMake来说,gradle插件相当冗长。对于每个构建变量,它会创建单独的子目录,例如
.cxx/cmake/debug/x86
.cxx/cmake/release/armeabi-v7a

每个目录都包含一些有用的文件:cmake\u build\u command.txt描述传递给cmake的实际参数android_gradle_build.json显示gradle插件为二进制文件派生的参数;从build.ninja可以推断这些参数是如何应用于每个编译或链接步骤的

对于
ndk build
,android\u gradle\u build.json文件也非常有用
ndkBuild\u build\u command.txt
列出传递给ndk build命令的所有参数,
ndkBuild\u build\u 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\u VERBOSE\u MAKEFILE=ON”
(请参阅):

如果没有
CMAKE\u VERBOSE\u 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\u VERBOSE\u 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)。这将调用<强> >代码> -V/COD> <强>标志,当代码> -DCMAMIVE VBBOEYSMACHOFFILE = ON/CONT>被用来同步C++与Gradle。< /P> 请注意,预期的文件
.cxx/cmake/debug/armeabi-v7a/cmake_build_output.txt
不包含有趣的信息(除非您对cmake配置本身有问题)

p.S.使用此3.6.0Gradle插件,如果您有编译错误,则编译器的整个命令行将显示在生成输出窗口中,无论您是否设置
CMAKE\u VERBOSE\u MAKEFILE
。事实上,有两次:一次,黑白相间(我不使用黑色主题),第二次,棕色和白色相间,之后

FAILURE: Build failed with an exception.

* What went wrong:

尝试更新你的gradle版本。

作为一个难看的解决方法,我用我自己的可执行文件替换了ninja,该可执行文件将所有命令传递给真正的ninja可执行文件,并附加
“-v”

检查
.externalNativeBuild
项目根目录;它可能包含所有与您相关的信息的确,非常好,谢谢!有一个
build.ninja
日志文件,其中包含所有基本信息。如果您想将您的评论作为答案发布,我将接受。另请参阅一些更新:我终于到达我的桌面手动测试标志。@Peeton:您的错误是将其放在externalNativeBuild块中,路径为CMakeLists.txt;但是参数应该进入另一个模块,在android.defaultConfigPS中,我无法想象在android.build.gradle DSLNote:
“-DCMAKE\u VERBOSE\u MAKEFILE:BOOL=ON”
中产生给完全不同的实体取相同名称的想法的心态
“-DCMAKE\u VERBOSE\u MAKEFILE=ON”
对我很有效。不确定发生了什么变化,我刚刚安装了android studio。
“-DCMAKE\u VERBOSE\u MAKEFILE:BOOL=ON”
被完全忽略(cmake服务器发出相应的警告),
“-DCMAKE\u VERBOSE\u MAKEFILE=ON”
似乎不再工作了,我设置了
“-DCMAKE\u VERBOSE\u MAKEFILE=ON”
我在
.cxx/cmake//armeabi-v7a/compile_commands.json
文件中找到了compile命令。