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

And*_*eas 14 cmake gradle android-ndk

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

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

externalNativeBuild {
    cmake {
        path "src/main/cpp/CMakeLists.txt"
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我怎样才能强制CMake在它出现之前将所有编译器调用打印到控制台?具体来说,我想看看CMake如何运行编译器和链接器.

我已经尝试了以下,但都无济于事:

1)在我,CMakeLists.txt我已经把以下行:

set(CMAKE_VERBOSE_MAKEFILE on)
Run Code Online (Sandbox Code Playgroud)

没有任何影响.

2)我已经开始构建这样的:

./gradlew build --info
Run Code Online (Sandbox Code Playgroud)

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

3)并且像这样:

./gradlew build --debug
Run Code Online (Sandbox Code Playgroud)

Gradle打印了很多东西,但是没有编译器调用.

所以这三次尝试都没有做到我想要的东西让我想知道我怎么能看到CMake如何在我的个人源文件上运行?

Ale*_*ohn 28

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

对于CMake,gradle插件非常冗长.对于每个构建变体,它创建单独的子目录,例如.cxx.externalNativeBuild等.

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

对于.externalNativeBuild/cmake/debug/x86,该.externalNativeBuild/cmake/release/armeabi-v7a文件也非常有用.ndk-build列出传递给ndk-build命令的所有参数,并且android_gradle_build.json是该命令的未删节输出.您可以轻松添加ndkBuild_build_command.txt参数,例如

externalNativeBuild {
  ndkBuild {
    cppFlags "-std=c++11"
    arguments "APP_STL=c++_static", "APP_OPTIM=release", "NDK_DEBUG=0", "V=1"
    abiFilters "armeabi-v7a"
  }
}
Run Code Online (Sandbox Code Playgroud)

因为ndkBuild_build_output.txt,相关的论点是V=1(见解释和备选方案):

externalNativeBuild {
  cmake {
    cppFlags "-std=c++11"
    arguments "-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
    abiFilters "armeabi-v7a"
  }
}
Run Code Online (Sandbox Code Playgroud)

没有CMake,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
Run Code Online (Sandbox Code Playgroud)

有了"-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" && :
Run Code Online (Sandbox Code Playgroud)

明显的文件CMAKE_VERBOSE_MAKEFILE不包含有趣的信息(除非你本身有CMake配置问题).Gradle不会将此输出写入文件,但您可以使用命令行重定向,请参阅Gradle日志在哪里?.

  • PS我无法想象想出的想法是给android.build.gradle DSL中完全不同的实体提供相同的名称 (4认同)
  • 注意:““-DCMAKE_VERBOSE_MAKEFILE:BOOL = ON”`似乎不再起作用。“ -DCMAKE_VERBOSE_MAKEFILE = ON”对我有用。不知道发生了什么变化,我刚刚安装了android studio。 (3认同)
  • @peetonn:你的错误是你将它放在带有**path**的**externalNativeBuild**块中给CMakeLists.txt; 但是**参数**应该进入另一个块,里面是**android.defaultConfig** (2认同)
  • `"-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"` 被完全忽略(cmake 服务器发出相应的警告),`"-DCMAKE_VERBOSE_MAKEFILE=ON"` 似乎也不再工作 (2认同)