#
# Makefile - BOOM's Makefile
#
# Copyright 2012 by Werner Almesberger
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#

SHELL = /bin/bash

CFLAGS = -g \
	 -Wall -Wextra -Wshadow -Wmissing-prototypes -Wmissing-declarations \
	 $(shell pkg-config --cflags glib-2.0)
SLOPPY = -Wno-unused -Wno-implicit-function-declaration
OBJS = bom.o boom.o chr.o comp.o db.o dump.o eval.o param.o relop.o \
       subex.o subst.o util.o \
       vstring.o lex.yy.o y.tab.o
LDLIBS = -lfl $(shell pkg-config --libs glib-2.0)

YACC = bison -y
YYFLAGS = -v

CC_normal	:= $(CC)
YACC_normal	:= $(YACC)
LEX_normal	:= $(LEX)
DEPEND_normal	:= $(CPP) $(CFLAGS) -MM -MG

CC_quiet	= @echo "  CC       " $@ && $(CC_normal)
YACC_quiet	= @echo "  YACC     " $@ && $(YACC_normal)
LEX_quiet	= @echo "  LEX      " $@ && $(LEX_normal)
GEN_quiet	= @echo "  GENERATE " $@ &&
DEPEND_quiet	= @$(DEPEND_normal)

ifeq ($(V),1)
	CC	= $(CC_normal)
	LEX	= $(LEX_normal)
	YACC	= $(YACC_normal)
	GEN	=
	DEPEND	= $(DEPEND_normal)
else
	CC	= $(CC_quiet)
	LEX	= $(LEX_quiet)
	YACC	= $(YACC_quiet)
	GEN	= $(GEN_quiet)
	DEPEND	= $(DEPEND_quiet)
endif

MKDEP = $(DEPEND) $(1).c | \
	sed -e \
	'/^\(.*:\)\? */{p;s///;s/ *\\\?$$/ /;s/  */:\n/g;H;}' \
	  -e '$${g;p;}' -e d >$(1).d; \
	[ "$${PIPESTATUS[*]}" = "0 0" ] || { rm -f $(1).d; exit 1; }

.PHONY:	all clean spotless try

all:		boom

boom:		$(OBJS)
		$(CC) $(CFLAGS) -o $@ $(OBJS) $(LDLIBS)

lex.yy.c:	lang.l y.tab.h
		$(LEX) lang.l

lex.yy.o:	lex.yy.c y.tab.h
		$(CC) -c $(CFLAGS) $(SLOPPY) lex.yy.c
		$(call MKDEP, lex.yy)

y.tab.c y.tab.h: lang.y
		$(YACC) $(YYFLAGS) -d lang.y

y.tab.o:	y.tab.c
		$(CC) -c $(CFLAGS) $(SLOPPY) y.tab.c
		$(call MKDEP, y.tab)

%.o:		%.c
		$(CC) -c $(CFLAGS) $*.c -o $*.o
		$(call MKDEP, $*)

relop.o:	unreachable.inc

unreachable.inc: genredmap.pl
		$(GEN) ./$< 0 >$@ || { rm -f $@; exit 1; }

-include $(OBJS:.o=.d)

clean:
		rm -f $(OBJS) $(OBJS:.o=.d)
		rm -f lex.yy.c y.tab.c y.tab.h y.output
		rm -f redmap.inc

spotless:	clean
		rm -f boom

# ----- Experiments -----------------------------------------------------------

try:
	$(VALGRIND) ./boom -v HIERARCHY -c CHAR -x CURR -p PROVIDER -i INV \
	  -s SUBST

# ----- Tests -----------------------------------------------------------------

test tests:	all
		LANG= bash -c \
		  'passed=0 && cd test && \
		  for n in [a-z]*; do \
		  [ $$n != core ] && SCRIPT=$$n . ./$$n; done; \
		  echo "Passed all $$passed tests"'

valgrind:
		VALGRIND="valgrind -q" $(MAKE) tests