#! /usr/bin/env python

# Copyright (C) 2009 Kevin Ollivier  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
#
# wxWebKit Python bindings build script for the waf build system

from settings import *
import Logs
import Options

include_paths = [
            os.path.join(wk_root, 'Source', 'JavaScriptCore'),
            os.path.join(wk_root, 'Source', 'JavaScriptCore', 'runtime'),
            os.path.join(wk_root, 'Source', 'WebCore', 'bindings', 'cpp'),
            os.path.join(wk_root, 'Source', 'WebCore', 'DerivedSources'),
            os.path.join(wk_root, 'Source', 'WebKit', 'wx'),
            os.path.join(wx_root, 'wxPython', 'include'),
            os.path.join(wx_root, '..', 'wxPython', 'include'),
            ]

def wxpy_swig_include():
    dirs = [
                'include/wx-2.9/wx/wxPython/i_files',
                'include/wx-2.8/wx/wxPython/i_files',
                'include/wx/wxPython/i_files',
                'wxPython/src',
                '../wxPython/src',
           ]

    for adir in dirs:
        fullpath = os.path.join(wx_root, adir)
        if os.path.exists(fullpath):
            return fullpath
            
    return ''
    
def build(bld):
    if Options.options.wxpython:
        defines = ['SWIG_TYPE_TABLE=_wxPython_table', 'WXP_USE_THREAD=1', 'SWIG_PYTHON_OUTPUT_TUPLE']
        wx_swig_args = []
        for define in defines:
            wx_swig_args.append('-D%s' % define)

        try:
            import wx.build.config
            wx_swig_args += wx.build.config.swig_args
        except:
            Logs.warn("Cannot find wxPython, wxPython extension will not be built.")
            return
    
        wxpy_include = wxpy_swig_include()
        if os.path.exists(wxpy_include):
            include_paths.append(wxpy_include)
        else:
            Logs.warn("Cannot find location of wxPython .i files, wxPython extension will not be built.")
            return
    
        for inc_path in include_paths:
            wx_swig_args.append('-I' + inc_path)

        obj = bld.new_task_gen(
            features = 'cxx cshlib pyext',
            includes = ' '.join(include_paths),
            source = 'webview.i',
            swig_flags = ' '.join(wx_swig_args),
            defines = defines,
            target = '_webview',
            uselib = 'WX CURL ICU XSLT XML SQLITE3 ' + get_config(),
            
            libpath = [output_dir],
            uselib_local = 'wxwebkit',
            install_path = output_dir
            )
