#encoding: latin-1

# libzzub, Buz, Aldrin
# Modular Sequencer
# Copyright (C) 2006 The Aldrin Development Team
#
# 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 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

Import('env', 'posix', 'win32', 'install_lib', 'cl', 'vs_projects')
import glob

#######################################
#
# libzzub shared library
#
#######################################

localenv = env.Copy()

files = [
	'bmxreader.cpp',
	'bmxwriter.cpp',
	'compress.cpp',
	'decompress.cpp',
	'driver.cpp',
	'dummy.cpp',
	'host.cpp',
	'libzzub.cpp',
	'master.cpp',
	'metaplugin.cpp',
	'pattern.cpp',
	'player.cpp',
	'pluginloader.cpp',
	'presetmanager.cpp',
	'sequence.cpp',
	'sequencer.cpp',
	'tools.cpp',
	'waveplayer.cpp',
	'wavetable.cpp',
	'midi.cpp',
]

localenv.Append(CCFLAGS=['-D_LIB','-D_LIBZZUB'])

# neccessities
if posix:	
	localenv.Append(LIBS=[
		'dl',
		'pthread',
	])
elif win32:
	localenv.Append(LIBS=[
		'oleaut32'
	])

if localenv['USE_SIGNATURE'] == True:
	localenv.Append(CCFLAGS=[
		'-DUSE_SIGNATURE'
	])


if localenv['SNDFILE']:
	localenv.Append(LIBS=[
		'sndfile',
	])
	localenv.Append(CCFLAGS=[
		'-DUSE_SNDFILE',
	])

if localenv['OSC']:
	files += ['osc.cpp']
	localenv.Append(LIBS=[
		'lo',
	])
	localenv.Append(CCFLAGS=[
		'-DUSE_OSC',
	])

if localenv['ZXM']:
	localenv.Append(CCFLAGS=[
		'-DUSE_ZXM',
	])
	files += [
		'zxm.cpp',
	]
	files += [
		'${MINIZIP_SRC_PATH}/ioapi.c',
		'${MINIZIP_SRC_PATH}/mztools.c',
		'${MINIZIP_SRC_PATH}/unzip.c',
		'${MINIZIP_SRC_PATH}/zip.c',
	]
	if win32:
		localenv.Append(CPPPATH=["${ROOTPATH}/src/zlib", "${ROOTPATH}/src/flac/include"])
	localenv.Append(LIBS=[
		'FLAC',
		'z',
	])
	
# add portaudio dependencies
localenv.Append(CCFLAGS=[
	'-DPA_LITTLE_ENDIAN', # set this to make sure amd64 is happy
])

files += [
	'${PORTAUDIO_SRC_PATH}/src/common/pa_allocation.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_converters.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_cpuload.c',
	#'${PORTAUDIO_SRC_PATH}/src/common/pa_debugprint.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_dither.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_front.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_process.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_skeleton.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_stream.c',
	'${PORTAUDIO_SRC_PATH}/src/common/pa_trace.c',
]

# portmidi support
localenv.Append(CPPPATH=[
	'${PORTMIDI_SRC_PATH}/pm_common',
	'${PORTMIDI_SRC_PATH}/porttime'
])

if posix:
	localenv.Append(LIBS=[
		'asound',
	])
	localenv.Append(CCFLAGS=[
		'-DPMALSA',
		'-DPM_CHECK_ERRORS',
		'-DNEWBUFFER'
	])
	# porttime
	files += [
		'${PORTMIDI_SRC_PATH}/porttime/porttime.c',
		'${PORTMIDI_SRC_PATH}/porttime/ptlinux.c',
	]
	# portmidi	
	files += [
		'${PORTMIDI_SRC_PATH}/pm_common/pmutil.c',
		'${PORTMIDI_SRC_PATH}/pm_linux/pmlinux.c',
		'${PORTMIDI_SRC_PATH}/pm_common/portmidi.c',
		'${PORTMIDI_SRC_PATH}/pm_linux/pmlinuxalsa.c',
	]

elif win32:
	localenv.Append(LIBS=[
		'portmidi',			
		'porttime',
	])

