web-dev-qa-db-ja.com

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に、コンソールへのすべてのコンパイラー呼び出しを強制的に出力させてから、コンソールに出力させるにはどうすればよいですか?具体的には、CMakeがコンパイラとリンカーをどのように実行するかを確認したいと思います。

私はすでに次のことを試しましたが、まったく役に立ちません:

1)CMakeLists.txtに次の行を追加しました:

set(CMAKE_VERBOSE_MAKEFILE on)

効果はありませんでした。

2)私はこのようにビルドを開始しました:

./gradlew build --info

Gradleは一部を出力しましたが、コンパイラー呼び出しはしませんでした。

3)そしてこのように:

./gradlew build --debug

Gradleはたくさんのものを印刷しましたが、コンパイラー呼び出しはしませんでした。

したがって、これら3つの試みのどれも私が望んでいたことを行わなかったので、CMakeが個々のソースファイルでclangを実行する方法をどのように確認できるのでしょうか。

16
Andreas

Android Studio、gradleでは、NDKを持つ各モジュールについて、モジュールルートの下にディレクトリ.externalNativeBuildを作成しますCMakeまたはndk-buildを介した統合。

CMakeの場合、gradleプラグインはかなり冗長です。ビルドバリアントごとに、個別のサブディレクトリを作成します。 .externalNativeBuild/cmake/debug/x86または.externalNativeBuild/cmake/release/armeabi-v7aなど.

各ディレクトリには、いくつかの有用なファイルが含まれています。cmake_build_command.txtは、CMakeに渡される実際のパラメーターを記述します。 Android_gradle_build.jsonは、バイナリ用にGradleプラグインが派生したパラメーターを示します。 build.ninjaから、これらのパラメーターが各コンパイルまたはリンケージステップにどのように適用されたかを推測できます。

ndk-buildの場合、Android_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:BOOL=ON"です(説明と代替案を参照):

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

CMAKE_VERBOSE_MAKEFILEがない場合、Gradle Consoleには次のように表示されます。

: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" && :

明白なファイル.externalNativeBuild/cmake/debug/armeabi-v7a/cmake_build_output.txtには、興味深い情報が含まれていません(CMake構成に問題がある場合自体を除く)。 Gradleはこの出力をファイルに書き込みませんが、コマンドラインリダイレクトを使用できます。Gradleログはどこにあるか を参照してください。 をご覧ください。

26
Alex Cohn

Gradleバージョンを更新してみてください。

0
zhen She

醜い回避策として、忍者を実際の忍者実行可能ファイルにすべてのコマンドを渡す独自の実行可能ファイルに置き換え、"-v"

0
user7860670