Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hotfix for NDK r19c #231

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 12 additions & 36 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,6 @@ if((NOT ANDROID_PLATFORM) AND (NOT GNULINUX_PLATFORM) AND (NOT IOS_PLATFORM))
message(FATAL_ERROR "No platform is defined! see doc/building.md for build instructions.")
endif()

if(DEFINED NE10_ANDROID_TARGET_ARCH)
if(${NE10_ANDROID_TARGET_ARCH} STREQUAL "armv7")
set(NE10_TARGET_ARCH "armv7")
else()
set(NE10_TARGET_ARCH "aarch64")
endif()
endif()

if(NOT DEFINED NE10_LINUX_TARGET_ARCH AND DEFINED ENV{NE10_LINUX_TARGET_ARCH})
set(NE10_LINUX_TARGET_ARCH $ENV{NE10_LINUX_TARGET_ARCH})
endif()
Expand Down Expand Up @@ -105,39 +97,23 @@ endif(BUILD_DEBUG)
# By default, we compile c intrinsic.
set(NE10_ASM_OPTIMIZATION off)

if(ANDROID_PLATFORM)
if(NE10_ARM_HARD_FLOAT)
set(FLOAT_ABI "hard")
else()
set(FLOAT_ABI "softfp")
endif()

#TODO: Fine tune pic and pie flag for executable, share library and static library.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${NDK_SYSROOT_PATH} -pie")
string(APPEND CMAKE_C_FLAGS " -isysroot ${NDK_ISYSROOT_PATH}")
add_definitions(-D__ANDROID_API__=${ANDROID_API_LEVEL})