# portaudio support
if posix:
	files += [
		'${PORTAUDIO_SRC_PATH}/src/os/unix/pa_unix_hostapis.c',
		'${PORTAUDIO_SRC_PATH}/src/os/unix/pa_unix_util.c',
		'${PORTAUDIO_SRC_PATH}/src/hostapi/alsa/pa_linux_alsa.c',
		'${PORTAUDIO_SRC_PATH}/src/hostapi/oss/pa_unix_oss.c',
		'${PORTAUDIO_SRC_PATH}/src/hostapi/jack/pa_jack.c',
	]
	localenv.Append(LIBS=[
		'asound',
		'pthread',
		'rt',
		'm',
		'jack',
	])
	localenv.Append(CPPPATH=[
		'${PORTAUDIO_SRC_PATH}/include',
		'${PORTAUDIO_SRC_PATH}/src/common',
		'${PORTAUDIO_SRC_PATH}/src/os/unix',
	])
	localenv.Append(CCFLAGS=[
		'-DPA_USE_ALSA',
		'-DPA_USE_JACK',
		'-DPA_USE_OSS',
	])
	
elif win32:
	files += [
		'${PORTAUDIO_SRC_PATH}/src/os/win/pa_win_hostapis.c',
		'${PORTAUDIO_SRC_PATH}/src/os/win/pa_win_util.c',
		#'${PORTAUDIO_SRC_PATH}/src/os/win/pa_x86_plain_converters.c',
		'${PORTAUDIO_SRC_PATH}/src/hostapi/wmme/pa_win_wmme.c',
	]
	localenv.Append(CPPPATH=[
		'${PORTAUDIO_SRC_PATH}/include',
		'${PORTAUDIO_SRC_PATH}/src/common',
	])
	localenv.Append(CCFLAGS=[
		'-DPA_NO_DS',
	])
	
	if localenv['ASIO']:
		files += [
			'${PORTAUDIO_SRC_PATH}/src/hostapi/asio/iasiothiscallresolver.cpp',
			'${PORTAUDIO_SRC_PATH}/src/hostapi/asio/pa_asio.cpp',
			'${ASIOSDK_SRC_PATH}/common/asio.cpp',
			'${ASIOSDK_SRC_PATH}/host/asiodrivers.cpp',
			'${ASIOSDK_SRC_PATH}/host/pc/asiolist.cpp',
		]
		
		localenv.Append(CPPPATH=[
			'${ASIOSDK_SRC_PATH}/common',
			'${ASIOSDK_SRC_PATH}/host',
			'${ASIOSDK_SRC_PATH}/host/pc',
		])
		
		localenv.Append(LIBS=[
			'advapi32',
			'ole32',
			'winmm',
		])
	else:
		localenv.Append(CCFLAGS=[
			'-DPA_NO_ASIO',
		])


libzzub_static = localenv.Library('${LIB_BUILD_PATH}/zzub_static',files)

if hasattr(localenv, 'MSVSProject'):
	localenv.MSVSProject(target = 'libzzub_static' + localenv['MSVSPROJECTSUFFIX'],
		srcs = glob.glob('*.cpp'),
		incs = glob.glob('*.h'),
		buildtarget = libzzub_static,
		variant = 'Debug',
		auto_build_solution=0)
	vs_projects+=['src/libzzub/libzzub_static' + localenv.subst('$MSVSPROJECTSUFFIX') ]

if win32:
	files.append('libzzub.def')

libzzub = localenv.SharedLibrary('${LIB_BUILD_PATH}/zzub',files)

if hasattr(localenv, 'MSVSProject'):
	localenv.MSVSProject(target = 'libzzub' + localenv['MSVSPROJECTSUFFIX'],
		srcs = glob.glob('*.cpp'),
		incs = glob.glob('*.h'),
		buildtarget = libzzub[0],   # len(libzzub)==3, but we need only 1
		variant = 'Debug',
		auto_build_solution=0)
	vs_projects+=['src/libzzub/libzzub' + localenv.subst('$MSVSPROJECTSUFFIX') ]

install_lib(libzzub)
