diff --git a/README.md b/README.md index 9f5c289..2e3f992 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,12 @@ export DISABLE_IDE_DEBUG=1 3. add -DEXTERNAL_VIV_SDK= to cmake definitions, also remember -DCMAKE_TOOLCHAIN_FILE= 4. then make + +#### Notes for integration +If you want to build tim-vx as a static library, and link it to your shared library or application, please be carefull with the linker, "-Wl,--whole-archive" is required. + +@see samples/lenet/CMakeLists.txt for reference + ### Bazel [Install bazel](https://docs.bazel.build/versions/master/install.html) to get started. diff --git a/samples/lenet/CMakeLists.txt b/samples/lenet/CMakeLists.txt index d8a170e..6e0fbef 100644 --- a/samples/lenet/CMakeLists.txt +++ b/samples/lenet/CMakeLists.txt @@ -5,8 +5,8 @@ set(TARGET_NAME "lenet") aux_source_directory(. ${TARGET_NAME}_SRCS) add_executable(${TARGET_NAME} ${${TARGET_NAME}_SRCS}) -target_link_libraries(${TARGET_NAME} PRIVATE tim-vx) +target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive tim-vx) target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/include -) \ No newline at end of file +) diff --git a/src/tim/CMakeLists.txt b/src/tim/CMakeLists.txt index 0303d51..0a8ab2b 100644 --- a/src/tim/CMakeLists.txt +++ b/src/tim/CMakeLists.txt @@ -2,16 +2,6 @@ message("src/tim/vx") set(TARGET_NAME "tim-vx") -if(${TIM_VX_USE_EXTERNAL_OVXLIB}) - find_library(OVXLIB_LIB NAMES "ovxlib") - message(STATUS "Using external OVXLIB from ${OVXLIB_LIB}") - add_library(tim_internal SHARED IMPORTED) - set_target_properties(tim_internal PROPERTIES IMPORTED_LOCATION ${OVXLIB_LIB}) - target_link_libraries(tim_internal INTERFACE ${OVXDRV_LIBRARIES}) -else() - add_subdirectory("vx/internal") -endif() - aux_source_directory(./vx VX_SRC) aux_source_directory(./vx/ops OPS_SRC) @@ -21,6 +11,16 @@ list(APPEND ${TARGET_NAME}_SRCS ${OPS_SRC} ) +if(${TIM_VX_USE_EXTERNAL_OVXLIB}) + find_library(OVXLIB_LIB NAMES "ovxlib") + message(STATUS "Using external OVXLIB from ${OVXLIB_LIB}") + add_library(tim_internal SHARED IMPORTED) + set_target_properties(tim_internal PROPERTIES IMPORTED_LOCATION ${OVXLIB_LIB}) + target_link_libraries(tim_internal INTERFACE ${OVXDRV_LIBRARIES}) +else() + include(vx/internal/tim_internal.cmake) +endif() + if(${TIM_VX_USE_EXTERNAL_OVXLIB}) if(NOT OVXLIB_INC) message(FATAL_ERROR "Set OVXLIB_INC if using external OVXLIB (TIM_VX_USE_EXTERNAL_OVXLIB)") @@ -72,15 +72,20 @@ endif() add_library(${TARGET_NAME} ${${TARGET_NAME}_SRCS}) target_include_directories(${TARGET_NAME} PRIVATE ${INC_DIRS}) target_link_libraries(${TARGET_NAME} PUBLIC - -Wl,--whole-archive tim_internal -Wl,--no-whole-archive ${EXTERNAL_LIBS}) + -Wl,--no-whole-archive ${EXTERNAL_LIBS} ${OVXDRV_LIBRARIES}) + +if(${TIM_VX_USE_EXTERNAL_OVXLIB}) + #-Wl,--whole-archive should not applied to external library, but only for shared library + target_link_libraries(${TARGET_NAME} PUBLIC tim_internal) +endif() + +if (NOT CMAKE_INSTALL_LIBDIR) + set(CMAKE_INSTALL_LIBDIR "lib") +endif() + install(TARGETS ${TARGET_NAME} ${TARGET_NAME} - DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) - -if (CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) - install(TARGETS ${TARGET_NAME} ${TARGET_NAME} - DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64) -endif() + DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/vx DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim) @@ -103,7 +108,7 @@ if(TIM_VX_ENABLE_TEST) ${CMAKE_CURRENT_SOURCE_DIR}/vx ) - install(TARGETS unit_test DESTINATION ${CMAKE_INSTALL_PREFIX}/bin) + install(TARGETS unit_test DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}) endif() add_subdirectory("utils") diff --git a/src/tim/vx/internal/CMakeLists.txt b/src/tim/vx/internal/CMakeLists.txt deleted file mode 100644 index a707d65..0000000 --- a/src/tim/vx/internal/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -message("src/tim/vx/internal") - -set(TARGET_NAME "tim_internal") -set(OVXLIB_API_ATTR "__attribute__\(\(visibility\(\"default\"\)\)\)") -add_definitions(-DOVXLIB_API=${OVXLIB_API_ATTR}) - -aux_source_directory(src INTERNAL_SRC) -aux_source_directory(src/kernel INTERNAL_KERNEL) -aux_source_directory(src/kernel/cl INTERNAL_KERNEL_CL) -aux_source_directory(src/kernel/cpu INTERNAL_KERNEL_CPU) -aux_source_directory(src/kernel/evis INTERNAL_KERNEL_EVIS) -aux_source_directory(src/kernel/vx INTERNAL_KERNEL_VX) -aux_source_directory(src/ops INTERNAL_OPS) -aux_source_directory(src/libnnext INTERNAL_LIBNNEXT) -aux_source_directory(src/quantization INTERNAL_QUANTIZATION) -aux_source_directory(src/custom/ops INTERNAL_CUSTOM_OPS) -aux_source_directory(src/custom/ops/kernel INTERNAL_CUSTOM_OPS_KERNEL) -aux_source_directory(src/utils INTERNAL_UTILS) - -set(${TARGET_NAME}_SRCS) -list(APPEND ${TARGET_NAME}_SRCS - ${INTERNAL_SRC} - ${INTERNAL_KERNEL} - ${INTERNAL_KERNEL_CL} - ${INTERNAL_KERNEL_CPU} - ${INTERNAL_KERNEL_EVIS} - ${INTERNAL_KERNEL_VX} - ${INTERNAL_OPS} - ${INTERNAL_LIBNNEXT} - ${INTERNAL_QUANTIZATION} - ${INTERNAL_CUSTOM_OPS} - ${INTERNAL_CUSTOM_OPS_KERNEL} - ${INTERNAL_UTILS} -) - -add_library(${TARGET_NAME} STATIC ${${TARGET_NAME}_SRCS}) -target_link_libraries(${TARGET_NAME} PRIVATE ${OVXDRV_LIBRARIES}) -target_include_directories(${TARGET_NAME} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${OVXDRV_INCLUDE_DIRS} -) diff --git a/src/tim/vx/internal/tim_internal.cmake b/src/tim/vx/internal/tim_internal.cmake new file mode 100644 index 0000000..b52a034 --- /dev/null +++ b/src/tim/vx/internal/tim_internal.cmake @@ -0,0 +1,32 @@ +message("src/tim/vx/internal") + +set(OVXLIB_API_ATTR "__attribute__\(\(visibility\(\"default\"\)\)\)") +add_definitions(-DOVXLIB_API=${OVXLIB_API_ATTR}) + +aux_source_directory(./vx/internal/src INTERNAL_SRC) +aux_source_directory(./vx/internal/src/kernel INTERNAL_KERNEL) +aux_source_directory(./vx/internal/src/kernel/cl INTERNAL_KERNEL_CL) +aux_source_directory(./vx/internal/src/kernel/cpu INTERNAL_KERNEL_CPU) +aux_source_directory(./vx/internal/src/kernel/evis INTERNAL_KERNEL_EVIS) +aux_source_directory(./vx/internal/src/kernel/vx INTERNAL_KERNEL_VX) +aux_source_directory(./vx/internal/src/ops INTERNAL_OPS) +aux_source_directory(./vx/internal/src/libnnext INTERNAL_LIBNNEXT) +aux_source_directory(./vx/internal/src/quantization INTERNAL_QUANTIZATION) +aux_source_directory(./vx/internal/src/custom/ops INTERNAL_CUSTOM_OPS) +aux_source_directory(./vx/internal/src/custom/ops/kernel INTERNAL_CUSTOM_OPS_KERNEL) +aux_source_directory(./vx/internal/src/utils INTERNAL_UTILS) + +list(APPEND ${TARGET_NAME}_SRCS + ${INTERNAL_SRC} + ${INTERNAL_KERNEL} + ${INTERNAL_KERNEL_CL} + ${INTERNAL_KERNEL_CPU} + ${INTERNAL_KERNEL_EVIS} + ${INTERNAL_KERNEL_VX} + ${INTERNAL_OPS} + ${INTERNAL_LIBNNEXT} + ${INTERNAL_QUANTIZATION} + ${INTERNAL_CUSTOM_OPS} + ${INTERNAL_CUSTOM_OPS_KERNEL} + ${INTERNAL_UTILS} +)