forked from aeroheim/audio-file-decoder
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakefile
More file actions
216 lines (193 loc) · 7.18 KB
/
makefile
File metadata and controls
216 lines (193 loc) · 7.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
SHELL := /bin/bash
# paths
LIB_PATH := src/lib
SRC_PATH := src/module
WASM_PATH := src/wasm
OBJ_PATH := obj
DEPS_PATH := deps
# dependencies
EMSDK_VER := 2.0.1
EMSDK_PATH := $(DEPS_PATH)/emsdk
FFMPEG_VER := 4.3.1
FFMPEG_SRC_PATH := $(DEPS_PATH)/src/ffmpeg
FFMPEG_DIST_PATH := $(DEPS_PATH)/dist/ffmpeg
FFMPEG_LIB_PATH := $(FFMPEG_DIST_PATH)/lib
LIBOPUS_VER := 1.3.1
LIBOPUS_SRC_PATH := $(DEPS_PATH)/src/libopus
LIBOPUS_DIST_PATH := $(DEPS_PATH)/dist/libopus
LIBMP3LAME_VER := 3.100
LIBMP3LAME_SRC_PATH := $(DEPS_PATH)/src/libmp3lame
LIBMP3LAME_DIST_PATH := $(DEPS_PATH)/dist/libmp3lame
# targets
WASM_TARGET := $(WASM_PATH)/decode-audio.js
WASM_WORKER_TARGET := $(WASM_PATH)/decode-audio-worker.js
WASM_WORKER_SRC := $(LIB_PATH)/worker.js
FFMPEG_TARGET_NAME := libavcodec libavformat libavutil
FFMPEG_TARGET := $(foreach target, $(FFMPEG_TARGET_NAME), $(FFMPEG_LIB_PATH)/$(target).a)
LIBOPUS_TARGET_NAME := libopus
LIBOPUS_TARGET := $(foreach target, $(LIBOPUS_TARGET_NAME), $(FFMPEG_LIB_PATH)/$(target).a)
LIBMP3LAME_TARGET_NAME := libmp3lame
LIBMP3LAME_TARGET := $(foreach target, $(LIBMP3LAME_TARGET_NAME), $(FFMPEG_LIB_PATH)/$(target).a)
# compiler flags
CC := em++
COMMON_CCFLAG := \
-Wall \
-O3 \
--closure 1 \
--no-entry \
-fno-exceptions \
-s WASM=1 \
-s STRICT=1 \
-s MODULARIZE=1 \
-s MALLOC=emmalloc \
-s ALLOW_MEMORY_GROWTH=1 \
-s EXPORTED_RUNTIME_METHODS=['FS'] \
--bind
CCFLAG := \
$(COMMON_CCFLAG) \
-s EXPORT_ES6
CCFLAG_WORKER := \
$(COMMON_CCFLAG) \
-s --extern-post-js $(WASM_WORKER_SRC)
CCOBJFLAG := $(COMMON_CCFLAG) -c
LDFLAG := `PKG_CONFIG_PATH="$(FFMPEG_LIB_PATH)/pkgconfig" pkg-config --cflags --libs $(FFMPEG_TARGET_NAME)`
# src files & obj files
SRC := $(foreach x, $(SRC_PATH), $(wildcard $(addprefix $(x)/*,.c*)))
OBJ := $(addprefix $(OBJ_PATH)/, $(addsuffix .o, $(notdir $(basename $(SRC)))))
# the default target
wasm: $(WASM_TARGET) $(WASM_WORKER_TARGET)
# wasm file & js file with glue code to be included in library bundle
$(WASM_TARGET): $(OBJ)
@ mkdir -p $(WASM_PATH)
$(CC) $(CCFLAG) -o $@ $? $(LDFLAG)
# worker js file with glue code inlined
$(WASM_WORKER_TARGET): $(OBJ)
@ mkdir -p $(WASM_PATH)
EMCC_CLOSURE_ARGS="--language_in=ECMASCRIPT_2021" $(CC) $(CCFLAG_WORKER) -o $@ $? $(LDFLAG)
# object files
$(OBJ_PATH)/%.o: $(SRC_PATH)/%.c*
@ mkdir -p $(OBJ_PATH)
$(CC) $(CCOBJFLAG) -o $@ $< $(LDFLAG)
# phony targets
.PHONY: clean \
deps ffmpeg libopus libmp3lame \
clean-deps clean-ffmpeg clean-libopus clean-libmp3lame \
sync sync-ffmpeg sync-libopus sync-libmp3lame \
unsync unsync-ffmpeg unsync-libopus unsync-libmp3lame
clean:
@echo Removing $(OBJ_PATH) $(WASM_PATH)
@rm -rf $(OBJ_PATH) $(WASM_PATH)
# rules for dependencies
deps: ffmpeg libopus libmp3lame
ffmpeg: $(FFMPEG_TARGET)
$(FFMPEG_TARGET) &: $(LIBOPUS_TARGET) $(LIBMP3LAME_TARGET)
@ echo Compiling FFmpeg $(FFMPEG_VER)
@ cd $(FFMPEG_SRC_PATH) && \
EM_PKG_CONFIG_PATH="../../../$(FFMPEG_DIST_PATH)/lib/pkgconfig" emconfigure ./configure \
--cc=emcc --ranlib=emranlib --target-os=none --arch=x86 \
--disable-everything --disable-all \
--enable-avcodec --enable-avformat --enable-avutil \
--enable-decoder="aac*,mp3*,pcm*,flac,libopus,opus,vorbis" \
--enable-demuxer="aac*,mov,pcm*,mp3,ogg,flac,wav" \
--enable-libopus \
--enable-libmp3lame \
--enable-protocol="file" \
--disable-programs \
--disable-asm --disable-runtime-cpudetect --disable-fast-unaligned --disable-pthreads --disable-w32threads --disable-os2threads \
--disable-network --disable-debug --disable-stripping --disable-safe-bitstream-reader \
--disable-d3d11va --disable-dxva2 --disable-vaapi --disable-vdpau --disable-bzlib \
--disable-iconv --disable-libxcb --disable-lzma --disable-securetransport --disable-xlib \
--pkg-config-flags="--static" \
--prefix=$$(pwd)/../../../$(FFMPEG_DIST_PATH) \
--extra-cflags="-I../../../$(FFMPEG_DIST_PATH)/include" \
--extra-ldflags="-L../../../$(FFMPEG_DIST_PATH)/lib" \
&& \
emmake make -j && \
emmake make install
libopus: $(LIBOPUS_TARGET)
$(LIBOPUS_TARGET) &:
@ echo Compiling libopus $(LIBOPUS_VER)
@ mkdir -p $(FFMPEG_DIST_PATH) && cd $(LIBOPUS_SRC_PATH) && \
./autogen.sh && \
emconfigure ./configure \
CFLAGS="-O3" \
--prefix=$$(pwd)/../../../$(FFMPEG_DIST_PATH) \
--disable-shared \
--disable-rtcd \
--disable-asm \
--disable-intrinsics \
--disable-doc \
--disable-extra-programs \
--disable-hardening \
--disable-stack-protector \
&& \
emmake make -j && \
emmake make install
libmp3lame: $(LIBMP3LAME_TARGET)
$(LIBMP3LAME_TARGET) &:
@ echo Compiling libmp3lame $(LIBMP3LAME_VER)
@ mkdir -p $(FFMPEG_DIST_PATH) && cd $(LIBMP3LAME_SRC_PATH) && \
emconfigure ./configure \
CFLAGS="-DNDEBUG -O3" \
--prefix=$$(pwd)/../../../$(FFMPEG_DIST_PATH) \
--disable-shared \
--disable-gtktest \
--disable-analyzer-hooks \
--disable-frontend \
--host=x86-none-linux \
&& \
emmake make -j && \
emmake make install
# rules for cleaning dependencies
clean-deps: clean-ffmpeg clean-libopus clean-libmp3lame
clean-ffmpeg:
@ cd $(FFMPEG_SRC_PATH) && \
emmake make clean || true && \
emmake make uninstall || true && \
echo Done!
clean-libopus:
@ cd $(LIBOPUS_SRC_PATH) && \
emmake make clean || true && \
emmake make uninstall || true && \
echo Done!
clean-libmp3lame:
@ cd $(LIBMP3LAME_SRC_PATH) && \
emmake make clean || true && \
emmake make uninstall || true && \
echo Done!
# rules for syncing/downloading dependencies
sync: sync-ffmpeg sync-libopus sync-libmp3lame
sync-ffmpeg:
@ echo Syncing FFmpeg $(FFMPEG_VER) from: https://ffmpeg.org/releases/ffmpeg-$(FFMPEG_VER).tar.bz2
@ mkdir -p $(FFMPEG_SRC_PATH) && \
wget -nc -O $(FFMPEG_SRC_PATH)/ffmpeg-$(FFMPEG_VER).tar.bz2 https://ffmpeg.org/releases/ffmpeg-$(FFMPEG_VER).tar.bz2 || true && \
echo Extracting FFmpeg.. && \
tar xjf $(FFMPEG_SRC_PATH)/ffmpeg-$(FFMPEG_VER).tar.bz2 --directory $(FFMPEG_SRC_PATH) --strip-components 1 && \
echo Done!
sync-libopus:
@ echo Syncing libopus $(LIBOPUS_VER) from: https://github.com/xiph/opus.git
@ mkdir -p $(LIBOPUS_SRC_PATH) && \
git --git-dir=$(LIBOPUS_SRC_PATH)/.git pull 2> /dev/null || \
git clone --depth 1 --branch v$(LIBOPUS_VER) https://github.com/xiph/opus.git $(LIBOPUS_SRC_PATH) && \
echo Done!
sync-libmp3lame:
@ echo Syncing libmp3lame $(LIBMP3LAME_VER) from: https://downloads.sourceforge.net/project/lame/lame/$(LIBMP3LAME_VER)/lame-$(LIBMP3LAME_VER).tar.gz
@ mkdir -p $(LIBMP3LAME_SRC_PATH) && \
wget -nc -O $(LIBMP3LAME_SRC_PATH)/lame-$(LIBMP3LAME_VER).tar.gz https://downloads.sourceforge.net/project/lame/lame/$(LIBMP3LAME_VER)/lame-$(LIBMP3LAME_VER).tar.gz || true && \
echo Extracting libmp3lame.. && \
tar xzf $(LIBMP3LAME_SRC_PATH)/lame-$(LIBMP3LAME_VER).tar.gz --directory $(LIBMP3LAME_SRC_PATH) --strip-components 1 && \
echo Done!
# rules for unsycing/removing dependencies
unsync: unsync-ffmpeg unsync-libopus unsync-libmp3lame
unsync-ffmpeg:
@ echo Removing $(FFMPEG_SRC_PATH)
@ rm -rf $(FFMPEG_SRC_PATH) && \
echo Done!
unsync-libopus:
@ echo Removing $(LIBOPUS_SRC_PATH)
@ rm -rf $(LIBOPUS_SRC_PATH) && \
echo Done!
unsync-libmp3lame:
@ echo Removing $(LIBMP3LAME_SRC_PATH)
@ rm -rf $(LIBMP3LAME_SRC_PATH) && \
echo Done!