Merge pull request #2843 from ryojiysd/ctcdecoder-wheels-win

Support building ctc_decoder wheel package on Windows system
This commit is contained in:
lissyx 2020-03-25 09:34:47 +01:00 committed by GitHub
commit ea233439ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 11 deletions

View File

@ -15,14 +15,24 @@ else
GENERATE_DEBUG_SYMS :=
endif
ifeq ($(findstring _NT,$(OS)),_NT)
ARCHIVE_EXT := lib
else
ARCHIVE_EXT := a
endif
FIRST_PARTY := first_party.$(ARCHIVE_EXT)
THIRD_PARTY := third_party.$(ARCHIVE_EXT)
all: bindings
clean-keep-third-party:
rm -rf dist temp_build ds_ctcdecoder.egg-info
rm -f swigwrapper_wrap.cpp swigwrapper.py first_party.a
rm -f swigwrapper_wrap.cpp swigwrapper.py $(FIRST_PARTY)
clean: clean-keep-third-party
rm -f third_party.a
rm -f $(THIRD_PARTY)
rm workspace_status.cc
rm -fr bazel-out/

View File

@ -9,14 +9,23 @@ import sys
from multiprocessing.dummy import Pool
ARGS = ['-DKENLM_MAX_ORDER=6', '-std=c++11', '-Wno-unused-local-typedefs', '-Wno-sign-compare']
OPT_ARGS = ['-O3', '-DNDEBUG']
DBG_ARGS = ['-O0', '-g', '-UNDEBUG', '-DDEBUG']
if sys.platform.startswith('win'):
ARGS = ['/nologo', '/D KENLM_MAX_ORDER=6', '/EHsc', '/source-charset:utf-8']
OPT_ARGS = ['/O2', '/MT', '/D NDEBUG']
DBG_ARGS = ['/Od', '/MTd', '/Zi', '/U NDEBUG', '/D DEBUG']
OPENFST_DIR = 'third_party/openfst-1.6.9-win'
else:
ARGS = ['-fPIC', '-DKENLM_MAX_ORDER=6', '-std=c++11', '-Wno-unused-local-typedefs', '-Wno-sign-compare']
OPT_ARGS = ['-O3', '-DNDEBUG']
DBG_ARGS = ['-O0', '-g', '-UNDEBUG', '-DDEBUG']
OPENFST_DIR = 'third_party/openfst-1.6.7'
INCLUDES = [
'..',
'../kenlm',
'third_party/openfst-1.6.7/src/include',
OPENFST_DIR + '/src/include',
'third_party/ThreadPool'
]
@ -24,7 +33,7 @@ KENLM_FILES = (glob.glob('../kenlm/util/*.cc')
+ glob.glob('../kenlm/lm/*.cc')
+ glob.glob('../kenlm/util/double-conversion/*.cc'))
KENLM_FILES += glob.glob('third_party/openfst-1.6.7/src/lib/*.cc')
KENLM_FILES += glob.glob(OPENFST_DIR + '/src/lib/*.cc')
KENLM_FILES = [
fn for fn in KENLM_FILES
@ -42,6 +51,8 @@ CTC_DECODER_FILES = [
def build_archive(srcs=[], out_name='', build_dir='temp_build/temp_build', debug=False, num_parallel=1):
compiler = os.environ.get('CXX', 'g++')
if sys.platform.startswith('win'):
compiler = '"{}"'.format(compiler)
ar = os.environ.get('AR', 'ar')
libtool = os.environ.get('LIBTOOL', 'libtool')
cflags = os.environ.get('CFLAGS', '') + os.environ.get('CXXFLAGS', '')
@ -59,13 +70,19 @@ def build_archive(srcs=[], out_name='', build_dir='temp_build/temp_build', debug
if os.path.exists(outfile):
return
cmd = '{cc} -fPIC -c {cflags} {args} {includes} {infile} -o {outfile}'.format(
if sys.platform.startswith('win'):
file = '"{}"'.format(file.replace('\\', '/'))
output = '/Fo"{}"'.format(outfile.replace('\\', '/'))
else:
output = '-o ' + outfile
cmd = '{cc} -c {cflags} {args} {includes} {infile} {output}'.format(
cc=compiler,
cflags=cflags,
args=' '.join(args),
includes=' '.join('-I' + i for i in INCLUDES),
infile=file,
outfile=outfile,
output=output,
)
print(cmd)
subprocess.check_call(shlex.split(cmd))
@ -82,6 +99,13 @@ def build_archive(srcs=[], out_name='', build_dir='temp_build/temp_build', debug
)
print(cmd)
subprocess.check_call(shlex.split(cmd))
elif sys.platform.startswith('win'):
cmd = '"lib.exe" /OUT:"{outfile}" {infiles} /MACHINE:X64 /NOLOGO'.format(
outfile=out_name,
infiles=' '.join(obj_files))
cmd = cmd.replace('\\', '/')
print(cmd)
subprocess.check_call(shlex.split(cmd))
else:
cmd = '{ar} rcs {outfile} {infiles}'.format(
ar=ar,

View File

@ -54,8 +54,15 @@ def maybe_rebuild(srcs, out_name, build_dir):
project_version = read('../../VERSION').strip()
build_dir = 'temp_build/temp_build'
third_party_build = 'third_party.a'
ctc_decoder_build = 'first_party.a'
if sys.platform.startswith('win'):
archive_ext = 'lib'
else:
archive_ext = 'a'
third_party_build = 'third_party.{}'.format(archive_ext)
ctc_decoder_build = 'first_party.{}'.format(archive_ext)
maybe_rebuild(KENLM_FILES, third_party_build, build_dir)
maybe_rebuild(CTC_DECODER_FILES, ctc_decoder_build, build_dir)