# -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
VERSION='0.3~dev0'
NAME="ndn-cpp-dev"

from waflib import Build, Logs, Utils, Task, TaskGen, Configure

def options(opt):
    opt.load('compiler_c compiler_cxx gnu_dirs c_osx')
    opt.load('boost doxygen openssl cryptopp', tooldir=['waf-tools'])

    opt = opt.add_option_group('NDN-CPP Options')

    opt.add_option('--debug',action='store_true',default=False,dest='debug',help='''debugging mode''')
    opt.add_option('--test', action='store_true',default=False,dest='_test',help='''build unit tests''')
    opt.add_option('--log4cxx', action='store_true',default=False,dest='log4cxx',help='''Compile with log4cxx logging support''')
    opt.add_option('--private_storage', dest='private_storage', default='opt', help='''simple for SimplePrivatekeyStorage; osx for OSXPrivatekeyStorage; opt for optimal one based on system (default)''')
    opt.add_option('--public_storage', dest='public_storage', default='opt', help='''basic for BasicIdentityStorage; opt for optimal one based on system (default)''')
    opt.add_option('--policy_manager', dest='policy_manager', default='opt', help='''none for NoVerifyPolicyManager; opt for optimal one based on system (default)''')
    opt.add_option('--encrypt_manager', dest='encrypt_manager', default='opt', help='''basic for BasicEncryptionManager; opt for optimal one based on system (default)''')

    opt.add_option('--no-c++11', action='store_false', default=True, dest='use_cxx11',
                   help='''Do not use C++11 features, even if available in the compiler''')
    opt.add_option('--use-system-boost', action='store_true', default=False, dest='use_system_boost',
                   help='''Use system's boost libraries''')


def configure(conf):
    conf.load("compiler_c compiler_cxx boost gnu_dirs c_osx openssl cryptopp")
    try:
        conf.load("doxygen")
    except:
        pass

    if conf.options._test:
        conf.define ('_TESTS', 1)
        conf.env['TEST'] = True

    # Optional functions
    for func in ['memcmp', 'memcpy', 'memset']:
        conf.check(function_name=func, header_name='string.h', mandatory=False)

    # Mandatory functions
    for func in ['strchr', 'sscanf']:
        conf.check(function_name=func, header_name=['string.h', 'stdio.h'])

    # Mandatory headers
    for header in ['time.h', 'sys/time.h']:
        conf.check(header_name=header)

    conf.check(function_name='gettimeofday', header_name=['time.h', 'sys/time.h'])

    conf.check_openssl()

    if conf.options.debug:
        conf.define ('_DEBUG', 1)
        flags = ['-O0',
                 '-Wall',
                 '-Werror',
                 '-Wno-unused-variable',
                 '-g3',
                 '-Wno-unused-private-field', # only clang supports
                 '-fcolor-diagnostics',       # only clang supports
                 '-Qunused-arguments',        # only clang supports
                 '-Wno-tautological-compare', # suppress warnings from CryptoPP
                 '-Wno-unused-function',      # another annoying warning from CryptoPP

                 '-Wno-deprecated-declarations',
                 ]

        conf.add_supported_cxxflags (cxxflags = flags)
        conf.add_supported_cflags (cflags = flags)
    else:
        flags = ['-O3', '-g', '-Wno-tautological-compare', '-Wno-unused-function', '-Wno-deprecated-declarations']
        conf.add_supported_cxxflags (cxxflags = flags)
        conf.add_supported_cflags (cxxflags = flags)

    if Utils.unversioned_sys_platform () == "darwin":
        # if 'clang++' not in conf.env['CXX']:
        #     conf.fatal('Use clang++ compiler (CXX=clang++ ./waf configure) on OSX platform')
        #     return

        conf.check_cxx(framework_name='CoreFoundation', uselib_store='OSX_COREFOUNDATION', mandatory=True)
        # conf.check_cxx(framework_name='CoreServices', uselib_store='OSX_CORESERVICES', mandatory=True, compile_filename='test.mm')
        # conf.check_cxx(framework_name='Security',   uselib_store='OSX_SECURITY',   define_name='HAVE_SECURITY',
        #                use="OSX_COREFOUNDATION", mandatory=True, compile_filename='test.mm')

    conf.check_security_parameter()

    conf.define ("PACKAGE_BUGREPORT", "ndn-lib@lists.cs.ucla.edu")
    conf.define ("PACKAGE_NAME", NAME)
    conf.define ("PACKAGE_VERSION", VERSION)
    conf.define ("PACKAGE_URL", "https://github.com/named-data/ndn-cpp")

    conf.check_cfg(package='sqlite3', args=['--cflags', '--libs'], uselib_store='SQLITE3', mandatory=True)
    # conf.check_cfg(package='libevent', args=['--cflags', '--libs'], uselib_store='LIBEVENT', mandatory=True)
    # conf.check_cfg(package='libevent_pthreads', args=['--cflags', '--libs'], uselib_store='LIBEVENT_PTHREADS', mandatory=True)

    if conf.options.log4cxx:
        conf.check_cfg(package='liblog4cxx', args=['--cflags', '--libs'], uselib_store='LOG4CXX', mandatory=True)
        conf.define ("HAVE_LOG4CXX", 1)

    # conf.check_cryptopp(path=conf.options.cryptopp_dir)

    if conf.options.use_cxx11:
        conf.add_supported_cxxflags(cxxflags = ['-std=c++11', '-std=c++0x'])

        conf.check(msg='Checking for type std::shared_ptr',
                   type_name="std::shared_ptr<int>", header_name="memory", define_name='HAVE_STD_SHARED_PTR')
        conf.check(msg='Checking for type std::function',
                   type_name="std::function<void()>", header_name="functional", define_name='HAVE_STD_FUNCTION')
        conf.define('HAVE_CXX11', 1)
    else:
        if conf.options.use_system_boost:
            USED_BOOST_LIBS = 'system iostreams'
            if conf.env['TEST']:
                USED_BOOST_LIBS += " test"

            conf.check_boost(lib=USED_BOOST_LIBS)

            boost_version = conf.env.BOOST_VERSION.split('_')
            if int(boost_version[0]) > 1 or (int(boost_version[0]) == 1 and int(boost_version[1]) >= 46):
                conf.env['USE_SYSTEM_BOOST'] = True
                conf.define('USE_SYSTEM_BOOST', 1)

    conf.write_config_header('include/ndn-cpp/ndn-cpp-config.h', define_prefix='NDN_CPP_')

