parent
c7db3639ef
commit
fa63006787
@ -1,68 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.18 FATAL_ERROR)
|
||||
|
||||
# Use compiler ID "AppleClang" instead of "Clang" for XCode.
|
||||
# Not setting this sometimes makes XCode C compiler gets detected as "Clang",
|
||||
# even when the C++ one is detected as "AppleClang".
|
||||
cmake_policy(SET CMP0010 NEW)
|
||||
cmake_policy(SET CMP0025 NEW)
|
||||
|
||||
# Suppress warning flags in default MSVC configuration. It's not
|
||||
# mandatory that we do this (and we don't if cmake is old), but it's
|
||||
# nice when it's possible, and it's possible on our Windows configs.
|
||||
if(NOT CMAKE_VERSION VERSION_LESS 3.15.0)
|
||||
cmake_policy(SET CMP0092 NEW)
|
||||
endif()
|
||||
|
||||
|
||||
project(paddlespeech)
|
||||
|
||||
|
||||
# check and set CMAKE_CXX_STANDARD
|
||||
string(FIND "${CMAKE_CXX_FLAGS}" "-std=c++" env_cxx_standard)
|
||||
if(env_cxx_standard GREATER -1)
|
||||
message(
|
||||
WARNING "C++ standard version definition detected in environment variable."
|
||||
"paddlespeech requires -std=c++14. Please remove -std=c++ settings in your environment.")
|
||||
endif()
|
||||
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||
|
||||
|
||||
|
||||
# Options
|
||||
option(BUILD_SOX "Build libsox statically" ON)
|
||||
option(BUILD_MAD "Enable libmad" ON)
|
||||
option(BUILD_KALDI "Build kaldi statically" ON)
|
||||
option(BUILD_PADDLEAUDIO_PYTHON_EXTENSION "Build Python extension" ON)
|
||||
|
||||
|
||||
# cmake
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${PROJECT_SOURCE_DIR}/cmake;${PROJECT_SOURCE_DIR}/cmake/external")
|
||||
|
||||
|
||||
# fc_patch dir
|
||||
set(FETCHCONTENT_QUIET off)
|
||||
get_filename_component(fc_patch "fc_patch" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}")
|
||||
set(FETCHCONTENT_BASE_DIR ${fc_patch})
|
||||
|
||||
|
||||
include(openblas)
|
||||
include(pybind)
|
||||
|
||||
# packages
|
||||
find_package(Python3 COMPONENTS Interpreter Development)
|
||||
#find_package(pybind11 CONFIG REQUIRED)
|
||||
|
||||
|
||||
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -O0 -Wall -g")
|
||||
add_subdirectory(paddlespeech/audio)
|
||||
|
||||
# Summary
|
||||
include(cmake/summary.cmake)
|
||||
onnx_print_configuration_summary()
|
Binary file not shown.
@ -1,153 +0,0 @@
|
||||
#.rst:
|
||||
# FindGFortranLibs
|
||||
# --------
|
||||
# https://github.com/Argonne-National-Laboratory/PIPS/blob/master/cmake/Modules/FindGFortranLibs.cmake
|
||||
# https://enccs.github.io/cmake-workshop/cxx-fortran/
|
||||
#
|
||||
# Find gcc Fortran compiler & library paths
|
||||
#
|
||||
# The module defines the following variables:
|
||||
#
|
||||
# ::
|
||||
#
|
||||
#
|
||||
# GFORTRANLIBS_FOUND - true if system has gfortran
|
||||
# LIBGFORTRAN_LIBRARIES - path to libgfortran
|
||||
# LIBQUADMATH_LIBRARIES - path to libquadmath
|
||||
# GFORTRAN_LIBARIES_DIR - directory containing libgfortran, libquadmath
|
||||
# GFORTRAN_INCLUDE_DIR - directory containing gfortran/gcc headers
|
||||
# LIBGOMP_LIBRARIES - path to libgomp
|
||||
# LIBGOMP_INCLUDE_DIR - directory containing omp.h header
|
||||
# GFORTRAN_VERSION_STRING - version of gfortran found
|
||||
#
|
||||
set(CMAKE_REQUIRED_QUIET ${LIBIOMP_FIND_QUIETLY})
|
||||
|
||||
if(NOT CMAKE_REQUIRED_QUIET)
|
||||
message(STATUS "Looking for gfortran related libraries...")
|
||||
endif()
|
||||
|
||||
enable_language(Fortran)
|
||||
if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU")
|
||||
|
||||
# Basically, call "gfortran -v" to dump compiler info to the string
|
||||
# GFORTRAN_VERBOSE_STR, which will be used to get necessary paths
|
||||
message(STATUS "Extracting library and header information by calling 'gfortran -v'...")
|
||||
execute_process(COMMAND "${CMAKE_Fortran_COMPILER}" "-v" ERROR_VARIABLE
|
||||
GFORTRAN_VERBOSE_STR RESULT_VARIABLE FLAG)
|
||||
|
||||
# For debugging
|
||||
message(STATUS "'gfortran -v' returned:")
|
||||
message(STATUS "${GFORTRAN_VERBOSE_STR}")
|
||||
|
||||
# Detect gfortran version
|
||||
string(REGEX MATCH "gcc version [^\t\n ]+" GFORTRAN_VER_STR "${GFORTRAN_VERBOSE_STR}")
|
||||
string(REGEX REPLACE "gcc version ([^\t\n ]+)" "\\1" GFORTRAN_VERSION_STRING "${GFORTRAN_VER_STR}")
|
||||
message(STATUS "Detected gfortran version ${GFORTRAN_VERSION_STRING}")
|
||||
unset(GFORTRAN_VER_STR)
|
||||
|
||||
set(MATCH_REGEX "[^\t\n ]+[\t\n ]+")
|
||||
set(REPLACE_REGEX "([^\t\n ]+)")
|
||||
|
||||
# Find architecture for compiler
|
||||
string(REGEX MATCH "Target: [^\t\n ]+"
|
||||
GFORTRAN_ARCH_STR "${GFORTRAN_VERBOSE_STR}")
|
||||
message(STATUS "Architecture string: ${GFORTRAN_ARCH_STR}")
|
||||
string(REGEX REPLACE "Target: ([^\t\n ]+)" "\\1"
|
||||
GFORTRAN_ARCH "${GFORTRAN_ARCH_STR}")
|
||||
message(STATUS "Detected gfortran architecture: ${GFORTRAN_ARCH}")
|
||||
unset(GFORTRAN_ARCH_STR)
|
||||
|
||||
# Find install prefix, if it exists; if not, use default
|
||||
string(REGEX MATCH "--prefix=[^\t\n ]+[\t\n ]+"
|
||||
GFORTRAN_PREFIX_STR "${GFORTRAN_VERBOSE_STR}")
|
||||
if(NOT GFORTRAN_PREFIX_STR)
|
||||
message(STATUS "Detected default gfortran prefix")
|
||||
set(GFORTRAN_PREFIX_DIR "/usr/local") # default prefix for gcc install
|
||||
else()
|
||||
string(REGEX REPLACE "--prefix=([^\t\n ]+)" "\\1"
|
||||
GFORTRAN_PREFIX_DIR "${GFORTRAN_PREFIX_STR}")
|
||||
endif()
|
||||
message(STATUS "Detected gfortran prefix: ${GFORTRAN_PREFIX_DIR}")
|
||||
unset(GFORTRAN_PREFIX_STR)
|
||||
|
||||
# Find install exec-prefix, if it exists; if not, use default
|
||||
string(REGEX MATCH "--exec-prefix=[^\t\n ]+[\t\n ]+" "\\1"
|
||||
GFORTRAN_EXEC_PREFIX_STR "${GFORTRAN_VERBOSE_STR}")
|
||||
if(NOT GFORTRAN_EXEC_PREFIX_STR)
|
||||
message(STATUS "Detected default gfortran exec-prefix")
|
||||
set(GFORTRAN_EXEC_PREFIX_DIR "${GFORTRAN_PREFIX_DIR}")
|
||||
else()
|
||||
string(REGEX REPLACE "--exec-prefix=([^\t\n ]+)" "\\1"
|
||||
GFORTRAN_EXEC_PREFIX_DIR "${GFORTRAN_EXEC_PREFIX_STR}")
|
||||
endif()
|
||||
message(STATUS "Detected gfortran exec-prefix: ${GFORTRAN_EXEC_PREFIX_DIR}")
|
||||
UNSET(GFORTRAN_EXEC_PREFIX_STR)
|
||||
|
||||
# Find library directory and include directory, if library directory specified
|
||||
string(REGEX MATCH "--libdir=[^\t\n ]+"
|
||||
GFORTRAN_LIB_DIR_STR "${GFORTRAN_VERBOSE_STR}")
|
||||
if(NOT GFORTRAN_LIB_DIR_STR)
|
||||
message(STATUS "Found --libdir flag -- not found")
|
||||
message(STATUS "Using default gfortran library & include directory paths")
|
||||
set(GFORTRAN_LIBRARIES_DIR
|
||||
"${GFORTRAN_EXEC_PREFIX_DIR}/lib/gcc/${GFORTRAN_ARCH}/${GFORTRAN_VERSION_STRING}")
|
||||
string(CONCAT GFORTRAN_INCLUDE_DIR "${GFORTRAN_LIBRARIES_DIR}" "/include")
|
||||
else()
|
||||
message(STATUS "Found --libdir flag -- yes")
|
||||
string(REGEX REPLACE "--libdir=([^\t\n ]+)" "\\1"
|
||||
GFORTRAN_LIBRARIES_DIR "${GFORTRAN_LIB_DIR_STR}")
|
||||
string(CONCAT GFORTRAN_INCLUDE_DIR "${GFORTRAN_LIBRARIES_DIR}" "/gcc/" "${GFORTRAN_ARCH}" "/" "${GFORTRAN_VERSION_STRING}" "/include")
|
||||
endif()
|
||||
message(STATUS "gfortran libraries path: ${GFORTRAN_LIBRARIES_DIR}")
|
||||
message(STATUS "gfortran include path dir: ${GFORTRAN_INCLUDE_DIR}")
|
||||
unset(GFORTRAN_LIB_DIR_STR)
|
||||
|
||||
# There are lots of other build options for gcc & gfortran. For now, the
|
||||
# options implemented above should cover a lot of common use cases.
|
||||
|
||||
# Clean up be deleting the output string from "gfortran -v"
|
||||
unset(GFORTRAN_VERBOSE_STR)
|
||||
|
||||
# Find paths for libgfortran, libquadmath, libgomp
|
||||
# libgomp needed for OpenMP support without Clang
|
||||
find_library(LIBGFORTRAN_LIBRARIES NAMES gfortran libgfortran
|
||||
HINTS ${GFORTRAN_LIBRARIES_DIR})
|
||||
find_library(LIBQUADMATH_LIBRARIES NAMES quadmath libquadmath
|
||||
HINTS ${GFORTRAN_LIBRARIES_DIR})
|
||||
find_library(LIBGOMP_LIBRARIES NAMES gomp libgomp
|
||||
HINTS ${GFORTRAN_LIBRARIES_DIR})
|
||||
|
||||
# Find OpenMP headers
|
||||
find_path(LIBGOMP_INCLUDE_DIR NAMES omp.h HINTS ${GFORTRAN_INCLUDE_DIR})
|
||||
|
||||
else()
|
||||
message(STATUS "CMAKE_Fortran_COMPILER_ID does not match 'GNU'!")
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
# Required: libgfortran, libquadmath, path for gfortran libraries
|
||||
# Optional: libgomp, path for OpenMP headers, path for gcc/gfortran headers
|
||||
find_package_handle_standard_args(GFortranLibs
|
||||
REQUIRED_VARS LIBGFORTRAN_LIBRARIES LIBQUADMATH_LIBRARIES GFORTRAN_LIBRARIES_DIR
|
||||
VERSION_VAR GFORTRAN_VERSION_STRING)
|
||||
|
||||
if(GFORTRANLIBS_FOUND)
|
||||
message(STATUS "Looking for gfortran libraries -- found")
|
||||
message(STATUS "gfortran version: ${GFORTRAN_VERSION_STRING}")
|
||||
else()
|
||||
message(STATUS "Looking for gfortran libraries -- not found")
|
||||
endif()
|
||||
|
||||
mark_as_advanced(LIBGFORTRAN_LIBRARIES LIBQUADMATH_LIBRARIES
|
||||
LIBGOMP_LIBRARIES LIBGOMP_INCLUDE_DIR
|
||||
GFORTRAN_LIBRARIES_DIR GFORTRAN_INCLUDE_DIR)
|
||||
# FindGFortranLIBS.cmake ends here
|
||||
|
||||
|
||||
message(STATUS LIBGFORTRAN_LIBRARIES= ${LIBGFORTRAN_LIBRARIES})
|
||||
message(STATUS LIBQUADMATH_LIBRARIES= ${LIBQUADMATH_LIBRARIES})
|
||||
message(STATUS LIBGOMP_LIBRARIES= ${LIBGOMP_LIBRARIES})
|
||||
message(STATUS LIBGOMP_INCLUDE_DIR= ${LIBGOMP_INCLUDE_DIR})
|
||||
message(STATUS GFORTRAN_LIBRARIES_DIR= ${GFORTRAN_LIBRARIES_DIR})
|
||||
message(STATUS GFORTRAN_INCLUDE_DIR= ${GFORTRAN_INCLUDE_DIR})
|
@ -1,66 +0,0 @@
|
||||
include(FetchContent)
|
||||
include(ExternalProject)
|
||||
|
||||
set(OpenBLAS_SOURCE_DIR ${fc_patch}/OpenBLAS-src)
|
||||
set(OpenBLAS_PREFIX ${fc_patch}/OpenBLAS-prefix)
|
||||
|
||||
# ######################################################################################################################
|
||||
# OPENBLAS https://github.com/lattice/quda/blob/develop/CMakeLists.txt#L575
|
||||
# ######################################################################################################################
|
||||
enable_language(Fortran)
|
||||
|
||||
include(FortranCInterface)
|
||||
|
||||
# # Clang doesn't have a Fortran compiler in its suite (yet),
|
||||
# # so detect libraries for gfortran; we need equivalents to
|
||||
# # libgfortran and libquadmath, which are implicitly
|
||||
# # linked by flags in CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES
|
||||
# include(FindGFortranLibs REQUIRED)
|
||||
# # Add directory containing libgfortran and libquadmath to
|
||||
# # linker. Should also contain libgomp, if not using
|
||||
# # Intel OpenMP runtime
|
||||
# link_directories(${GFORTRAN_LIBRARIES_DIR})
|
||||
# # gfortan dir in the docker.
|
||||
# link_directories(/usr/local/gcc-8.2/lib64)
|
||||
# # if you are working with C and Fortran
|
||||
# FortranCInterface_VERIFY()
|
||||
|
||||
# # if you are working with C++ and Fortran
|
||||
# FortranCInterface_VERIFY(CXX)
|
||||
|
||||
|
||||
#TODO: switch to CPM
|
||||
include(GNUInstallDirs)
|
||||
ExternalProject_Add(
|
||||
OPENBLAS
|
||||
GIT_REPOSITORY https://github.com/xianyi/OpenBLAS.git
|
||||
GIT_TAG v0.3.10
|
||||
GIT_SHALLOW YES
|
||||
PREFIX ${OpenBLAS_PREFIX}
|
||||
SOURCE_DIR ${OpenBLAS_SOURCE_DIR}
|
||||
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
|
||||
CMAKE_GENERATOR "Unix Makefiles")
|
||||
|
||||
|
||||
# https://cmake.org/cmake/help/latest/module/ExternalProject.html?highlight=externalproject_get_property#external-project-definition
|
||||
ExternalProject_Get_Property(OPENBLAS INSTALL_DIR)
|
||||
set(OpenBLAS_INSTALL_PREFIX ${INSTALL_DIR})
|
||||
add_library(openblas STATIC IMPORTED)
|
||||
add_dependencies(openblas OPENBLAS)
|
||||
set_target_properties(openblas PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES Fortran)
|
||||
|
||||
set_target_properties(openblas PROPERTIES IMPORTED_LOCATION ${OpenBLAS_INSTALL_PREFIX}/lib/libopenblas.a)
|
||||
|
||||
|
||||
link_directories(${OpenBLAS_INSTALL_PREFIX}/lib)
|
||||
include_directories(${OpenBLAS_INSTALL_PREFIX}/include/openblas)
|
||||
|
||||
|
||||
set(OPENBLAS_LIBRARIES
|
||||
${OpenBLAS_INSTALL_PREFIX}/lib/libopenblas.a
|
||||
)
|
||||
|
||||
add_library(libopenblas INTERFACE)
|
||||
add_dependencies(libopenblas openblas)
|
||||
target_include_directories(libopenblas INTERFACE ${OpenBLAS_INSTALL_PREFIX}/include/openblas)
|
||||
target_link_libraries(libopenblas INTERFACE ${OPENBLAS_LIBRARIES})
|
@ -1,11 +0,0 @@
|
||||
include(FetchContent)
|
||||
include(ExternalProject)
|
||||
|
||||
FetchContent_Declare(
|
||||
pybind
|
||||
URL https://github.com/pybind/pybind11/archive/refs/tags/v2.10.0.zip
|
||||
URL_HASH SHA256=225df6e6dea7cea7c5754d4ed954e9ca7c43947b849b3795f87cb56437f1bd19
|
||||
)
|
||||
FetchContent_MakeAvailable(pybind)
|
||||
include_directories(${pybind_SOURCE_DIR}/include)
|
||||
|
@ -1,45 +0,0 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Prints accumulated ONNX configuration summary
|
||||
function (onnx_print_configuration_summary)
|
||||
message(STATUS "")
|
||||
message(STATUS "******** Summary ********")
|
||||
message(STATUS " CMake version : ${CMAKE_VERSION}")
|
||||
message(STATUS " CMake command : ${CMAKE_COMMAND}")
|
||||
message(STATUS " System : ${CMAKE_SYSTEM_NAME}")
|
||||
message(STATUS " C++ compiler : ${CMAKE_CXX_COMPILER}")
|
||||
message(STATUS " C++ compiler version : ${CMAKE_CXX_COMPILER_VERSION}")
|
||||
message(STATUS " CXX flags : ${CMAKE_CXX_FLAGS}")
|
||||
message(STATUS " Build type : ${CMAKE_BUILD_TYPE}")
|
||||
get_directory_property(tmp DIRECTORY ${PROJECT_SOURCE_DIR} COMPILE_DEFINITIONS)
|
||||
message(STATUS " Compile definitions : ${tmp}")
|
||||
message(STATUS " CMAKE_PREFIX_PATH : ${CMAKE_PREFIX_PATH}")
|
||||
message(STATUS " CMAKE_INSTALL_PREFIX : ${CMAKE_INSTALL_PREFIX}")
|
||||
message(STATUS " CMAKE_MODULE_PATH : ${CMAKE_MODULE_PATH}")
|
||||
message(STATUS "")
|
||||
message(STATUS " ONNX version : ${ONNX_VERSION}")
|
||||
message(STATUS " ONNX NAMESPACE : ${ONNX_NAMESPACE}")
|
||||
message(STATUS " ONNX_USE_LITE_PROTO : ${ONNX_USE_LITE_PROTO}")
|
||||
message(STATUS " USE_PROTOBUF_SHARED_LIBS : ${ONNX_USE_PROTOBUF_SHARED_LIBS}")
|
||||
message(STATUS " Protobuf_USE_STATIC_LIBS : ${Protobuf_USE_STATIC_LIBS}")
|
||||
message(STATUS " ONNX_DISABLE_EXCEPTIONS : ${ONNX_DISABLE_EXCEPTIONS}")
|
||||
message(STATUS " ONNX_WERROR : ${ONNX_WERROR}")
|
||||
message(STATUS " ONNX_BUILD_TESTS : ${ONNX_BUILD_TESTS}")
|
||||
message(STATUS " ONNX_BUILD_BENCHMARKS : ${ONNX_BUILD_BENCHMARKS}")
|
||||
message(STATUS " ONNXIFI_DUMMY_BACKEND : ${ONNXIFI_DUMMY_BACKEND}")
|
||||
message(STATUS " ONNXIFI_ENABLE_EXT : ${ONNXIFI_ENABLE_EXT}")
|
||||
message(STATUS "")
|
||||
message(STATUS " Protobuf compiler : ${PROTOBUF_PROTOC_EXECUTABLE}")
|
||||
message(STATUS " Protobuf includes : ${PROTOBUF_INCLUDE_DIRS}")
|
||||
message(STATUS " Protobuf libraries : ${PROTOBUF_LIBRARIES}")
|
||||
message(STATUS " BUILD_ONNX_PYTHON : ${BUILD_ONNX_PYTHON}")
|
||||
message(STATUS " Python version : ${Python_VERSION}")
|
||||
message(STATUS " Python executable : ${Python_EXECUTABLE}")
|
||||
message(STATUS " Python includes : ${Python_INCLUDE_DIR}")
|
||||
message(STATUS " Python libraries : ${Python_LIBRARY}")
|
||||
message(STATUS " PYBIND11 : ${pybind11_FOUND}")
|
||||
message(STATUS " Pybind11 version : ${pybind11_VERSION}")
|
||||
message(STATUS " Pybind11 include : ${pybind11_INCLUDE_DIR}")
|
||||
message(STATUS " Pybind11 includes : ${pybind11_INCLUDE_DIRS}")
|
||||
message(STATUS " Pybind11 libraries : ${pybind11_LIBRARIES}")
|
||||
endfunction()
|
@ -1 +0,0 @@
|
||||
from .extension import *
|
@ -1,157 +0,0 @@
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
import distutils.sysconfig
|
||||
from setuptools import Extension
|
||||
from setuptools.command.build_ext import build_ext
|
||||
|
||||
__all__ = [
|
||||
"get_ext_modules",
|
||||
"CMakeBuild",
|
||||
]
|
||||
|
||||
_THIS_DIR = Path(__file__).parent.resolve()
|
||||
_ROOT_DIR = _THIS_DIR.parent.parent.resolve()
|
||||
_PADDLESPEECH_DIR = _ROOT_DIR / "paddlespeech"
|
||||
|
||||
|
||||
def _get_build(var, default=False):
|
||||
if var not in os.environ:
|
||||
return default
|
||||
|
||||
val = os.environ.get(var, "0")
|
||||
trues = ["1", "true", "TRUE", "on", "ON", "yes", "YES"]
|
||||
falses = ["0", "false", "FALSE", "off", "OFF", "no", "NO"]
|
||||
if val in trues:
|
||||
return True
|
||||
if val not in falses:
|
||||
print(f"WARNING: Unexpected environment variable value `{var}={val}`. "
|
||||
f"Expected one of {trues + falses}")
|
||||
return False
|
||||
|
||||
|
||||
_BUILD_SOX = False if platform.system() == "Windows" else _get_build(
|
||||
"BUILD_SOX", True)
|
||||
_BUILD_MAD = _get_build("BUILD_MAD", False)
|
||||
_BUILD_KALDI = False if platform.system() == "Windows" else _get_build(
|
||||
"BUILD_KALDI", True)
|
||||
# _BUILD_RNNT = _get_build("BUILD_RNNT", True)
|
||||
# _BUILD_CTC_DECODER = False if platform.system() == "Windows" else _get_build("BUILD_CTC_DECODER", True)
|
||||
# _USE_FFMPEG = _get_build("USE_FFMPEG", False)
|
||||
# _USE_ROCM = _get_build("USE_ROCM", torch.cuda.is_available() and torch.version.hip is not None)
|
||||
# _USE_CUDA = _get_build("USE_CUDA", torch.cuda.is_available() and torch.version.hip is None)
|
||||
# _USE_OPENMP = _get_build("USE_OPENMP", True) and "ATen parallel backend: OpenMP" in torch.__config__.parallel_info()
|
||||
_PADDLESPEECH_CUDA_ARCH_LIST = os.environ.get("PADDLESPEECH_CUDA_ARCH_LIST",
|
||||
None)
|
||||
|
||||
|
||||
def get_ext_modules():
|
||||
modules = [
|
||||
Extension(name="paddlespeech.audio.lib.libpaddleaudio", sources=[]),
|
||||
Extension(name="paddlespeech.audio._paddleaudio", sources=[]),
|
||||
]
|
||||
return modules
|
||||
|
||||
|
||||
# Based off of
|
||||
# https://github.com/pybind/cmake_example/blob/580c5fd29d4651db99d8874714b07c0c49a53f8a/setup.py
|
||||
class CMakeBuild(build_ext):
|
||||
def run(self):
|
||||
try:
|
||||
subprocess.check_output(["cmake", "--version"])
|
||||
except OSError:
|
||||
raise RuntimeError("CMake is not available.") from None
|
||||
super().run()
|
||||
|
||||
def build_extension(self, ext):
|
||||
# Since two library files (libpaddleaudio and _paddleaudio) need to be
|
||||
# recognized by setuptools, we instantiate `Extension` twice. (see `get_ext_modules`)
|
||||
# This leads to the situation where this `build_extension` method is called twice.
|
||||
# However, the following `cmake` command will build all of them at the same time,
|
||||
# so, we do not need to perform `cmake` twice.
|
||||
# Therefore we call `cmake` only for `paddleaudio._paddleaudio`.
|
||||
if ext.name != "paddlespeech.audio._paddleaudio":
|
||||
return
|
||||
|
||||
extdir = os.path.abspath(
|
||||
os.path.dirname(self.get_ext_fullpath(ext.name)))
|
||||
|
||||
# required for auto-detection of auxiliary "native" libs
|
||||
if not extdir.endswith(os.path.sep):
|
||||
extdir += os.path.sep
|
||||
|
||||
cfg = "Debug" if self.debug else "Release"
|
||||
|
||||
cmake_args = [
|
||||
f"-DCMAKE_BUILD_TYPE={cfg}",
|
||||
# f"-DCMAKE_PREFIX_PATH={torch.utils.cmake_prefix_path}",
|
||||
f"-DCMAKE_INSTALL_PREFIX={extdir}",
|
||||
"-DCMAKE_VERBOSE_MAKEFILE=ON",
|
||||
f"-DPython_INCLUDE_DIR={distutils.sysconfig.get_python_inc()}",
|
||||
f"-DPython_LIBRARY={distutils.sysconfig.get_config_var('LIBDIR')}",
|
||||
f"-DBUILD_SOX:BOOL={'ON' if _BUILD_SOX else 'OFF'}",
|
||||
f"-DBUILD_MAD:BOOL={'ON' if _BUILD_MAD else 'OFF'}",
|
||||
# f"-DBUILD_KALDI:BOOL={'ON' if _BUILD_KALDI else 'OFF'}",
|
||||
# f"-DBUILD_RNNT:BOOL={'ON' if _BUILD_RNNT else 'OFF'}",
|
||||
# f"-DBUILD_CTC_DECODER:BOOL={'ON' if _BUILD_CTC_DECODER else 'OFF'}",
|
||||
"-DBUILD_PADDLEAUDIO_PYTHON_EXTENSION:BOOL=ON",
|
||||
# f"-DUSE_ROCM:BOOL={'ON' if _USE_ROCM else 'OFF'}",
|
||||
# f"-DUSE_CUDA:BOOL={'ON' if _USE_CUDA else 'OFF'}",
|
||||
# f"-DUSE_OPENMP:BOOL={'ON' if _USE_OPENMP else 'OFF'}",
|
||||
# f"-DUSE_FFMPEG:BOOL={'ON' if _USE_FFMPEG else 'OFF'}",
|
||||
]
|
||||
build_args = ["--target", "install"]
|
||||
# Pass CUDA architecture to cmake
|
||||
if _PADDLESPEECH_CUDA_ARCH_LIST is not None:
|
||||
# Convert MAJOR.MINOR[+PTX] list to new style one
|
||||
# defined at https://cmake.org/cmake/help/latest/prop_tgt/CUDA_ARCHITECTURES.html
|
||||
_arches = _PADDLESPEECH_CUDA_ARCH_LIST.replace(".", "").replace(
|
||||
" ", ";").split(";")
|
||||
_arches = [
|
||||
arch[:-4] if arch.endswith("+PTX") else f"{arch}-real"
|
||||
for arch in _arches
|
||||
]
|
||||
cmake_args += [f"-DCMAKE_CUDA_ARCHITECTURES={';'.join(_arches)}"]
|
||||
|
||||
# Default to Ninja
|
||||
if "CMAKE_GENERATOR" not in os.environ or platform.system() == "Windows":
|
||||
cmake_args += ["-GNinja"]
|
||||
|
||||
if platform.system() == "Windows":
|
||||
import sys
|
||||
|
||||
python_version = sys.version_info
|
||||
cmake_args += [
|
||||
"-DCMAKE_C_COMPILER=cl",
|
||||
"-DCMAKE_CXX_COMPILER=cl",
|
||||
f"-DPYTHON_VERSION={python_version.major}.{python_version.minor}",
|
||||
]
|
||||
|
||||
# Set CMAKE_BUILD_PARALLEL_LEVEL to control the parallel build level
|
||||
# across all generators.
|
||||
if "CMAKE_BUILD_PARALLEL_LEVEL" not in os.environ:
|
||||
# self.parallel is a Python 3 only way to set parallel jobs by hand
|
||||
# using -j in the build_ext call, not supported by pip or PyPA-build.
|
||||
if hasattr(self, "parallel") and self.parallel:
|
||||
# CMake 3.12+ only.
|
||||
build_args += ["-j{}".format(self.parallel)]
|
||||
|
||||
if not os.path.exists(self.build_temp):
|
||||
os.makedirs(self.build_temp)
|
||||
|
||||
print(
|
||||
f"cmake {_ROOT_DIR} {' '.join(cmake_args)}, cwd={self.build_temp}")
|
||||
subprocess.check_call(
|
||||
["cmake", str(_ROOT_DIR)] + cmake_args, cwd=self.build_temp)
|
||||
print(f"cmake --build . {' '.join(build_args)}, cwd={self.build_temp}")
|
||||
subprocess.check_call(
|
||||
["cmake", "--build", "."] + build_args, cwd=self.build_temp)
|
||||
|
||||
def get_ext_filename(self, fullname):
|
||||
ext_filename = super().get_ext_filename(fullname)
|
||||
ext_filename_parts = ext_filename.split(".")
|
||||
without_abi = ext_filename_parts[:-2] + ext_filename_parts[-1:]
|
||||
ext_filename = ".".join(without_abi)
|
||||
return ext_filename
|
Loading…
Reference in new issue