# Makefile for piex-wasm
#
# An IIFE https://developer.mozilla.org/en-US/docs/Glossary/IIFE is used to
# wrap em++ compiler-generated JS code so it does not pollute |globalThis|.
#
# CFI sanitizer options are used to compile our WebAssembly, as recommended
# by https://webassembly.org/docs/security/#memory-safety (for more details
# about CFI see https://clang.llvm.org/docs/ControlFlowIntegrity.html).
#
PIEX = node_modules/piex
PSRC = $(PIEX)/src/piex.cc \
$(PIEX)/src/tiff_parser.cc \
$(PIEX)/src/image_type_recognition/image_type_recognition_lite.cc \
$(PIEX)/src/tiff_directory/tiff_directory.cc \
$(PIEX)/src/binary_parse/range_checked_byte_ptr.cc \
$(PIEX)/src/binary_parse/cached_paged_byte_array.cc
INCS = -I $(PIEX)
WASM = -s WASM=1 -fno-exceptions -Wall -fsanitize=cfi -flto -fvisibility=hidden
WOPT = -Os --llvm-opts 3 \
-s MODULARIZE=1 \
-s EXPORT_NAME=createPiexModule \
-s STRICT=1 \
-s ALLOW_MEMORY_GROWTH=1 \
-s ENVIRONMENT='web' \
-s NO_DYNAMIC_EXECUTION=1 \
-s TOTAL_STACK=$(shell echo $$((8*1024)))
IIFE = --pre-js iife.beg --post-js iife.end
.PHONY: all clean release
all: piex.out.js release
piex.out.js: piex.cpp.bc piex.src.bc iife.beg iife.end
em++ --bind --std=c++11 $(WASM) $(WOPT) $(IIFE) piex.cpp.bc piex.src.bc -o $@
piex.cpp.bc: piex.cpp Makefile
em++ --bind --std=c++11 $(WASM) $(WOPT) $(INCS) piex.cpp -o $@
piex.src.bc: $(PSRC) Makefile
em++ --bind --std=c++11 $(WASM) $(WOPT) $(INCS) $(PSRC) -o $@
release:
$(shell cp piex.out.js piex.js.wasm)
$(shell cp piex*wasm extension)
clean:
$(shell rm -f tests.{result*,log} *.bc piex.out.js)
$(shell rm -f piex*wasm extension/piex*wasm)