#  FLAC - Free Lossless Audio Codec
#  Copyright (C) 2001,2002,2003  Josh Coalson
#
#  This program is part of FLAC; 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.
#
#  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, write to the Free Software
#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

#
# GNU Makefile
#
# Useful targets
#
# all     : build all libraries and programs in the default configuration (currently 'release')
# debug   : build all libraries and programs in debug mode
# valgrind: build all libraries and programs in debug mode, dynamically linked and ready for valgrind
# release : build all libraries and programs in release mode
# test    : run the unit and stream tests
# clean   : remove all non-distro files
#

topdir = .

.PHONY: all doc src libFLAC libFLAC++ libOggFLAC libOggFLAC++ share plugin_common plugin_xmms flac metaflac test_grabbag test_libFLAC test_libFLAC++ test_libOggFLAC test_libOggFLAC++ test_streams
all: doc src

DEFAULT_CONFIG = release

CONFIG = $(DEFAULT_CONFIG)

debug   : CONFIG = debug
valgrind: CONFIG = valgrind
release : CONFIG = release

debug   : all
valgrind: all
release : all

doc:
	(cd $@ ; $(MAKE) -f Makefile.lite)

src:
	(cd $@ ; $(MAKE) -f Makefile.lite $(CONFIG))

libFLAC:
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

libFLAC++: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

libOggFLAC: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

libOggFLAC++: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

share: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

flac: libFLAC libOggFLAC share
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

metaflac: libFLAC share
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

plugin_common: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

plugin_xmms: libFLAC plugin_common
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test_streams: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test_grabbag: share
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test_libFLAC: libFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test_libFLAC++: libFLAC libFLAC++
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test_libOggFLAC: libFLAC libOggFLAC
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test_libOggFLAC++: libFLAC libOggFLAC libOggFLAC++
	(cd src/$@ ; $(MAKE) -f Makefile.lite $(CONFIG))

test: debug
	(cd test ; $(MAKE) -f Makefile.lite debug)

testv: valgrind
	(cd test ; $(MAKE) -f Makefile.lite valgrind)

testr: release
	(cd test ; $(MAKE) -f Makefile.lite release)

clean:
	-(cd doc ; $(MAKE) -f Makefile.lite clean)
	-(cd src ; $(MAKE) -f Makefile.lite clean)
	-(cd test ; $(MAKE) -f Makefile.lite clean)
