BUILDDIR := ./bin
SRCDIR := .

CC := cc
CXX := c++
PKGCONFIG := pkgconf

CPPFLAGS ?= -W -Wall -pedantic
CFLAGS ?= -O2 -g
CXXFLAGS ?= -O2 -g

CPPFLAGS += -I..
# Confirms that the library builds correctly as C89; but does not print
# warnings for use of C99 “long long” in test code.
CFLAGS += -std=c89 -Wno-long-long
CFLAGS += -fPIE
CXXFLAGS += -fPIE

DL_CFLAGS :=
DL_LDFLAGS := -ldl

M_CFLAGS :=
M_LDFLAGS := -lm

FLAC_CFLAGS := $(shell $(PKGCONFIG) --cflags flac)
FLAC_LDFLAGS := $(shell $(PKGCONFIG) --libs flac)

SNDFILE_CFLAGS := $(shell $(PKGCONFIG) --cflags sndfile)
SNDFILE_LDFLAGS := $(shell $(PKGCONFIG) --libs sndfile)

FLAC_TESTS := $(BUILDDIR)/dr_flac_test_0 \
	$(BUILDDIR)/dr_flac_test_0_cpp \
	$(BUILDDIR)/dr_flac_decoding \
	$(BUILDDIR)/dr_flac_decoding_cpp \
	$(BUILDDIR)/dr_flac_seeking
FLAC_COMMON := $(SRCDIR)/flac/dr_flac_common.c $(SRCDIR)/common/dr_common.c

$(BUILDDIR)/dr_flac_%: $(SRCDIR)/flac/dr_flac_%.c \
  $(SRCDIR)/flac/dr_flac_common.c $(SRCDIR)/common/dr_common.c
	$(CC) $(CPPFLAGS) $< -o $@ $(CFLAGS) $(DL_CFLAGS) $(FLAC_CFLAGS) \
		$(LDFLAGS) $(DL_LDFLAGS) $(FLAC_LDFLAGS)

$(BUILDDIR)/dr_flac_%_cpp: $(SRCDIR)/flac/dr_flac_%.cpp \
  $(SRCDIR)/flac/dr_flac_common.c $(SRCDIR)/common/dr_common.c
	$(CXX) $(CPPFLAGS) $< -o $@ $(CXXFLAGS) $(DL_CFLAGS) $(FLAC_CFLAGS) \
		$(LDFLAGS) $(DL_LDFLAGS) $(FLAC_LDFLAGS)

MP3_TESTS := $(BUILDDIR)/dr_mp3_test_0
MP3_COMMON := $(SRCDIR)/mp3/dr_mp3_common.c $(SRCDIR)/common/dr_common.c

$(BUILDDIR)/dr_mp3_%: $(SRCDIR)/mp3/dr_mp3_%.c \
  $(SRCDIR)/mp3/dr_mp3_common.c $(SRCDIR)/common/dr_common.c
	$(CC) $(CPPFLAGS) $< -o $@ $(CFLAGS) $(DL_CFLAGS) \
		$(LDFLAGS) $(DL_LDFLAGS)

WAV_TESTS := $(BUILDDIR)/dr_wav_test_0 \
	$(BUILDDIR)/dr_wav_test_0_cpp \
	$(BUILDDIR)/dr_wav_decoding \
	$(BUILDDIR)/dr_wav_decoding_cpp \
	$(BUILDDIR)/dr_wav_encoding
WAV_COMMON := $(SRCDIR)/wav/dr_wav_common.c $(SRCDIR)/common/dr_common.c

# At least the encoding test needs the math library for sin().
$(BUILDDIR)/dr_wav_%: $(SRCDIR)/wav/dr_wav_%.c \
  $(SRCDIR)/wav/dr_wav_common.c $(SRCDIR)/common/dr_common.c
	$(CC) $(CPPFLAGS) $< -o $@ $(CFLAGS) $(DL_CFLAGS) $(M_CFLAGS) \
		$(LDFLAGS) $(DL_LDFLAGS) $(M_LDFLAGS)

$(BUILDDIR)/dr_wav_%_cpp: $(SRCDIR)/wav/dr_wav_%.cpp \
  $(SRCDIR)/wav/dr_wav_common.c $(SRCDIR)/common/dr_common.c
	$(CXX) $(CPPFLAGS) $< -o $@ $(CXXFLAGS) $(DL_CFLAGS) $(M_CFLAGS) \
		$(LDFLAGS) $(DL_LDFLAGS) $(M_LDFLAGS)

.PHONY: all
all: $(FLAC_TESTS) $(MP3_TESTS) $(WAV_TESTS)

.PHONY: clean
clean:
	rm -vf $(FLAC_TESTS) $(MP3_TESTS) $(WAV_TESTS) \
		$(BUILDDIR)/dr_wav_encoding.wav

.PHONY: check
check: check-flac check-mp3 check-wav

.PHONY: check-flac
check: check-flac_test_0 \
	check-flac_test_0_cpp \
	check-flac_decoding \
	check-flac_decoding_cpp \
	check-flac_seeking
.PHONY: check-flac_test_0
check-flac_test_0: $(BUILDDIR)/dr_flac_test_0
	$(BUILDDIR)/dr_flac_test_0
.PHONY: check-flac_test_0_cpp
check-flac_test_0_cpp: $(BUILDDIR)/dr_flac_test_0_cpp
	$(BUILDDIR)/dr_flac_test_0_cpp
.PHONY: check-flac_decoding
check-flac_decoding: $(BUILDDIR)/dr_flac_decoding
	$(BUILDDIR)/dr_flac_decoding
.PHONY: check-flac_decoding_cpp
check-flac_decoding_cpp: $(BUILDDIR)/dr_flac_decoding_cpp
	$(BUILDDIR)/dr_flac_decoding_cpp
.PHONY: check-flac_seeking
check-flac_seeking: $(BUILDDIR)/dr_flac_seeking
	$(BUILDDIR)/dr_flac_seeking

.PHONY: check-mp3
check: check-mp3_test_0
.PHONY: check-mp3_test_0
check-mp3_test_0: $(BUILDDIR)/dr_mp3_test_0
	$(BUILDDIR)/dr_mp3_test_0

.PHONY: check-wav
check: check-wav_test_0 \
	check-wav_test_0_cpp \
	check-wav_decoding \
	check-wav_decoding_cpp \
	check-wav_encoding
.PHONY: check-wav_test_0
check-wav_test_0: $(BUILDDIR)/dr_wav_test_0
	$(BUILDDIR)/dr_wav_test_0
.PHONY: check-wav_test_0_cpp
check-wav_test_0_cpp: $(BUILDDIR)/dr_wav_test_0_cpp
	$(BUILDDIR)/dr_wav_test_0_cpp
.PHONY: check-wav_decoding
check-wav_decoding: $(BUILDDIR)/dr_wav_decoding
	$(BUILDDIR)/dr_wav_decoding
.PHONY: check-wav_decoding_cpp
check-wav_decoding_cpp: $(BUILDDIR)/dr_wav_decoding_cpp
	$(BUILDDIR)/dr_wav_decoding_cpp
.PHONY: check-wav_encoding
check-wav_encoding: $(BUILDDIR)/dr_wav_encoding
	rm -vf $(BUILDDIR)/dr_wav_encoding.wav
	$(BUILDDIR)/dr_wav_encoding $(BUILDDIR)/dr_wav_encoding.wav
