#!/usr/bin/env python
# Licensed under the GNU GPL v2 or later, see COPYING file for details.
# Copyright (C) 2008-2010 David Robillard
# Copyright (C) 2008 Nedko Arnaudov
import os

from waflib.extras import autowaf as autowaf
import waflib.Options as Options, waflib.Utils as Utils

# Version of this package (even if built as a child)
PATCHAGE_VERSION = '0.5.0'

# Variables for 'waf dist'
APPNAME = 'patchage'
VERSION = PATCHAGE_VERSION
APP_HUMAN_NAME = 'Patchage'

# Mandatory variables
top = '.'
out = 'build'

def options(opt):
	autowaf.set_options(opt)
	opt.add_option('--patchage-install-name', type='string', default=APPNAME,
			dest='patchage_install_name',
			help="Patchage install name. [Default: '" + APPNAME + "']")
	opt.add_option('--patchage-human-name', type='string', default=APP_HUMAN_NAME,
			dest='patchage_human_name',
			help="Patchage human name [Default: '" + APP_HUMAN_NAME + "']")
	opt.add_option('--jack-dbus', action='store_true', default=False, dest='jack_dbus',
			help="Use Jack via D-Bus [Default: False (use libjack)]")
	opt.add_option('--no-lash', action='store_true', default=False, dest='no_lash',
			help="Do not build Lash support")
	opt.add_option('--no-alsa', action='store_true', default=False, dest='no_alsa',
			help="Do not build Alsa Sequencer support")
	opt.add_option('--no-binloc', action='store_true', default=False, dest='no_binloc',
			help="Do not try to read files from executable's parent directory")

def configure(conf):
	autowaf.configure(conf)
	autowaf.display_header('Patchage Configuration')
	conf.load('compiler_cxx')
	autowaf.check_pkg(conf, 'dbus-1', uselib_store='DBUS',
	                  mandatory=False)
	autowaf.check_pkg(conf, 'dbus-glib-1', uselib_store='DBUS_GLIB',
	                  mandatory=False)
	autowaf.check_pkg(conf, 'libgnomecanvasmm-2.6', uselib_store='GNOMECANVASMM',
	                  mandatory=True)
	autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD',
			  atleast_version='2.14.0', mandatory=True)
	autowaf.check_pkg(conf, 'glibmm-2.4', uselib_store='GLIBMM',
			  atleast_version='2.14.0', mandatory=True)
	autowaf.check_pkg(conf, 'gtkmm-2.4', uselib_store='GTKMM',
			  atleast_version='2.11.12', mandatory=True)
	autowaf.check_pkg(conf, 'libglademm-2.4', uselib_store='GLADEMM',
			  atleast_version='2.6.0', mandatory=True)
	autowaf.check_pkg(conf, 'flowcanvas', uselib_store='FLOWCANVAS',
			  atleast_version='0.8.0', mandatory=True)
	autowaf.check_pkg(conf, 'raul', uselib_store='RAUL',
			  atleast_version='0.7.0', mandatory=True)

	# Check for dladdr
	conf.check(function_name='dladdr',
	           header_name='dlfcn.h',
	           cflags='-D_GNU_SOURCE',
	           linkflags='-ldl',
	           define_name='HAVE_DLADDR',
	           mandatory=False)

	# Use Jack D-Bus if requested (only one jack driver is allowed)
	if Options.options.jack_dbus and conf.is_defined('HAVE_DBUS') and conf.is_defined('HAVE_DBUS_GLIB'):
		autowaf.define(conf, 'HAVE_JACK_DBUS', 1)
	else:
		autowaf.check_pkg(conf, 'jack', uselib_store='JACK',
		                  atleast_version='0.107.0', mandatory=False)
		if conf.is_defined('HAVE_JACK'):
			autowaf.define(conf, 'PATCHAGE_LIBJACK', 1)

	if conf.is_defined('HAVE_JACK') and conf.is_defined('HAVE_JACK_DBUS'):
		autowaf.define(conf, 'HAVE_JACK_MIDI', 1)

	# Use Alsa if present unless --no-alsa
	if not Options.options.no_alsa:
		autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA', mandatory=False)

	# Use LASH if we have DBUS unless --no-lash
	if not Options.options.no_lash and conf.is_defined('HAVE_DBUS_GLIB'):
		autowaf.define(conf, 'HAVE_LASH', 1)

	# Find files at binary location if we have dladdr unless --no-binloc
	if not Options.options.no_binloc and conf.is_defined('HAVE_DLADDR'):
		autowaf.define(conf, 'PATCHAGE_BINLOC', 1)

	# Boost headers
	autowaf.check_header(conf, 'boost/shared_ptr.hpp', mandatory=True)
	autowaf.check_header(conf, 'boost/weak_ptr.hpp', mandatory=True)

	conf.env['PATCHAGE_VERSION'] = PATCHAGE_VERSION

	conf.env['APP_INSTALL_NAME'] = Options.options.patchage_install_name
	conf.env['APP_HUMAN_NAME'] = Options.options.patchage_human_name
	autowaf.define(conf, 'PATCHAGE_DATA_DIR', os.path.join(
			conf.env['DATADIR'], conf.env['APP_INSTALL_NAME']))

	conf.write_config_header('patchage-config.h', remove=False)

	autowaf.display_msg(conf, "Install name", "'" + conf.env['APP_INSTALL_NAME'] + "'", 'CYAN')
	autowaf.display_msg(conf, "App human name", "'" + conf.env['APP_HUMAN_NAME'] + "'", 'CYAN')
	autowaf.display_msg(conf, "Jack (D-Bus)", conf.is_defined('HAVE_JACK_DBUS'))
	autowaf.display_msg(conf, "LASH (D-Bus)", conf.is_defined('HAVE_LASH'))
	autowaf.display_msg(conf, "Jack (libjack)", conf.is_defined('PATCHAGE_LIBJACK'))
	autowaf.display_msg(conf, "Alsa Sequencer", conf.is_defined('HAVE_ALSA'))
	print('')

