view Makefile.inc @ 176:eaf46e7647a0 tip master

Update for latest Emscripten - Pointer_stringify has apparently been deprecated for a while, and was removed in v1.38.27
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 27 Feb 2019 11:29:53 +0000
parents a91b4defa581
children
line wrap: on
line source

# This GNU Makefile fragment is intended to be included from the
# Makefile for a Piper adapter, for use when recompiling an existing
# Vamp plugin (in C++) into a Javascript module.
#
# This fragment defines all of the actual build targets for the
# module. Your including Makefile should define some or all of the
# following variables before including it:
#
# MODULE_SOURCE - The name of the .cpp file for the module main entry
# point, e.g. vamp-example-plugins.cpp. You must write this file; it
# is not the same as the plugin library entry point used for the
# original Vamp plugin build. You can use the generator program (in
# piper-vamp-js/generator) to generate a preliminary version based on
# metadata reported by your actual plugin library, but it will usually
# still need some editing.
#
# MODULE_NAME - The name of the target feature extraction module.
# Typically a camel-cased representation of the Vamp plugin library
# name, like VampExamplePlugins.
#
# PLUGIN_SOURCES - All C++ source files for the plugin library.
#
# PLUGIN_C_SOURCES - Any C source files for the plugin library.
#
# DEFINES - Any additional -D flags for the C/C++ compiler.
#
# INCLUDES - Any additional -I flags for the C/C++ compiler.
#
# EMFLAGS - Any additional Emscripten-specific flags to pass to the
# compiler.

default:        help

help:
		@echo
		@echo "Supported make targets:"
		@echo
		@echo "$$ make wasm"
		@echo "  - build Javascript/WebAssembly module using Emscripten"
		@echo "$$ make test-wasm"
		@echo "  - build and run simple test of Javascript/WebAssembly module using node.js"
		@echo "$$ make em"
		@echo "  - build Javascript module using Emscripten"
		@echo "$$ make test-em"
		@echo "  - build and run simple test of Javascript module using node.js"
		@echo "$$ make linux"
		@echo "  - build native-code module on Linux (currently this is mostly for testing)"
		@echo "$$ make clean"
		@echo "  - remove intermediate build files, but not targets"
		@echo "$$ make distclean"
		@echo "  - remove all targets and intermediate build files"
		@echo
		@echo "Note: when switching from one target to another, make clean first"
		@echo

MY_DIR		:= $(realpath $(dir $(lastword $(MAKEFILE_LIST))))

SRC_DIR		:= $(MY_DIR)/src
SDK_DIR		:= $(MY_DIR)/../vamp-plugin-sdk
PIPERCPP_DIR    := $(MY_DIR)/../piper-vamp-cpp

ADAPTER_HEADERS	:= \
		$(SRC_DIR)/PiperAdapter.h \
		$(SRC_DIR)/PiperPluginLibrary.h 
ADAPTER_SOURCES	:= \
		$(SRC_DIR)/PiperPluginLibrary.cpp

SDK_SOURCES	:= \
		$(SDK_DIR)/src/vamp-hostsdk/PluginBufferingAdapter.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/PluginChannelAdapter.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/PluginHostAdapter.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/PluginLoader.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/PluginWrapper.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/RealTime.cpp \
		$(SDK_DIR)/src/vamp-hostsdk/Files.cpp \
		$(SDK_DIR)/src/vamp-sdk/PluginAdapter.cpp \
		$(SDK_DIR)/src/vamp-sdk/RealTime.cpp \
		$(SDK_DIR)/src/vamp-sdk/FFT.cpp

OTHER_SOURCES	:= \
		$(PIPERCPP_DIR)/ext/json11/json11.cpp

NODE            ?= node

EM_MODULE_T_EXT	:= .tmp.js
EM_MODULE_U_EXT	:= .umd.js
EM_MODULE_T	:= $(MODULE_NAME)$(EM_MODULE_T_EXT)
EM_MODULE_U	:= $(MODULE_NAME)$(EM_MODULE_U_EXT)
EM_MODULE_SYMBOL	:= $(MODULE_NAME)Module

WASM_MODULE_T_EXT := _w.js
WASM_MODULE_U_EXT := _w.umd.js
WASM_MODULE_T   := $(MODULE_NAME)$(WASM_MODULE_T_EXT)
WASM_MODULE_U   := $(MODULE_NAME)$(WASM_MODULE_U_EXT)

SO_MODULE_EXT	:= .so
SO_MODULE	:= $(MODULE_NAME)$(SO_MODULE_EXT)

