Support single static-library for libtim-vx.a (#237)

Fix external ovxlib build failure, and change install dir to CMAKE_INSTALL_LIBDIR

Signed-off-by: xiang.zhang <xiang.zhang@verisilicon.com>
Co-authored-by: yuenan.li <yuenan.li@verisilicon.com>
This commit is contained in:
Sven 2021-12-15 22:23:32 +08:00 committed by GitHub
parent 2c38f89d06
commit 321a53fd2a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 63 additions and 61 deletions

View File

@ -85,6 +85,12 @@ export DISABLE_IDE_DEBUG=1
3. add -DEXTERNAL_VIV_SDK=<low-level-driver/out/sdk> to cmake definitions, also remember -DCMAKE_TOOLCHAIN_FILE=<Your_Toolchain_Config> 3. add -DEXTERNAL_VIV_SDK=<low-level-driver/out/sdk> to cmake definitions, also remember -DCMAKE_TOOLCHAIN_FILE=<Your_Toolchain_Config>
4. then make 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 ### Bazel
[Install bazel](https://docs.bazel.build/versions/master/install.html) to get started. [Install bazel](https://docs.bazel.build/versions/master/install.html) to get started.

View File

@ -5,7 +5,7 @@ set(TARGET_NAME "lenet")
aux_source_directory(. ${TARGET_NAME}_SRCS) aux_source_directory(. ${TARGET_NAME}_SRCS)
add_executable(${TARGET_NAME} ${${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 target_include_directories(${TARGET_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/include

View File

@ -2,16 +2,6 @@ message("src/tim/vx")
set(TARGET_NAME "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 VX_SRC)
aux_source_directory(./vx/ops OPS_SRC) aux_source_directory(./vx/ops OPS_SRC)
@ -21,6 +11,16 @@ list(APPEND ${TARGET_NAME}_SRCS
${OPS_SRC} ${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(${TIM_VX_USE_EXTERNAL_OVXLIB})
if(NOT OVXLIB_INC) if(NOT OVXLIB_INC)
message(FATAL_ERROR "Set OVXLIB_INC if using external OVXLIB (TIM_VX_USE_EXTERNAL_OVXLIB)") message(FATAL_ERROR "Set OVXLIB_INC if using external OVXLIB (TIM_VX_USE_EXTERNAL_OVXLIB)")
@ -72,16 +72,21 @@ endif()
add_library(${TARGET_NAME} ${${TARGET_NAME}_SRCS}) add_library(${TARGET_NAME} ${${TARGET_NAME}_SRCS})
target_include_directories(${TARGET_NAME} PRIVATE ${INC_DIRS}) target_include_directories(${TARGET_NAME} PRIVATE ${INC_DIRS})
target_link_libraries(${TARGET_NAME} PUBLIC 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})
install(TARGETS ${TARGET_NAME} ${TARGET_NAME} if(${TIM_VX_USE_EXTERNAL_OVXLIB})
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib) #-Wl,--whole-archive should not applied to external library, but only for shared library
target_link_libraries(${TARGET_NAME} PUBLIC tim_internal)
if (CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64)
install(TARGETS ${TARGET_NAME} ${TARGET_NAME}
DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64)
endif() endif()
if (NOT CMAKE_INSTALL_LIBDIR)
set(CMAKE_INSTALL_LIBDIR "lib")
endif()
install(TARGETS ${TARGET_NAME} ${TARGET_NAME}
DESTINATION ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/vx install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/tim/vx
DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim) DESTINATION ${CMAKE_INSTALL_PREFIX}/include/tim)
@ -103,7 +108,7 @@ if(TIM_VX_ENABLE_TEST)
${CMAKE_CURRENT_SOURCE_DIR}/vx ${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() endif()
add_subdirectory("utils") add_subdirectory("utils")

View File

@ -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}
)

View File

@ -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}
)