halide / Halide

a language for fast, portable data-parallel computation
https://halide-lang.org
Other
5.84k stars 1.07k forks source link

Bazel build does not work with Android armeabi-v7a/arm64-v8a #2539

Open llhe opened 6 years ago

llhe commented 6 years ago

System info:

  1. Halide official release used: halide-linux-64-gcc53-trunk-3af238615667312dcb46607752e3ae5d0ec5d713
  2. Host gcc version: 5.4 (also tested with 4.8 with Halide gcc48, same result)
  3. Android NDK: android-ndk-r12b (does not work for android-ndk-r15c either)

Repro steps:

  1. cd apps/bazeldemo
  2. Make some necessary edits
    diff --git a/apps/bazeldemo/BUILD b/apps/bazeldemo/BUILD
    index 281a9ff..fd082c1 100644
    --- a/apps/bazeldemo/BUILD
    +++ b/apps/bazeldemo/BUILD
    @@ -13,4 +13,6 @@ cc_binary(
       ":bazeldemo",
       "@halide//:halide_buffer"
     ],
    +    copts = ["-std=c++11"],
    +    linkopts = ["-latomic", "-llog", "-pie"],
    )
    diff --git a/apps/bazeldemo/WORKSPACE b/apps/bazeldemo/WORKSPACE
    index 4bd29ac..1eb0ff8 100644
    --- a/apps/bazeldemo/WORKSPACE
    +++ b/apps/bazeldemo/WORKSPACE
    @@ -1,5 +1,11 @@
    # Note that this requires you to have built the toplevel Halide 'distrib' folder via 'make distrib'
    local_repository(
    name = "halide",
    -  path = "../../distrib",
    +  #path = "../../distrib",
    +  path = "path/to/halide-linux-64-gcc53-trunk-3af238615667312dcb46607752e3ae5d0ec5d713/",
    +)
    +
    +android_ndk_repository(
    +  name = "androidndk",
    +  api_level = 21
    )
  3. Make some fix to make the NDK linker happy inside halide-linux-64-gcc53-trunk-3af238615667312dcb46607752e3ae5d0ec5d713 (this also a bug?)
    diff --git a/halide.bzl b/halide.bzl
    index 8fe6fa8..26d407c 100644
    --- a/halide.bzl
    +++ b/halide.bzl
    @@ -62,7 +62,7 @@ def halide_language_linkopts():
    def halide_runtime_linkopts():
    _posix_opts = [
       "-ldl",
    -      "-lpthread",
    +      "-pthread",
    ]
    _android_opts = [
       "-llog",

Build log:

heliangliang@llhe:~/work/Halide/apps/bazeldemo$ bazel build -c opt --verbose_failures //:main --crosstool_top=//external:android/crosstool --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cpu=armeabi
INFO: Found 1 target...
Target //:main up-to-date:
  bazel-bin/main
INFO: Elapsed time: 0.357s, Critical Path: 0.01s
heliangliang@llhe:~/work/Halide/apps/bazeldemo$ bazel clean
INFO: Starting clean (this may take a while). Consider using --async if the clean takes more than several minutes.
heliangliang@llhe:~/work/Halide/apps/bazeldemo$ bazel build -c opt --verbose_failures //:main --crosstool_top=//external:android/crosstool --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cpu=armeabi-v7a
INFO: Found 1 target...
ERROR: /home/heliangliang/work/Halide/apps/bazeldemo/BUILD:9:1: Linking of rule '//:main' failed (Exit 1): arm-linux-androideabi-gcc failed: error executing command 
  (cd /home/heliangliang/.cache/bazel/_bazel_heliangliang/58fd03f90180152f4266a6860e680e75/execroot/__main__ && \
  exec env - \
    PATH=/home/heliangliang/app/jdk/jdk1.8.0_25/bin:/home/heliangliang/app/bin:/home/heliangliang/app/idea-IC-171.4424.56/bin/:/home/heliangliang/app/apache-maven-3.3.9/bin:/home/heliangliang/app/phabricator/arcanist/bin:/home/heliangliang/app/protobuf3.1.0/bin:/home/heliangliang/bin:/home/heliangliang/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/heliangliang/work/minos/client:/home/heliangliang/work/android-toolchains/aarch64-linux-android-4.9/bin:/home/heliangliang/work/android-toolchains/arm-linux-androideabi-4.9/bin:/home/heliangliang/go/bin \
    PWD=/proc/self/cwd \
  external/androidndk/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -o bazel-out/arm-linux-androideabi-4.9-v7a-gnu-libstdcpp-opt/bin/main bazel-out/arm-linux-androideabi-4.9-v7a-gnu-libstdcpp-opt/bin/_objs/main/main.o bazel-out/arm-linux-androideabi-4.9-v7a-gnu-libstdcpp-opt/genfiles/x86_64_osx/bazeldemo.a bazel-out/arm-linux-androideabi-4.9-v7a-gnu-libstdcpp-opt/bin/external/halide/libhalide_library_runtime.a external/androidndk/ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a external/androidndk/ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libsupc++.a -latomic -llog -pie -ldl -pthread -static-libgcc -no-canonical-prefixes '-march=armv7-a' -Wl,--fix-cortex-a8 '--sysroot=external/androidndk/ndk/platforms/android-21/arch-arm')

Use --sandbox_debug to see verbose messages from the sandbox.
external/androidndk/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: bazel-out/arm-linux-androideabi-4.9-v7a-gnu-libstdcpp-opt/genfiles/x86_64_osx/bazeldemo.a: no archive symbol table (run ranlib)
external/androidndk/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin/ld: error: bazel-out/arm-linux-androideabi-4.9-v7a-gnu-libstdcpp-opt/bin/external/halide/libhalide_library_runtime.a: no archive symbol table (run ranlib)
main.cpp:20: error: undefined reference to 'bazeldemo(halide_buffer_t*, float, halide_buffer_t*)'
collect2: error: ld returned 1 exit status
Target //:main failed to build
INFO: Elapsed time: 6.660s, Critical Path: 5.68s
heliangliang@llhe:~/work/Halide/apps/bazeldemo$ bazel clean
INFO: Starting clean (this may take a while). Consider using --async if the clean takes more than several minutes.
heliangliang@llhe:~/work/Halide/apps/bazeldemo$ bazel build -c opt --verbose_failures //:main --crosstool_top=//external:android/crosstool --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cpu=arm64-v8a
INFO: Found 1 target...
ERROR: /home/heliangliang/work/Halide/apps/bazeldemo/BUILD:9:1: Linking of rule '//:main' failed (Exit 1): aarch64-linux-android-gcc failed: error executing command 
  (cd /home/heliangliang/.cache/bazel/_bazel_heliangliang/58fd03f90180152f4266a6860e680e75/execroot/__main__ && \
  exec env - \
    PATH=/home/heliangliang/app/jdk/jdk1.8.0_25/bin:/home/heliangliang/app/bin:/home/heliangliang/app/idea-IC-171.4424.56/bin/:/home/heliangliang/app/apache-maven-3.3.9/bin:/home/heliangliang/app/phabricator/arcanist/bin:/home/heliangliang/app/protobuf3.1.0/bin:/home/heliangliang/bin:/home/heliangliang/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/heliangliang/work/minos/client:/home/heliangliang/work/android-toolchains/aarch64-linux-android-4.9/bin:/home/heliangliang/work/android-toolchains/arm-linux-androideabi-4.9/bin:/home/heliangliang/go/bin \
    PWD=/proc/self/cwd \
  external/androidndk/ndk/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc -o bazel-out/aarch64-linux-android-4.9-gnu-libstdcpp-opt/bin/main bazel-out/aarch64-linux-android-4.9-gnu-libstdcpp-opt/bin/_objs/main/main.o bazel-out/aarch64-linux-android-4.9-gnu-libstdcpp-opt/genfiles/x86_64_osx/bazeldemo.a bazel-out/aarch64-linux-android-4.9-gnu-libstdcpp-opt/bin/external/halide/libhalide_library_runtime.a external/androidndk/ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libgnustl_static.a external/androidndk/ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libsupc++.a -latomic -llog -pie -ldl -pthread -static-libgcc -no-canonical-prefixes '--sysroot=external/androidndk/ndk/platforms/android-21/arch-arm64')

Use --sandbox_debug to see verbose messages from the sandbox.
bazel-out/aarch64-linux-android-4.9-gnu-libstdcpp-opt/genfiles/x86_64_osx/bazeldemo.a: error adding symbols: Archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status
Target //:main failed to build
INFO: Elapsed time: 6.818s, Critical Path: 5.86s
steven-johnson commented 6 years ago

What version of Bazel are you using?

steven-johnson commented 6 years ago

Please note that cpu=armeabi isn't supported by Halide (and never has been, Bazel or otherwise); for 32-bit ARM support, armeabi-v7a is the minimum supported.

steven-johnson commented 6 years ago

(Unfortunately, it's going to take me a while to get around to looking at this. Patches would be welcomed.)

llhe commented 6 years ago

Build version: 0.5.4