LIBVERSION	= $(shell echo $(PACKAGE_VERSION) | sed 's/[-abgrc].*//')
ACLOCAL_AMFLAGS = -I m4
dist_man_MANS	= doc/ledger.1
SUBDIRS		= po intl
EXTRA_DIST	= autogen.sh config.rpath contrib src/system.hh.in
DISTCLEANFILES	= .timestamp

lib_LTLIBRARIES =				\
	libledger_report.la			\
	libledger_data.la			\
	libledger_expr.la			\
	libledger_math.la			\
	libledger_util.la

lib_cppflags  = -I$(srcdir)/src -I$(srcdir)/lib	\
		-I$(srcdir)/lib/utfcpp/source

libledger_util_la_SOURCES =			\
	src/stream.cc				\
	src/mask.cc				\
	src/times.cc				\
	src/error.cc				\
	src/utils.cc				\
	src/accum.cc				\
	lib/sha1.cpp

libledger_util_la_CPPFLAGS = $(lib_cppflags)
libledger_util_la_LDFLAGS  = -release $(LIBVERSION)

libledger_math_la_SOURCES  =			\
	src/balance.cc				\
	src/quotes.cc				\
	src/pool.cc				\
	src/annotate.cc				\
	src/commodity.cc			\
	src/amount.cc

libledger_math_la_CPPFLAGS = $(lib_cppflags)
libledger_math_la_LDFLAGS  = -release $(LIBVERSION)

libledger_expr_la_SOURCES  =			\
	src/option.cc				\
	src/format.cc				\
	src/query.cc				\
	src/predicate.cc			\
	src/scope.cc				\
	src/expr.cc				\
	src/op.cc				\
	src/parser.cc				\
	src/token.cc				\
	src/value.cc

libledger_expr_la_CPPFLAGS  = $(lib_cppflags)
libledger_expr_la_LDFLAGS   = -release $(LIBVERSION)

libledger_data_la_SOURCES   =			\
	src/lookup.cc				\
	src/compare.cc				\
	src/iterators.cc			\
	src/timelog.cc				\
	src/textual.cc				\
	src/temps.cc				\
	src/journal.cc				\
	src/archive.cc				\
	src/account.cc				\
	src/xact.cc				\
	src/post.cc				\
	src/item.cc

libledger_data_la_CPPFLAGS   = $(lib_cppflags)
libledger_data_la_LDFLAGS    = -release $(LIBVERSION)

libledger_report_la_SOURCES  =			\
	src/stats.cc				\
	src/generate.cc				\
	src/csv.cc				\
	src/convert.cc				\
	src/draft.cc				\
	src/emacs.cc				\
	src/org.cc				\
	src/xml.cc				\
	src/print.cc				\
	src/output.cc				\
	src/precmd.cc				\
	src/chain.cc				\
	src/filters.cc				\
	src/report.cc				\
	src/session.cc

libledger_report_la_CPPFLAGS = $(lib_cppflags)
libledger_report_la_LDFLAGS  = -release $(LIBVERSION)

