# --*- Makefile -*--
#------------------------------------------------------------------------------
#$Author: saulius $
#$Date: 2017-11-12 07:05:31 -0500 (Sun, 12 Nov 2017) $ 
#$Revision: 88 $
#$URL: svn://saulius-grazulis.lt/libraries/trunk/java/SOptions/Makefile $
#------------------------------------------------------------------------------

MAKECONF_FILES = ${filter-out %~, ${wildcard Makeconf*}}

ifneq ("${MAKECONF_FILES}","")
include ${MAKECONF_FILES}
endif

#------------------------------------------------------------------------------

SRC_DIR = .
GEN_DIR = generated
SCRIPT_DIR = scripts
CLASS_DIR  = classes

JSOURCES = $(wildcard ${SRC_DIR}/*.java)
JFILES = ${JSOURCES} ${GJAVA}
CFILES = ${JFILES:${SRC_DIR}/%.java=${CLASS_DIR}/%.class}

CLASSPATH := $(shell find -name \*.jar | tr "\n" ":")${SRC_DIR}:${CLASS_DIR}:${CLASSPATH}

export CLASSPATH

JAVAC = javac

.PHONY: all clean distclean cleanAll

.PRECIOUS: ${GEN_DIR}/%.java

all: ${CFILES} ${JFILES}

#------------------------------------------------------------------------------

ifneq ("${MAKELOCAL_FILES}","")
include ${MAKELOCAL_FILES}
endif

${CLASS_DIR}/%.class: ${SRC_DIR}/%.java
	${JAVAC} ${JFLAGS} $< -d ${CLASS_DIR}

#------------------------------------------------------------------------------

JARFILE = $(notdir $(shell pwd)).jar

.PHONY: jar display

jar: ${JARFILE}

display:
	echo ${JARFILE}

%.jar: ${CFILES}
	jar cvf $@ $(patsubst ${CLASS_DIR}/%.class,${CLASS_DIR}/ %.class,$(addprefix -C ,$^)) \
		-C ${CLASS_DIR} SOptions\$$1.class

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

.PHONY: test tests out output outputs

TEST_DIR     = tests/cases
TST_OUT_DIR  = tests/outputs
TST_DIF_DIR  = tests/outputs

TEST_FILES   = $(wildcard ${TEST_DIR}/*.sh)
TEST_OUTPUTS = ${TEST_FILES:${TEST_DIR}/%.sh=${TST_OUT_DIR}/%.out}
TEST_DIFFS   = ${TEST_FILES:${TEST_DIR}/%.sh=${TST_DIF_DIR}/%.diff}

test tests: ${TEST_DIFFS}

out output outputs: ${TEST_OUTPUTS}

${TST_OUT_DIR}/%.out: ${TEST_DIR}/%.sh
	@test -f $@ || ./$< 2>&1 | tee $@
	@test -f $@ && touch $@

${TST_DIF_DIR}/%.diff: ${TEST_DIR}/%.sh ${TST_OUT_DIR}/%.out ${CFILES}
	@printf "%-30s: " $(notdir $<)
	@./$< 2>&1 | diff $(word 2,$^) - > $@; \
	if [ $$? = 0 ]; then echo OK; \
	else echo FAILED:; cat $@; fi

#------------------------------------------------------------------------------

.PHONY: fail listdiff

fail listdiff: # test
	@-( test -d ${TST_DIF_DIR} && \
	    ls -l ${TST_DIF_DIR}/*.diff | awk '{if( $$5 > 0 ) print}' ) || \
	    true

#------------------------------------------------------------------------------

clean:
	rm -f ${TEST_DIFFS}

distclean cleanAll: clean
	rm -f ${CFILES}
	rm -f ${GJAVA}
	rm -f ${JARFILE}
