From 7582644f579fbbc584da9e8dcad03b8eb7204fc1 Mon Sep 17 00:00:00 2001 From: Hector Li Date: Mon, 13 Jun 2022 08:15:37 -0700 Subject: [PATCH] cmake changes for SNPE EP (#11821) * move code used to find the SNPE libs to a separate cmake file * Roll back the change for libc++_shared, it's the one from SNPE SDK, otherwise it will cause uncaught exception of type std::bad_cast because of conflict --- cmake/CMakeLists.txt | 24 ++------------ cmake/find_snpe.cmake | 46 +++++++++++++++++++++++++++ cmake/onnxruntime_snpe_provider.cmake | 16 ---------- 3 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 cmake/find_snpe.cmake diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e5f4478d0e..f8dd369ce9 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1007,28 +1007,8 @@ if (onnxruntime_USE_CUDA) endif() if(onnxruntime_USE_SNPE) - if (NOT SNPE_ARCH_ABI) - if(MSVC) - string(TOLOWER ${CMAKE_GENERATOR_PLATFORM} GEN_PLATFORM) - message(STATUS "Building MSVC for architecture ${CMAKE_SYSTEM_PROCESSOR} with CMAKE_GENERATOR_PLATFORM as ${GEN_PLATFORM}") - if (${GEN_PLATFORM} STREQUAL "arm64") - set(SNPE_ARCH_ABI aarch64-windows-vc19) - else() - set(SNPE_ARCH_ABI x86_64-windows-vc19) - endif() - else() - if (CMAKE_SYSTEM_NAME STREQUAL "Android") - set(SNPE_ARCH_ABI aarch64-android-clang6.0) - elseif (LINUX) - if (${GEN_PLATFORM} STREQUAL "x64") - set(SNPE_ARCH_ABI x86_64-linux-clang) - else() - set(SNPE_ARCH_ABI aarch64-linux-gcc4.9) - endif() - endif() - endif() - list(APPEND onnxruntime_LINK_DIRS ${SNPE_ROOT}/lib/${SNPE_ARCH_ABI}) - endif() + include(find_snpe.cmake) + list(APPEND onnxruntime_EXTERNAL_LIBRARIES ${SNPE_NN_LIBS}) endif() FILE(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} ORT_BINARY_DIR) diff --git a/cmake/find_snpe.cmake b/cmake/find_snpe.cmake new file mode 100644 index 0000000000..1281ad9dc0 --- /dev/null +++ b/cmake/find_snpe.cmake @@ -0,0 +1,46 @@ +if (NOT SNPE_ARCH_ABI) + if(MSVC) + string(TOLOWER ${CMAKE_GENERATOR_PLATFORM} GEN_PLATFORM) + message(STATUS "Building MSVC for architecture ${CMAKE_SYSTEM_PROCESSOR} with CMAKE_GENERATOR_PLATFORM as ${GEN_PLATFORM}") + if (${GEN_PLATFORM} STREQUAL "arm64") + set(SNPE_ARCH_ABI aarch64-windows-vc19) + else() + set(SNPE_ARCH_ABI x86_64-windows-vc19) + endif() + else() + if (CMAKE_SYSTEM_NAME STREQUAL "Android") + set(SNPE_ARCH_ABI aarch64-android-clang6.0) + elseif (LINUX) + if (${GEN_PLATFORM} STREQUAL "x64") + set(SNPE_ARCH_ABI x86_64-linux-clang) + else() + set(SNPE_ARCH_ABI aarch64-linux-gcc4.9) + endif() + endif() + endif() + list(APPEND onnxruntime_LINK_DIRS ${SNPE_ROOT}/lib/${SNPE_ARCH_ABI}) +endif() +file(TO_CMAKE_PATH ${SNPE_ROOT} SNPE_ROOT) +get_filename_component(SNPE_CMAKE_DIR ${SNPE_ROOT} ABSOLUTE) +file(TO_CMAKE_PATH "${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI}" SNPE_LIB_DIR) +file(TO_NATIVE_PATH ${SNPE_LIB_DIR} SNPE_NATIVE_DIR) +message(STATUS "Looking for SNPE library in ${SNPE_NATIVE_DIR}") +find_library(SNPE NAMES snpe SNPE libSNPE.so PATHS "${SNPE_NATIVE_DIR}" "${SNPE_ROOT}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH REQUIRED) + +file(GLOB SNPE_SO_FILES LIST_DIRECTORIES false "${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI}/*.so" "${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI}/*.dll") +# add dsp skel files to distribution +file(GLOB SNPE_DSP_FILES LIST_DIRECTORIES false "${SNPE_CMAKE_DIR}/lib/dsp/*.so") +list(APPEND SNPE_SO_FILES ${QCDK_FILES} ${SNPE_DSP_FILES}) + +if(NOT SNPE OR NOT SNPE_SO_FILES) + message(ERROR "Snpe not found in ${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI} for platform ${CMAKE_GENERATOR_PLATFORM}") +endif() + +set(SNPE_NN_LIBS ${SNPE}) +if(ANDROID) + # Use libc++_shared.so from SNPE SDK + list(APPEND SNPE_NN_LIBS libc++_shared.so) +endif() + +message(STATUS "SNPE library at ${SNPE}") +message(STATUS "SNPE so/dlls in ${SNPE_SO_FILES}") \ No newline at end of file diff --git a/cmake/onnxruntime_snpe_provider.cmake b/cmake/onnxruntime_snpe_provider.cmake index 0f06de4365..b9f35b3de6 100644 --- a/cmake/onnxruntime_snpe_provider.cmake +++ b/cmake/onnxruntime_snpe_provider.cmake @@ -10,19 +10,6 @@ file(GLOB_RECURSE "${ONNXRUNTIME_ROOT}/core/providers/snpe/*.cc" ) -if(ANDROID) - # Specify the link libraries - set(SNPE_NN_LIBS ${SNPE} libc++_shared.so) -else() - set(SNPE_NN_LIBS ${SNPE}) -endif() - -file(TO_CMAKE_PATH ${SNPE_ROOT} SNPE_ROOT) -get_filename_component(SNPE_CMAKE_DIR ${SNPE_ROOT} ABSOLUTE) -file(TO_CMAKE_PATH "${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI}" SNPE_LIB_DIR) -file(TO_NATIVE_PATH ${SNPE_LIB_DIR} SNPE_NATIVE_DIR) -message(STATUS "Looking for SNPE library in ${SNPE_NATIVE_DIR}") -find_library(SNPE NAMES snpe SNPE libSNPE.so PATHS "${SNPE_NATIVE_DIR}" "${SNPE_ROOT}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH REQUIRED) file(GLOB SNPE_SO_FILES LIST_DIRECTORIES false "${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI}/*.so" "${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI}/*.dll") # add dsp skel files to distribution file(GLOB SNPE_DSP_FILES LIST_DIRECTORIES false "${SNPE_CMAKE_DIR}/lib/dsp/*.so") @@ -31,14 +18,11 @@ list(APPEND SNPE_SO_FILES ${QCDK_FILES} ${SNPE_DSP_FILES}) if(NOT SNPE OR NOT SNPE_SO_FILES) message(ERROR "Snpe not found in ${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI} for platform ${CMAKE_GENERATOR_PLATFORM}") endif() -message(STATUS "SNPE library at ${SNPE}") -message(STATUS "SNPE so/dlls in ${SNPE_SO_FILES}") source_group(TREE ${ONNXRUNTIME_ROOT}/core FILES ${onnxruntime_providers_snpe_cc_srcs}) onnxruntime_add_static_library(onnxruntime_providers_snpe ${onnxruntime_providers_snpe_cc_srcs}) onnxruntime_add_include_to_target(onnxruntime_providers_snpe onnxruntime_common onnxruntime_framework onnx onnx_proto protobuf::libprotobuf-lite flatbuffers) link_directories(${SNPE_CMAKE_DIR}/lib/${SNPE_ARCH_ABI} ${SNPE_CMAKE_DIR}/lib/dsp) -target_link_libraries(onnxruntime_providers_snpe PRIVATE SNPE ${SNPE_NN_LIBS}) add_dependencies(onnxruntime_providers_snpe onnx ${onnxruntime_EXTERNAL_DEPENDENCIES}) set_target_properties(onnxruntime_providers_snpe PROPERTIES CXX_STANDARD_REQUIRED ON) set_target_properties(onnxruntime_providers_snpe PROPERTIES FOLDER "ONNXRuntime")