CXX := g++
CXXFLAGS := -g -Wall -fno-exceptions -std=gnu++17 -MMD -MP
UNAME := $(shell uname -s)
LDFLAGS := -g -lsrt \
	-lavformat -lavutil -lavcodec \
	-laws-cpp-sdk-core -laws-cpp-sdk-s3

ifeq ($(findstring MINGW,$(UNAME)),MINGW)
	LDFLAGS += -lws2_32
endif

CXX_SOURCES := $(shell find src -name '*.cc')

CXX_OBJS := $(CXX_SOURCES:src/%.cc=build/%.o)
CXX_DEPS := $(CXX_SOURCES:src/%.cc=build/%.d)

TEST_SOURCES := $(wildcard tests/test_*.cc)
TEST_BINARIES := $(TEST_SOURCES:tests/%.cc=build/%)

TARGET := ezlive

all: build $(TARGET)

test: build $(TEST_BINARIES) $(CXX_OBJS)
	@for test in $(TEST_BINARIES); do echo "Running $$test..."; ./$$test || exit 1; done

docker: ezlive-docker-image.tar.gz

ezlive-docker-image.tar.gz: all
	sh ./scripts/build-docker.sh

$(TARGET): build $(C_OBJS) $(CXX_OBJS)
	$(CXX) $(C_OBJS) $(CXX_OBJS) -o $@ $(LDFLAGS)

build:
	mkdir -p build

build/%.o: src/%.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@

bear:
	make clean
	bear -- make all $(TEST_BINARIES)

TEST_OBJS := $(filter-out build/main.o,$(CXX_OBJS))
build/test_%: tests/test_%.cc $(TEST_OBJS) build
	$(CXX) $(CXXFLAGS) $< -o $@ $(TEST_OBJS) $(LDFLAGS)

clean:
	rm -rf build $(TARGET) $(TEST_BINARIES)

-include $(CXX_DEPS)

.PHONY: all clean test build bear
