diff --git a/native_client/ctcdecode/Makefile b/native_client/ctcdecode/Makefile index fb3ca6a4..c6c7fc64 100644 --- a/native_client/ctcdecode/Makefile +++ b/native_client/ctcdecode/Makefile @@ -15,14 +15,22 @@ else GENERATE_DEBUG_SYMS := endif +ifeq ($(findstring _NT,$(OS)),_NT) + FIRST_PARTY := first_party.lib + THIRD_PARTY := third_party.lib +else + FIRST_PARTY := first_party.a + THIRD_PARTY := third_party.a +endif + 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/ diff --git a/native_client/ctcdecode/build_archive.py b/native_client/ctcdecode/build_archive.py index 6b36ea45..05e0056c 100644 --- a/native_client/ctcdecode/build_archive.py +++ b/native_client/ctcdecode/build_archive.py @@ -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 = ['-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 @@ -59,14 +68,25 @@ 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( - cc=compiler, - cflags=cflags, - args=' '.join(args), - includes=' '.join('-I' + i for i in INCLUDES), - infile=file, - outfile=outfile, - ) + if sys.platform.startswith('win'): + cmd = '"{cc}" -c {cflags} {args} {includes} {infile} -Fo"{outfile}"'.format( + cc=compiler, + cflags=cflags, + args=' '.join(args), + includes=' '.join('-I' + i for i in INCLUDES), + infile=file, + outfile=outfile, + ) + cmd = cmd.replace('\\', '/') + else: + cmd = '{cc} -fPIC -c {cflags} {args} {includes} {infile} -o {outfile}'.format( + cc=compiler, + cflags=cflags, + args=' '.join(args), + includes=' '.join('-I' + i for i in INCLUDES), + infile=file, + outfile=outfile, + ) print(cmd) subprocess.check_call(shlex.split(cmd)) return outfile @@ -82,6 +102,15 @@ 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'): + obj_files = [s for s in obj_files if s != None] + cmd = '"lib.exe" /OUT:"{outfile}" {infiles} /MACHINE:X64 /NOLOGO'.format( + ar=ar, + 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, diff --git a/native_client/ctcdecode/setup.py b/native_client/ctcdecode/setup.py index fb5a7114..248b7ba0 100644 --- a/native_client/ctcdecode/setup.py +++ b/native_client/ctcdecode/setup.py @@ -54,8 +54,12 @@ 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'): + third_party_build = 'third_party.lib' + ctc_decoder_build = 'first_party.lib' +else: + third_party_build = 'third_party.a' + ctc_decoder_build = 'first_party.a' maybe_rebuild(KENLM_FILES, third_party_build, build_dir) maybe_rebuild(CTC_DECODER_FILES, ctc_decoder_build, build_dir)