MAIN=celeste
DOC_DIR=doc
OBJ_DIR=bin
SRC_DIR=src
SRC=celeste.c euler.c velocity_verlet.c cristoffel.c explicit_rk.c common.c parsertypes.c celeste_types.c mylib.c parser.y parser.l
C_SRC=$(filter %.c, $(SRC))

LEX_FILE=parser.l
LEX_C=yy.lex.c

BISON_SRC=$(filter %.y, $(SRC))
BISON_C_SRC=$(patsubst %.y, %.tab.c, $(BISON_SRC))
BISON_OBJ=$(patsubst %.c, %.o, $(BISON_C_SRC))

OBJS=$(patsubst %.c,%.o,$(C_SRC))
OBJS+= $(BISON_OBJ)
OBJS+= yy.lex.o

CC?=gcc
LDFLAGS+= -lm
CFLAGS+= -Wall -O2 # -D SPEEDRUN

vpath %.l $(SRC_DIR)
vpath %.y $(SRC_DIR)
vpath %.c $(SRC_DIR)
vpath %.h $(SRC_DIR)
vpath %.o $(BIN_DIR)

all:	$(OBJS)
	$(CC) $(CFLAGS) -o $(MAIN) $(foreach obj, $^, $(OBJ_DIR)/$(obj)) $(LDFLAGS)

%.tab.o: %.tab.c yy.lex.c
	$(CC) $(CFLAGS) -c -o $(OBJ_DIR)/$(@F) $(SRC_DIR)/$(<F)


%.tab.c: %.y
	bison -o $(SRC_DIR)/$@ -d $<

yy.lex.c: $(LEX_FILE)
	flex --header-file=$(SRC_DIR)/yy.lex.h -o $(SRC_DIR)/$@ $<

%.o:	%.c
	$(CC) $(CFLAGS) -c -o $(OBJ_DIR)/$(@F) $(SRC_DIR)/$(<F)


.PHONY: clean mrproper

clean: 	
	rm -f $(OBJ_DIR)/*.o $(SRC_DIR)/yy.lex.* $(SRC_DIR)/*.tab.* 
	rm -f $(SRC_DIR)/.*.swo $(SRC_DIR)/.*.swn $(SRC_DIR)/.*.swp

mrproper: clean
	rm -Rf $(DOC_DIR)/*
	rm $(MAIN)