# Adding cflags for armv7. Aarch64 does not need such flags.
if(${NE10_TARGET_ARCH} STREQUAL "armv7")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -march=armv7-a -mfloat-abi=${FLOAT_ABI} -mfpu=vfp3")
if(NE10_ARM_HARD_FLOAT)
# "--no-warn-mismatch" is needed for linker to suppress linker error about not all functions use VFP register to pass argument, eg.
# .../arm-linux-androideabi/bin/ld: error: ..../test-float.o
# uses VFP register arguments, output does not
# There is call convension mismatch between NDK's crt*.o and ne10's object files.
# crt*.o still uses softfp while ne10's object files use hard floating point.
# Refer $NDK/tests/device/hard-float/jni/Android.mk for more details.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--no-warn-mismatch")
endif()
# Turn on asm optimization for Android on ARM v7.
set(NE10_ASM_OPTIMIZATION on)
endif()
message("-- Loaded toolchain:
message("-- Loaded toolchain:
${CMAKE_C_COMPILER}
${CMAKE_CXX_COMPILER}
${CMAKE_ASM_COMPILER}")
message("-- CMAKE_C_FLAGS:
${CMAKE_C_FLAGS}")

if(ANDROID_PLATFORM)
option(ANDROID_DEMO "Build Android Demo" ON)

if("${NE10_TARGET_ARCH}" STREQUAL "armv7")
set(NE10_ENABLE_IMGPROC OFF)
endif()

if(ANDROID_DEMO)
add_definitions(-DNE10_ANDROID_DEMO)
endif()
elseif(GNULINUX_PLATFORM)
if("${NE10_TARGET_ARCH}" STREQUAL "armv7")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -march=armv7-a -mfpu=vfp3 -funsafe-math-optimizations")
Expand Down
130 changes: 79 additions & 51 deletions android/android_config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -41,75 +41,103 @@
# Target architecture can be specified by setting NE10_ANDROID_TARGET_ARCH to
# aarch64 or armv7. Defaut is armv7.

set(CMAKE_SYSTEM_NAME Linux)
set(ANDROID_PLATFORM ON)

if(ANDROID_PLATFORM)
set(ANDROID_DEMO ON)
endif()
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING 1)

if(ANDROID_DEMO)
add_definitions(-DNE10_ANDROID_DEMO)
endif()
set(ANDROID_PLATFORM ON)

if(NOT DEFINED ENV{NE10_ANDROID_TARGET_ARCH})
set(NE10_ANDROID_TARGET_ARCH "armv7")
else()
set(NE10_ANDROID_TARGET_ARCH $ENV{NE10_ANDROID_TARGET_ARCH})
endif()

if(DEFINED ENV{ANDROID_NDK})
if(NOT DEFINED ENV{ANDROID_API_LEVEL})
set(ANDROID_API_LEVEL 21)
else()
set(ANDROID_API_LEVEL $ENV{ANDROID_API_LEVEL})
endif()
if(${NE10_ANDROID_TARGET_ARCH} STREQUAL "armv7")
set(NE10_TARGET_ARCH "armv7")
else()
set(NE10_TARGET_ARCH "aarch64")
endif()

if(NOT DEFINED ENV{ARM_ANDROID_TOOLCHAIN_VERSION})
set(ARM_ANDROID_TOOLCHAIN_VERSION 4.9)
else()
set(ARM_ANDROID_TOOLCHAIN_VERSION $ENV{ARM_ANDROID_TOOLCHAIN_VERSION})
endif()
if(NOT DEFINED ENV{ANDROID_NDK})
message(FATAL_ERROR "Could not find Android NDK. You should set an environment variable: export ANDROID_NDK=/your/path/to/android/ndk")
endif()

if(NOT DEFINED ENV{ANDROID_API_LEVEL})
set(ANDROID_API_LEVEL 21)
else()
set(ANDROID_API_LEVEL $ENV{ANDROID_API_LEVEL})
endif()
set(CMAKE_SYSTEM_VERSION ${ANDROID_API_LEVEL})

if(${NE10_ANDROID_TARGET_ARCH} STREQUAL "armv7")
set(ANDROID_NDK_PLATFORMS_ARCH_SUFFIX "arm")
set(ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX "arm-linux-androideabi")
elseif(${NE10_ANDROID_TARGET_ARCH} STREQUAL "aarch64")
if(${ANDROID_API_LEVEL} LESS "21")
message(FATAL_ERROR "Aarch64 target is only availiable under ANDROID_API_LEVEL version 21 and later. Current ANDROID_API_LEVEL is ${ANDROID_API_LEVEL}.")
endif()
set(ANDROID_NDK_PLATFORMS_ARCH_SUFFIX "arm64")
set(ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX "aarch64-linux-android")
else()
message(FATAL_ERROR "No NE10_ANDROID_TARGET_ARCH is specified, availiable target architectures are: armv7, aarch64.")
if(${NE10_ANDROID_TARGET_ARCH} STREQUAL "armv7")
set(ANDROID_NDK_PLATFORMS_ARCH_SUFFIX "arm")
set(ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX "armv7a-linux-androideabi")
elseif(${NE10_ANDROID_TARGET_ARCH} STREQUAL "aarch64")
if(${ANDROID_API_LEVEL} LESS "21")
message(FATAL_ERROR "Aarch64 target is only availiable under ANDROID_API_LEVEL version 21 and later. Current ANDROID_API_LEVEL is ${ANDROID_API_LEVEL}.")
endif()
set(ANDROID_NDK_PLATFORMS_ARCH_SUFFIX "arm64")
set(ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX "aarch64-linux-android")
else()
message(FATAL_ERROR "No NE10_ANDROID_TARGET_ARCH is specified, availiable target architectures are: armv7, aarch64.")
endif()

#NDK_SYSROOT_PATH is used in compiler's '--sysroot' flags
set(NDK_SYSROOT_PATH "$ENV{ANDROID_NDK}/platforms/android-${ANDROID_API_LEVEL}/arch-${ANDROID_NDK_PLATFORMS_ARCH_SUFFIX}/")
set(NDK_ISYSROOT_PATH "$ENV{ANDROID_NDK}/sysroot -I$ENV{ANDROID_NDK}/sysroot/usr/include/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}")
#NDK_SYSROOT_PATH is used in compiler's '--sysroot' flags
set(NDK_SYSROOT_PATH "$ENV{ANDROID_NDK}/platforms/android-${ANDROID_API_LEVEL}/arch-${ANDROID_NDK_PLATFORMS_ARCH_SUFFIX}/")
set(NDK_ISYSROOT_PATH "$ENV{ANDROID_NDK}/sysroot -I$ENV{ANDROID_NDK}/sysroot/usr/include/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}")

if(APPLE)
#TODO: Check whether this path is correct for aarch64 under mac.
set(ANDROID_TOOLCHAIN_PATH "$ENV{ANDROID_NDK}/toolchains/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-${ARM_ANDROID_TOOLCHAIN_VERSION}/prebuilt/darwin-x86_64/bin")
else()
set(ANDROID_TOOLCHAIN_PATH "$ENV{ANDROID_NDK}/toolchains/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-${ARM_ANDROID_TOOLCHAIN_VERSION}/prebuilt/linux-x86_64/bin")
endif()
if(APPLE)
#TODO: Check whether this path is correct for aarch64 under mac.
set(ANDROID_TOOLCHAIN_PATH "$ENV{ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin")
else()
set(ANDROID_TOOLCHAIN_PATH "$ENV{ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin")
endif()

#change toolchain name according to your configuration
set(CMAKE_C_COMPILER ${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-g++)
set(CMAKE_ASM_COMPILER ${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-as)
#change toolchain name according to your configuration
set(CMAKE_C_COMPILER ${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}${ANDROID_API_LEVEL}-clang)
set(CMAKE_CXX_COMPILER ${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}${ANDROID_API_LEVEL}-clang++)

if(${NE10_ANDROID_TARGET_ARCH} STREQUAL "armv7")
set(CMAKE_ASM_COMPILER "$ENV{ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/as")
find_program(CMAKE_AR NAMES "$ENV{ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ar")
find_program(CMAKE_RANLIB NAMES "$ENV{ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/arm-linux-androideabi/bin/ranlib")
else()
set(CMAKE_ASM_COMPILER ${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-as)
find_program(CMAKE_AR NAMES "${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-ar")
find_program(CMAKE_RANLIB NAMES "${ANDROID_TOOLCHAIN_PATH}/${ANDROID_NDK_TOOLCHAIN_CROSS_PREFIX}-ranlib")
endif()

# Skip the platform compiler checks for cross compiling
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_ASM_COMPILER_WORKS TRUE)
mark_as_advanced(CMAKE_AR)
mark_as_advanced(CMAKE_RANLIB)
# Skip the platform compiler checks for cross compiling
set(CMAKE_C_COMPILER_WORKS 1)
set(CMAKE_CXX_COMPILER_WORKS 1)
set(CMAKE_ASM_COMPILER_WORKS 1)
mark_as_advanced(CMAKE_AR)
mark_as_advanced(CMAKE_RANLIB)

if(NE10_ARM_HARD_FLOAT)
set(FLOAT_ABI "hard")
else()
message(FATAL_ERROR "Could not find Android NDK. You should set an environment variable: export ANDROID_NDK=/your/path/to/android/ndk")
set(FLOAT_ABI "softfp")
endif()

#TODO: Fine tune pic and pie flag for executable, share library and static library.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${NDK_SYSROOT_PATH} -pie")
string(APPEND CMAKE_C_FLAGS " -isysroot ${NDK_ISYSROOT_PATH}")
# set(CMAKE_ASM_FLAGS "")
add_definitions(-D__ANDROID_API__=${ANDROID_API_LEVEL})

# Adding cflags for armv7. Aarch64 does not need such flags.
if(${NE10_TARGET_ARCH} STREQUAL "armv7")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -march=armv7-a -mfloat-abi=${FLOAT_ABI} -mfpu=vfp3")
if(NE10_ARM_HARD_FLOAT)
# "--no-warn-mismatch" is needed for linker to suppress linker error about not all functions use VFP register to pass argument, eg.
# .../arm-linux-androideabi/bin/ld: error: ..../test-float.o
# uses VFP register arguments, output does not
# There is call convension mismatch between NDK's crt*.o and ne10's object files.
# crt*.o still uses softfp while ne10's object files use hard floating point.
# Refer $NDK/tests/device/hard-float/jni/Android.mk for more details.
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--no-warn-mismatch")
endif()
# Turn on asm optimization for Android on ARM v7.
set(NE10_ASM_OPTIMIZATION OFF)
endif()
2 changes: 1 addition & 1 deletion circle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ build_steps: &build_steps
ln -s ${CMAKE_BIN_DIR}/cpack ${LOCAL_BIN_DIR}/cpack
ln -s ${CMAKE_BIN_DIR}/ctest ${LOCAL_BIN_DIR}/ctest
elif [ "${PLATFORM}" == "android" ]; then
NDK_VERSION="r16b"
NDK_VERSION="r19c"
sudo apt-get update
sudo apt-get install cmake
cd ${HOME}
Expand Down
19 changes: 16 additions & 3 deletions cmake/FunctionSwitch.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,18 @@

# Following definition is only available under armv7.
if("${NE10_TARGET_ARCH}" STREQUAL "armv7")
if(IOS_PLATFORM)
# We use intrinsic for iOS, no definition is needed.
else()
if(ANDROID_PLATFORM)
if(NE10_ENABLE_PHYSICS)
add_definitions(-DENABLE_NE10_PHYSICS_COMPUTE_AABB_VEC2F_NEON)
add_definitions(-DENABLE_NE10_PHYSICS_RELATIVE_V_VEC2F_NEON)
add_definitions(-DENABLE_NE10_PHYSICS_APPLY_IMPULSE_VEC2F_NEON)
endif()
if(NE10_ENABLE_IMGPROC)
add_definitions(-DENABLE_NE10_IMG_ROTATE_RGBA_NEON)
endif()
endif()

if (GNULINUX_PLATFORM)
if(NE10_ENABLE_DSP)
add_definitions(-DENABLE_NE10_FIR_FLOAT_NEON)
add_definitions(-DENABLE_NE10_FIR_DECIMATE_FLOAT_NEON)
Expand All @@ -47,4 +56,8 @@ if("${NE10_TARGET_ARCH}" STREQUAL "armv7")
add_definitions(-DENABLE_NE10_IMG_ROTATE_RGBA_NEON)
endif()
endif()

if(IOS_PLATFORM)
# We use intrinsic for iOS, no definition is needed.
endif()
endif()
14 changes: 9 additions & 5 deletions modules/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,15 @@ if(NE10_ENABLE_DSP)
if(IOS_PLATFORM)
else()
# Add dsp NEON files.
set(NE10_DSP_NEON_SRCS
${NE10_DSP_NEON_SRCS}
${PROJECT_SOURCE_DIR}/modules/dsp/NE10_fir.neon.s
${PROJECT_SOURCE_DIR}/modules/dsp/NE10_iir.neon.s
)
if(NE10_ASM_OPTIMIZATION)
set(NE10_DSP_NEON_SRCS
${NE10_DSP_NEON_SRCS}
${PROJECT_SOURCE_DIR}/modules/dsp/NE10_fir.neon.s
${PROJECT_SOURCE_DIR}/modules/dsp/NE10_iir.neon.s
)
else()
# TODO
endif()
endif()
endif()

Expand Down