pkginclude_HEADERS =				\
	src/utils.h				\
	src/flags.h				\
	src/error.h				\
	src/times.h				\
	src/mask.h				\
	src/stream.h				\
	src/pstream.h				\
	src/unistring.h				\
	src/accum.h				\
						\
	src/amount.h				\
	src/commodity.h				\
	src/annotate.h				\
	src/pool.h				\
	src/quotes.h				\
	src/balance.h				\
						\
	src/value.h				\
	src/token.h				\
	src/parser.h				\
	src/op.h				\
	src/exprbase.h				\
	src/expr.h				\
	src/scope.h				\
	src/predicate.h				\
	src/query.h				\
	src/format.h				\
	src/option.h				\
	src/series.h				\
						\
	src/item.h				\
	src/post.h				\
	src/xact.h				\
	src/account.h				\
	src/journal.h				\
	src/temps.h				\
	src/archive.h				\
	src/timelog.h				\
	src/iterators.h				\
	src/compare.h				\
	src/lookup.h				\
						\
	src/session.h				\
	src/report.h				\
	src/filters.h				\
	src/chain.h				\
	src/precmd.h				\
	src/csv.h				\
	src/convert.h				\
	src/draft.h				\
	src/generate.h				\
	src/stats.h				\
	src/print.h				\
	src/output.h				\
	src/xml.h				\
	src/emacs.h				\
	src/org.h				\
						\
	src/global.h				\
						\
	src/pyinterp.h				\
						\
	lib/sha1.h				\
	lib/gettext.h				\
						\
	lib/utfcpp/source/utf8.h		\
	lib/utfcpp/source/utf8/checked.h	\
	lib/utfcpp/source/utf8/core.h		\
	lib/utfcpp/source/utf8/unchecked.h

nodist_libledger_util_la_SOURCES = system.hh

BUILT_SOURCES = system.hh
CLEANFILES    = system.hh

system.hh: src/system.hh.in
	cp -p $< $@

if USE_PCH
nodist_libledger_util_la_SOURCES += system.hh.gch

BUILT_SOURCES += system.hh.gch
CLEANFILES    += system.hh.gch

system.hh.gch: system.hh
	-rm -f $@
	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
	    $(lib_cppflags) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) \
	    -o $@ $<
endif

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

bin_PROGRAMS	= ledger

ledger_CPPFLAGS	= $(lib_cppflags)
if HAVE_BOOST_PYTHON
ledger_CPPFLAGS	+= -I$(srcdir)/python
endif
ledger_SOURCES	= src/main.cc src/global.cc
ledger_LDADD	= $(LIBOBJS) $(lib_LTLIBRARIES) $(INTLLIBS)
ledger_LDFLAGS	= -static

info_TEXINFOS	= doc/ledger.texi

dist_lisp_LISP	= lisp/ledger.el lisp/timeclock.el
ELCFILES	=
DISTCLEANFILES += ledger.elc timeclock.elc

all_sources	= $(libledger_util_la_SOURCES)		\
		  $(libledger_math_la_SOURCES)		\
		  $(libledger_expr_la_SOURCES)		\
		  $(libledger_data_la_SOURCES)		\
		  $(libledger_report_la_SOURCES)	\
		  $(libledger_python_la_SOURCES)	\
		  src/pyledger.cc

all_files	= $(all_sources) $(pkginclude_HEADERS)

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

if HAVE_BOOST_PYTHON

lib_LTLIBRARIES += libledger_python.la

libledger_python_la_SOURCES =			\
	src/pyutils.h				\
	src/pyfstream.h				\
	src/py_account.cc			\
	src/py_amount.cc			\
	src/py_balance.cc			\
	src/py_commodity.cc			\
	src/py_expr.cc				\
	src/py_format.cc			\
	src/py_item.cc				\
	src/py_journal.cc			\
	src/py_post.cc				\
	src/py_times.cc				\
	src/py_utils.cc				\
	src/py_value.cc				\
	src/py_xact.cc				\
	src/pyinterp.cc

libledger_python_la_CPPFLAGS = $(lib_cppflags) -I$(srcdir)/python

pyexec_LTLIBRARIES     = ledger.la

ledger_la_CPPFLAGS     = $(libledger_python_la_CPPFLAGS)
ledger_la_SOURCES      = src/pyledger.cc
ledger_la_DEPENDENCIES = $(lib_LTLIBRARIES)
ledger_la_LDFLAGS      = -avoid-version -module
ledger_la_LIBADD       = $(LIBOBJS) $(lib_LTLIBRARIES)

pkgpython_PYTHON       = python/__init__.py python/server.py

endif

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

TESTS = RegressTests BaselineTests ManualTests ConfirmTests \
        GenerateTests

