blob: 1da22a8fcf57a15510c440e026ee8c93fb684b31 [file] [log] [blame]
#
# Copyright (C) 2014-2017 Eitan Isaacson
# Copyright (C) 2016-2017 Alberto Pettarin
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see: <http://www.gnu.org/licenses/>.
#
# NOTE: variables specific to espeak-ng + emscripten starts with "EM_"
# NOTE: set to 1 to debug or to speed emscripten up while developing.
# If the EM_DEBUG environment variable is set,
# the value specified here will be ignored.
EM_DEBUG ?= 0
ifneq ($(EM_DEBUG), 1)
CXXFLAGS+=-O3
endif
###############################################################################
# WARNING: modify code below this line at your own risk!
###############################################################################
# NOTE: sanity check
ifndef EMSCRIPTEN
$(error EMSCRIPTEN var not set. You must use emmake to run this Makefile!)
endif
# NOTE: in the emscripten virtual FS,
# this is the location of the eSpeak-ng data files,
# if we configure with "./configure --prefix=/usr"
EM_VIRTUAL_PATH_ESPEAKNG_DATA=/usr/share/espeak-ng-data
# NOTE: emmake will replace EMSCRIPTEN with the actual root directory
# of the emscripten tools inside the emscripten SDK directory
EM_WEBIDL_BINDER=python $(EMSCRIPTEN)/tools/webidl_binder.py
EM_FILE_PACKAGER=python $(EMSCRIPTEN)/tools/file_packager.py
# NOTE: libespeak-ng.a (static library) compiled to LLVM IR code
EM_LIBESPEAKNG=../src/.libs/libespeak-ng.a
# NOTE: glue code files
EM_GLUE_PREFIX=glue
EM_GLUE_IDL=espeakng_glue.idl
EM_GLUE_OBJ=espeakng_glue.o
EM_GLUE_CPP=espeakng_glue.cpp
EM_GLUE_AUTOGEN_CPP=glue.cpp
EM_GLUE_AUTOGEN_JS=glue.js
# libresample files
EM_LIBRESAMPLE_FILTERKIT_CPP=third_party/libresample/src/filterkit.c
EM_LIBRESAMPLE_RESAMPLE_CPP=third_party/libresample/src/resample.c
EM_LIBRESAMPLE_RESAMPLESUBS_CPP=third_party/libresample/src/resamplesubs.c
EM_LIBRESAMPLE_FILTERKIT_OBJ=third_party/libresample/src/filterkit.o
EM_LIBRESAMPLE_RESAMPLE_OBJ=third_party/libresample/src/resample.o
EM_LIBRESAMPLE_RESAMPLESUBS_OBJ=third_party/libresample/src/resamplesubs.o
# NOTE: preload espeak-ng-data directory...
EM_DATA_DIR=../espeak-ng-data
# NOTE: ... but exclude these subdirectories/files
EM_EXCLUDE_DATA=../espeak-ng-data/mbrola_ph ../espeak-ng-data/phondata-manifest
# NOTE: pre/post JS files
EM_PRE_JS=pre.js
EM_POST_JS=post.js
# NOTE: output files
EM_ESPEAKNG_DATA_PACKAGE_JS=espeakng_data_package.js
EM_WORKER_DATA=js/espeakng.worker.data
EM_WORKER_JS=js/espeakng.worker.js
EM_PTHREAD_MAIN_JS=js/pthread-main.js
# NOTE: intermediate objects
EM_ALL_PRE_JS=$(EM_PRE_JS) $(EM_ESPEAKNG_DATA_PACKAGE_JS)
EM_ALL_POST_JS=$(EM_GLUE_AUTOGEN_JS) $(EM_POST_JS)
# NOTE: compile without async, i.e. with synchronous output
#
# ./emconfigure ./configure --prefix=/usr --without-async
# ./emmake make
CXXFLAGS+=-DESPEAK_DATA_PATH=\"$(EM_VIRTUAL_PATH_ESPEAKNG_DATA)\"
CXXFLAGS+=-I ./ -I ../ -I ../src/include/espeak-ng -I third_party/libresample/src -I third_party/libresample/include
# NOTE: so far, pthread is not supported in any browser
# except Firefox Nightly.
# If we want to enable pthread in the future,
# we must append "-s USE_PTHREADS=1" to CXXFLAGS
# and pass that to emconfigure and emmake.
# If enabled, js/pthread-main.js will be created as well.
#
#CXXFLAGS+=-s USE_PTHREADS=1
# NOTE: extra flags for emscripten
CXXFLAGS+=-s RESERVED_FUNCTION_POINTERS=2 --memory-init-file 0 -s FORCE_FILESYSTEM=1 -s WASM=1
CFLAGS+=-s RESERVED_FUNCTION_POINTERS=2 --memory-init-file 0 -s FORCE_FILESYSTEM=1 -s WASM=1
###############################################################################
# NOTE: actual targets
###############################################################################
all: $(EM_WORKER_JS)
$(EM_WORKER_DATA):
$(EM_FILE_PACKAGER) $@ \
--js-output=$(EM_ESPEAKNG_DATA_PACKAGE_JS) \
--preload $(EM_DATA_DIR)@$(EM_VIRTUAL_PATH_ESPEAKNG_DATA) \
$(patsubst %,--exclude %,$(EM_EXCLUDE_DATA))
$(EM_ESPEAKNG_DATA_PACKAGE_JS): $(EM_WORKER_DATA)
$(EM_GLUE_AUTOGEN_CPP): $(EM_GLUE_IDL)
$(EM_WEBIDL_BINDER) $(EM_GLUE_IDL) $(EM_GLUE_PREFIX)
$(EM_GLUE_AUTOGEN_JS): $(EM_GLUE_AUTOGEN_CPP)
$(EM_GLUE_OBJ): $(EM_GLUE_CPP)
$(EM_LIBRESAMPLE_FILTERKIT_OBJ): $(EM_LIBRESAMPLE_FILTERKIT_CPP)
$(EM_LIBRESAMPLE_RESAMPLE_OBJ): $(EM_LIBRESAMPLE_RESAMPLE_CPP)
$(EM_LIBRESAMPLE_RESAMPLESUBS_OBJ): $(EM_LIBRESAMPLE_RESAMPLESUBS_CPP)
$(EM_WORKER_JS): $(EM_GLUE_AUTOGEN_CPP) $(EM_GLUE_OBJ) $(EM_LIBRESAMPLE_FILTERKIT_OBJ) $(EM_LIBRESAMPLE_RESAMPLE_OBJ) $(EM_LIBRESAMPLE_RESAMPLESUBS_OBJ) $(EM_ALL_PRE_JS) $(EM_ALL_POST_JS)
ifeq ($(EM_LIBESPEAKNG),)
$(error Unable to find ../src/.libs/libespeak-ng .so or .dylib. Aborting!)
endif
$(CXX) $(CXXFLAGS) \
$(EM_CXXFLAGS) \
$(EM_GLUE_OBJ) \
$(EM_LIBESPEAKNG) \
$(EM_LIBRESAMPLE_FILTERKIT_OBJ) \
$(EM_LIBRESAMPLE_RESAMPLESUBS_OBJ) \
$(EM_LIBRESAMPLE_RESAMPLE_OBJ) \
$(patsubst %,--pre-js %,$(EM_ALL_PRE_JS)) \
$(patsubst %,--post-js %,$(EM_ALL_POST_JS)) \
-o $@
clean-intermediate:
rm -f *.o third_party/libresample/src/*.o *.out *.pkl $(EM_GLUE_AUTOGEN_CPP) $(EM_GLUE_AUTOGEN_JS) $(EM_ESPEAKNG_DATA_PACKAGE_JS)
clean: clean-intermediate
rm -f $(EM_WORKER_DATA) $(EM_WORKER_JS) $(EM_PTHREAD_MAIN_JS)
help:
echo "Available targets: all clean clean-intermediate help"