android-sdk-tools icon indicating copy to clipboard operation
android-sdk-tools copied to clipboard

Riscv64 support

Open jershell opened this issue 3 years ago • 13 comments

How i can to add riscv64? update: i found this https://github.com/riscv-android-src/riscv-android/blob/main/doc/prebuilt_projects.md for build prebuilds and ndk.

jershell avatar May 08 '22 12:05 jershell

Clang supports riscv backend, building from scratch is not required for ndk, you just need the sysroot of riscv

Do they provide precompiled toolchains? if there is, you can directly specify the sysroot flag clang --target=riscv64-linux-android --sysroot=/path/to/sysroot

Of course this just compiles, just like you can cross-compile aarch64 on x86_64, but you can't execute it

lzhiyong avatar May 09 '22 00:05 lzhiyong

I cant build it by error

Ubunut 22.04 LTS

/home/ubuntu/bld/sdk-tools-source/src/logging/liblog/pmsg_reader.cpp:199:9: error: use of undeclared identifier 'SSIZE_MAX'
  ret = SSIZE_MAX;
        ^
/home/ubuntu/bld/sdk-tools-source/src/logging/liblog/pmsg_reader.cpp:454:22: error: use of undeclared identifier 'SSIZE_MAX'
          if (ret == SSIZE_MAX) {
                     ^
/home/ubuntu/bld/sdk-tools-source/src/logging/liblog/pmsg_reader.cpp:468:18: error: use of undeclared identifier 'SSIZE_MAX'
  return (ret == SSIZE_MAX) ? -ENOENT : ret;

I think it related with some dependency.

What OS are you using to build it?

jershell avatar May 12 '22 13:05 jershell

ubuntu 21.04 android-ndk-r24 no dependency, the SSIZE_MAX is defined in android-ndk-r24/**/sysroot/usr/include/limits.h

python build.py \
    --ndk=/path/to/android-ndk-xxx \
    --arch aarch64

lzhiyong avatar May 12 '22 14:05 lzhiyong

For test scripts i decided in first just build by guide README.md. I took fresh docker image with ubuntu 22.04 installed tools and run command

python build.py \
    --ndk=/path/to/android-ndk-xxx \
    --arch aarch64

I have the error

...
- Found PythonInterp: /usr/bin/python3.10 (found version "3.10.4") 
-- 
-- 3.9.1.0
-- Found BISON: /usr/bin/bison (found version "3.8.2") 
-- Found FLEX: /usr/bin/flex (found version "2.6.4") 
-- /root/sdk-tools-source/src/aidl/aidl_language_l.cpp/root/sdk-tools-source/src/aidl/aidl_language_l.h
-- /root/sdk-tools-source/src/aidl/aidl_language_y.cpp/root/sdk-tools-source/src/aidl/aidl_language_y.h
-- Configuring done
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
M_LIBRARY
    linked by target "png-fix-itxt" in directory /root/sdk-tools-source/src/libpng
    linked by target "png" in directory /root/sdk-tools-source/src/libpng
    linked by target "png_static" in directory /root/sdk-tools-source/src/libpng

-- Generating done
CMake Generate step failed.  Build files cannot be regenerated correctly.

jershell avatar May 13 '22 13:05 jershell

modify src/libpng/CMakeLists.txt

if(UNIX AND NOT APPLE AND NOT BEOS AND NOT HAIKU)
  find_library(M_LIBRARY m)
else()
  # libm is not needed and/or not available
  set(M_LIBRARY "")
endif()

# set M_LIBRARY direct 
set(M_LIBRARY "m")

lzhiyong avatar May 13 '22 15:05 lzhiyong

I did it but have the error

ld: error: unable to find library -lpthread
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)

jershell avatar May 14 '22 14:05 jershell

modify CMakeLists.txt, change -lpthread to -lc

or

add a libpthread.so, for example execute the following command: echo 'INPUT(-lc)' > /path/to/android-ndk-xxx/**/sysroot/usr/lib/aarch64-linux-android/30/libpthread.so

android has no libpthread.so and librt.so libpthread == libc librt == libc

lzhiyong avatar May 15 '22 01:05 lzhiyong

i did it

    ar cr /path/to/android-ndk-xxx/**/sysroot/usr/lib/aarch64-linux-android/30/libpthread.a

but now I have another error related with libpng

