cannam@154: cannam@154: # This GNU Makefile fragment is intended to be included from the cannam@154: # Makefile for a Piper adapter, for use when recompiling an existing cannam@154: # Vamp plugin (in C++) into a Javascript module. cannam@154: # cannam@154: # This fragment defines all of the actual build targets for the cannam@154: # module. Your including Makefile should define some or all of the cannam@154: # following variables before including it: cannam@154: # cannam@154: # MODULE_SOURCE - The name of the .cpp file for the module main entry cannam@154: # point, e.g. vamp-example-plugins.cpp. You must write this file; it cannam@154: # is not the same as the plugin library entry point used for the cannam@154: # original Vamp plugin build. You can use the generator program (in cannam@154: # piper-vamp-js/generator) to generate a preliminary version based on cannam@154: # metadata reported by your actual plugin library, but it will usually cannam@154: # still need some editing. cannam@154: # cannam@154: # MODULE_NAME - The name of the target feature extraction module. cannam@154: # Typically a camel-cased representation of the Vamp plugin library cannam@154: # name, like VampExamplePlugins. cannam@154: # cannam@154: # PLUGIN_SOURCES - All C++ source files for the plugin library. cannam@154: # cannam@154: # PLUGIN_C_SOURCES - Any C source files for the plugin library. cannam@154: # cannam@154: # DEFINES - Any additional -D flags for the C/C++ compiler. cannam@154: # cannam@154: # INCLUDES - Any additional -I flags for the C/C++ compiler. cannam@154: # cannam@154: # EMFLAGS - Any additional Emscripten-specific flags to pass to the cannam@154: # compiler. c@120: c@120: default: help c@120: c@120: help: c@120: @echo c@120: @echo "Supported make targets:" c@120: @echo cannam@175: @echo "$$ make wasm" cannam@175: @echo " - build Javascript/WebAssembly module using Emscripten" cannam@175: @echo "$$ make test-wasm" cannam@175: @echo " - build and run simple test of Javascript/WebAssembly module using node.js" c@120: @echo "$$ make em" c@120: @echo " - build Javascript module using Emscripten" cannam@175: @echo "$$ make test-em" cannam@175: @echo " - build and run simple test of Javascript module using node.js" c@120: @echo "$$ make linux" c@124: @echo " - build native-code module on Linux (currently this is mostly for testing)" c@120: @echo "$$ make clean" c@120: @echo " - remove intermediate build files, but not targets" c@122: @echo "$$ make distclean" c@122: @echo " - remove all targets and intermediate build files" c@120: @echo c@120: @echo "Note: when switching from one target to another, make clean first" c@120: @echo c@120: c@121: MY_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))) c@121: c@121: SRC_DIR := $(MY_DIR)/src c@121: SDK_DIR := $(MY_DIR)/../vamp-plugin-sdk cannam@148: PIPERCPP_DIR := $(MY_DIR)/../piper-vamp-cpp c@120: c@120: ADAPTER_HEADERS := \ c@120: $(SRC_DIR)/PiperAdapter.h \ c@120: $(SRC_DIR)/PiperPluginLibrary.h c@120: ADAPTER_SOURCES := \ c@120: $(SRC_DIR)/PiperPluginLibrary.cpp c@120: c@120: SDK_SOURCES := \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginBufferingAdapter.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginChannelAdapter.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginHostAdapter.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginLoader.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/PluginWrapper.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/RealTime.cpp \ c@120: $(SDK_DIR)/src/vamp-hostsdk/Files.cpp \ c@120: $(SDK_DIR)/src/vamp-sdk/PluginAdapter.cpp \ c@120: $(SDK_DIR)/src/vamp-sdk/RealTime.cpp \ c@120: $(SDK_DIR)/src/vamp-sdk/FFT.cpp c@120: c@120: OTHER_SOURCES := \ cannam@138: $(PIPERCPP_DIR)/ext/json11/json11.cpp c@120: cannam@161: NODE ?= node cannam@161: cannam@169: EM_MODULE_T_EXT := .tmp.js cannam@150: EM_MODULE_U_EXT := .umd.js cannam@169: EM_MODULE_T := $(MODULE_NAME)$(EM_MODULE_T_EXT) cannam@150: EM_MODULE_U := $(MODULE_NAME)$(EM_MODULE_U_EXT) c@120: EM_MODULE_SYMBOL := $(MODULE_NAME)Module c@120: cannam@172: WASM_MODULE_T_EXT := _w.js cannam@172: WASM_MODULE_U_EXT := _w.umd.js cannam@172: WASM_MODULE_T := $(MODULE_NAME)$(WASM_MODULE_T_EXT) cannam@172: WASM_MODULE_U := $(MODULE_NAME)$(WASM_MODULE_U_EXT) cannam@172: c@120: SO_MODULE_EXT := .so c@120: SO_MODULE := $(MODULE_NAME)$(SO_MODULE_EXT) c@120: cannam@175: EMFLAGS_ANY := \ cannam@175: --memory-init-file 0 \ c@120: -s MODULARIZE=1 \ c@120: -s NO_FILESYSTEM=1 \ cannam@176: -s ASSERTIONS=1 \ c@120: -s ERROR_ON_UNDEFINED_SYMBOLS=1 \ cannam@172: -s "EXPORT_NAME='$(EM_MODULE_SYMBOL)'" \ cannam@175: -s "EXPORTED_FUNCTIONS=['_piperRequestJson', '_piperProcessRaw', '_piperFreeJson', '_malloc', '_free']" \ cannam@176: -s "EXTRA_EXPORTED_RUNTIME_METHODS=['cwrap', 'allocate', 'ALLOC_NORMAL', 'UTF8ToString', 'intArrayFromString']" \ c@120: $(EMFLAGS) c@120: cannam@175: EMFLAGS_ASMJS := \ cannam@175: $(EMFLAGS_ANY) \ cannam@176: -s MEM_INIT_METHOD=0 \ cannam@175: -s WASM=0 cannam@172: cannam@175: EMFLAGS_WASM := \ cannam@175: $(EMFLAGS_ANY) \ cannam@175: -s WASM=1 \ cannam@175: -s SINGLE_FILE=1 cannam@172: c@120: CXX_SOURCES := $(MODULE_SOURCE) $(ADAPTER_SOURCES) $(PLUGIN_SOURCES) $(SDK_SOURCES) $(OTHER_SOURCES) c@121: C_SOURCES := $(PLUGIN_C_SOURCES) $(C_SOURCES) c@120: c@136: #OPTFLAGS ?= -g3 c@136: OPTFLAGS ?= -O c@120: c@120: DEFINES := $(DEFINES) cannam@138: INCLUDES := -I$(SRC_DIR) -I$(SDK_DIR) -I$(PIPERCPP_DIR) -I$(PIPERCPP_DIR)/ext $(INCLUDES) c@120: cannam@169: em: $(EM_MODULE_U) c@120: em: CXX := em++ c@120: em: CC := emcc cannam@175: em: CXXFLAGS := -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_ASMJS) $(INCLUDES) cannam@175: em: CFLAGS := -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_ASMJS) $(INCLUDES) cannam@175: em: LDFLAGS := $(EMFLAGS_ASMJS) c@120: cannam@172: wasm: $(WASM_MODULE_U) cannam@172: wasm: CXX := em++ cannam@172: wasm: CC := emcc cannam@175: wasm: CXXFLAGS := -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_WASM) $(INCLUDES) cannam@175: wasm: CFLAGS := -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_WASM) $(INCLUDES) cannam@175: wasm: LDFLAGS := $(EMFLAGS_WASM) cannam@172: c@120: linux: $(SO_MODULE) c@131: linux: CXXFLAGS := -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(INCLUDES) c@131: linux: CFLAGS := -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(INCLUDES) c@120: linux: LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-soname=$(SO_MODULE) -Wl,-z,defs -Wl,--version-script=$(SRC_DIR)/piper.map -ldl c@120: c@120: OBJDIR := o c@120: c@120: CXX_OBJECTS := $(CXX_SOURCES:.cpp=.o) c@120: C_OBJECTS := $(C_SOURCES:.c=.o) c@122: ALL_OBJECTS := $(CXX_OBJECTS) $(C_OBJECTS) c@122: OBJECTS := $(addprefix $(OBJDIR)/,$(abspath $(ALL_OBJECTS))) c@120: c@120: o/%.o: %.cpp c@120: mkdir -p $(dir $@) c@131: $(CXX) -c $(INCLUDES) $(CXXFLAGS) -o $@ $< c@120: c@120: o/%.o: %.c c@120: mkdir -p $(dir $@) c@131: $(CC) -c $(INCLUDES) $(CFLAGS) -o $@ $< c@120: cannam@169: $(EM_MODULE_U): $(OBJECTS) cannam@169: $(CXX) $(OPTFLAGS) -o $(EM_MODULE_T) $^ $(LDFLAGS) && \ dev@166: ( echo "(function(root,factory){if(typeof define==='function'&&define.amd){define([],factory);}else if(typeof module==='object'&&module.exports){module.exports=factory();}else{root['$(EM_MODULE_SYMBOL)']=factory();}}(this,function(){" > $(EM_MODULE_U) ) && \ cannam@169: cat $(EM_MODULE_T) >> $(EM_MODULE_U) && \ cannam@169: rm $(EM_MODULE_T) && \ dev@166: ( echo ; echo "return $(EM_MODULE_SYMBOL);}));" >> $(EM_MODULE_U) ) c@120: cannam@172: $(WASM_MODULE_U): $(OBJECTS) cannam@172: $(CXX) $(OPTFLAGS) -o $(WASM_MODULE_T) $^ $(LDFLAGS) && \ cannam@172: ( echo "(function(root,factory){if(typeof define==='function'&&define.amd){define([],factory);}else if(typeof module==='object'&&module.exports){module.exports=factory();}else{root['$(EM_MODULE_SYMBOL)']=factory();}}(this,function(){" > $(WASM_MODULE_U) ) && \ cannam@172: cat $(WASM_MODULE_T) >> $(WASM_MODULE_U) && \ cannam@172: rm $(WASM_MODULE_T) && \ cannam@172: ( echo ; echo "return $(EM_MODULE_SYMBOL);}));" >> $(WASM_MODULE_U) ) cannam@172: c@120: $(SO_MODULE): $(OBJECTS) c@120: $(CXX) -o $@ $^ $(LDFLAGS) c@120: cannam@176: test: test-em test-wasm cannam@176: cannam@175: test-em: em dev@166: $(NODE) $(MY_DIR)/test/node-load-test.js $(shell pwd)/$(EM_MODULE_U) c@133: cannam@175: test-wasm: wasm cannam@172: $(NODE) $(MY_DIR)/test/node-load-test.js $(shell pwd)/$(WASM_MODULE_U) cannam@172: c@120: clean: c@120: rm -f $(OBJECTS) c@122: c@122: distclean: clean cannam@172: rm -f $(EM_MODULE_T) $(EM_MODULE_U) $(WASM_MODULE_T) $(WASM_MODULE_U) $(SO_MODULE) cannam@169: