annotate 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
rev   line source
cannam@154 1
cannam@154 2 # This GNU Makefile fragment is intended to be included from the
cannam@154 3 # Makefile for a Piper adapter, for use when recompiling an existing
cannam@154 4 # Vamp plugin (in C++) into a Javascript module.
cannam@154 5 #
cannam@154 6 # This fragment defines all of the actual build targets for the
cannam@154 7 # module. Your including Makefile should define some or all of the
cannam@154 8 # following variables before including it:
cannam@154 9 #
cannam@154 10 # MODULE_SOURCE - The name of the .cpp file for the module main entry
cannam@154 11 # point, e.g. vamp-example-plugins.cpp. You must write this file; it
cannam@154 12 # is not the same as the plugin library entry point used for the
cannam@154 13 # original Vamp plugin build. You can use the generator program (in
cannam@154 14 # piper-vamp-js/generator) to generate a preliminary version based on
cannam@154 15 # metadata reported by your actual plugin library, but it will usually
cannam@154 16 # still need some editing.
cannam@154 17 #
cannam@154 18 # MODULE_NAME - The name of the target feature extraction module.
cannam@154 19 # Typically a camel-cased representation of the Vamp plugin library
cannam@154 20 # name, like VampExamplePlugins.
cannam@154 21 #
cannam@154 22 # PLUGIN_SOURCES - All C++ source files for the plugin library.
cannam@154 23 #
cannam@154 24 # PLUGIN_C_SOURCES - Any C source files for the plugin library.
cannam@154 25 #
cannam@154 26 # DEFINES - Any additional -D flags for the C/C++ compiler.
cannam@154 27 #
cannam@154 28 # INCLUDES - Any additional -I flags for the C/C++ compiler.
cannam@154 29 #
cannam@154 30 # EMFLAGS - Any additional Emscripten-specific flags to pass to the
cannam@154 31 # compiler.
c@120 32
c@120 33 default: help
c@120 34
c@120 35 help:
c@120 36 @echo
c@120 37 @echo "Supported make targets:"
c@120 38 @echo
cannam@175 39 @echo "$$ make wasm"
cannam@175 40 @echo " - build Javascript/WebAssembly module using Emscripten"
cannam@175 41 @echo "$$ make test-wasm"
cannam@175 42 @echo " - build and run simple test of Javascript/WebAssembly module using node.js"
c@120 43 @echo "$$ make em"
c@120 44 @echo " - build Javascript module using Emscripten"
cannam@175 45 @echo "$$ make test-em"
cannam@175 46 @echo " - build and run simple test of Javascript module using node.js"
c@120 47 @echo "$$ make linux"
c@124 48 @echo " - build native-code module on Linux (currently this is mostly for testing)"
c@120 49 @echo "$$ make clean"
c@120 50 @echo " - remove intermediate build files, but not targets"
c@122 51 @echo "$$ make distclean"
c@122 52 @echo " - remove all targets and intermediate build files"
c@120 53 @echo
c@120 54 @echo "Note: when switching from one target to another, make clean first"
c@120 55 @echo
c@120 56
c@121 57 MY_DIR := $(realpath $(dir $(lastword $(MAKEFILE_LIST))))
c@121 58
c@121 59 SRC_DIR := $(MY_DIR)/src
c@121 60 SDK_DIR := $(MY_DIR)/../vamp-plugin-sdk
cannam@148 61 PIPERCPP_DIR := $(MY_DIR)/../piper-vamp-cpp
c@120 62
c@120 63 ADAPTER_HEADERS := \
c@120 64 $(SRC_DIR)/PiperAdapter.h \
c@120 65 $(SRC_DIR)/PiperPluginLibrary.h
c@120 66 ADAPTER_SOURCES := \
c@120 67 $(SRC_DIR)/PiperPluginLibrary.cpp
c@120 68
c@120 69 SDK_SOURCES := \
c@120 70 $(SDK_DIR)/src/vamp-hostsdk/PluginBufferingAdapter.cpp \
c@120 71 $(SDK_DIR)/src/vamp-hostsdk/PluginChannelAdapter.cpp \
c@120 72 $(SDK_DIR)/src/vamp-hostsdk/PluginHostAdapter.cpp \
c@120 73 $(SDK_DIR)/src/vamp-hostsdk/PluginInputDomainAdapter.cpp \
c@120 74 $(SDK_DIR)/src/vamp-hostsdk/PluginLoader.cpp \
c@120 75 $(SDK_DIR)/src/vamp-hostsdk/PluginSummarisingAdapter.cpp \
c@120 76 $(SDK_DIR)/src/vamp-hostsdk/PluginWrapper.cpp \
c@120 77 $(SDK_DIR)/src/vamp-hostsdk/RealTime.cpp \
c@120 78 $(SDK_DIR)/src/vamp-hostsdk/Files.cpp \
c@120 79 $(SDK_DIR)/src/vamp-sdk/PluginAdapter.cpp \
c@120 80 $(SDK_DIR)/src/vamp-sdk/RealTime.cpp \
c@120 81 $(SDK_DIR)/src/vamp-sdk/FFT.cpp
c@120 82
c@120 83 OTHER_SOURCES := \
cannam@138 84 $(PIPERCPP_DIR)/ext/json11/json11.cpp
c@120 85
cannam@161 86 NODE ?= node
cannam@161 87
cannam@169 88 EM_MODULE_T_EXT := .tmp.js
cannam@150 89 EM_MODULE_U_EXT := .umd.js
cannam@169 90 EM_MODULE_T := $(MODULE_NAME)$(EM_MODULE_T_EXT)
cannam@150 91 EM_MODULE_U := $(MODULE_NAME)$(EM_MODULE_U_EXT)
c@120 92 EM_MODULE_SYMBOL := $(MODULE_NAME)Module
c@120 93
cannam@172 94 WASM_MODULE_T_EXT := _w.js
cannam@172 95 WASM_MODULE_U_EXT := _w.umd.js
cannam@172 96 WASM_MODULE_T := $(MODULE_NAME)$(WASM_MODULE_T_EXT)
cannam@172 97 WASM_MODULE_U := $(MODULE_NAME)$(WASM_MODULE_U_EXT)
cannam@172 98
c@120 99 SO_MODULE_EXT := .so
c@120 100 SO_MODULE := $(MODULE_NAME)$(SO_MODULE_EXT)
c@120 101
cannam@175 102 EMFLAGS_ANY := \
cannam@175 103 --memory-init-file 0 \
c@120 104 -s MODULARIZE=1 \
c@120 105 -s NO_FILESYSTEM=1 \
cannam@176 106 -s ASSERTIONS=1 \
c@120 107 -s ERROR_ON_UNDEFINED_SYMBOLS=1 \
cannam@172 108 -s "EXPORT_NAME='$(EM_MODULE_SYMBOL)'" \
cannam@175 109 -s "EXPORTED_FUNCTIONS=['_piperRequestJson', '_piperProcessRaw', '_piperFreeJson', '_malloc', '_free']" \
cannam@176 110 -s "EXTRA_EXPORTED_RUNTIME_METHODS=['cwrap', 'allocate', 'ALLOC_NORMAL', 'UTF8ToString', 'intArrayFromString']" \
c@120 111 $(EMFLAGS)
c@120 112
cannam@175 113 EMFLAGS_ASMJS := \
cannam@175 114 $(EMFLAGS_ANY) \
cannam@176 115 -s MEM_INIT_METHOD=0 \
cannam@175 116 -s WASM=0
cannam@172 117
cannam@175 118 EMFLAGS_WASM := \
cannam@175 119 $(EMFLAGS_ANY) \
cannam@175 120 -s WASM=1 \
cannam@175 121 -s SINGLE_FILE=1
cannam@172 122
c@120 123 CXX_SOURCES := $(MODULE_SOURCE) $(ADAPTER_SOURCES) $(PLUGIN_SOURCES) $(SDK_SOURCES) $(OTHER_SOURCES)
c@121 124 C_SOURCES := $(PLUGIN_C_SOURCES) $(C_SOURCES)
c@120 125
c@136 126 #OPTFLAGS ?= -g3
c@136 127 OPTFLAGS ?= -O
c@120 128
c@120 129 DEFINES := $(DEFINES)
cannam@138 130 INCLUDES := -I$(SRC_DIR) -I$(SDK_DIR) -I$(PIPERCPP_DIR) -I$(PIPERCPP_DIR)/ext $(INCLUDES)
c@120 131
cannam@169 132 em: $(EM_MODULE_U)
c@120 133 em: CXX := em++
c@120 134 em: CC := emcc
cannam@175 135 em: CXXFLAGS := -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_ASMJS) $(INCLUDES)
cannam@175 136 em: CFLAGS := -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_ASMJS) $(INCLUDES)
cannam@175 137 em: LDFLAGS := $(EMFLAGS_ASMJS)
c@120 138
cannam@172 139 wasm: $(WASM_MODULE_U)
cannam@172 140 wasm: CXX := em++
cannam@172 141 wasm: CC := emcc
cannam@175 142 wasm: CXXFLAGS := -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_WASM) $(INCLUDES)
cannam@175 143 wasm: CFLAGS := -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(EMFLAGS_WASM) $(INCLUDES)
cannam@175 144 wasm: LDFLAGS := $(EMFLAGS_WASM)
cannam@172 145
c@120 146 linux: $(SO_MODULE)
c@131 147 linux: CXXFLAGS := -std=c++11 -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(INCLUDES)
c@131 148 linux: CFLAGS := -fPIC -Wall -Wextra $(DEFINES) $(OPTFLAGS) $(INCLUDES)
c@120 149 linux: LDFLAGS := -shared -Wl,-Bsymbolic -Wl,-soname=$(SO_MODULE) -Wl,-z,defs -Wl,--version-script=$(SRC_DIR)/piper.map -ldl
c@120 150
c@120 151 OBJDIR := o
c@120 152
c@120 153 CXX_OBJECTS := $(CXX_SOURCES:.cpp=.o)
c@120 154 C_OBJECTS := $(C_SOURCES:.c=.o)
c@122 155 ALL_OBJECTS := $(CXX_OBJECTS) $(C_OBJECTS)
c@122 156 OBJECTS := $(addprefix $(OBJDIR)/,$(abspath $(ALL_OBJECTS)))
c@120 157
c@120 158 o/%.o: %.cpp
c@120 159 mkdir -p $(dir $@)
c@131 160 $(CXX) -c $(INCLUDES) $(CXXFLAGS) -o $@ $<
c@120 161
c@120 162 o/%.o: %.c
c@120 163 mkdir -p $(dir $@)
c@131 164 $(CC) -c $(INCLUDES) $(CFLAGS) -o $@ $<
c@120 165
cannam@169 166 $(EM_MODULE_U): $(OBJECTS)
cannam@169 167 $(CXX) $(OPTFLAGS) -o $(EM_MODULE_T) $^ $(LDFLAGS) && \
dev@166 168 ( 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 169 cat $(EM_MODULE_T) >> $(EM_MODULE_U) && \
cannam@169 170 rm $(EM_MODULE_T) && \
dev@166 171 ( echo ; echo "return $(EM_MODULE_SYMBOL);}));" >> $(EM_MODULE_U) )
c@120 172
cannam@172 173 $(WASM_MODULE_U): $(OBJECTS)
cannam@172 174 $(CXX) $(OPTFLAGS) -o $(WASM_MODULE_T) $^ $(LDFLAGS) && \
cannam@172 175 ( 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 176 cat $(WASM_MODULE_T) >> $(WASM_MODULE_U) && \
cannam@172 177 rm $(WASM_MODULE_T) && \
cannam@172 178 ( echo ; echo "return $(EM_MODULE_SYMBOL);}));" >> $(WASM_MODULE_U) )
cannam@172 179
c@120 180 $(SO_MODULE): $(OBJECTS)
c@120 181 $(CXX) -o $@ $^ $(LDFLAGS)
c@120 182
cannam@176 183 test: test-em test-wasm
cannam@176 184
cannam@175 185 test-em: em
dev@166 186 $(NODE) $(MY_DIR)/test/node-load-test.js $(shell pwd)/$(EM_MODULE_U)
c@133 187
cannam@175 188 test-wasm: wasm
cannam@172 189 $(NODE) $(MY_DIR)/test/node-load-test.js $(shell pwd)/$(WASM_MODULE_U)
cannam@172 190
c@120 191 clean:
c@120 192 rm -f $(OBJECTS)
c@122 193
c@122 194 distclean: clean
cannam@172 195 rm -f $(EM_MODULE_T) $(EM_MODULE_U) $(WASM_MODULE_T) $(WASM_MODULE_U) $(SO_MODULE)
cannam@169 196