Emscripten
emcc -v
#emscripten git checkout refs/tags/2.0.12 && npm install # llvm-12, node v10, binaryen98
#binaryen git checkout refs/tags/version_98 && rm CMakeCache.txt && cmake . && make
#llvm
https://emscripten.org/docs/building_from_source/index.html
Backends
Emscripten emits WebAssembly using the upstream LLVM wasm backend, since version 1.39.0
(October 2019). Previously emscripten also supported the old fastcomp backend which was
removed in 2.0.0 (August 2020).
2.0.10: 12/04/2020 # llvm-12, node v10, binaryen98
------------------
1.40.0
-------------------
1.39.20: 07/20/2020 # llvm-12, node v8, binaryen94
-------------------
1.39.19: 07/07/2020
-------------------
- In standalone mode make `main` mandatory by default (#11536). To build a
library ("reactor"), use `--no-entry`. The compiler will suggest that if
`main` is not present.
- Automatically resume AudioContexts on user input in SDL and OpenAL (#10843).
- Asyncify now does liveness analysis to find which locals to save
(Binaryen#2890).
1.39.17: 06/05/2020
-------------------
- Remove emterpreter and `EMTERPRETIFY` settings. Emterpreter has largely
been replaced by asyncify and is fastcomp only so due for removing in
the near future anyway.
v1.39.14: binaryen-version_93...emscripten_sleep() ok!
v1.39.11: 03/20/2020 (require option: --version, <=binaryen -version_91)
--------------------
- Enable DWARF support: When compiling with `-g`, normal DWARF emitting happens,
and when linking with `-g` we preserve that and update it. This is a change
from before, where we assumed DWARF was unneeded and did not emit it, so this
can increase the size of debug builds (i.e. builds compiling and/or linking
with -g). This change is necessary for full debugging support, that is, to
be able to build with `-g` and use a debugger. Before this change only the
`-gforce_dwarf` flag enabled DWARF; that flag is now removed. If you want
the old behavior, build your object files with `-gline-tables-only` (that will
only add line table info, which is just enough for things like source maps and
does not include full debug info). For more info and background see #10325.
1.39.4-fastcomp (not require option: --version) openFramework-0.11.0 binaryen-version_8x
-------------------
v1.39.0: 10/18/2019
-------------------
- The emsdk defaults to the upstream backend (instead of fastcomp) from this
release onward (but both backends are still fully supported). See
v1.38.41: 08/07/2019
--------------------
- Remove fastcomp's implementation of Asyncify. This has been deprecated for
a long time, since we added Emterpreter-Async, and now we have a new Asyncify
implementation in the upstream wasm backend. It is recommended to upgrade to
the upstream backend and use Asyncify there if you need it. (If you do still
need the older version, you can use 1.38.40.)
sdk-fastcomp-1.38.31 openCV4 compiled with binaryen-version_82,clang-11
--------------------
v1.36.14: 11/3/2016
-------------------
- Added support to emscripten_async_wget() for relative paths.
v1.30.5: 4/7/2015
-----------------
- Fixed WebIDL operation when closure is enabled after the previous EM_ASM()
optimizations.
- Optimized jsCall() to handle variadic cases of number of arguments faster
(#3290, #3305).
- Removed support for the getwd() function (#1115, #3309).
- Fixed a problem with -s IGNORED_FUNCTIONS and -s DEAD_FUNCTIONS not working
as expected (#3239).
- Fixed an issue with -s EMTERPRETIFY_ASYNC=1 and emscripten_sleep() not
working (#3307).
-fignore-exceptions: update to LLVM-11 HEAD
Fatal: initialStackPointer must be set: update binaryen
unreachable executed: update to emcc v1.39.14
# ~/.emscripten
#LLVM_ROOT = os.path.expanduser(os.getenv('LLVM', '/usr/bin')) # directory
LLVM_ROOT = os.path.expanduser(os.getenv('LLVM', '~/download/llvm-project/build/bin')) # directory
#BINARYEN_ROOT = os.path.expanduser(os.getenv('BINARYEN', '')) # if not set, we will use it from ports
BINARYEN_ROOT = os.path.expanduser(os.getenv('BINARYEN', '~/.emscripten_ports/binaryen/binaryen-version_82/')) # if not set, we will use it from ports
export EMCC_CORES=4
emcc --clear-cache # libcも削除される
EMCC_DEBUG=1 emmake make clean
EMCC_DEBUG=1 emmake make
#-s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 # slower, deprecated, supported by the LLVM wasm backend
-O3 -s ASYNCIFY=1
-s ALLOW_MEMORY_GROWTH=1 -s WASM_MEM_MAX=2097152000 #v1.39.8まで
# Rename `TOTAL_MEMORY` to `INITIAL_MEMORY` and `WASM_MEM_MAX` to `MAXIMUM_MEMORY`, #v1.39.9から
-s ERROR_ON_UNDEFINED_SYMBOLS=0
-s EXPORT_ALL=1 -s EXPORT_ALL=1 -s "EXPORTED_FUNCTIONS=['_file_uploaded']" -s -s "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall']"
emrun --no_browser --hostname=jetson.local .
python3 -m http.server 6931 --bind jetson.local
em++ -s ASYNCIFY=1 -o timer.js timer.c
Assertion failed: compiled without a main, but one is present. if you added it from JS, use Module["onRuntimeInitialized"]
emconfigure ./configure --host=asmjs-unknown-emscripten
emconfigure ./configure --disable-assembly
emconfigure ./configure --disable-threads
-s BINARYEN_ASYNC_COMPILATION=0 | 1 # https://github.com/emscripten-core/emscripten/issues/5034
-s WASM=0 | 1
-pthreads | -s USE_PTHREADS=1 # pthreadsを入れると--shared-memoryも入る仕様
-s PTHREAD_POOL_SIZE=4
-matomics # (-mthread-model posix) ほぼ-pthreadsと同じオプション
-Wl,--shared-memory
--check-features/--no-check-features
-Wl,--no-check-features
-mbulk-memory
-s WASM=0 -s ASSERTIONS=2 -g3 -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=1 -s ERROR_ON_UNDEFINED_SYMBOLS=0 -s EXPORT_ALL=1 -s ASYNCIFY=1 -s ALLOW_MEMORY_GROWTH=1
-g4 -s ASSERTIONS=2 -s SAFE_HEAP=1 -s STACK_OVERFLOW_CHECK=1 --source-map-base http://jetson.local:6931/
python ~/document/source/emscripten/tools/file_packager.py emnp21kai.data --preload np2.cfg
-s INITIAL_MEMORY=32MB # must be 24MB higher
-s MAXIMUM_MEMORY=
-s ALLOW_MEMORY_GROWTH=1 # it disables asm.js optimizations
-s ALLOW_MEMORY_GROWTH=0
-s ALLOW_MEMORY_GROWTH=1
-O3
-O0
-O1
-O2
-O3
-flto
-fno-rtti -fno-exceptions
--llvm-lto 1 # https://github.com/emscripten-core/emscripten/issues/10603
-g
-g0
-g1
-g2
-g3
-g4 # (generate source-map)
-s WASM=1
-s WASM=0
-s WASM=1
-s WASM_ASYNC_COMPILATION=1
-s EXPORT_ALL=1
-s "EXPORTED_FUNCTIONS=['_main', '_my_func']"
-s LINKABLE=1
-s RESERVED_FUNCTION_POINTERS=20
-s ASSERTIONS=2
-s ASSERTIONS=0
-s ASSERTIONS=1
-s ASSERTIONS=2
-s SAFE_HEAP=1
-s STACK_OVERFLOW_CHECK=1
-s ERROR_ON_UNDEFINED_SYMBOLS=0
-s ASYNCIFY=1
-s FORCE_FILESYSTEM=1
--preload-file
FFmpeg emscripten
ffmpeg.c compiling Makefile for node
test: ffmpeg.o
emcc -o test ffmpeg.o ../fftools/cmdutils.c ../fftools/ffmpeg_opt.c ../fftools/ffmpeg_hw.c ../fftools/ffmpeg_filter.c ../libavcodec/libavcodec.a ../libavutil/libavutil.a ../libavformat/libavformat.a ../libavfilter/libavfilter.a ../libavdevice/libavdevice.a ../libswresample/libswresample.a ../libswscale/libswscale.a -I../ -I../fftools -s INITIAL_MEMORY=1677721600 -s EXIT_RUNTIME=1 --bind -lnodefs.js
ffmpeg.o: ffmpeg.c
emcc ffmpeg.c -c -I../ -I../libavformat -I../fftools
clean:
rm *.o
rm test
FFmpeg emscripten main() test code
int main(int argc, char** argv) {
int i, ret;
BenchmarkTimeStamps ti;
EM_ASM(
FS.mkdir('/working');
FS.mount(NODEFS, { root: '.' }, '/working');
);
int _argc;
char *_argv[6];
_argc = 6;
_argv[0] = "ffmpeg";
_argv[1] = "-i";
_argv[2] = "/working/iphone_rec-new_rec7.m4a";
_argv[3] = "-ar";
_argv[4] = "16000";
_argv[5] = "/working/iphone_rec-new_rec7.wav";
init_dynload();