def build (bld):
    libndn_cpp = bld (
        target="ndn-cpp-dev",
        vnum = "0.3.0",
        features=['c', 'cxx', 'cxxshlib'],
        source = bld.path.ant_glob(['src/**/*.cpp',
                                    'src/**/*.c']),
        use = 'BOOST OPENSSL LOG4CXX CRYPTOPP SQLITE3',
        includes = ". include",
        )

    if Utils.unversioned_sys_platform () == "darwin":
        libndn_cpp.mac_app = True
        libndn_cpp.use += " OSX_COREFOUNDATION OSX_SECURITY"

    # Unit tests
    if bld.env['TEST']:
      unittests = bld.program (
          target="unit-tests",
          features = "cxx cxxprogram",
          defines = "WAF",
          source = bld.path.ant_glob(['test/*.cc']),
          use = 'BOOST BOOST_TEST OPENSSL LOG4CXX ndn.cxx CRYPTOPP',
          includes = ".",
          install_prefix = None,
          )

    headers = bld.path.ant_glob(['src/**/*.h'])
    bld.install_files("%s/ndn-cpp" % bld.env['INCLUDEDIR'], headers, relative_trick=True, cwd=bld.path.find_node('src'))

@Configure.conf
def add_supported_cxxflags(self, cxxflags):
    """
    Check which cxxflags are supported by compiler and add them to env.CXXFLAGS variable
    """
    self.start_msg('Checking allowed flags for c++ compiler')

    supportedFlags = []
    for flag in cxxflags:
        if self.check_cxx (cxxflags=[flag], mandatory=False):
            supportedFlags += [flag]

    self.end_msg (' '.join (supportedFlags))
    self.env.CXXFLAGS += supportedFlags

@Configure.conf
def add_supported_cflags(self, cflags):
    """
    Check which cflags are supported by compiler and add them to env.CFLAGS variable
    """
    self.start_msg('Checking allowed flags for c compiler')

    supportedFlags = []
    for flag in cflags:
        if self.check_cc (cflags=[flag], mandatory=False):
            supportedFlags += [flag]

    self.end_msg (' '.join (supportedFlags))
    self.env.CFLAGS += supportedFlags

@Configure.conf
def check_security_parameter(self):
    """
    Check the security parameters
    """
    if self.options.private_storage == 'simple':
        self.define ('USE_SIMPLE_PRIVATEKEY_STORAGE', 1)
    elif self.options.private_storage == 'osx':
        self.define ('USE_OSX_PRIVATEKEY_STORAGE', 1)
    else:
        if Utils.unversioned_sys_platform () == "darwin":
            self.define ('USE_OSX_PRIVATEKEY_STORAGE', 1)
        else:
            self.define ('USE_SIMPLE_PRIVATEKEY_STORAGE', 1)

    if self.options.public_storage == 'basic':
        self.define ('USE_BASIC_IDENTITY_STORAGE', 1)
    else:
        self.define ('USE_BASIC_IDENTITY_STORAGE', 1)

    if self.options.policy_manager == 'none':
        self.define ('USE_NO_VERIFY_POLICY_MANAGER', 1)
    else:
        self.define ('USE_SIMPLE_POLICY_MANAGER', 1)

    if self.options.encrypt_manager == 'basic':
        self.define ('USE_BASIC_ENCRYPTION_MANAGER', 1)
    else:
        self.define ('USE_BASIC_ENCRYPTION_MANAGER', 1)


# doxygen docs
from waflib.Build import BuildContext
class doxy (BuildContext):
    cmd = "doxygen"
    fun = "doxygen"

def doxygen (bld):
    if not bld.env.DOXYGEN:
        bld.fatal ("ERROR: cannot build documentation (`doxygen' is not found in $PATH)")
    bld (features="doxygen",
         doxyfile='doc/doxygen.conf')

# doxygen docs
from waflib.Build import BuildContext
class sphinx (BuildContext):
    cmd = "sphinx"
    fun = "sphinx"

def sphinx (bld):
    bld.load('sphinx_build', tooldir=['waf-tools'])

    bld (features="sphinx",
         outdir = "doc/html",
         source = "doc/source/conf.py")

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