SM_REPO := https://github.com/fitzgen/gecko-dev SM_COMMIT := dafd3165f45c55023ece4787a86444029e4f475e # TODO: support building `spidermonkey.wasm` on other OSes. But for some reason # the resulting `.wasm` binary is slower when the host compiler is on macOS. WASI_SDK_URL := https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-12/wasi-sdk-12.0-linux.tar.gz CC := $(CURDIR)/wasi-sdk-12.0/bin/clang CXX := $(CURDIR)/wasi-sdk-12.0/bin/clang++ # Set this to `1` to enable logging via all the `SMW_LOG(...)` calls. LOGGING := 0 # Set this to `-DDEBUG` and uncomment the `--enable-debug` line in `mozconfig` # to enable debug builds of SpiderMonkey. DEBUG := "" # Set this to `""` in debug mode for better debugging. OPT := "-O2" CFLAGS := \ --sysroot=$(CURDIR)/wasi-sdk-12.0/share/wasi-sysroot \ -Wall \ --target=wasm32-unknown-wasi \ -Ispidermonkey-$(SM_COMMIT)/obj-wasm32-unknown-wasi/dist/include \ -I$(CURDIR)/include \ $(DEBUG) \ $(OPT) \ -DLOGGING=$(LOGGING) CXXFLAGS := \ $(CFLAGS) \ -fno-exceptions \ -std=c++17 # Local object files. LOCAL_OBJECTS := $(patsubst %.cpp,%.o,$(wildcard *.cpp)) # Object files needed within SpiderMonkey's obj dir. SM_OBJECTS := \ js/src/build/libjs_static.a \ memory/build/Unified_cpp_memory_build0.o \ memory/mozalloc/mozalloc_abort.o \ memory/mozalloc/Unified_cpp_memory_mozalloc0.o \ mfbt/Unified_cpp_mfbt0.o \ mfbt/Unified_cpp_mfbt1.o \ mfbt/lz4.o \ mfbt/lz4frame.o \ mfbt/lz4hc.o \ mfbt/xxhash.o \ mozglue/misc/AutoProfilerLabel.o \ mozglue/misc/ConditionVariable_noop.o \ mozglue/misc/Decimal.o \ mozglue/misc/MmapFaultHandler.o \ mozglue/misc/Mutex_noop.o \ mozglue/misc/Printf.o \ mozglue/misc/StackWalk.o \ mozglue/misc/TimeStamp.o \ mozglue/misc/TimeStamp_posix.o \ mozglue/misc/Uptime.o \ modules/zlib/src/compress.o \ modules/zlib/src/gzclose.o \ modules/zlib/src/infback.o \ modules/zlib/src/uncompr.o \ wasm32-wasi/release/libjsrust.a # The `./lib/*` copies of SpiderMonkey's object files that we check into the # repo. SM_LIB_OBJECTS := $(shell echo $(SM_OBJECTS) | xargs -d' ' -I{} basename {} | xargs -I{} echo lib/{}) .PHONY: all clean clean-all clean-spidermonkey clean-wasi-sdk all: spidermonkey.wasm @echo "Done!" spidermonkey.initial.wasm: $(SM_LIB_OBJECTS) $(LOCAL_OBJECTS) $(CXX) $(CXXFLAGS) \ -mexec-model=reactor \ $(LOCAL_OBJECTS) \ $(SM_LIB_OBJECTS) \ -o spidermonkey.initial.wasm \ -Wl,--export-dynamic \ -Wl,--growable-table \ -Wl,--export-table \ -Wl,--gc-sections spidermonkey.wasm: spidermonkey.initial.wasm # Uncomment this `wasm-opt` invocation and comment the following one out to # enable better debugging. # # wasm-opt -g --duplicate-import-elimination spidermonkey.initial.wasm -o spidermonkey.wasm wasm-opt -O2 --strip-dwarf --duplicate-import-elimination spidermonkey.initial.wasm -o spidermonkey.wasm # Build all `*.cpp` files into `*.o` files. %.o: %.cpp $(SM_LIB_OBJECTS) $(CXX) $(CXXFLAGS) -c $< -o $@ # Actually build SpiderMonkey. $(SM_LIB_OBJECTS): spidermonkey-$(SM_COMMIT) mozbuild wasi-sdk-12.0 mozconfig cd spidermonkey-$(SM_COMMIT) \ && MOZBUILD_STATE_PATH=$(CURDIR)/mozbuild MOZCONFIG=$(CURDIR)/mozconfig ./mach build mkdir -p lib for x in $(SM_OBJECTS); do \ cp spidermonkey-$(SM_COMMIT)/obj-wasm32-unknown-wasi/$$x lib/; \ done # Clone `mozilla-central` at the `SM_COMMIT` commit. spidermonkey-$(SM_COMMIT): -rm -rf spidermonkey-temp mkdir spidermonkey-temp cd spidermonkey-temp \ && git init \ && git remote add origin $(SM_REPO) \ && git fetch origin $(SM_COMMIT) \ && git checkout $(SM_COMMIT) mv spidermonkey-temp spidermonkey-$(SM_COMMIT) mozbuild: spidermonkey-$(SM_COMMIT) -mkdir mozbuild cd spidermonkey-$(SM_COMMIT) \ && MOZBUILD_STATE_PATH=$(CURDIR)/mozbuild ./mach bootstrap --application-choice js --no-system-changes \ || rm -rf $(CURDIR)/mozbuild wasi-sdk-12.0: curl -L $(WASI_SDK_URL) | tar -x -z clean-all: clean clean-spidermonkey clean-wasi-sdk clean-wasi-sdk: -rm -rf wasi-sdk-12.0 clean-spidermonkey: -rm -rf spidermonkey-$(SM_COMMIT) -rm -rf spidermonkey-$(SM_COMMIT)/obj-wasm32-unknown-wasi/ -rm -rf mozbuild clean: @echo 'Only cleaning our own artifacts, not upstream deps. Run `make clean-{all,spidermonkey,wasi-sdk}` to clean others.' -rm -rf spidermonkey-temp -rm -rf ./*.o -rm -rf spidermonkey.wasm