CC := gcc
LIB_DEB := bin/lib/libsalis-deb.so
LIB_REL := bin/lib/libsalis-rel.so
SOURCES := $(wildcard src/*.c)
OBJECTS_DEB := $(patsubst src/%.c,build/debug/%.o,$(SOURCES))
OBJECTS_REL := $(patsubst src/%.c,build/release/%.o,$(SOURCES))
DEPS_DEB := $(patsubst %.o,%.d,$(OBJECTS_DEB))
DEPS_REL := $(patsubst %.o,%.d,$(OBJECTS_REL))
LFLAGS := -shared

# Compiler flags for debug build.
DEB_FLAGS := -ggdb

# Compiler flags for release build.
REL_FLAGS := -O3 -DNDEBUG -Wno-unused-function -Wno-unused-result \
	-Wno-unused-variable

# General compiler flags.
CFLAGS := -Iinclude -c -MMD -Wall -Wextra -std=c89 -fPIC -fopenmp \
	-DSALIS_API="" -DSALIS_INST="" -DSALIS_PROC_ELEMENT="" -pedantic-errors \
	-Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition

# By default, keep a debug and release build available.
all: debug release

debug: $(OBJECTS_DEB)
	$(CC) $(LFLAGS) -fopenmp -o $(LIB_DEB) $(OBJECTS_DEB)

release: $(OBJECTS_REL)
	$(CC) $(LFLAGS) -fopenmp -o $(LIB_REL) $(OBJECTS_REL)

-include $(DEPS_DEB)

$(OBJECTS_DEB): $(patsubst build/debug/%.o,src/%.c,$@)
	$(CC) $(DEB_FLAGS) $(CFLAGS) $(patsubst build/debug/%.o,src/%.c,$@) -o $@

-include $(DEPS_REL)

$(OBJECTS_REL): $(patsubst build/release/%.o,src/%.c,$@)
	$(CC) $(REL_FLAGS) $(CFLAGS) $(patsubst build/release/%.o,src/%.c,$@) -o $@

clean:
	-rm build/debug/*
	-rm build/release/*
	-rm $(LIB_DEB)
	-rm $(LIB_REL)