MAIN=gepuku
OBJ_DIR=bin
SRC_DIR=src
SRC=gpu.c gepuku.c random_coord.c galaxy_types.c gpu_euler.c gpu_verlet.c mylib.c parser.y parser.l parsertypes.c parser.c

LEX_FILE=$(filter %.l, $(SRC))
LEX_C=yy.lex.c
LEX_OBJ=$(patsubst %.c,%.o,$(LEX_C))

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

C_SRC=$(filter %.c, $(SRC))
C_SRC+= $(LEX_C) $(BISON_C_SRC)
OBJS=$(patsubst %.c,%.o,$(C_SRC))

CC?=gcc
LDFLAGS+= -lm  -lOpenCL -lrt
CFLAGS+= -std=gnu99 -Wall -Wextra -g -O2 # -D SPEEDRUN

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


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


$(BISON_C_SRC): $(BISON_SRC)
	bison -o $(SRC_DIR)/$@ -d $<

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

$(LEX_OBJ): $(LEX_C) $(BISON_C_SRC)


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


.PHONY: clean mrproper

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

mrproper: clean
	rm $(MAIN)