def build(bld):
	out_base = ''
	if Options.platform == 'darwin':
		out_base = 'Patchage.app/Contents/'

	# Program
	prog = bld(features = 'cxx cxxprogram')
	prog.includes = ['.', 'src']
	prog.target = out_base + bld.env['APP_INSTALL_NAME']
	prog.install_path = '${BINDIR}'
	autowaf.use_lib(bld, prog, 'DBUS FLOWCANVAS GLADEMM DBUS_GLIB GNOMECANVASMM GTHREAD RAUL')
	prog.source = '''
		src/Client.cpp
		src/Patchage.cpp
		src/PatchageCanvas.cpp
		src/PatchageEvent.cpp
		src/PatchageModule.cpp
		src/StateManager.cpp
		src/main.cpp
	'''
	if bld.is_defined('HAVE_JACK_DBUS'):
		prog.source += '''
			src/JackDbusDriver.cpp
		'''
	if bld.is_defined('HAVE_LASH'):
		prog.source += '''
			src/LashProxy.cpp
			src/LoadProjectDialog.cpp
			src/Project.cpp
			src/ProjectList.cpp
			src/ProjectPropertiesDialog.cpp
			src/Session.cpp
		'''
	if bld.is_defined('HAVE_LASH') or bld.is_defined('HAVE_JACK_DBUS'):
		prog.source += ' src/DBus.cpp '
	if bld.is_defined('PATCHAGE_LIBJACK'):
		prog.source += ' src/JackDriver.cpp '
		prog.uselib += ' JACK '
	if bld.is_defined('HAVE_ALSA'):
		prog.source += ' src/AlsaDriver.cpp '
		prog.uselib += ' ALSA '
	if bld.is_defined('PATCHAGE_BINLOC'):
		prog.linkflags = ['-ldl']

	# Glade XML UI definition
	bld(features         = 'subst',
	    source           = 'src/patchage.glade',
	    target           = out_base + 'patchage.glade',
	    install_path     = '${DATADIR}/' + bld.env['APP_INSTALL_NAME'],
	    chmod            = Utils.O644,
		PATCHAGE_VERSION = PATCHAGE_VERSION)

	# 'Desktop' file (menu entry, icon, etc)
	bld(features         = 'subst',
	    source           = 'patchage.desktop.in',
	    target           = 'patchage.desktop',
	    install_path     = '${DATADIR}/applications',
	    chmod            = Utils.O644,
	    BINDIR           = os.path.normpath(bld.env['BINDIR']),
	    APP_INSTALL_NAME = bld.env['APP_INSTALL_NAME'],
	    APP_HUMAN_NAME   = bld.env['APP_HUMAN_NAME'])

	if Options.platform == 'darwin':
		# Property list
		bld(features         = 'subst',
		    source           = 'osx/Info.plist.in',
		    target           = out_base + 'Info.plist',
		    install_path     = '',
		    chmod            = Utils.O644)

		# Icons
		bld(rule   = 'cp ${SRC} ${TGT}',
		    source = 'osx/Patchage.icns',
		    target = out_base + 'Resources/Patchage.icns')

		# Gtk/Pango/etc configuration files
		for i in ['pangorc', 'pango.modules', 'gtkrc']:
			bld(rule   = 'cp ${SRC} ${TGT}',
			    source = 'osx/' + i,
			    target = out_base + 'Resources/' + i)

	# Icons
	# After installation, icon cache should be updated using:
	# gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
	icon_sizes = [16, 22, 24, 32, 48, 128, 256, 512]
	for s in icon_sizes:
		d = '%dx%d' % (s, s)
		bld.install_as(
			os.path.join(bld.env['DATADIR'], 'icons', 'hicolor', d, 'apps',
					bld.env['APP_INSTALL_NAME'] + '.png'),
			'icons/' + d + '/patchage.png')

	bld.install_as(
		os.path.join(bld.env['DATADIR'], 'icons', 'hicolor', 'scalable', 'apps',
				bld.env['APP_INSTALL_NAME'] + '.svg'),
		'icons/scalable/patchage.svg')

	bld.install_files('${MANDIR}/man1', bld.path.ant_glob('doc/*.1'))