#
# GNU Solfege - ear training for GNOME
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 Tom Cato Amundsen
#
# 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 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

@SET_MAKE@

export prefix:=@prefix@
export exec_prefix:=@exec_prefix@
export bindir:=@bindir@
export datadir:=@datadir@
export sysconfdir:=@sysconfdir@
export libdir:=@libdir@
export mandir:=@mandir@
export CC:=@CC@
export CFLAGS:=@CFLAGS@
export RSVG:=@RSVG@
export SWIG:=@SWIG@
export SWIG_VERSION:=@SWIG_VERSION@
export LILYPOND:=@LILYPOND@
export BZR:="@BZR@"
export GS:=@GS@
export XGETTEXT:=@XGETTEXT@
export MAKEINFO:=@MAKEINFO@
export MSGFMT:=@MSGFMT@
export MSGGREP:=@MSGGREP@
export MSGMERGE:=@MSGMERGE@
export XML2PO:=@XML2PO@
export XSLTPROC:=@XSLTPROC@
export STYLESHEET:=@STYLESHEET@
export HAVE_STYLESHEET:=@HAVE_STYLESHEET@
export PYTHON:=@PYTHON@
export PYTHON_VERSION:=@PYTHON_VERSION@
export PYTHON_PREFIX:=@PYTHON_PREFIX@
export PYTHON_INCLUDES:=@PYTHON_INCLUDES@
export PACKAGE:=@PACKAGE@
export MAJOR_VERSION:=@MAJOR_VERSION@
export MINOR_VERSION:=@MINOR_VERSION@
export VERSION:=@VERSION@

export INSTALL:=@INSTALL@
export INSTALL_PROGRAM := ${INSTALL}
export INSTALL_DATA := ${INSTALL} -m 644
export ENABLE_OSS_SOUND := @ENABLE_OSS_SOUND@
export ENABLE_WINMIDI := @ENABLE_WINMIDI@
export ENABLE_TUNER := @ENABLE_TUNER@
export HAVE_FFTW := @HAVE_FFTW@
export LIBS:=@LIBS@
export DISTNAME:=$(PACKAGE)-$(VERSION)
export DISTDIR:=$(PWD)/$(PACKAGE)-$(VERSION)

