ifndef GEARCOLECO_ROOT
$(error GEARCOLECO_ROOT must name the patched f80 source tree)
endif

CORE_DIR := $(GEARCOLECO_ROOT)/platforms/libretro
SOURCE_DIR := $(GEARCOLECO_ROOT)/src
BUILD_DIR ?= $(CURDIR)/.build
TARGET ?= $(BUILD_DIR)/input_resync_f80_test.js

EMCC ?= emcc
EMCXX ?= em++
NODE ?= node

include $(CORE_DIR)/Makefile.common

CORE_CXX_SOURCES := $(filter-out $(CORE_DIR)/libretro.cpp,$(SOURCES_CXX))
CXX_OBJECTS := $(foreach source,$(CORE_CXX_SOURCES),$(BUILD_DIR)/$(notdir $(source:.cpp=.o)))
C_OBJECTS := $(foreach source,$(SOURCES_C),$(BUILD_DIR)/$(notdir $(source:.c=.o)))
TEST_OBJECT := $(BUILD_DIR)/input_resync_f80_test.o

CPPFLAGS += -I$(CORE_DIR) -I$(SOURCE_DIR) \
            -DGEARCOLECO_DISABLE_DISASSEMBLER \
            -D__LIBRETRO__
CXXFLAGS += -std=c++11 -O0 -g0 -Wall
CFLAGS += -std=c99 -O0 -g0 -Wall
TEST_LDFLAGS := -O0 -sENVIRONMENT=node -sEXIT_RUNTIME=1 \
                -sALLOW_MEMORY_GROWTH=1 -sINITIAL_MEMORY=134217728 \
                -sWASM_BIGINT=1

all: $(TARGET)

run: $(TARGET)
	$(NODE) $(TARGET)

$(TARGET): $(TEST_OBJECT) $(CXX_OBJECTS) $(C_OBJECTS) | $(BUILD_DIR)
	$(EMCXX) -o $@ $^ -lm $(TEST_LDFLAGS)

$(TEST_OBJECT): $(CURDIR)/input_resync_f80_test.cpp $(CORE_DIR)/libretro.cpp | $(BUILD_DIR)
	$(EMCXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $<

$(BUILD_DIR):
	mkdir -p $@

define CXX_SOURCE_RULE
$(BUILD_DIR)/$(notdir $(1:.cpp=.o)): $(1) | $(BUILD_DIR)
	$(EMCXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $$@ $$<
endef

$(foreach source,$(CORE_CXX_SOURCES),$(eval $(call CXX_SOURCE_RULE,$(source))))

define C_SOURCE_RULE
$(BUILD_DIR)/$(notdir $(1:.c=.o)): $(1) | $(BUILD_DIR)
	$(EMCC) $(CPPFLAGS) $(CFLAGS) -c -o $$@ $$<
endef

$(foreach source,$(SOURCES_C),$(eval $(call C_SOURCE_RULE,$(source))))

.PHONY: all run
