Files

143 lines
4.3 KiB
Makefile

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