EMFLAGS_ANY	:= \
                --memory-init-file 0 \
		-s MODULARIZE=1 \
		-s NO_FILESYSTEM=1 \
                -s ASSERTIONS=1 \
		-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
	    	-s "EXPORT_NAME='$(EM_MODULE_SYMBOL)'" \
	    	-s "EXPORTED_FUNCTIONS=['_piperRequestJson', '_piperProcessRaw', '_piperFreeJson', '_malloc', '_free']" \
                -s "EXTRA_EXPORTED_RUNTIME_METHODS=['cwrap', 'allocate', 'ALLOC_NORMAL', 'UTF8ToString', 'intArrayFromString']" \
		$(EMFLAGS)

EMFLAGS_ASMJS   := \
                $(EMFLAGS_ANY) \
		-s MEM_INIT_METHOD=0 \
                -s WASM=0

EMFLAGS_WASM    := \
                $(EMFLAGS_ANY) \
                -s WASM=1 \
                -s SINGLE_FILE=1

CXX_SOURCES	:= $(MODULE_SOURCE) $(ADAPTER_SOURCES) $(PLUGIN_SOURCES) $(SDK_SOURCES) $(OTHER_SOURCES)
C_SOURCES	:= $(PLUGIN_C_SOURCES) $(C_SOURCES)

#OPTFLAGS	?= -g3
OPTFLAGS	?= -O

DEFINES		:= $(DEFINES)
INCLUDES	:= -I$(SRC_DIR) -I$(SDK_DIR) -I$(PIPERCPP_DIR) -I$(PIPERCPP_DIR)/ext $(INCLUDES)

em:	$(EM_MODULE_U)
em:	CXX		:= em++
em:	CC		:= emcc
em:	CXXFLAGS	:= -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_ASMJS) $(INCLUDES)
em:	CFLAGS		:= -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_ASMJS) $(INCLUDES)
em:	LDFLAGS		:= $(EMFLAGS_ASMJS)

wasm:   $(WASM_MODULE_U)
wasm:   CXX		:= em++
wasm:	CC		:= emcc
wasm:	CXXFLAGS	:= -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_WASM) $(INCLUDES)
wasm:	CFLAGS		:= -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_WASM) $(INCLUDES)
wasm:	LDFLAGS		:= $(EMFLAGS_WASM)

linux:	$(SO_MODULE)
linux:	CXXFLAGS	:= -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(INCLUDES)
linux:	CFLAGS		:= -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(INCLUDES)
linux:	LDFLAGS		:= -shared -Wl,-Bsymbolic -Wl,-soname=$(SO_MODULE) -Wl,-z,defs -Wl,--version-script=$(SRC_DIR)/piper.map -ldl

OBJDIR          := o

CXX_OBJECTS	:= $(CXX_SOURCES:.cpp=.o)
C_OBJECTS	:= $(C_SOURCES:.c=.o)
ALL_OBJECTS	:= $(CXX_OBJECTS) $(C_OBJECTS)
OBJECTS         := $(addprefix $(OBJDIR)/,$(abspath $(ALL_OBJECTS)))

o/%.o:            %.cpp
		mkdir -p $(dir $@)
		$(CXX) -c $(INCLUDES) $(CXXFLAGS) -o $@ $<

o/%.o:            %.c
		mkdir -p $(dir $@)
		$(CC) -c $(INCLUDES) $(CFLAGS) -o $@ $<

$(EM_MODULE_U):	$(OBJECTS)
		$(CXX) $(OPTFLAGS) -o $(EM_MODULE_T) $^ $(LDFLAGS) && \
		( 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) ) && \
		cat $(EM_MODULE_T) >> $(EM_MODULE_U) && \
                rm $(EM_MODULE_T) && \
		( echo ; echo "return $(EM_MODULE_SYMBOL);}));" >> $(EM_MODULE_U) )

$(WASM_MODULE_U): $(OBJECTS)
		$(CXX) $(OPTFLAGS) -o $(WASM_MODULE_T) $^ $(LDFLAGS) && \
		( 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) ) && \
		cat $(WASM_MODULE_T) >> $(WASM_MODULE_U) && \
                rm $(WASM_MODULE_T) && \
		( echo ; echo "return $(EM_MODULE_SYMBOL);}));" >> $(WASM_MODULE_U) )

$(SO_MODULE):	$(OBJECTS)
		$(CXX) -o $@ $^ $(LDFLAGS)

test:           test-em test-wasm

test-em:	em
		$(NODE) $(MY_DIR)/test/node-load-test.js $(shell pwd)/$(EM_MODULE_U)

test-wasm:	wasm
		$(NODE) $(MY_DIR)/test/node-load-test.js $(shell pwd)/$(WASM_MODULE_U)

clean:
		rm -f $(OBJECTS)

distclean:	clean
		rm -f $(EM_MODULE_T) $(EM_MODULE_U) $(WASM_MODULE_T) $(WASM_MODULE_U) $(SO_MODULE)