#!/usr/bin/env python
from waflib.extras import autowaf as autowaf
from waflib import TaskGen
import os
import sys

# Version of this package (even if built as a child)
MAJOR = '4'
MINOR = '1'
MICRO = '0'
LIBPBD_VERSION = "%s.%s.%s" % (MAJOR, MINOR, MICRO)

# Library version (UNIX style major, minor, micro)
# major increment <=> incompatible changes
# minor increment <=> compatible changes (additions)
# micro increment <=> no interface changes
LIBPBD_LIB_VERSION = '4.1.0'

# Variables for 'waf dist'
APPNAME = 'libpbd'
VERSION = LIBPBD_VERSION
I18N_PACKAGE = 'libpbd4'

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

path_prefix = 'libs/pbd/'

def options(opt):
    autowaf.set_options(opt)

def configure(conf):
    conf.load('compiler_cxx')
    autowaf.build_version_files(path_prefix+'pbd/version.h', path_prefix+'version.cc',
                    'libpbd', MAJOR, MINOR, MICRO)
    autowaf.configure(conf)
    autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML')
    autowaf.check_pkg(conf, 'sigc++-2.0', uselib_store='SIGCPP', atleast_version='2.0')
    if sys.platform != 'darwin':
        autowaf.check_pkg(conf, 'uuid', uselib_store='UUID')

    conf.check(function_name='getmntent', header_name='mntent.h', define_name='HAVE_GETMNTENT',mandatory=False)
    conf.check(header_name='execinfo.h', define_name='HAVE_EXECINFO',mandatory=False)
    conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False)
    conf.check_cc(function_name='posix_memalign', header_name='stdlib.h', cflags='-D_XOPEN_SOURCE=600', define_name='HAVE_POSIX_MEMALIGN', mandatory=False)

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

    # Boost headers
    autowaf.check_header(conf, 'cxx', 'boost/shared_ptr.hpp')
    autowaf.check_header(conf, 'cxx', 'boost/weak_ptr.hpp')
    # autowaf.check_header(conf, 'cxx', 'boost/uuid/uuid.hpp')

def build(bld):
    
    # Make signals_generated.h using signals.py
    bld(rule = 'python ${SRC} ${TGT}', source = 'pbd/signals.py', target = 'pbd/signals_generated.h')

    # Library
    obj = bld(features = 'cxx cxxshlib')
    obj.source = '''
            basename.cc
            base_ui.cc
            boost_debug.cc
            cartesian.cc
            command.cc
            convert.cc
            controllable.cc
            controllable_descriptor.cc
            clear_dir.cc
            crossthread.cc
            cpus.cc
            debug.cc
            enumwriter.cc
            event_loop.cc
            dmalloc.cc
            enums.cc
            epa.cc
            error.cc
            file_manager.cc
            file_utils.cc
            fpu.cc
            id.cc
            locale_guard.cc
            malign.cc
            mountpoint.cc
            openuri.cc
            pathscanner.cc
            pool.cc
            property_list.cc
            pthread_utils.cc
            receiver.cc
            search_path.cc
            semutils.cc
            shortpath.cc
            signals.cc
            sndfile_manager.cc
            stacktrace.cc
            stateful_diff_command.cc
            stateful.cc
            strreplace.cc
            strsplit.cc
            textreceiver.cc
            transmitter.cc
            undo.cc
            uuid.cc
            version.cc
            whitespace.cc
            xml++.cc
    '''

    if bld.is_defined('DEBUG_RT_ALLOC'):
        obj.source += 'debug_rt_alloc.c'

    obj.export_includes = ['.']
    obj.includes     = ['.']
    obj.name         = 'libpbd'
    obj.target       = 'pbd'
    obj.uselib       = 'GLIBMM SIGCPP XML UUID SNDFILE GIOMM'
    if sys.platform == 'darwin':
        TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cc']
        obj.source += 'cocoa_open_uri.mm'
        obj.uselib += ' OSX'
    obj.vnum         = LIBPBD_LIB_VERSION
    obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
    obj.defines     = ['PACKAGE="' + I18N_PACKAGE + '"']

    if bld.env['build_target'] == 'x86_64':
        obj.defines += [ 'USE_X86_64_ASM' ]

    if bld.env['BUILD_TESTS'] and bld.is_defined('HAVE_CPPUNIT'):
        # Unit tests
        testobj              = bld(features = 'cxx cxxprogram')
        testobj.source       = '''
                test/testrunner.cc
                test/xpath.cc
                test/scalar_properties.cc
                test/signals_test.cc
                test/convert_test.cc
                test/filesystem_test.cc
        '''.split()
        testobj.target       = 'run-tests'
        testobj.includes     = obj.includes + ['test', '../pbd']
        testobj.uselib       = 'CPPUNIT XML SNDFILE'
        testobj.use          = 'libpbd'
        testobj.name         = 'libpbd-tests'
        if sys.platform != 'darwin':
            testobj.linkflags    = ['-lrt']


def shutdown():
    autowaf.shutdown()
