游雁
2024-02-19 94de39dde2e616a01683c518023d0fab72b4e103
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# Copyright (c)  2021  Xiaomi Corporation (author: Fangjun Kuang)
 
import glob
import os
import platform
import shutil
import sys
from pathlib import Path
 
import setuptools
from setuptools.command.build_ext import build_ext
 
 
def is_for_pypi():
    ans = os.environ.get("KALDI_NATIVE_FBANK_IS_FOR_PYPI", None)
    return ans is not None
 
 
def is_macos():
    return platform.system() == "Darwin"
 
 
def is_windows():
    return platform.system() == "Windows"
 
 
try:
    from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
 
    class bdist_wheel(_bdist_wheel):
        def finalize_options(self):
            _bdist_wheel.finalize_options(self)
            # In this case, the generated wheel has a name in the form
            # kaldifeat-xxx-pyxx-none-any.whl
            if is_for_pypi() and not is_macos():
                self.root_is_pure = True
            else:
                # The generated wheel has a name ending with
                # -linux_x86_64.whl
                self.root_is_pure = False
 
 
except ImportError:
    bdist_wheel = None
 
 
def cmake_extension(name, *args, **kwargs) -> setuptools.Extension:
    kwargs["language"] = "c++"
    sources = []
    return setuptools.Extension(name, sources, *args, **kwargs)
 
 
class BuildExtension(build_ext):
    def build_extension(self, ext: setuptools.extension.Extension):
        # build/temp.linux-x86_64-3.8
        os.makedirs(self.build_temp, exist_ok=True)
 
        # build/lib.linux-x86_64-3.8
        os.makedirs(self.build_lib, exist_ok=True)
 
        install_dir = Path(self.build_lib).resolve() / "kaldi_native_fbank"
 
        kaldi_native_fbank_dir = Path(__file__).parent.parent.resolve()
 
        cmake_args = os.environ.get("KALDI_NATIVE_FBANK_CMAKE_ARGS", "")
        make_args = os.environ.get("KALDI_NATIVE_FBANK_MAKE_ARGS", "")
        system_make_args = os.environ.get("MAKEFLAGS", "")
 
        if cmake_args == "":
            cmake_args = "-DCMAKE_BUILD_TYPE=Release"
 
        extra_cmake_args = f" -DCMAKE_INSTALL_PREFIX={install_dir} "
        extra_cmake_args += " -DKALDI_NATIVE_FBANK_BUILD_TESTS=OFF "
 
        if "PYTHON_EXECUTABLE" not in cmake_args:
            print(f"Setting PYTHON_EXECUTABLE to {sys.executable}")
            cmake_args += f" -DPYTHON_EXECUTABLE={sys.executable}"
 
        cmake_args += extra_cmake_args
 
        if is_windows():
            build_cmd = f"""
                cmake {cmake_args} -B {self.build_temp} -S {kaldi_native_fbank_dir}
                cmake --build {self.build_temp} --target install --config Release -- -m
            """
            print(f"build command is:\n{build_cmd}")
            ret = os.system(
                f"cmake {cmake_args} -B {self.build_temp} -S {kaldi_native_fbank_dir}"
            )
            if ret != 0:
                raise Exception("Failed to configure kaldi_native_fbank")
 
            ret = os.system(
                f"cmake --build {self.build_temp} --target install --config Release -- -m"
            )
            if ret != 0:
                raise Exception("Failed to install kaldi_native_fbank")
        else:
            if make_args == "" and system_make_args == "":
                print("For fast compilation, run:")
                print(
                    'export KALDI_NATIVE_FBANK_MAKE_ARGS="-j"; python setup.py install'
                )
 
            build_cmd = f"""
                cd {self.build_temp}
 
                cmake {cmake_args} {kaldi_native_fbank_dir}
 
                make {make_args} install
            """
            print(f"build command is:\n{build_cmd}")
 
            ret = os.system(build_cmd)
            if ret != 0:
                raise Exception(
                    "\nBuild kaldi-native-fbank failed. Please check the error message.\n"
                    "You can ask for help by creating an issue on GitHub.\n"
                    "\nClick:\n\thttps://github.com/csukuangfj/kaldi-native-fbank/issues/new\n"  # noqa
                )