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
|