BTYPE := int

CXX = u++					# uC++ compiler
#CXX = /u/cs343/cfa-cc/bin/cfa			# CFA compiler
CXXFLAGS = -quiet -g -Wall -Wextra -MMD -DBTYPE="${BTYPE}" # compiler flags
MAKEFILE_NAME = ${firstword ${MAKEFILE_LIST}}	# makefile name

ifeq ($(notdir $(strip ${CXX})),cfa)		# CFA rules
CXXFLAGS += "-Wno-implicit-fallthrough"
CFA=fa
.SUFFIXES :					# remove other default suffix rules
.SUFFIXES : .cfa .o				# add CFA default rules
.cfa.o :
	${CXX} ${CXXFLAGS} -c $<
endif

OBJECTS1 = # object files forming 1st executable with prefix "q1"
EXEC1 = binsertsort				# 1st executable name

OBJECTS2 = # object files forming 2nd executable with prefix "q2"
EXEC2 = cardgame

OBJECTS = ${OBJECTS1} ${OBJECTS2}		# all object files
DEPENDS = ${OBJECTS:.o=.d}			# substitute ".o" with ".d"
EXECS = ${EXEC1} ${EXEC2}			# all executables

.PHONY : all clean
.ONESHELL :

all : ${EXECS}					# build all executables

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

-include BinsertImpl

ifeq (${IMPLBTYPE},${BTYPE})			# same implementation type as last time ?
${EXEC1} : ${OBJECTS1}
	${CXX} ${CXXFLAGS} $^ -o $@
else						# implementation type has changed => rebuilt
.PHONY : ${EXEC1}
${EXEC1} :
	rm -f BinsertImpl
	touch q1binsertsort.h${CFA}
	${MAKE} ${EXEC1} OPT="${OPT}" BTYPE="${BTYPE}"
endif

BinsertImpl :
	echo "IMPLBTYPE=${BTYPE}" > BinsertImpl
	sleep 1

${EXEC2} : ${OBJECTS2}				# link step 2nd executable
	${CXX} ${CXXFLAGS} $^ -o $@

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

${OBJECTS} : ${MAKEFILE_NAME}			# OPTIONAL : changes to this file => recompile

-include ${DEPENDS}				# include *.d files containing program dependences

clean :						# remove files that can be regenerated
	rm -f ${DEPENDS} ${OBJECTS} ${EXECS} BinsertImpl
