diff --git a/native_client/ctcdecode/Makefile b/native_client/ctcdecode/Makefile index fb3ca6a4..60b42927 100644 --- a/native_client/ctcdecode/Makefile +++ b/native_client/ctcdecode/Makefile @@ -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/ diff --git a/native_client/ctcdecode/build_archive.py b/native_client/ctcdecode/build_archive.py index 6b36ea45..05d8e81b 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 = ['-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, diff --git a/native_client/ctcdecode/setup.py b/native_client/ctcdecode/setup.py index fb5a7114..8a3876c9 100644 --- a/native_client/ctcdecode/setup.py +++ b/native_client/ctcdecode/setup.py @@ -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)