CC ?= cc
CFLAGS ?= -std=c11 -Wall -Wextra -pedantic -O2
LDFLAGS ?=
ODBC_LIBS ?= -lodbc
BUILD_DIR := build
SRC_DIR := src

COMMON_CORE := $(SRC_DIR)/cgi.c $(SRC_DIR)/form.c $(SRC_DIR)/html.c $(SRC_DIR)/json.c $(SRC_DIR)/session.c
COMMON_DB := $(COMMON_CORE) $(SRC_DIR)/db.c

.PHONY: all core diary check-odbc clean

all: core

core: $(BUILD_DIR)/hello.cgi $(BUILD_DIR)/form_echo.cgi

diary: check-odbc \
	$(BUILD_DIR)/dev_login.cgi \
	$(BUILD_DIR)/diary_form.cgi \
	$(BUILD_DIR)/diary_submit.cgi \
	$(BUILD_DIR)/diary_list.cgi \
	$(BUILD_DIR)/diary_api.cgi

check-odbc:
	@printf '#include <sql.h>\n' | $(CC) -E - >/dev/null 2>&1 || \
		( echo "ODBC headers were not found. Install unixodbc-dev, then run make diary again."; exit 1 )

$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

$(BUILD_DIR)/hello.cgi: $(SRC_DIR)/hello.c $(SRC_DIR)/cgi.c $(SRC_DIR)/cgi.h | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/hello.c $(SRC_DIR)/cgi.c -o $@ $(LDFLAGS)

$(BUILD_DIR)/form_echo.cgi: $(SRC_DIR)/form_echo.c $(COMMON_CORE) | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/form_echo.c $(COMMON_CORE) -o $@ $(LDFLAGS)

$(BUILD_DIR)/dev_login.cgi: $(SRC_DIR)/dev_login.c $(COMMON_CORE) | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/dev_login.c $(COMMON_CORE) -o $@ $(LDFLAGS)

$(BUILD_DIR)/diary_form.cgi: $(SRC_DIR)/diary_form.c $(COMMON_CORE) | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/diary_form.c $(COMMON_CORE) -o $@ $(LDFLAGS)

$(BUILD_DIR)/diary_submit.cgi: $(SRC_DIR)/diary_submit.c $(COMMON_DB) | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/diary_submit.c $(COMMON_DB) -o $@ $(LDFLAGS) $(ODBC_LIBS)

$(BUILD_DIR)/diary_list.cgi: $(SRC_DIR)/diary_list.c $(COMMON_DB) | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/diary_list.c $(COMMON_DB) -o $@ $(LDFLAGS) $(ODBC_LIBS)

$(BUILD_DIR)/diary_api.cgi: $(SRC_DIR)/diary_api.c $(COMMON_DB) | $(BUILD_DIR)
	$(CC) $(CFLAGS) $(SRC_DIR)/diary_api.c $(COMMON_DB) -o $@ $(LDFLAGS) $(ODBC_LIBS)

clean:
	rm -f $(BUILD_DIR)/*.cgi
