DEBUG=false
#DEBUG=true
BISONDEBUG=-Wcounterexamples --debug
#FLEXDEBUG=--debug

TARGET := machin-fcgi
BUILD_DIR := build
SRC_DIR := src
LIBS=-lfcgi -lmysqlclient -lpthread
LEX_DIR:=$(SRC_DIR)/lexer
LEX_BUILD:=$(BUILD_DIR)/lexer



ifeq ($(DEBUG),true)
	MORECFLAGS := -g -DDEBUG -O0
else
	MORECFLAGS := -march=native -flto -O2
	MORELDFLAGS := -flto
endif

INC_DIRS := $(shell find $(SRC_DIR) -type d) $(LEX_BUILD)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))

CFLAGS := $(MORECFLAGS) $(INC_FLAGS) -Wall -pedantic -MMD -MP -c
LDFLAGS := -Wl,-z,now $(MORELDFLAGS)


all: $(TARGET)


SRCS := $(shell find $(SRC_DIR) -name "*.c")
OBJS := $(SRCS:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:.o=.d)


$(TARGET): $(LEX_BUILD)/lang.o $(LEX_BUILD)/lang_flex.o $(OBJS) Makefile
	gcc $(LDFLAGS) $(OBJS) $(LEX_BUILD)/lang.o $(LEX_BUILD)/lang_flex.o $(LIBS) -o $@


$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c Makefile
	@mkdir -p $(dir $@)
	gcc $(CFLAGS) $< -o $@


$(LEX_BUILD)/lang_flex.c: $(LEX_DIR)/lang.l $(LEX_DIR)/lang.y $(SRC_DIR)/sql.h Makefile
	flex $(FLEXDEBUG) -o $@ $<


$(LEX_BUILD)/lang_flex.o: $(LEX_BUILD)/lang_flex.c
	gcc $(CFLAGS) $< -o $@


$(LEX_BUILD)/lang.o: $(LEX_BUILD)/lang.c
	gcc $(CFLAGS) $< -o $@


$(LEX_BUILD)/lang.c: $(LEX_DIR)/lang.y $(LEX_DIR)/blang.h Makefile
	@mkdir -p $(BUILD_DIR)
	@mkdir -p $(dir $@)
	bison $(BISONDEBUG) $< --defines=$(LEX_BUILD)/lang.h -o $@

.PHONY: clean

clean:
	rm -rf $(BUILD_DIR) core vgcore.* gmon.out $(TARGET)

-include $(DEPS)