[999/1474] Linking CXX executable bin/aapt
FAILED: bin/aapt 
: && /root/n24/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang++ -fcolor-diagnostics -fPIC -Wno-attributes -std=gnu++2a -O3 -DNDEBUG -static build-tools/CMakeFiles/aapt.dir/__/src/base/tools/aapt/Main.cpp.o -o bin/aapt  lib/liblibaapt.a  lib/liblibandroidfw.a  lib/liblibincfs.a  lib/liblibutils.a  lib/liblibcutils.a  lib/liblibselinux.a  lib/liblibsepol.a  lib/liblibziparchive.a  lib/liblibpackagelistparser.a  lib/liblibbase.a  lib/liblibbuildversion.a  lib/liblibprocessgroup.a  lib/libliblog.a  src/expat/libexpat.a  src/boringssl/crypto/libcrypto.a  src/pcre/libpcre2-8.a  lib/libjsoncpp.a  src/libpng/libpng16.a  -lc++_static  -ldl  -lz  src/fmtlib/libfmt.a  -lpthread  -lm && :
ld: error: undefined symbol: png_do_expand_palette_rgba8_neon
>>> referenced by pngrtran.c
>>>               pngrtran.c.o:(png_do_read_transformations) in archive src/libpng/libpng16.a

ld: error: undefined symbol: png_riffle_palette_neon
>>> referenced by pngrtran.c
>>>               pngrtran.c.o:(png_do_read_transformations) in archive src/libpng/libpng16.a

ld: error: undefined symbol: png_do_expand_palette_rgb8_neon
>>> referenced by pngrtran.c
>>>               pngrtran.c.o:(png_do_read_transformations) in archive src/libpng/libpng16.a

ld: error: undefined symbol: png_init_filter_functions_neon
>>> referenced by pngrutil.c
>>>               pngrutil.c.o:(png_read_filter_row) in archive src/libpng/libpng16.a
clang-14: error: linker command failed with exit code 1 (use -v to see invocation)

jershell avatar May 15 '22 11:05 jershell

modify libpng/CMakeLists.txt, about line 32

// enable NEON
add_definitions(-DPNG_ARM_NEON_INTRINSICS_AVAILABLE)

lzhiyong avatar May 15 '22 15:05 lzhiyong

I modified it, but same error For clean test I removed sdk-tools-src directory. Also tried

add_definitions(-DPNG_ARM_NEON_INTRINSICS_AVAILABLE=1)

in out I see

/root/sts/src/libpng/pngrtran.c:23:13: warning: 'PNG_ARM_NEON_INTRINSICS_AVAILABLE' macro redefined [-Wmacro-redefined]
#    define PNG_ARM_NEON_INTRINSICS_AVAILABLE
            ^
<command line>:1:9: note: previous definition is here
#define PNG_ARM_NEON_INTRINSICS_AVAILABLE 1
        ^

but I have same error

jershell avatar May 16 '22 12:05 jershell

This error comes from CMAKE_SYSTEM_PROCESSOR detection, CMAKE_SYSTEM_PROCESSOR == host arch(linux-x86_64), not aarch64 or arm, so the libpng_arm_sources source file will not be compiled, this problem will be fixed in the next update, use cmake_toolchain_file instead of using the clang compiler directly.

# set definitions and sources for arm
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR
  CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64")
  set(PNG_ARM_NEON_POSSIBLE_VALUES check on off)
  set(PNG_ARM_NEON "check" CACHE STRING "Enable ARM NEON optimizations:
     check: (default) use internal checking code;
     off: disable the optimizations;
     on: turn on unconditionally.")
  set_property(CACHE PNG_ARM_NEON PROPERTY STRINGS
     ${PNG_ARM_NEON_POSSIBLE_VALUES})
  list(FIND PNG_ARM_NEON_POSSIBLE_VALUES ${PNG_ARM_NEON} index)
  if(index EQUAL -1)
    message(FATAL_ERROR
            "PNG_ARM_NEON must be one of [${PNG_ARM_NEON_POSSIBLE_VALUES}]")
  elseif(NOT ${PNG_ARM_NEON} STREQUAL "off")
    set(libpng_arm_sources
      arm/arm_init.c
      arm/filter_neon.S
      arm/filter_neon_intrinsics.c
      arm/palette_neon_intrinsics.c)

    if(${PNG_ARM_NEON} STREQUAL "on")
      add_definitions(-DPNG_ARM_NEON_OPT=2)
    elseif(${PNG_ARM_NEON} STREQUAL "check")
      add_definitions(-DPNG_ARM_NEON_CHECK_SUPPORTED)
    endif()
  else()
    add_definitions(-DPNG_ARM_NEON_OPT=0)
  endif()
endif()

lzhiyong avatar May 17 '22 13:05 lzhiyong

You can also try to build it with Termux on the device, it should work note that, need to download the termux-ndk I provided, because requires api >= 30

lzhiyong avatar May 17 '22 13:05 lzhiyong