diff --git a/.github/workflows/build-wheels.yaml b/.github/workflows/build-wheels.yaml index 9b680f56..4084d555 100644 --- a/.github/workflows/build-wheels.yaml +++ b/.github/workflows/build-wheels.yaml @@ -34,6 +34,8 @@ jobs: CIBW_BEFORE_BUILD: "pip install -U cmake numpy" CIBW_SKIP: "cp27-* cp35-* cp36-* *-win32 pp* *-musllinux* *-manylinux_i686" CIBW_BUILD_VERBOSITY: 3 + CIBW_ENVIRONMENT_LINUX: LD_LIBRARY_PATH='/project/build/bdist.linux-x86_64/wheel/sherpa_onnx/lib' + CIBW_REPAIR_WHEEL_COMMAND_MACOS: "" - name: Display wheels shell: bash @@ -55,3 +57,16 @@ jobs: python3 -m pip install wheel twine setuptools twine upload ./wheelhouse/*.whl + + - name: Build sdist + shell: bash + run: | + python3 setup.py sdist + ls -l dist/* + + - name: Publish sdist to PyPI + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + twine upload dist/sherpa-onnx-*.tar.gz diff --git a/cmake/cmake_extension.py b/cmake/cmake_extension.py index 979c4624..2c80fe7e 100644 --- a/cmake/cmake_extension.py +++ b/cmake/cmake_extension.py @@ -5,6 +5,7 @@ import os import platform +import shutil import sys from pathlib import Path @@ -59,6 +60,7 @@ class BuildExtension(build_ext): # build/lib.linux-x86_64-3.8 os.makedirs(self.build_lib, exist_ok=True) + out_bin_dir = Path(self.build_lib).parent / "sherpa_onnx" / "bin" install_dir = Path(self.build_lib).resolve() / "sherpa_onnx" sherpa_onnx_dir = Path(__file__).parent.parent.resolve() @@ -75,9 +77,9 @@ class BuildExtension(build_ext): extra_cmake_args += " -DSHERPA_ONNX_ENABLE_CHECK=OFF " extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PYTHON=ON " - extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF " + extra_cmake_args += " -DSHERPA_ONNX_ENABLE_PORTAUDIO=ON " extra_cmake_args += " -DSHERPA_ONNX_ENABLE_C_API=OFF " - extra_cmake_args += " -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF " + extra_cmake_args += " -DSHERPA_ONNX_ENABLE_WEBSOCKET=ON " if "PYTHON_EXECUTABLE" not in cmake_args: print(f"Setting PYTHON_EXECUTABLE to {sys.executable}") @@ -125,3 +127,21 @@ class BuildExtension(build_ext): "You can ask for help by creating an issue on GitHub.\n" "\nClick:\n\thttps://github.com/k2-fsa/sherpa-onnx/issues/new\n" # noqa ) + + suffix = ".exe" if is_windows() else "" + # Remember to also change setup.py + + binaries = ["sherpa-onnx"] + binaries += ["sherpa-onnx-offline"] + binaries += ["sherpa-onnx-microphone"] + binaries += ["sherpa-onnx-microphone-offline"] + binaries += ["sherpa-onnx-online-websocket-server"] + binaries += ["sherpa-onnx-offline-websocket-server"] + binaries += ["sherpa-onnx-online-websocket-client"] + + for f in binaries: + src_file = install_dir / "bin" / (f + suffix) + print(f"Copying {src_file} to {out_bin_dir}/") + shutil.copy(f"{src_file}", f"{out_bin_dir}/") + + shutil.rmtree(f"{install_dir}/bin") diff --git a/cmake/onnxruntime.cmake b/cmake/onnxruntime.cmake index 8001c05b..202b586c 100644 --- a/cmake/onnxruntime.cmake +++ b/cmake/onnxruntime.cmake @@ -149,7 +149,7 @@ function(download_onnxruntime) if(UNIX AND NOT APPLE) file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/lib*") elseif(APPLE) - file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/lib*dylib") + file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/libonnxruntime.*.*dylib") elseif(WIN32) file(GLOB onnxruntime_lib_files "${onnxruntime_SOURCE_DIR}/lib/*.dll") endif() diff --git a/cmake/portaudio.cmake b/cmake/portaudio.cmake index 7de187be..1b2e4176 100644 --- a/cmake/portaudio.cmake +++ b/cmake/portaudio.cmake @@ -53,6 +53,23 @@ function(download_portaudio) endif() add_subdirectory(${portaudio_SOURCE_DIR} ${portaudio_BINARY_DIR} EXCLUDE_FROM_ALL) + + if(BUILD_SHARED_LIBS) + set_target_properties(portaudio PROPERTIES OUTPUT_NAME "sherpa-onnx-portaudio") + + if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32) + install(TARGETS portaudio DESTINATION ..) + else() + install(TARGETS portaudio DESTINATION lib) + endif() + else() + set_target_properties(portaudio_static PROPERTIES OUTPUT_NAME "sherpa-onnx-portaudio_static") + if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32) + install(TARGETS portaudio_static DESTINATION ..) + else() + install(TARGETS portaudio_static DESTINATION lib) + endif() + endif() endfunction() download_portaudio() diff --git a/setup.py b/setup.py index c8cf295f..99f3fa6b 100644 --- a/setup.py +++ b/setup.py @@ -39,6 +39,28 @@ install_requires = [ "numpy", ] + +def get_binaries_to_install(): + bin_dir = Path("build") / "sherpa_onnx" / "bin" + bin_dir.mkdir(parents=True, exist_ok=True) + suffix = ".exe" if is_windows() else "" + + # Remember to also change cmake/cmake_extension.py + binaries = ["sherpa-onnx"] + binaries += ["sherpa-onnx-offline"] + binaries += ["sherpa-onnx-microphone"] + binaries += ["sherpa-onnx-microphone-offline"] + binaries += ["sherpa-onnx-online-websocket-server"] + binaries += ["sherpa-onnx-offline-websocket-server"] + binaries += ["sherpa-onnx-online-websocket-client"] + + exe = [] + for f in binaries: + t = bin_dir / (f + suffix) + exe.append(str(t)) + return exe + + setuptools.setup( name=package_name, python_requires=">=3.6", @@ -50,6 +72,7 @@ setuptools.setup( "sherpa_onnx": "sherpa-onnx/python/sherpa_onnx", }, packages=["sherpa_onnx"], + data_files=[("bin", get_binaries_to_install())], url="https://github.com/k2-fsa/sherpa-onnx", long_description=read_long_description(), long_description_content_type="text/markdown", diff --git a/sherpa-onnx/csrc/CMakeLists.txt b/sherpa-onnx/csrc/CMakeLists.txt index 2816de00..672172c7 100644 --- a/sherpa-onnx/csrc/CMakeLists.txt +++ b/sherpa-onnx/csrc/CMakeLists.txt @@ -1,5 +1,15 @@ include_directories(${CMAKE_SOURCE_DIR}) +if(SHERPA_ONNX_ENABLE_PYTHON) + message(STATUS "PYTHON_EXECUTABLE: ${PYTHON_EXECUTABLE}") + execute_process( + COMMAND "${PYTHON_EXECUTABLE}" -c "import sys; print('.'.join(sys.version.split('.')[:2]))" + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE PYTHON_VERSION + ) + message(STATUS "PYTHON_VERSION: ${PYTHON_VERSION}") +endif() + set(sources cat.cc endpoint.cc @@ -72,7 +82,15 @@ target_link_libraries(sherpa-onnx sherpa-onnx-core) target_link_libraries(sherpa-onnx-offline sherpa-onnx-core) if(NOT WIN32) target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + + if(SHERPA_ONNX_ENABLE_PYTHON) + target_link_libraries(sherpa-onnx "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + target_link_libraries(sherpa-onnx-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + endif() endif() if(SHERPA_ONNX_ENABLE_PYTHON AND WIN32) @@ -91,12 +109,12 @@ install( if(SHERPA_ONNX_HAS_ALSA) add_executable(sherpa-onnx-alsa sherpa-onnx-alsa.cc alsa.cc) - target_link_libraries(sherpa-onnx-alsa PRIVATE sherpa-onnx-core) + target_link_libraries(sherpa-onnx-alsa sherpa-onnx-core) if(DEFINED ENV{SHERPA_ONNX_ALSA_LIB_DIR}) - target_link_libraries(sherpa-onnx-alsa PRIVATE -L$ENV{SHERPA_ONNX_ALSA_LIB_DIR} -lasound) + target_link_libraries(sherpa-onnx-alsa -L$ENV{SHERPA_ONNX_ALSA_LIB_DIR} -lasound) else() - target_link_libraries(sherpa-onnx-alsa PRIVATE asound) + target_link_libraries(sherpa-onnx-alsa asound) endif() install(TARGETS sherpa-onnx-alsa DESTINATION bin) endif() @@ -118,8 +136,21 @@ if(SHERPA_ONNX_ENABLE_PORTAUDIO) set(PA_LIB portaudio_static) endif() - target_link_libraries(sherpa-onnx-microphone PRIVATE ${PA_LIB} sherpa-onnx-core) - target_link_libraries(sherpa-onnx-microphone-offline PRIVATE ${PA_LIB} sherpa-onnx-core) + target_link_libraries(sherpa-onnx-microphone ${PA_LIB} sherpa-onnx-core) + target_link_libraries(sherpa-onnx-microphone-offline ${PA_LIB} sherpa-onnx-core) + + if(NOT WIN32) + target_link_libraries(sherpa-onnx-microphone "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx-microphone "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + + target_link_libraries(sherpa-onnx-microphone-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx-microphone-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + + if(SHERPA_ONNX_ENABLE_PYTHON) + target_link_libraries(sherpa-onnx-microphone "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + target_link_libraries(sherpa-onnx-microphone-offline "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + endif() + endif() install( TARGETS @@ -164,6 +195,32 @@ if(SHERPA_ONNX_ENABLE_WEBSOCKET) target_link_libraries(sherpa-onnx-offline-websocket-server -pthread) target_compile_options(sherpa-onnx-offline-websocket-server PRIVATE -Wno-deprecated-declarations) endif() + + if(NOT WIN32) + target_link_libraries(sherpa-onnx-online-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx-online-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + + target_link_libraries(sherpa-onnx-online-websocket-client "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx-online-websocket-client "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + + target_link_libraries(sherpa-onnx-offline-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib") + target_link_libraries(sherpa-onnx-offline-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../../../sherpa_onnx/lib") + + if(SHERPA_ONNX_ENABLE_PYTHON) + target_link_libraries(sherpa-onnx-online-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + target_link_libraries(sherpa-onnx-online-websocket-client "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + target_link_libraries(sherpa-onnx-offline-websocket-server "-Wl,-rpath,${SHERPA_ONNX_RPATH_ORIGIN}/../lib/python${PYTHON_VERSION}/site-packages/sherpa_onnx/lib") + endif() + endif() + + install( + TARGETS + sherpa-onnx-online-websocket-server + sherpa-onnx-online-websocket-client + sherpa-onnx-offline-websocket-server + DESTINATION + bin + ) endif()