|
|
@@ -0,0 +1,139 @@ |
|
|
|
# |
|
|
|
# Copyright (C) 2014-2016 Eitan Isaacson |
|
|
|
# Copyright (C) 2016 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.so compiled to LLVM IR code |
|
|
|
EM_LIBESPEAKNG_SO=../src/.libs/libespeak-ng.so |
|
|
|
|
|
|
|
# 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 |
|
|
|
|
|
|
|
# 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_OBJS=$(EM_GLUE_OBJ) $(EM_LIBESPEAKNG_SO) |
|
|
|
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 |
|
|
|
|
|
|
|
# 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 |
|
|
|
EM_CXXFLAGS=-s RESERVED_FUNCTION_POINTERS=2 --memory-init-file 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
############################################################################### |
|
|
|
# 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_WORKER_JS): $(EM_GLUE_AUTOGEN_CPP) $(EM_OBJS) $(EM_ALL_PRE_JS) $(EM_ALL_POST_JS) |
|
|
|
$(CXX) $(CXXFLAGS) \ |
|
|
|
$(EM_CXXFLAGS) \ |
|
|
|
$(EM_OBJS) \ |
|
|
|
$(patsubst %,--pre-js %,$(EM_ALL_PRE_JS)) \ |
|
|
|
$(patsubst %,--post-js %,$(EM_ALL_POST_JS)) \ |
|
|
|
-o $@ |
|
|
|
|
|
|
|
clean-intermediate: |
|
|
|
rm -f *.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" |
|
|
|
|