########################################################
# GMZ: Generic Makefile
########################################################
# Variables

# C++ compiler
#CXX      := clang++
CXX      := g++

# C++ compiler flags
CXXFLAGS := -g -Wall -std=c++11

# Linker; for C++ should be $(CXX)
LINK     := $(CXX)

# Linker flags
LDFLAGS  := 

# Libraries we're using, prefaced with "-l"
LDLIBS   := -lfl

#############################################################
# Rules

ExprDriver : ExprDriver.o ExprLexer.o ExprParser.o

ExprLexer.o : ExprLexer.cc ExprParser.hh

% : %.o
	$(LINK) $(LDFLAGS) $^ -o $@ $(LDLIBS)

%.o : %.cc
	$(CXX) $(CXXFLAGS) -c $< -o $@

%.cc : %.l
	flex --nounput -o $@ $<

# We can't use $@ after -o b/c that will cause output
#   to %.hh file if that's what triggered the rule
%.cc %.hh : %.yy
	bison -dv $< -o ExprParser.cc

#############################################################

.PHONY : clean
clean :
	$(RM) a.out core
	$(RM) *.o *.d *~ *.hh *.output
	$(RM) ExprParser{,.cc} ExprLexer.cc ExprDriver

#############################################################