if HAVE_BOOST_TEST
TESTS +=	    \
	UtilTests   \
	MathTests   \
	ExprTests
#	DataTests   \
#	ReportTests
endif

if DEBUG
TESTS += CheckTests
endif

if HAVE_BOOST_PYTHON
TESTS += PyUnitTests
endif

check_PROGRAMS = $(TESTS)

TESTLIBS = -lboost_unit_test_framework$(BOOST_SUFFIX) \
	   -lboost_test_exec_monitor$(BOOST_SUFFIX)

UtilTests_SOURCES =		 \
	test/unit/t_times.cc

UtilTests_CPPFLAGS = -I$(srcdir)/test $(lib_cppflags)
UtilTests_LDADD	   = libledger_util.la $(TESTLIBS)

MathTests_SOURCES =		 \
	test/unit/t_commodity.cc \
	test/unit/t_amount.cc	 \
	test/unit/t_balance.cc

MathTests_CPPFLAGS = -I$(srcdir)/test $(lib_cppflags)
MathTests_LDADD	   = libledger_math.la $(UtilTests_LDADD)

ExprTests_SOURCES =		 \
	test/unit/t_expr.cc

ExprTests_CPPFLAGS = -I$(srcdir)/test $(lib_cppflags)
ExprTests_LDADD	   = libledger_expr.la $(MathTests_LDADD)

DataTests_SOURCES =

DataTests_CPPFLAGS = -I$(srcdir)/test $(lib_cppflags)
DataTests_LDADD	   = libledger_data.la $(ExprTests_LDADD)

ReportTests_SOURCES =

ReportTests_CPPFLAGS = -I$(srcdir)/test $(lib_cppflags)
ReportTests_LDADD    = libledger_report.la $(DataTests_LDADD)

all_tests_sources =				\
	$(UtilTests_SOURCES)			\
	$(MathTests_SOURCES)			\
	$(ExprTests_SOURCES)			\
	$(DataTests_SOURCES)			\
	$(ReportTests_SOURCES)

PyUnitTests_SOURCES = test/PyUnitTests.py

all_py_tests_sources = \
	$(patsubst test/unit/%.cc,$(top_builddir)/test/python/%.py, \
		   $(filter test/unit/t_%.cc,$(all_tests_sources)))

test/python/%.py: test/unit/%.cc test/convert.py
	$(PYTHON) $(srcdir)/test/convert.py $< $@

