BUILD_DIR := build
SRC_DIR := src
INCLUDE_DIR := include
PRIVATE_INCLUDE_DIR := privinclude

LIBIRCC_DIR := libircc
LIBIRCC_LIB := $(LIBIRCC_DIR)/libircc.so

CC := clang
CFLAGS := -I$(INCLUDE_DIR) -I$(PRIVATE_INCLUDE_DIR) -I$(LIBIRCC_DIR)/include -Wall -Wextra
CFLAGS_DBG := $(CFLAGS) -g -O0
CFLAGS_REL := $(CFLAGS) -O2

LDFLAGS := -L./libircc -Wl,-rpath,'$$ORIGIN/libircc' -lircc -lssl -lcrypto 
LDFLAGS_REL := $(LDFLAGS) -s

APPLICATION := bbirc
APPLICATION_DBG := bbirc-debug

$(shell mkdir -p $(BUILD_DIR))
SRCS := $(wildcard $(SRC_DIR)/*.c)
LIBIRCC_SRCS := $(shell find $(LIBIRCC_DIR)/$(SRC_DIR) -name '*.c')
DBG_OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/dbg_%.o,$(SRCS))
REL_OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/rel_%.o,$(SRCS))

.PHONY: all debug release both clean ircc

all: release

debug: ircc $(APPLICATION_DBG)
release: ircc $(APPLICATION)
both: debug release
ircc: $(LIBIRCC_LIB)

$(APPLICATION): $(REL_OBJS)
	$(CC) -o $@ $^ $(LDFLAGS_REL)

$(APPLICATION_DBG): $(DBG_OBJS)
	+$(MAKE) -C $(LIBIRCC_DIR)
	$(CC) -o $@ $^ $(LDFLAGS)

$(BUILD_DIR)/dbg_%.o: $(SRC_DIR)/%.c
	$(CC) -c -o $@ $< $(CFLAGS_DBG)

$(BUILD_DIR)/rel_%.o: $(SRC_DIR)/%.c
	$(CC) -c -o $@ $< $(CFLAGS_REL)

$(LIBIRCC_LIB): $(LIBIRCC_SRCS) 
	+$(MAKE) -C libircc

clean:
	rm -rf $(BUILD_DIR)
	rm -rf $(APPLICATION)
	rm -rf $(APPLICATION_DBG)
	+$(MAKE) -C $(LIBIRCC_DIR) clean