

CXXPARAMS = -O0 -g -DTARGET_PLATFORM_NATIVE


# Emscripten Toolchain
EMROOT = "/opt/emsdk"
EMBIN = "$(EMROOT)/emscripten/1.38.20"
EMCXX = "$(EMBIN)/em++"
EMCXXFLAGS = -std=c++11 -Isrc -O2 -s WASM=1 -DTARGET_PLATFORM_WASM \
             -s EXPORTED_FUNCTIONS="['_SolveSatFormulas']" \
             -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]'


OBJECTS = obj/parser.o \
          obj/lexer.o \
          obj/sat.o \
          obj/cnf.o \
          obj/satsolver.o \
          obj/main.o
EM_OBJECTS = $(subst obj/,em_obj/,$(OBJECTS))


satsolver: $(OBJECTS)
	g++ $(CXXPARAMS) -o "$@" $(OBJECTS)

satsolver.html: $(EM_OBJECTS)
	$(EMCXX) $(EMCXXFLAGS) -o $@ $(EM_OBJECTS)
	# The standard satsolver.html is not suitable for our purposes.
	# We use a self-written satsolver.htm instead
	rm "$@"


obj/%.o: src/%.cpp
	@mkdir -p $(@D)
	g++ $(CXXPARAMS) -o "$@" -c "$<"

em_obj/%.o: src/%.cpp
	@mkdir -p $(@D)
	$(EMCXX) $(EMCXXFLAGS) -o "$@" -c "$<"
	
src/%.cpp: src/%.l src/FlexLexer.h
	flex -o $@ $<

src/FlexLexer.h: /usr/include/FlexLexer.h
	cp "$<" "$@"

src/%.cpp: src/%.yy
	bison -o $@ $<

.PHONY: clean
clean:
	rm -rf obj src/parser.cpp src/parser.hpp src/lexer.cpp src/stack.hh src/FlexLexer.h

.PHONY: distclean
distclean: clean
	rm -f satsolver satsolver.htm satsolver.wasm
