mirror of
https://github.com/PaddlePaddle/FastDeploy.git
synced 2025-12-24 13:28:13 +08:00
Merge branch 'develop' of https://github.com/PaddlePaddle/FastDeploy into develop
This commit is contained in:
@@ -204,7 +204,6 @@ if(ENABLE_OPENVINO_BACKEND)
|
||||
add_definitions(-DENABLE_OPENVINO_BACKEND)
|
||||
list(APPEND ALL_DEPLOY_SRCS ${DEPLOY_OPENVINO_SRCS})
|
||||
include(${PROJECT_SOURCE_DIR}/cmake/openvino.cmake)
|
||||
list(APPEND DEPEND_LIBS external_openvino)
|
||||
endif()
|
||||
|
||||
if(WITH_GPU)
|
||||
@@ -414,6 +413,7 @@ install(
|
||||
${PROJECT_SOURCE_DIR}/ThirdPartyNotices.txt
|
||||
${PROJECT_SOURCE_DIR}/VERSION_NUMBER
|
||||
${PROJECT_SOURCE_DIR}/FastDeploy.cmake
|
||||
${PROJECT_SOURCE_DIR}/cmake/utils.cmake
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
install(
|
||||
|
||||
@@ -20,6 +20,9 @@ set(FASTDEPLOY_LIBS "")
|
||||
set(FASTDEPLOY_INCS "")
|
||||
list(APPEND FASTDEPLOY_INCS ${CMAKE_CURRENT_LIST_DIR}/include)
|
||||
|
||||
# Note(zhoushunjie): include some useful utils function
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/utils.cmake)
|
||||
|
||||
if(NOT CMAKE_CXX_STANDARD)
|
||||
set(CMAKE_CXX_STANDARD 11)
|
||||
endif()
|
||||
@@ -57,8 +60,10 @@ if(ENABLE_PADDLE_BACKEND)
|
||||
endif()
|
||||
|
||||
if(ENABLE_OPENVINO_BACKEND)
|
||||
find_library(OPENVINO_LIB openvino ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/openvino/lib/ NO_DEFAULT_PATH)
|
||||
list(APPEND FASTDEPLOY_LIBS ${OPENVINO_LIB})
|
||||
set(OPENVINO_FILENAME @OPENVINO_FILENAME@)
|
||||
get_openvino_libs(${CMAKE_CURRENT_LIST_DIR}/third_libs/install/${OPENVINO_FILENAME}/runtime)
|
||||
message(STATUS "OPENVINO_LIBS = ${OPENVINO_LIBS}")
|
||||
list(APPEND FASTDEPLOY_LIBS ${OPENVINO_LIBS})
|
||||
endif()
|
||||
|
||||
if(WITH_GPU)
|
||||
@@ -100,8 +105,6 @@ if (ENABLE_TEXT)
|
||||
find_library(FASTER_TOKENIZER_LIB core_tokenizers ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/faster_tokenizer/lib NO_DEFAULT_PATH)
|
||||
list(APPEND FASTDEPLOY_LIBS ${FASTER_TOKENIZER_LIB})
|
||||
list(APPEND FASTDEPLOY_INCS ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/faster_tokenizer/include)
|
||||
# TODO (zhoushunjie): Will remove it later.
|
||||
list(APPEND FASTDEPLOY_INCS ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/faster_tokenizer/include/faster_tokenizer)
|
||||
list(APPEND FASTDEPLOY_INCS ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/faster_tokenizer/third_party/include)
|
||||
endif()
|
||||
|
||||
@@ -110,6 +113,9 @@ if(ENABLE_PADDLE_FRONTEND)
|
||||
list(APPEND FASTDEPLOY_LIBS ${PADDLE2ONNX_LIB})
|
||||
endif()
|
||||
|
||||
message("FASTDEPLOY_LIBS = ${FASTDEPLOY_LIBS}")
|
||||
remove_duplicate_libraries(FASTDEPLOY_LIBS)
|
||||
|
||||
# Print compiler information
|
||||
message(STATUS "")
|
||||
message(STATUS "*************FastDeploy Building Summary**********")
|
||||
@@ -132,6 +138,7 @@ endif()
|
||||
message(STATUS " ENABLE_TRT_BACKEND : ${ENABLE_TRT_BACKEND}")
|
||||
message(STATUS " ENABLE_VISION : ${ENABLE_VISION}")
|
||||
message(STATUS " ENABLE_TEXT : ${ENABLE_TEXT}")
|
||||
message(STATUS " DEPENDENCY_LIBS : ${FASTDEPLOY_LIBS}")
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.4.0")
|
||||
|
||||
@@ -285,7 +285,7 @@ int main(int argc, char* argv[]) {
|
||||
- **加入社区👬:** 微信扫描二维码,进入**FastDeploy技术交流群**
|
||||
|
||||
<div align="center">
|
||||
<img src="https://user-images.githubusercontent.com/54695910/190932769-f36c0173-0fe6-4cab-9bba-f05e550b834f.jpg" width = "225" height = "225" />
|
||||
<img src="https://user-images.githubusercontent.com/54695910/192177204-811f114f-5393-4abb-bb7a-bdc70e0833be.jpeg" width = "225" height = "225" />
|
||||
</div>
|
||||
|
||||
## Acknowledge
|
||||
|
||||
@@ -299,7 +299,7 @@ Notes:
|
||||
- **Join Us👬:** Scan the QR code via WeChat to join our **FastDeploy technology communication group**
|
||||
|
||||
<div align="center">
|
||||
<img src="https://user-images.githubusercontent.com/54695910/190932769-f36c0173-0fe6-4cab-9bba-f05e550b834f.jpg" width = "225" height = "225" />
|
||||
<img src="https://user-images.githubusercontent.com/54695910/192177204-811f114f-5393-4abb-bb7a-bdc70e0833be.jpeg" width = "225" height = "225" />
|
||||
</div>
|
||||
|
||||
## Acknowledge
|
||||
|
||||
@@ -17,8 +17,8 @@ include(ExternalProject)
|
||||
# update eigen to the commit id f612df27 on 03/16/2021
|
||||
set(EIGEN_PREFIX_DIR ${THIRD_PARTY_PATH}/eigen3)
|
||||
set(EIGEN_SOURCE_DIR ${THIRD_PARTY_PATH}/eigen3/src/extern_eigen3)
|
||||
#set(EIGEN_REPOSITORY https://gitlab.com/libeigen/eigen.git)
|
||||
set(EIGEN_REPOSITORY https://gitee.com/jiangjiajun/eigen.git)
|
||||
set(EIGEN_REPOSITORY https://gitlab.com/libeigen/eigen.git)
|
||||
#set(EIGEN_REPOSITORY https://gitee.com/jiangjiajun/eigen.git)
|
||||
set(EIGEN_TAG f612df273689a19d25b45ca4f8269463207c4fee)
|
||||
|
||||
if(WIN32)
|
||||
@@ -64,4 +64,4 @@ add_dependencies(eigen3 extern_eigen3)
|
||||
# sw not support thread_local semantic
|
||||
if(WITH_SW)
|
||||
add_definitions(-DEIGEN_AVOID_THREAD_LOCAL)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -15,118 +15,75 @@
|
||||
include(ExternalProject)
|
||||
|
||||
set(OPENVINO_PROJECT "extern_openvino")
|
||||
set(OPENVINO_PREFIX_DIR ${THIRD_PARTY_PATH}/openvino)
|
||||
set(OPENVINO_INSTALL_DIR ${THIRD_PARTY_PATH}/install/openvino)
|
||||
set(OPENVINO_INSTALL_INC_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/include"
|
||||
CACHE PATH "openvino install include directory." FORCE)
|
||||
|
||||
if (WIN32)
|
||||
set(OPENVINO_SOURCE_DIR
|
||||
${THIRD_PARTY_PATH}/openvino/src/${OPENVINO_PROJECT}/openvino-win-x64-2022.1.0)
|
||||
set(OPENVINO_INC_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/include"
|
||||
"${OPENVINO_INSTALL_DIR}/include/ie"
|
||||
CACHE PATH "openvino include directory." FORCE)
|
||||
set(OPENVINO_LIB_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/lib/"
|
||||
CACHE PATH "openvino lib directory." FORCE)
|
||||
else()
|
||||
set(OPENVINO_SOURCE_DIR
|
||||
${THIRD_PARTY_PATH}/openvino/src/${OPENVINO_PROJECT})
|
||||
set(OPENVINO_INC_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/include"
|
||||
CACHE PATH "openvino include directory." FORCE)
|
||||
set(OPENVINO_LIB_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/lib/"
|
||||
CACHE PATH "openvino lib directory." FORCE)
|
||||
endif()
|
||||
|
||||
|
||||
set(CMAKE_BUILD_RPATH "${CMAKE_BUILD_RPATH}" "${OPENVINO_LIB_DIR}")
|
||||
|
||||
set(OPENVINO_VERSION "2022.3.0")
|
||||
set(OPENVINO_VERSION "2022.2.0.dev20220829")
|
||||
set(OPENVINO_URL_PREFIX "https://bj.bcebos.com/fastdeploy/third_libs/")
|
||||
|
||||
set(COMPRESSED_SUFFIX ".tgz")
|
||||
if(WIN32)
|
||||
set(OPENVINO_FILENAME "openvino-win-x64-${OPENVINO_VERSION}.zip")
|
||||
set(OPENVINO_FILENAME "w_openvino_toolkit_windows_${OPENVINO_VERSION}")
|
||||
set(COMPRESSED_SUFFIX ".zip")
|
||||
if(NOT CMAKE_CL_64)
|
||||
message(FATAL_ERROR "FastDeploy cannot ENABLE_OPENVINO_BACKEND in win32 now.")
|
||||
endif()
|
||||
elseif(APPLE)
|
||||
message(FATAL_ERROR "FastDeploy cannot ENABLE_OPENVINO_BACKEND in Mac OSX now.")
|
||||
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64")
|
||||
set(OPENVINO_FILENAME "openvino-osx-arm64-${OPENVINO_VERSION}.tgz")
|
||||
message("Cannot compile with openvino while in osx arm64 platform right now")
|
||||
else()
|
||||
set(OPENVINO_FILENAME "openvino-osx-x86_64-${OPENVINO_VERSION}.tgz")
|
||||
set(OPENVINO_FILENAME "m_openvino_toolkit_osx_${OPENVINO_VERSION}")
|
||||
endif()
|
||||
else()
|
||||
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
|
||||
message("Cannot compile with openvino while in linux-aarch64 platform")
|
||||
else()
|
||||
set(OPENVINO_FILENAME "openvino-linux-x64-${OPENVINO_VERSION}.tgz")
|
||||
set(OPENVINO_FILENAME "l_openvino_toolkit_centos7_${OPENVINO_VERSION}")
|
||||
endif()
|
||||
endif()
|
||||
set(OPENVINO_URL "${OPENVINO_URL_PREFIX}${OPENVINO_FILENAME}")
|
||||
set(OPENVINO_URL "${OPENVINO_URL_PREFIX}${OPENVINO_FILENAME}${COMPRESSED_SUFFIX}")
|
||||
|
||||
include_directories(${OPENVINO_INC_DIR}
|
||||
)# For OPENVINO code to include internal headers.
|
||||
set(OPENVINO_INSTALL_DIR ${THIRD_PARTY_PATH}/install/${OPENVINO_FILENAME}/runtime)
|
||||
set(OPENVINO_INSTALL_INC_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/include"
|
||||
"${OPENVINO_INSTALL_DIR}/include/ie"
|
||||
CACHE PATH "openvino install include directory." FORCE)
|
||||
|
||||
set(OPENVINO_LIB_DIR
|
||||
"${OPENVINO_INSTALL_DIR}/lib/"
|
||||
"${OPENVINO_INSTALL_DIR}/3rdparty/tbb/lib/"
|
||||
CACHE PATH "openvino lib directory." FORCE)
|
||||
set(CMAKE_BUILD_RPATH "${CMAKE_BUILD_RPATH}" "${OPENVINO_LIB_DIR}")
|
||||
|
||||
# For OPENVINO code to include internal headers.
|
||||
include_directories(${OPENVINO_INSTALL_INC_DIR})
|
||||
|
||||
download_and_decompress(${OPENVINO_URL}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/${OPENVINO_FILENAME}${COMPRESSED_SUFFIX}
|
||||
${THIRD_PARTY_PATH}/install)
|
||||
|
||||
if(WIN32)
|
||||
set(OPENVINO_LIB
|
||||
"${OPENVINO_INSTALL_DIR}/lib/openvino.lib"
|
||||
CACHE FILEPATH "OPENVINO static library." FORCE)
|
||||
file(GLOB_RECURSE OPENVINO_LIB_FILES ${OPENVINO_INSTALL_DIR}/lib/intel64/Release/*)
|
||||
file(COPY ${OPENVINO_LIB_FILES} DESTINATION ${OPENVINO_INSTALL_DIR}/lib/)
|
||||
file(REMOVE_RECURSE ${OPENVINO_INSTALL_DIR}/lib/intel64)
|
||||
|
||||
file(GLOB_RECURSE OPENVINO_BIN_FILES ${OPENVINO_INSTALL_DIR}/bin/intel64/Release/*)
|
||||
file(COPY ${OPENVINO_BIN_FILES} DESTINATION ${OPENVINO_INSTALL_DIR}/bin/)
|
||||
file(REMOVE_RECURSE ${OPENVINO_INSTALL_DIR}/bin/intel64)
|
||||
elseif(APPLE)
|
||||
set(OPENVINO_LIB
|
||||
"${OPENVINO_INSTALL_DIR}/lib/libopenvino.dylib"
|
||||
CACHE FILEPATH "OPENVINO static library." FORCE)
|
||||
file(GLOB_RECURSE OPENVINO_LIB_FILES ${OPENVINO_INSTALL_DIR}/lib/intel64/Release/*)
|
||||
file(COPY ${OPENVINO_LIB_FILES} DESTINATION ${OPENVINO_INSTALL_DIR}/lib/)
|
||||
file(REMOVE_RECURSE ${OPENVINO_INSTALL_DIR}/lib/intel64)
|
||||
else()
|
||||
set(OPENVINO_LIB
|
||||
"${OPENVINO_INSTALL_DIR}/lib/libopenvino.so"
|
||||
CACHE FILEPATH "OPENVINO static library." FORCE)
|
||||
file(GLOB_RECURSE OPENVINO_LIB_FILES ${OPENVINO_INSTALL_DIR}/lib/intel64/*)
|
||||
file(COPY ${OPENVINO_LIB_FILES} DESTINATION ${OPENVINO_INSTALL_DIR}/lib/)
|
||||
file(REMOVE_RECURSE ${OPENVINO_INSTALL_DIR}/lib/intel64)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
ExternalProject_Add(
|
||||
${OPENVINO_PROJECT}
|
||||
${EXTERNAL_PROJECT_LOG_ARGS}
|
||||
URL ${OPENVINO_URL}
|
||||
PREFIX ${OPENVINO_PREFIX_DIR}
|
||||
DOWNLOAD_NO_PROGRESS 1
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
UPDATE_COMMAND ""
|
||||
INSTALL_COMMAND
|
||||
${CMAKE_COMMAND} -E remove_directory ${OPENVINO_INSTALL_DIR} &&
|
||||
${CMAKE_COMMAND} -E make_directory ${OPENVINO_INSTALL_DIR} &&
|
||||
${CMAKE_COMMAND} -E copy_directory ${OPENVINO_SOURCE_DIR}/lib/intel64/Release ${OPENVINO_INSTALL_DIR}/lib &&
|
||||
${CMAKE_COMMAND} -E copy_directory ${OPENVINO_SOURCE_DIR}/bin/intel64/Release ${OPENVINO_INSTALL_DIR}/bin &&
|
||||
${CMAKE_COMMAND} -E copy_directory ${OPENVINO_SOURCE_DIR}/include ${OPENVINO_INSTALL_INC_DIR} &&
|
||||
${CMAKE_COMMAND} -E copy_directory ${OPENVINO_SOURCE_DIR}/3rdparty ${OPENVINO_INSTALL_DIR}/3rdparty
|
||||
BUILD_BYPRODUCTS ${OPENVINO_LIB})
|
||||
else()
|
||||
ExternalProject_Add(
|
||||
${OPENVINO_PROJECT}
|
||||
${EXTERNAL_PROJECT_LOG_ARGS}
|
||||
URL ${OPENVINO_URL}
|
||||
PREFIX ${OPENVINO_PREFIX_DIR}
|
||||
DOWNLOAD_NO_PROGRESS 1
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
UPDATE_COMMAND ""
|
||||
INSTALL_COMMAND
|
||||
${CMAKE_COMMAND} -E remove_directory ${OPENVINO_INSTALL_DIR} &&
|
||||
${CMAKE_COMMAND} -E make_directory ${OPENVINO_INSTALL_DIR} &&
|
||||
${CMAKE_COMMAND} -E rename ${OPENVINO_SOURCE_DIR}/lib/intel64 ${OPENVINO_INSTALL_DIR}/lib &&
|
||||
${CMAKE_COMMAND} -E copy_directory ${OPENVINO_SOURCE_DIR}/include
|
||||
${OPENVINO_INSTALL_INC_DIR}
|
||||
BUILD_BYPRODUCTS ${OPENVINO_LIB})
|
||||
endif()
|
||||
file(REMOVE_RECURSE ${THIRD_PARTY_PATH}/install/${OPENVINO_FILENAME}/docs)
|
||||
file(REMOVE_RECURSE ${THIRD_PARTY_PATH}/install/${OPENVINO_FILENAME}/install_dependencies)
|
||||
file(REMOVE_RECURSE ${THIRD_PARTY_PATH}/install/${OPENVINO_FILENAME}/samples)
|
||||
file(REMOVE_RECURSE ${THIRD_PARTY_PATH}/install/${OPENVINO_FILENAME}/setupvars.sh)
|
||||
file(REMOVE_RECURSE ${THIRD_PARTY_PATH}/install/${OPENVINO_FILENAME}/tools)
|
||||
|
||||
if(UNIX)
|
||||
add_custom_target(patchelf_openvino ALL COMMAND bash -c "sh ${PROJECT_SOURCE_DIR}/scripts/patch_lib.sh ${OPENVINO_INSTALL_DIR}/lib" DEPENDS ${LIBRARY_NAME})
|
||||
endif()
|
||||
|
||||
add_library(external_openvino STATIC IMPORTED GLOBAL)
|
||||
set_property(TARGET external_openvino PROPERTY IMPORTED_LOCATION ${OPENVINO_LIB})
|
||||
add_dependencies(external_openvino ${OPENVINO_PROJECT})
|
||||
get_openvino_libs(${OPENVINO_INSTALL_DIR})
|
||||
message("OPENVINO_LIBS = ${OPENVINO_LIBS}")
|
||||
list(APPEND DEPEND_LIBS ${OPENVINO_LIBS})
|
||||
@@ -26,3 +26,36 @@ function(download_and_decompress url filename decompress_dir)
|
||||
message("Decompress file ${filename} ...")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar -xf ${filename} WORKING_DIRECTORY ${decompress_dir})
|
||||
endfunction()
|
||||
|
||||
function(get_openvino_libs OPENVINO_RUNTIME_DIR)
|
||||
set(LIB_LIST "")
|
||||
find_library(OPENVINO_LIB openvino ${OPENVINO_RUNTIME_DIR}/lib/ NO_DEFAULT_PATH)
|
||||
list(APPEND LIB_LIST ${OPENVINO_LIB})
|
||||
|
||||
find_package(TBB PATHS "${OPENVINO_RUNTIME_DIR}/3rdparty/tbb")
|
||||
if (TBB_FOUND)
|
||||
list(APPEND LIB_LIST ${TBB_IMPORTED_TARGETS})
|
||||
else()
|
||||
# TODO(zhoushunjie): Use openvino with tbb on linux in future.
|
||||
set(OMP_LIB "${OPENVINO_RUNTIME_DIR}/3rdparty/omp/lib/libiomp5.so")
|
||||
list(APPEND LIB_LIST ${OMP_LIB})
|
||||
endif()
|
||||
set(OPENVINO_LIBS ${LIB_LIST} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(remove_duplicate_libraries libraries)
|
||||
list(LENGTH ${libraries} lib_length)
|
||||
set(libraries_temp "")
|
||||
set(full_libraries "")
|
||||
foreach(lib_path ${${libraries}})
|
||||
get_filename_component(lib_name ${lib_path} NAME)
|
||||
list(FIND libraries_temp ${lib_name} lib_idx)
|
||||
if (${lib_idx} EQUAL -1)
|
||||
list(APPEND libraries_temp ${lib_name})
|
||||
list(APPEND full_libraries ${lib_path})
|
||||
endif()
|
||||
endforeach()
|
||||
set(${libraries} ${full_libraries} PARENT_SCOPE)
|
||||
list(LENGTH full_libraries lib_length)
|
||||
endfunction()
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ def process_on_linux(current_dir):
|
||||
if d not in ["lib", "lib64"]:
|
||||
continue
|
||||
rel_path = os.path.relpath(os.path.join(root, d), libs_path)
|
||||
if path in user_specified_dirs:
|
||||
if path in user_specified_dirs:
|
||||
# Note(zhoushunjie): Use the absolute path for user_specified_dirs
|
||||
rpath = os.path.join(root, d)
|
||||
else:
|
||||
@@ -78,14 +78,18 @@ def process_on_mac(current_dir):
|
||||
for d in dirs:
|
||||
if d not in ["lib", "lib64"]:
|
||||
continue
|
||||
rel_path = rel_path = os.path.relpath(os.path.join(root, d), libs_path)
|
||||
rpath = "$loader_path/" + rel_path
|
||||
for lib in fd_libs:
|
||||
pre_commands.append(
|
||||
"install_name_tool -delete_rpath '@loader_path/{}' {}".format(
|
||||
rpath, lib))
|
||||
commands.append("install_name_tool -add_rpath 'loader_path/{}' {}".
|
||||
format(rpath, lib))
|
||||
rel_path = os.path.relpath(os.path.join(root, d), libs_path)
|
||||
if path in user_specified_dirs:
|
||||
# Note(zhoushunjie): Use the absolute path for user_specified_dirs
|
||||
rpath = os.path.join(root, d)
|
||||
else:
|
||||
rpath = "$loader_path/" + rel_path
|
||||
for lib in fd_libs:
|
||||
pre_commands.append(
|
||||
"install_name_tool -delete_rpath '@loader_path/{}' {}".format(
|
||||
rpath, lib))
|
||||
commands.append("install_name_tool -add_rpath 'loader_path/{}' {}".
|
||||
format(rpath, lib))
|
||||
|
||||
for cmd in pre_commands:
|
||||
try:
|
||||
@@ -97,7 +101,6 @@ def process_on_mac(current_dir):
|
||||
assert subprocess.Popen(
|
||||
cmd, shell=True) != 0, "Execute command failed: {}".format(cmd)
|
||||
|
||||
|
||||
def process_on_windows(current_dir):
|
||||
libs_path = os.path.join(current_dir, "fastdeploy", "libs")
|
||||
third_libs_path = os.path.join(libs_path, "third_libs")
|
||||
|
||||
Reference in New Issue
Block a user