test/python/UnitTests.py: $(all_py_tests_sources)
	@echo "from unittest import TextTestRunner, TestSuite" > $@
	@for file in $$(ls $(srcdir)/test/unit/*.cc); do \
	    base=$$(basename $$file); \
	    base=$$(echo $$base | sed 's/\.cc//'); \
	    echo "import $$base" >> $@; \
	done
	@echo "suites = [" >> $@
	@for file in $$(ls $(srcdir)/test/unit/*.cc); do \
	    base=$$(basename $$file); \
	    base=$$(echo $$base | sed 's/\.cc//'); \
	    echo "    $$base.suite()," >> $@; \
	done
	@echo "]" >> $@
	@echo "TextTestRunner().run(TestSuite(suites))" >> $@

ledger_python = $(top_builddir)/ledger$(EXEEXT) python

ESC_python=`echo "$(ledger_python)" | sed 's/\//\\\\\//g'`
ESC_srcdir=`echo "$(srcdir)" | sed 's/\//\\\\\//g'`
ESC_builddir=`echo "$(top_builddir)" | sed 's/\//\\\\\//g'`
ESC_distdir=`echo "$(distdir)" | sed 's/\//\\\\\//g'`

# jww (2007-05-10): This rule will not be triggered on systems that
# define an EXEEXT.
PyUnitTests: test/PyUnitTests.py test/python/UnitTests.py
	@cat $(srcdir)/test/PyUnitTests.py \
	    | sed "s/%python%/$(ESC_python)/" \
	    | sed "s/%srcdir%/$(ESC_srcdir)/g" \
	    | sed "s/%builddir%/$(ESC_builddir)/g" > $@
	chmod 755 $@

RegressTests_SOURCES = test/RegressTests.py

EXTRA_DIST += test/regress test/convert.py test/LedgerHarness.py

RegressTests: $(srcdir)/test/RegressTests.py
	echo "$(PYTHON) $(srcdir)/test/RegressTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/regress \"\$$@\"" > $@
	chmod 755 $@

BaselineTests_SOURCES = test/RegressTests.py

EXTRA_DIST += test/baseline

BaselineTests: $(srcdir)/test/RegressTests.py
	echo "$(PYTHON) $(srcdir)/test/RegressTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/baseline \"\$$@\"" > $@
	chmod 755 $@

ManualTests_SOURCES = test/RegressTests.py

EXTRA_DIST += test/manual

ManualTests: $(srcdir)/test/RegressTests.py
	echo "$(PYTHON) $(srcdir)/test/RegressTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/manual \"\$$@\"" > $@
	chmod 755 $@

ConfirmTests_SOURCES = test/ConfirmTests.py

EXTRA_DIST += test/input

test/input/mondo.dat: test/input/standard.dat
	@for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do \
	    for j in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do \
		cat $< >> $@; \
	    done; \
	done

ConfirmTests: $(srcdir)/test/ConfirmTests.py
	echo "$(PYTHON) $(srcdir)/test/ConfirmTests.py $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/input \"\$$@\"" > $@
	chmod 755 $@

GenerateTests_SOURCES = test/GenerateTests.py

GenerateTests: $(srcdir)/test/GenerateTests.py
	echo "$(PYTHON) $(srcdir)/test/GenerateTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) 1 ${1:-20} \"\$$@\"" > $@
	chmod 755 $@

CheckTests_SOURCES = test/CheckTests.py

CheckTests:
	echo "$(PYTHON) $(srcdir)/test/CheckTests.py $(top_builddir)/ledger$(EXEEXT) $(srcdir) \"\$$@\"" > $@
	chmod 755 $@

FULLCHECK=$(srcdir)/test/fullcheck.sh

if HAVE_BOOST_TEST
unittests: check
	@sh $(FULLCHECK) $(top_builddir)/UtilTests$(EXEEXT)   --verify \
	    2>&1 | grep -v '^GuardMalloc:'
	@sh $(FULLCHECK) $(top_builddir)/MathTests$(EXEEXT)   --verify \
	    2>&1 | grep -v '^GuardMalloc:'
	@sh $(FULLCHECK) $(top_builddir)/ExprTests$(EXEEXT)   --verify \
	    2>&1 | grep -v '^GuardMalloc:'
#	@sh $(FULLCHECK) $(top_builddir)/DataTests$(EXEEXT)   --verify \
#	    2>&1 | grep -v '^GuardMalloc:'
#	@sh $(FULLCHECK) $(top_builddir)/ReportTests$(EXEEXT) --verify \
#	    2>&1 | grep -v '^GuardMalloc:'
else
unittests: check
	@test 1 -eq 1
endif

fullcheck: unittests
	@$(top_builddir)/RegressTests  --verify
	@$(top_builddir)/BaselineTests --verify
	@$(top_builddir)/ManualTests   --verify
	@$(top_builddir)/ConfirmTests  --verify
	@$(top_builddir)/GenerateTests 20 --verify
	@$(top_builddir)/RegressTests  --gmalloc
	@$(top_builddir)/BaselineTests --gmalloc
	@$(top_builddir)/ManualTests   --gmalloc
	@$(top_builddir)/ConfirmTests  --gmalloc
	@$(top_builddir)/GenerateTests 10000
#	@$(top_builddir)/GenerateTests --gmalloc

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

EXTRA_DIST += doc/README doc/NEWS doc/ledger.pdf
EXTRA_DIST += doc/LICENSE doc/LICENSE-sha1 doc/LICENSE-utfcpp
if USE_DOXYGEN
EXTRA_DIST += doc/Doxyfile doc/refman.pdf
endif

DISTCLEANFILES += doc/ledger.info doc/ledger.pdf
if USE_DOXYGEN
DISTCLEANFILES += Doxyfile.gen doc/Doxyfile.bak doc/refman.pdf
endif

if USE_DOXYGEN
dist-hook-doxygen:
	find $(distdir)/doc -name .dirstamp -delete
	rm -fr $(distdir)/doc/latex \
	       $(distdir)/doc/Doxyfile.bak \
	       $(distdir)/doc/Doxyfile.gen
	cp -pR doc/html $(distdir)/doc
else
dist-hook-doxygen:
	@test 1 -eq 1
endif

dist-hook: dist-hook-doxygen
	find $(distdir) -name .DS_Store -delete
	find $(distdir) -name .localized -delete
	rm -f $(distdir)/README.textile
	cp -p $(srcdir)/doc/README $(distdir)/README

if USE_DOXYGEN
distclean-local-doxygen:
	rm -fr doc/html doc/latex
	rm -f doc/refman.pdf
else
distclean-local-doxygen:
	@test 1 -eq 1
endif

distclean-local: distclean-local-doxygen
	rm -fr test/python

if USE_DOXYGEN
ESC_top_builddir=`cd $(top_builddir); pwd | sed 's/\//\\\\\//g'`

Doxyfile.gen: doc/Doxyfile
	cat $< | sed "s/%srcdir%/$(ESC_srcdir)/g" \
	       | sed "s/%builddir%/$(ESC_top_builddir)/g" > $@

doc/html/index.html: Doxyfile.gen $(all_files)
	BUILD_DIR=`cd $(top_builddir); pwd`; \
	(cd $(srcdir); doxygen $$BUILD_DIR/Doxyfile.gen)

# The intention with the following rules is that all of the Doxygen
# documentation (both HTML and PDF) is built locally before distcheck is
# run, since it's quite possible that the user will not have a complete
# TeX + Doxygen + dot environment on their own system.

doc/refman.pdf: doc/html/index.html
	(cd doc/latex && make)
	cp doc/latex/refman.pdf $@

docs: pdf doc/refman.pdf
else
docs: pdf
endif

libs:
	@echo Building dependency libs and installing in /usr/local/stow ...
	git submodule update --init
	(cd lib; make)

report: all
	lcov -d $(shell pwd) --zerocounters
	if [ -d doc/report ]; then rm -fr doc/report; fi
	-mkdir doc/report
	lcov -c -i -d $(shell pwd) -o doc/report/ledger_base.info
	make check
	lcov -c -d $(shell pwd) --checksum -o doc/report/ledger_test.info
	lcov -a doc/report/ledger_base.info \
	     -a doc/report/ledger_test.info -o doc/report/ledger_total.info
	lcov --extract doc/report/ledger_total.info '*/src/*' \
	     -o doc/report/ledger_cov.info
	genhtml -o doc/report doc/report/ledger_cov.info
	@echo Coverage reported generated\; now open doc/report/index.html

LEDGER_BINARY  = $(top_builddir)/ledger$(EXEEXT)
SPEEDTEST_DAT  = $(srcdir)/test/input/speed-test.dat
SPEEDTEST_ARGS = -v --decimal-comma -o /dev/null reg 2eb75f84 1eede0cb

speedtest:
	@$(LEDGER_BINARY) -f $(SPEEDTEST_DAT) $(SPEEDTEST_ARGS)
	@$(LEDGER_BINARY) -f $(SPEEDTEST_DAT) $(SPEEDTEST_ARGS) -V
	@$(LEDGER_BINARY) -f $(SPEEDTEST_DAT) $(SPEEDTEST_ARGS) -X €

# Makefile.am ends here