# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
VERSION='1.0'
APPNAME='ndnx-control-center'

from waflib import Logs, Utils, Task, TaskGen

def options(opt):
    opt.load('compiler_c compiler_cxx qt4 gnu_dirs')
    opt.load('sparkle xcode', tooldir='waf-tools')

    grp = opt.add_option_group ('NDNx Control Center options')
    grp.add_option ('--ndnx', help='''Root path to NDNx installation (default: /usr/local/ndn)''',
                    dest='ndnx_root', type=str, default='/usr/local/ndn')

    if Utils.unversioned_sys_platform () == "darwin":
        grp.add_option ('--qt4', help='''Build QT4 app, instead of native one''',
                        action='store_true', dest='build_qt', default=False)

    
def configure(conf):
    conf.load('compiler_c compiler_cxx')

    conf.start_msg('Checking for NDNx in %s' % conf.options.ndnx_root)
    if not conf.find_file('ndnd ndndstatus ndndstart ndndstop', path_list='%s/bin' % conf.options.ndnx_root, mandatory=False):
        conf.fatal ('not found', 'RED')
    else:
        conf.end_msg ('ok')

    conf.define('NDNX_ROOT', conf.options.ndnx_root)
    conf.define('NDND_STATUS_COMMAND', '%s/bin/ndndsmoketest' % conf.options.ndnx_root)
    conf.define('NDND_FIB_COMMAND',  '%s/bin/ndndc' % conf.options.ndnx_root)
    conf.define('NDND_AUTOCONFIG_COMMAND', '%s/bin/ndnd-autoconfig' % conf.options.ndnx_root)
    
    if Utils.unversioned_sys_platform () == "darwin" and not conf.options.build_qt:
        conf.define('NDND_START_COMMAND', '%s/bin/ndndstart' % conf.options.ndnx_root)
        conf.define('NDND_STOP_COMMAND', '%s/bin/ndndstop' % conf.options.ndnx_root)

        conf.env.BUILD_OSX_NATIVE = 1
        
        conf.find_program('ibtool', var='IBTOOL', mandatory=False)

        conf.check_cxx(framework_name='Foundation', uselib_store='FOUNDATION', compile_filename='test.mm')
        conf.check_cxx(framework_name='AppKit',     uselib_store='APPKIT',     compile_filename='test.mm')
        conf.check_cxx(framework_name='Cocoa',      uselib_store='COCOA',      compile_filename='test.mm')

        conf.env.ARCH_OSX = 'x86_64'
        conf.env.CXXFLAGS_OSX += ['-fobjc-arc', '-mmacosx-version-min=10.7']
        conf.env.LINKFLAGS_OSX += ['-mmacosx-version-min=10.7']        
        conf.env.MACOSX_DEPLOYMENT_TARGET = '10.7'
        
        conf.load('sparkle')
    else:
        conf.load('qt4')
        conf.load('gnu_dirs')
        conf.find_program('xsltproc', mandatory=True)
        conf.define('XSLTPROC', conf.env['XSLTPROC'])

        conf.define('RESOURCES_DIR', Utils.subst_vars("${DATAROOTDIR}/ndnx-control-center", conf.env))
        
        if Utils.unversioned_sys_platform () == "darwin":
            conf.define('OSX_BUILD', 1)
        
    conf.write_config_header('config.h')

def build (bld):
    if bld.env.BUILD_OSX_NATIVE:
        bld (
            target = "NDNx Control Center",
            features=['cxxprogram', 'cxx'],
            includes = ". osx",
            source = bld.path.ant_glob (['osx/**/*.mm', 'osx/MainMenu.xib']),
            
            mac_app = True,
            use = "OSX COCOA FOUNDATION APPKIT SPARKLE",

            mac_plist = 'osx/Info.plist',
            mac_resources = [i.path_from(bld.path) for i in bld.path.ant_glob ('osx/Resources/**/*')],
            mac_frameworks = "osx/Frameworks/Sparkle.framework",
            )
    else:
        bld (features = "subst",
             source = bld.path.ant_glob(['linux/**/*.in']),
             target = [node.change_ext('', '.in') for node in bld.path.ant_glob(['linux/**/*.in'])],
             BINARY = "NDNx Control Center",
             install_path = "${DATAROOTDIR}/ndnx-control-center"
            )
        bld.install_files("${DATAROOTDIR}/ndnx-control-center",
                          bld.path.ant_glob(['linux/Resources/*']))

        bld (
            target = "NDNx Control Center",
            features=['qt4', 'cxxprogram', 'cxx'],
            includes = ". linux",

            use = "QTCORE QTGUI QTXML QTXMLPATTERNS QTDBUS",
            
            defines = "WAF",
            source = bld.path.ant_glob (['linux/**/*.cpp', 'linux/**/*.ui', 'linux/**/*.qrc']),
            )

        
from waflib import TaskGen
@TaskGen.extension('.mm')
def m_hook(self, node):
    """Alias .mm files to be compiled the same as .cc files, gcc/clang will do the right thing."""
    return self.create_compiled_task('cxx', node)

@TaskGen.extension('.m')
def m_hook(self, node):
    """Alias .m files to be compiled the same as .c files, gcc/clang will do the right thing."""
    return self.create_compiled_task('c', node)


def bundle_name_for_output(name):
	k = name.rfind('.')
	if k >= 0:
		name = name[:k] + '.app'
	else:
		name = name + '.app'
	return name

@TaskGen.extension('.xib')
def xib(self,node):
    out = node.change_ext ('.nib')

    name = self.path.get_bld ().find_or_declare (bundle_name_for_output(self.target))
    resources = name.find_or_declare(['Contents', 'Resources'])
    resources.mkdir()
    real_out = resources.make_node (out.name)

    self.create_task('xib', node, real_out)
    inst_to = getattr(self, 'install_path', '/Applications') + '/%s/Contents/Resources' % name
    self.bld.install_as (inst_to + '/%s' % real_out.name, real_out)
        
class xib(Task.Task):
    color='PINK'
    run_str = '${IBTOOL} --errors --warnings --notices --output-format human-readable-text  --compile ${TGT} ${SRC}'
