# Include common makefile
include ../../genn/MakefileCommon

# Check required environment variable names are set
ifndef BACKEND_NAME
    $(error Environment variable BACKEND_NAME must be defined)
endif
ifndef BACKEND_NAMESPACE
    $(error Environment variable BACKEND_NAMESPACE must be defined)
endif
ifndef GENERATOR_NAME
    $(error Environment variable GENERATOR_NAME  must be defined)
endif

# Determine full path to generator and backend
SPINEML_GENERATOR	:=$(GENN_DIR)/bin/$(GENERATOR_NAME)$(GENN_PREFIX)
BACKEND			:=$(GENN_DIR)/lib/libgenn_$(BACKEND_NAME)_backend$(GENN_PREFIX).a
OBJECT_DIRECTORY	:=$(OBJECT_DIRECTORY)/spineml/$(GENERATOR_NAME)

# Find source files
SOURCES			:=$(wildcard *.cc)

# Add object directory prefix
OBJECTS			:=$(SOURCES:%.cc=$(OBJECT_DIRECTORY)/%.o)
DEPS			:=$(OBJECTS:.o=.d)

# Add compiler and linker flags to link libGeNN and correct backend; and to configure generator to use backend
LDFLAGS			+= -L$(GENN_DIR)/lib -lgenn_$(BACKEND_NAME)_backend$(GENN_PREFIX) -lspineml_common$(GENN_PREFIX) -lgenn$(GENN_PREFIX)
CXXFLAGS		+= -I$(GENN_DIR)/include/spineml/common -I$(GENN_DIR)/include/spineml/generator -I$(GENN_DIR)/include/genn/backends/$(BACKEND_NAME) -DBACKEND_NAMESPACE=$(BACKEND_NAMESPACE)

.PHONY: all clean libgenn backend spineml_common

all: $(SPINEML_GENERATOR)

$(SPINEML_GENERATOR): $(OBJECTS) libgenn backend spineml_common
	$(CXX) $(CXXFLAGS) $(OBJECTS) -o $@ $(LDFLAGS)

-include $(DEPS)

$(OBJECT_DIRECTORY)/%.o: %.cc $(OBJECT_DIRECTORY)/%.d
	mkdir -p $(@D)
	$(CXX) -std=c++11 $(CXXFLAGS) -c -o $@ $<

%.d: ;

libgenn:
	$(MAKE) -C $(GENN_DIR)/src/genn/genn

backend:
	$(MAKE) -C $(GENN_DIR)/src/genn/backends/$(BACKEND_NAME)

spineml_common:
	$(MAKE) -C $(GENN_DIR)/src/spineml/common

clean:
	rm -f $(OBJECT_DIRECTORY)/*.o $(OBJECT_DIRECTORY)/*.d $(SPINEML_GENERATOR)
