Fangjun Kuang
Committed by GitHub

Install binaries via pip install (#112)

When pepole use pip install sherpa-onnx, they also get the following binaries:

(py38) fangjuns-MacBook-Pro:bin fangjun$ ls -lh  sherpa-onnx*
-rwxr-xr-x  1 fangjun  staff    36K Apr  4 13:48 sherpa-onnx
-rwxr-xr-x  1 fangjun  staff    52K Apr  4 13:48 sherpa-onnx-microphone
-rwxr-xr-x  1 fangjun  staff    54K Apr  4 13:48 sherpa-onnx-microphone-offline
-rwxr-xr-x  1 fangjun  staff    37K Apr  4 13:48 sherpa-onnx-offline
-rwxr-xr-x  1 fangjun  staff   634K Apr  4 13:48 sherpa-onnx-offline-websocket-server
-rwxr-xr-x  1 fangjun  staff   710K Apr  4 13:48 sherpa-onnx-online-websocket-client
-rwxr-xr-x  1 fangjun  staff   651K Apr  4 13:48 sherpa-onnx-online-websocket-server
(py38) fangjuns-MacBook-Pro:bin fangjun$ pwd
/Users/fangjun/py38/bin
@@ -34,6 +34,8 @@ jobs: @@ -34,6 +34,8 @@ jobs:
34 CIBW_BEFORE_BUILD: "pip install -U cmake numpy" 34 CIBW_BEFORE_BUILD: "pip install -U cmake numpy"
35 CIBW_SKIP: "cp27-* cp35-* cp36-* *-win32 pp* *-musllinux* *-manylinux_i686" 35 CIBW_SKIP: "cp27-* cp35-* cp36-* *-win32 pp* *-musllinux* *-manylinux_i686"
36 CIBW_BUILD_VERBOSITY: 3 36 CIBW_BUILD_VERBOSITY: 3
  37 + CIBW_ENVIRONMENT_LINUX: LD_LIBRARY_PATH='/project/build/bdist.linux-x86_64/wheel/sherpa_onnx/lib'
  38 + CIBW_REPAIR_WHEEL_COMMAND_MACOS: ""
37 39
38 - name: Display wheels 40 - name: Display wheels
39 shell: bash 41 shell: bash
@@ -55,3 +57,16 @@ jobs: @@ -55,3 +57,16 @@ jobs:
55 python3 -m pip install wheel twine setuptools 57 python3 -m pip install wheel twine setuptools
56 58
57 twine upload ./wheelhouse/*.whl 59 twine upload ./wheelhouse/*.whl
  60 +
  61 + - name: Build sdist
  62 + shell: bash
  63 + run: |
  64 + python3 setup.py sdist
  65 + ls -l dist/*
  66 +
  67 + - name: Publish sdist to PyPI
  68 + env:
  69 + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
  70 + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
  71 + run: |
  72 + twine upload dist/sherpa-onnx-*.tar.gz
@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
5 5
6 import os 6 import os
7 import platform 7 import platform
  8 +import shutil
8 import sys 9 import sys
9 from pathlib import Path 10 from pathlib import Path
10 11
@@ -59,6 +60,7 @@ class BuildExtension(build_ext): @@ -59,6 +60,7 @@ class BuildExtension(build_ext):
59 # build/lib.linux-x86_64-3.8 60 # build/lib.linux-x86_64-3.8
60 os.makedirs(self.build_lib, exist_ok=True) 61 os.makedirs(self.build_lib, exist_ok=True)
61 62
  63 + out_bin_dir = Path(self.build_lib).parent / "sherpa_onnx" / "bin"
62 install_dir = Path(self.build_lib).resolve() / "sherpa_onnx" 64 install_dir = Path(self.build_lib).resolve() / "sherpa_onnx"
63 65
64 sherpa_onnx_dir = Path(__file__).parent.parent.resolve() 66 sherpa_onnx_dir = Path(__file__).parent.parent.resolve()
@@ -75,9 +77,9 @@ class BuildExtension(build_ext): @@ -75,9 +77,9 @@ class BuildExtension(build_ext):
75 77
76 extra_cmake_args += " -DSHERPA_ONNX_ENABLE_CHECK=OFF " 78 extra_cmake_args += " -DSHERPA_ONNX_ENABLE_CHECK=OFF "
77 extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PYTHON=ON " 79 extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PYTHON=ON "
78 - extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF " 80 + extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PORTAUDIO=ON "
79 extra_cmake_args += " -DSHERPA_ONNX_ENABLE_C_API=OFF " 81 extra_cmake_args += " -DSHERPA_ONNX_ENABLE_C_API=OFF "
80 - extra_cmake_args += " -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF " 82 + extra_cmake_args += " -DSHERPA_ONNX_ENABLE_WEBSOCKET=ON "
81 83
82 if "PYTHON_EXECUTABLE" not in cmake_args: 84 if "PYTHON_EXECUTABLE" not in cmake_args:
83 print(f"Setting PYTHON_EXECUTABLE to {sys.executable}") 85 print(f"Setting PYTHON_EXECUTABLE to {sys.executable}")
@@ -125,3 +127,21 @@ class BuildExtension(build_ext): @@ -125,3 +127,21 @@ class BuildExtension(build_ext):
125 "You can ask for help by creating an issue on GitHub.\n" 127 "You can ask for help by creating an issue on GitHub.\n"
126 "\nClick:\n\thttps://github.com/k2-fsa/sherpa-onnx/issues/new\n" # noqa 128 "\nClick:\n\thttps://github.com/k2-fsa/sherpa-onnx/issues/new\n" # noqa
127 ) 129 )
  130 +
  131 + suffix = ".exe" if is_windows() else ""
  132 + # Remember to also change setup.py
  133 +
  134 + binaries = ["sherpa-onnx"]
  135 + binaries += ["sherpa-onnx-offline"]
  136 + binaries += ["sherpa-onnx-microphone"]
  137 + binaries += ["sherpa-onnx-microphone-offline"]
  138 + binaries += ["sherpa-onnx-online-websocket-server"]
  139 + binaries += ["sherpa-onnx-offline-websocket-server"]
  140 + binaries += ["sherpa-onnx-online-websocket-client"]
  141 +
  142 + for f in binaries:
  143 + src_file = install_dir / "bin" / (f + suffix)
  144 + print(f"Copying {src_file} to {out_bin_dir}/")
  145 + shutil.copy(f"{src_file}", f"{out_bin_dir}/")
  146 +
  147 + shutil.rmtree(f"{install_dir}/bin")
@@ -149,7 +149,7 @@ function(download_onnxruntime) @@ -149,7 +149,7 @@ function(download_onnxruntime)
149 if(UNIX AND NOT APPLE) 149 if(UNIX AND NOT APPLE)
150 file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/lib*") 150 file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/lib*")
151 elseif(APPLE) 151 elseif(APPLE)
152 - file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/lib*dylib") 152 + file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/libonnxruntime.*.*dylib")
153 elseif(WIN32) 153 elseif(WIN32)
154 file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.dll") 154 file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.dll")
155 endif() 155 endif()
@@ -53,6 +53,23 @@ function(download_portaudio) @@ -53,6 +53,23 @@ function(download_portaudio)
53 endif() 53 endif()
54 54
55 add_subdirectory(${portaudio_SOURCE_DIR} ${portaudio_BINARY_DIR} EXCLUDE_FROM_ALL) 55 add_subdirectory(${portaudio_SOURCE_DIR} ${portaudio_BINARY_DIR} EXCLUDE_FROM_ALL)
  56 +
  57 + if(BUILD_SHARED_LIBS)
  58 + set_target_properties(portaudio PROPERTIES OUTPUT_NAME "sherpa-onnx-portaudio")
  59 +
  60 + if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32)
  61 + install(TARGETS portaudio DESTINATION ..)
  62 + else()
  63 + install(TARGETS portaudio DESTINATION lib)
  64 + endif()
  65 + else()
  66 + set_target_properties(portaudio_static PROPERTIES OUTPUT_NAME "sherpa-onnx-portaudio_static")
  67 + if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32)
  68 + install(TARGETS portaudio_static DESTINATION ..)
  69 + else()
  70 + install(TARGETS portaudio_static DESTINATION lib)
  71 + endif()
  72 + endif()
56 endfunction() 73 endfunction()
57 74
58 download_portaudio() 75 download_portaudio()
@@ -39,6 +39,28 @@ install_requires = [ @@ -39,6 +39,28 @@ install_requires = [
39 "numpy", 39 "numpy",
40 ] 40 ]
41 41
  42 +
  43 +def get_binaries_to_install():
  44 + bin_dir = Path("build") / "sherpa_onnx" / "bin"
  45 + bin_dir.mkdir(parents=True, exist_ok=True)
  46 + suffix = ".exe" if is_windows() else ""
  47 +
  48 + # Remember to also change cmake/cmake_extension.py
  49 + binaries = ["sherpa-onnx"]
  50 + binaries += ["sherpa-onnx-offline"]
  51 + binaries += ["sherpa-onnx-microphone"]
  52 + binaries += ["sherpa-onnx-microphone-offline"]
  53 + binaries += ["sherpa-onnx-online-websocket-server"]
  54 + binaries += ["sherpa-onnx-offline-websocket-server"]
  55 + binaries += ["sherpa-onnx-online-websocket-client"]
  56 +
  57 + exe = []
  58 + for f in binaries:
  59 + t = bin_dir / (f + suffix)
  60 + exe.append(str(t))
  61 + return exe
  62 +
  63 +
42 setuptools.setup( 64 setuptools.setup(
43 name=package_name, 65 name=package_name,
44 python_requires=">=3.6", 66 python_requires=">=3.6",
@@ -50,6 +72,7 @@ setuptools.setup( @@ -50,6 +72,7 @@ setuptools.setup(
50 "sherpa_onnx": "sherpa-onnx/python/sherpa_onnx", 72 "sherpa_onnx": "sherpa-onnx/python/sherpa_onnx",
51 }, 73 },
52 packages=["sherpa_onnx"], 74 packages=["sherpa_onnx"],
  75 + data_files=[("bin", get_binaries_to_install())],
53 url="https://github.com/k2-fsa/sherpa-onnx", 76 url="https://github.com/k2-fsa/sherpa-onnx",
54 long_description=read_long_description(), 77 long_description=read_long_description(),
55 long_description_content_type="text/markdown", 78 long_description_content_type="text/markdown",
1 include_directories(${CMAKE_SOURCE_DIR}) 1 include_directories(${CMAKE_SOURCE_DIR})
2 2
  3 +if(SHERPA_ONNX_ENABLE_PYTHON)
  4 + message(STATUS "PYTHON_EXECUTABLE: ${PYTHON_EXECUTABLE}")
  5 + execute_process(
  6 + COMMAND "${PYTHON_EXECUTABLE}" -c "import sys; print('.'.join(sys.version.split('.')[:2]))"
  7 + OUTPUT_STRIP_TRAILING_WHITESPACE
  8 + OUTPUT_VARIABLE PYTHON_VERSION
  9 + )
  10 + message(STATUS "PYTHON_VERSION: ${PYTHON_VERSION}")
  11 +endif()
  12 +
3 set(sources 13 set(sources
4 cat.cc 14 cat.cc
5 endpoint.cc 15 endpoint.cc
@@ -72,7 +82,15 @@ target_link_libraries(sherpa-onnx sherpa-onnx-core) @@ -72,7 +82,15 @@ target_link_libraries(sherpa-onnx sherpa-onnx-core)
72 target_link_libraries(sherpa-onnx-offline sherpa-onnx-core) 82 target_link_libraries(sherpa-onnx-offline sherpa-onnx-core)
73 if(NOT WIN32) 83 if(NOT WIN32)
74 target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") 84 target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  85 + target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  86 +
75 target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") 87 target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  88 + target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  89 +
  90 + if(SHERPA_ONNX_ENABLE_PYTHON)
  91 + target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  92 + target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  93 + endif()
76 endif() 94 endif()
77 95
78 if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32) 96 if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32)
@@ -91,12 +109,12 @@ install( @@ -91,12 +109,12 @@ install(
91 109
92 if(SHERPA_ONNX_HAS_ALSA) 110 if(SHERPA_ONNX_HAS_ALSA)
93 add_executable(sherpa-onnx-alsa sherpa-onnx-alsa.cc alsa.cc) 111 add_executable(sherpa-onnx-alsa sherpa-onnx-alsa.cc alsa.cc)
94 - target_link_libraries(sherpa-onnx-alsa PRIVATE sherpa-onnx-core) 112 + target_link_libraries(sherpa-onnx-alsa sherpa-onnx-core)
95 113
96 if(DEFINED ENV{SHERPA_ONNX_ALSA_LIB_DIR}) 114 if(DEFINED ENV{SHERPA_ONNX_ALSA_LIB_DIR})
97 - target_link_libraries(sherpa-onnx-alsa PRIVATE -L$ENV{SHERPA_ONNX_ALSA_LIB_DIR} -lasound) 115 + target_link_libraries(sherpa-onnx-alsa -L$ENV{SHERPA_ONNX_ALSA_LIB_DIR} -lasound)
98 else() 116 else()
99 - target_link_libraries(sherpa-onnx-alsa PRIVATE asound) 117 + target_link_libraries(sherpa-onnx-alsa asound)
100 endif() 118 endif()
101 install(TARGETS sherpa-onnx-alsa DESTINATION bin) 119 install(TARGETS sherpa-onnx-alsa DESTINATION bin)
102 endif() 120 endif()
@@ -118,8 +136,21 @@ if(SHERPA_ONNX_ENABLE_PORTAUDIO) @@ -118,8 +136,21 @@ if(SHERPA_ONNX_ENABLE_PORTAUDIO)
118 set(PA_LIB portaudio_static) 136 set(PA_LIB portaudio_static)
119 endif() 137 endif()
120 138
121 - target_link_libraries(sherpa-onnx-microphone PRIVATE ${PA_LIB} sherpa-onnx-core)  
122 - target_link_libraries(sherpa-onnx-microphone-offline PRIVATE ${PA_LIB} sherpa-onnx-core) 139 + target_link_libraries(sherpa-onnx-microphone ${PA_LIB} sherpa-onnx-core)
  140 + target_link_libraries(sherpa-onnx-microphone-offline ${PA_LIB} sherpa-onnx-core)
  141 +
  142 + if(NOT WIN32)
  143 + target_link_libraries(sherpa-onnx-microphone "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  144 + target_link_libraries(sherpa-onnx-microphone "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  145 +
  146 + target_link_libraries(sherpa-onnx-microphone-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  147 + target_link_libraries(sherpa-onnx-microphone-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  148 +
  149 + if(SHERPA_ONNX_ENABLE_PYTHON)
  150 + target_link_libraries(sherpa-onnx-microphone "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  151 + target_link_libraries(sherpa-onnx-microphone-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  152 + endif()
  153 + endif()
123 154
124 install( 155 install(
125 TARGETS 156 TARGETS
@@ -164,6 +195,32 @@ if(SHERPA_ONNX_ENABLE_WEBSOCKET) @@ -164,6 +195,32 @@ if(SHERPA_ONNX_ENABLE_WEBSOCKET)
164 target_link_libraries(sherpa-onnx-offline-websocket-server -pthread) 195 target_link_libraries(sherpa-onnx-offline-websocket-server -pthread)
165 target_compile_options(sherpa-onnx-offline-websocket-server PRIVATE -Wno-deprecated-declarations) 196 target_compile_options(sherpa-onnx-offline-websocket-server PRIVATE -Wno-deprecated-declarations)
166 endif() 197 endif()
  198 +
  199 + if(NOT WIN32)
  200 + target_link_libraries(sherpa-onnx-online-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  201 + target_link_libraries(sherpa-onnx-online-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  202 +
  203 + target_link_libraries(sherpa-onnx-online-websocket-client "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  204 + target_link_libraries(sherpa-onnx-online-websocket-client "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  205 +
  206 + target_link_libraries(sherpa-onnx-offline-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib")
  207 + target_link_libraries(sherpa-onnx-offline-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib")
  208 +
  209 + if(SHERPA_ONNX_ENABLE_PYTHON)
  210 + target_link_libraries(sherpa-onnx-online-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  211 + target_link_libraries(sherpa-onnx-online-websocket-client "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  212 + target_link_libraries(sherpa-onnx-offline-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib")
  213 + endif()
  214 + endif()
  215 +
  216 + install(
  217 + TARGETS
  218 + sherpa-onnx-online-websocket-server
  219 + sherpa-onnx-online-websocket-client
  220 + sherpa-onnx-offline-websocket-server
  221 + DESTINATION
  222 + bin
  223 + )
167 endif() 224 endif()
168 225
169 226