TARGETS += AUTHORS INSTALL README FAQ INSTALL.win32
installfiles += ui.xml help-menu.xml helpbrowser.xml
installfiles += $(wildcard learningtrees/*)

.PHONY: all
all:

SUBDIRS := po feta regression-lesson-files example-lesson-files lesson-files hash-bug-workaround mpd soundcard src test tools topdocs graphics themes/svg help

FAQ INSTALL.win32 README INSTALL : topdocs/defs.texi

%: topdocs/%.texi
	LC_ALL=C makeinfo -I topdocs --no-split --no-headers --output $(notdir $(basename $<)) $<

dist_files = AUTHORS COPYING INSTALL FAQ INSTALL.win32 \
	Makefile.in config.h.in \
	README changelog ChangeLog configure configure.ac \
	default.config system.rc finn \
	install-sh py-compile run-solfege.py.in \
	solfege.1 solfege.1.txt \
	lessonfile_editor.1.txt \
	solfege.desktop solfege.gtkrc solfege.py \
	windowsinstaller.iss.in windowsinstaller.iss \
	win32-start-solfege.pyw \
	solfegedebug.bat \
	solfege.redhat9.spec.in solfege.redhat9.spec \
	solfege.suse9.spec.in solfege.suse9.spec \
	acinclude.m4 aclocal.m4 \
	runsrcdir.bat \
	ui.xml \
	help-menu.xml \
	helpbrowser.xml \
	$(wildcard learningtrees/*) \
	autopackage/default.apspec.in \
	winbuild.sh \
	test.py

include $(patsubst %,%/Makefile,$(SUBDIRS))
-include debian-dir/Makefile
-include debian/Makefile

%.1: %.1.txt
	txt2man -r "GNU Solfege @VERSION@" -t Solfege -s 1 $< > $@

# We need src/_version.py because solfege imports it at runtime.
solfege.1: solfege.1.txt src/_version.py
	LANGUAGE=C $(PYTHON) -c "import tools.buildutil; tools.buildutil.create_manpage()" | txt2man -t Solfege -s 1 > $@

# Unfortunately we still have to manually convert from html to pdf
# using openoffice and "Save as PDF"
prepare-rsync-manual: $(foreach lang,$(USER_MANUAL_LANGUAGES),help/$(lang)/one-big-page.html) help/C/one-big-page.html
	rm -rf tmp-build
	make prefix=`pwd`/tmp-build
	make prefix=`pwd`/tmp-build install
	oowriter tmp-build/share/solfege/help/*/one-big-page.html

rsync-manual: tmp-build/share/solfege/help/C/one-big-page.pdf
	cd tmp-build/share/solfege/help && rsync --delete --rsh=ssh -r . tom@solfege.org:/var/www/docs.solfege.org/www/$(MAJOR_VERSION).$(MINOR_VERSION)
	ssh tom@solfege.org "cd /var/www/docs.solfege.org && python mkindex.py"

maintainer-clean: clean
clean:
	rm -f $(TARGETS)
	rm -f $(clean-files)
	rm -f AUTHORS.txt COPYING.txt FAQ.txt README.txt INSTALL.txt INSTALL.win32.txt
	# share is created at build time to store .mo files to be used when
	# we run the program from the source dir.
	rm -rf share

install: all mkinstalldirs install-po install-soundcard install-graphics install-program-files compileall

install-program-files:
	$(INSTALL_PROGRAM) run-solfege.py $(DESTDIR)/$(bindir)/solfege
	$(INSTALL_PROGRAM) run-solfege.py $(DESTDIR)/$(bindir)/solfege
	$(INSTALL_DATA) solfege.gtkrc $(DESTDIR)/$(datadir)/$(PACKAGE)
	$(INSTALL_DATA) default.config $(DESTDIR)/$(datadir)/$(PACKAGE)
	$(INSTALL_DATA) solfege.1 $(DESTDIR)/$(mandir)/man1
	
	$(INSTALL_DATA) system.rc $(DESTDIR)/$(sysconfdir)/$(PACKAGE)
	$(INSTALL_DATA) solfege.desktop $(DESTDIR)/$(datadir)/applications/
	echo $(installfiles) | $(PYTHON) tools/pcopy.py $(DESTDIR)/$(datadir)/$(PACKAGE)/

compileall:
ifneq (x"$(nopycompile)",xYES)
	for dir in src mpd soundcard; do\
	  $(PYTHON) -c "import compileall; compileall.compile_dir('$(DESTDIR)/$(datadir)/$(PACKAGE)/$(dir)')" ;\
	done
endif

mkinstalldirs:
	mkdir -p $(DESTDIR)/$(mandir)/man1
	mkdir -p $(DESTDIR)/$(bindir)
	mkdir -p $(DESTDIR)/$(datadir)/$(PACKAGE)
	mkdir -p $(DESTDIR)/$(sysconfdir)
	mkdir -p $(DESTDIR)/$(datadir)/applications/

uninstall: uninstall-po uninstall-soundcard uninstall-graphics
	rm $(addprefix $(datadir)/$(PACKAGE)/,$(installfiles))
	# delete .pyc files
	rm -f $(patsubst %,$(datadir)/$(PACKAGE)/%c,$(filter %.py,$(installfiles)))
	# delete .pyo files
	rm -f $(patsubst %,$(datadir)/$(PACKAGE)/%o,$(filter %.py,$(installfiles)))
	rm $(bindir)/$(PACKAGE)
	rmdir $(bindir) || true
	rm $(mandir)/man1/solfege.1
	rmdir $(mandir)/man1 || true
	rmdir $(mandir) || true
	rm -f $(datadir)/$(PACKAGE)/solfege.gtkrc
	rm -f $(datadir)/$(PACKAGE)/default.config
	rm -f $(sysconfdir)/$(PACKAGE)
	rm -f $(datadir)/applications/solfege.desktop
	rmdir $(datadir)/$(PACKAGE)/feta
	rmdir $(datadir)/$(PACKAGE)/regression-lesson-files
	rmdir $(datadir)/$(PACKAGE)/example-lesson-files
	rmdir $(datadir)/$(PACKAGE)/lesson-files/bin
	rmdir $(datadir)/$(PACKAGE)/lesson-files/share
	rmdir $(datadir)/$(PACKAGE)/lesson-files/include
	rmdir $(datadir)/$(PACKAGE)/lesson-files
	rmdir $(datadir)/$(PACKAGE)/hash-bug-workaround
	rmdir $(datadir)/$(PACKAGE)/mpd
	rmdir $(datadir)/$(PACKAGE)/soundcard
	rmdir $(datadir)/$(PACKAGE)/src
	rmdir $(datadir)/$(PACKAGE)/graphics
	rmdir $(datadir)/$(PACKAGE)/themes/svg
	rmdir $(datadir)/$(PACKAGE)/themes
	rmdir $(datadir)/$(PACKAGE)/learningtrees
	rm -rf $(datadir)/$(PACKAGE)/help
	rmdir $(datadir)/$(PACKAGE)
	rmdir $(datadir)/applications || true
	rmdir $(datadir)/pixmaps || true
	rmdir $(datadir) || true
	rmdir $(sysconfdir) || true
	rmdir $(libdir) || true
	rmdir $(prefix) || true

.PHONY: test xmllint
xmllint:
	xmllint --postvalid --dtdvalid http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd --xinclude --noout  help/C/solfege.xml

test: xmllint
	$(MAKE) dist
	$(PYTHON) test.py
	$(PYTHON) tools/po-file-checks.py
	rm -rf $(PACKAGE)-$(VERSION)
	tar zxf ../$(PACKAGE)-$(VERSION).tar.gz
	(cd $(PACKAGE)-$(VERSION) && ./configure && $(MAKE) 2>&1| tee buildlog.txt)
	@if grep "parser error :" $(PACKAGE)-$(VERSION)/buildlog.txt; then exit 10; else echo "Docbook ok"; fi
	rm -rf $(PACKAGE)-$(VERSION)
	@echo
	@echo "Also run 'make test-screenshots' to search for missing screenshots."

test-screenshots:
	$(PYTHON) tools/missing-screenshots.py

src/_version.py:
	$(BZR) version-info --check-clean --python > src/_version.py

check-revision-id:
ifndef skip_rev_test
	# We force recreating src/_version.py here
	$(BZR) version-info --check-clean --python > src/_version.py
	$(PYTHON) tools/test-revision-id.py
endif

prepare-release: check-for-new-po-files check-for-new-manual-po-files update-manual check-revision-id test

dist: po/solfege.pot help/C/solfege.pot
	# We cannot add disk_workhorse as a prerequisite to the dist target,
	# because it is possible, I think, that dist_workhorse will be executed
	# before update-manual
	$(MAKE) dist_workhorse
	@echo
	@echo "To make an official release:"
	@echo " * set revision-id and version string in configure.ac and run"
	@echo "   autoconf && configure"
	@echo " * make prepare-release"
	@echo " * make dist"

dist_workhorse: all AUTHORS INSTALL README FAQ INSTALL.win32
	rm -rf $(DISTNAME)
ifdef BZR
	$(BZR) st && $(BZR) log -r 1..  > ChangeLog || true
endif
	mkdir $(DISTNAME)
	echo $(dist_files) | $(PYTHON) tools/pcopy.py $(DISTNAME)
	find $(DISTNAME) | grep "~$$" | xargs rm -f
	tar --gzip --create --file=../$(DISTNAME).tar.gz $(DISTNAME)
	rm -rf $(DISTNAME)

distclean-files += config.status config.cache config.log \
	install-stamp build-stamp \
	Makefile \
	config.h run-solfege.py \
	installer.nsi \
	autopackage/default.apspec


distclean: clean
	rm -f $(distclean-files)

count_c_lines:
	wc --lines $(wildcard soundcard/*.c)

count_lines:
	wc --lines $(wildcard mpd/*.py soundcard/*.py src/*.py)
	@echo "Counted python files"

winbuild:
	$(PYTHON) -c "file('AUTHORS.txt', 'w').write(file('AUTHORS', 'rU').read())"
	$(PYTHON) -c "file('COPYING.txt', 'w').write(file('COPYING', 'rU').read())"
	$(PYTHON) -c "file('FAQ.txt', 'w').write(file('FAQ', 'rU').read())"
	$(PYTHON) -c "file('README.txt', 'w').write(file('README', 'rU').read())"
	$(PYTHON) -c "file('INSTALL.txt', 'w').write(file('INSTALL', 'rU').read())"
	$(PYTHON) -c "file('INSTALL.win32.txt', 'w').write(file('INSTALL.win32', 'rU').read())"

src/languages.py: $(wildcard po/*.po) tools/buildutil.py
	$(PYTHON) -c "import tools.buildutil; tools.buildutil.create_languages_py()"

TARGETS += src/languages.py

all: $(TARGETS) solfege.1

.PHONY: help
help:
	@echo "set skip_rev_test=yes if you need to skip the bzr revid test"
	@echo "make po-update           Update po/solfege.pot and msgmerge with po/*.po"
	@echo "make manual-po-update    Update help/*/solfege.pot and msgmerge with help/*/*.po"
	@echo "make update-manual       Rebuild the manual, requiring xml2po etc."
	@echo "make test-screenshots    See which screenshots are missing in the user manual"
	@echo "make help                Display this message."
	@echo "help/C/one-big-page.html Make documentation in on big html file."
