Rubberstamped by Eric Seidel.
authorkevino@webkit.org <kevino@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Apr 2011 01:08:59 +0000 (01:08 +0000)
committerkevino@webkit.org <kevino@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Apr 2011 01:08:59 +0000 (01:08 +0000)
Enable waf to be used to build other ports
https://bugs.webkit.org/show_bug.cgi?id=58213

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@84994 268f45cc-cd09-0410-ab3c-d52691b4dbfc

ChangeLog
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wscript
Tools/ChangeLog
Tools/Scripts/build-webkit
Tools/Scripts/webkitdirs.pm
Tools/waf/build/build_utils.py [new file with mode: 0644]
Tools/waf/build/settings.py [new file with mode: 0644]
Tools/waf/build/waf_extensions.py [new file with mode: 0644]
Tools/waf/build/wxpresets.py [new file with mode: 0644]
wscript

index 24ceb0d..9364bc4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2011-04-26  Kevin Ollivier  <kevino@theolliviers.com>
+
+        Rubberstamped by Eric Seidel.
+
+        Enable waf to be used to build other ports
+        https://bugs.webkit.org/show_bug.cgi?id=58213
+
+        * wscript:
+
 2011-04-22  Sheriff Bot  <webkit.review.bot@gmail.com>
 
         Unreviewed, rolling out r84627.
index 9203ccd..73569c8 100644 (file)
@@ -1,3 +1,12 @@
+2011-04-26  Kevin Ollivier  <kevino@theolliviers.com>
+
+        Rubberstamped by Eric Seidel.
+
+        Enable waf to be used to build other ports
+        https://bugs.webkit.org/show_bug.cgi?id=58213
+
+        * wscript:
+
 2011-04-26  Sam Weinig  <sam@webkit.org>
 
         Reviewed by David Hyatt.
index 88d3b68..3df3ded 100644 (file)
@@ -29,25 +29,26 @@ import commands
 
 from settings import *
 
-jscore_excludes = ['jsc.cpp', 'ProfilerServer.mm', 'ExecutableAllocatorPosix.cpp']
-jscore_excludes.extend(get_excludes(jscore_dir, ['*Brew.cpp', '*CF.cpp', '*Symbian.cpp']))
+def build(bld):
 
-sources = []
+    import Options
 
-jscore_excludes.extend(get_excludes(jscore_dir, ['*None.cpp']))
+    jscore_excludes = ['jsc.cpp', 'ProfilerServer.mm', 'ExecutableAllocatorPosix.cpp']
+    jscore_excludes.extend(get_excludes(jscore_dir, ['*Brew.cpp', '*CF.cpp', '*Symbian.cpp']))
 
-if build_port == "wx":
-    if building_on_win32:
-        jscore_excludes += ['MarkStackPosix.cpp', 'OSAllocatorPosix.cpp', 'ThreadingPthreads.cpp']
-        sources += ['heap/MarkStackWin.cpp']
-    else:
-        jscore_excludes.append('JSStringRefBSTR.cpp')
-        jscore_excludes.extend(get_excludes(jscore_dir, ['*Win.cpp']))
-    
-def build(bld):
-    import Options
+    jscore_excludes.extend(get_excludes(jscore_dir, ['*None.cpp']))
+
+    sources = []
+
+    if Options.options.port == "wx":
+        if building_on_win32:
+            jscore_excludes += ['MarkStackPosix.cpp', 'OSAllocatorPosix.cpp', 'ThreadingPthreads.cpp']
+            sources += ['heap/MarkStackWin.cpp']
+        else:
+            jscore_excludes.append('JSStringRefBSTR.cpp')
+            jscore_excludes.extend(get_excludes(jscore_dir, ['*Win.cpp']))
 
-    full_dirs = get_dirs_for_features(jscore_dir, features=[build_port], dirs=jscore_dirs)
+    full_dirs = get_dirs_for_features(jscore_dir, features=[Options.options.port.lower()], dirs=jscore_dirs)
 
     includes = common_includes + full_dirs
     if sys.platform.startswith('darwin'):
index b8f86a0..a2ca7d2 100644 (file)
@@ -1,3 +1,19 @@
+2011-04-26  Kevin Ollivier  <kevino@theolliviers.com>
+
+        Rubberstamped by Eric Seidel.
+
+        Enable waf to be used to build other ports
+        https://bugs.webkit.org/show_bug.cgi?id=58213
+
+        * Scripts/build-webkit:
+        * Scripts/webkitdirs.pm:
+        * waf: Added.
+        * waf/build: Added.
+        * waf/build/build_utils.py: Added.
+        * waf/build/settings.py: Added.
+        * waf/build/waf_extensions.py: Added.
+        * waf/build/wxpresets.py: Added.
+
 2011-04-26  Sam Weinig  <sam@webkit.org>
 
         Reviewed by David Hyatt.
index 58d15a8..fcbff21 100755 (executable)
@@ -542,6 +542,8 @@ if (isInspectorFrontend()) {
 }
 
 if (isWx()) {
+    $makeArgs .= " --port=wx";
+
     downloadWafIfNeeded();
     @options = split(/ /, $makeArgs);
     @projects = ();
index 64d3404..b9b828d 100644 (file)
@@ -1317,7 +1317,7 @@ sub buildVisualStudioProject
 sub downloadWafIfNeeded
 {
     # get / update waf if needed
-    my $waf = "$sourceDir/Tools/wx/waf";
+    my $waf = "$sourceDir/Tools/waf/waf";
     my $wafURL = 'http://wxwebkit.kosoftworks.com/downloads/deps/waf';
     if (!-f $waf) {
         my $result = system "curl -o $waf $wafURL";
@@ -1335,7 +1335,7 @@ sub buildWafProject
         $pythonPath = '';
     }
     my $sourceDir = sourceDir();
-    my $newPythonPath = "$sourceDir/Tools/wx/build:$pythonPath";
+    my $newPythonPath = "$sourceDir/Tools/waf/build:$pythonPath";
     if (isCygwin()) {
         $newPythonPath = `cygpath --mixed --path $newPythonPath`;
     }
@@ -1343,7 +1343,7 @@ sub buildWafProject
     
     print "Building $project\n";
 
-    my $wafCommand = "$sourceDir/Tools/wx/waf";
+    my $wafCommand = "$sourceDir/Tools/waf/waf";
     if ($ENV{'WXWEBKIT_WAF'}) {
         $wafCommand = $ENV{'WXWEBKIT_WAF'};
     }
diff --git a/Tools/waf/build/build_utils.py b/Tools/waf/build/build_utils.py
new file mode 100644 (file)
index 0000000..aa606b7
--- /dev/null
@@ -0,0 +1,208 @@
+# 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.
+#
+# Helper functions for the WebKit build.
+
+import commands
+import glob
+import os
+import platform
+import re
+import shutil
+import sys
+import urllib
+import urlparse
+
+
+def get_output(command):
+    """
+    Windows-compatible function for getting output from a command.
+    """
+    if sys.platform.startswith('win'):
+        f = os.popen(command)
+        return f.read().strip()
+    else:
+        return commands.getoutput(command)
+
+
+def get_excludes(root, patterns):
+    """
+    Get a list of exclude patterns going down several dirs.
+    TODO: Make this fully recursive.
+    """
+    excludes = []
+
+    for pattern in patterns:
+        subdir_pattern = os.sep + '*'
+        for subdir in [subdir_pattern, subdir_pattern * 2, subdir_pattern * 3]:
+            adir = root + subdir + os.sep + pattern
+            files = glob.glob(adir)
+            for afile in files:
+                excludes.append(os.path.basename(afile))
+
+    return excludes
+
+
+def get_dirs_for_features(root, features, dirs):
+    """
+    Find which directories to include in the list of build dirs based upon the
+    enabled port(s) and features.
+    """
+    outdirs = dirs
+    for adir in dirs:
+        for feature in features:
+            relpath = os.path.join(adir, feature)
+            featuredir = os.path.join(root, relpath)
+            if os.path.exists(featuredir) and not relpath in outdirs:
+                outdirs.append(relpath)
+
+    return outdirs
+
+
+def download_if_newer(url, destdir):
+    """
+    Checks if the file on the server is newer than the one in the user's tree,
+    and if so, downloads it.
+
+    Returns the filename of the downloaded file if downloaded, or None if
+    the existing file matches the one on the server.
+    """
+    obj = urlparse.urlparse(url)
+    filename = os.path.basename(obj.path)
+    destfile = os.path.join(destdir, filename)
+
+    urlobj = urllib.urlopen(url)
+    size = long(urlobj.info().getheader('Content-Length'))
+
+    def download_callback(downloaded, block_size, total_size):
+        downloaded = block_size * downloaded
+        if downloaded > total_size:
+            downloaded = total_size
+        sys.stdout.write('%s %d of %d bytes downloaded\r' % (filename, downloaded, total_size))
+
+    # NB: We don't check modified time as Python doesn't yet handle timezone conversion
+    # properly when converting strings to time objects.
+    if not os.path.exists(destfile) or os.path.getsize(destfile) != size:
+        urllib.urlretrieve(url, destfile, download_callback)
+        print ''
+        return destfile
+
+    return None
+
+
+def update_wx_deps(conf, wk_root, msvc_version='msvc2008'):
+    """
+    Download and update tools needed to build the wx port.
+    """
+    import Logs
+    Logs.info('Ensuring wxWebKit dependencies are up-to-date.')
+
+    wklibs_dir = os.path.join(wk_root, 'WebKitLibraries')
+    waf = download_if_newer('http://wxwebkit.wxcommunity.com/downloads/deps/waf', os.path.join(wk_root, 'Tools', 'wx'))
+    if waf:
+        # TODO: Make the build restart itself after an update.
+        Logs.warn('Build system updated, please restart build.')
+        sys.exit(1)
+
+    # since this module is still experimental
+    wxpy_dir = os.path.join(wk_root, 'Source', 'WebKit', 'wx', 'bindings', 'python')
+    swig_module = download_if_newer('http://wxwebkit.wxcommunity.com/downloads/deps/swig.py.txt', wxpy_dir)
+    if swig_module:
+        shutil.copy(os.path.join(wxpy_dir, 'swig.py.txt'), os.path.join(wxpy_dir, 'swig.py'))
+
+    if sys.platform.startswith('win'):
+        Logs.info('downloading deps package')
+        archive = download_if_newer('http://wxwebkit.wxcommunity.com/downloads/deps/wxWebKitDeps-%s.zip' % msvc_version, wklibs_dir)
+        if archive and os.path.exists(archive):
+            os.system('unzip -o %s -d %s' % (archive, os.path.join(wklibs_dir, msvc_version)))
+
+    elif sys.platform.startswith('darwin'):
+        # export the right compiler for building the dependencies
+        if platform.release().startswith('10'):  # Snow Leopard
+            os.environ['CC'] = conf.env['CC'][0]
+            os.environ['CXX'] = conf.env['CXX'][0]
+        os.system('%s/Tools/wx/install-unix-extras' % wk_root)
+
+
+def includeDirsForSources(sources):
+    include_dirs = []
+    for group in sources:
+        for source in group:
+            dirname = os.path.dirname(source)
+            if not dirname in include_dirs:
+                include_dirs.append(dirname)
+
+    return include_dirs
+
+
+def flattenSources(sources):
+    flat_sources = []
+    for group in sources:
+        flat_sources.extend(group)
+
+    return flat_sources
+
+
+def git_branch_name():
+    try:
+        branches = commands.getoutput("git branch --no-color")
+        match = re.search('^\* (.*)', branches, re.MULTILINE)
+        if match:
+            return ".%s" % match.group(1)
+    except:
+        pass
+
+    return ""
+
+
+def get_config(wk_root):
+    config_file = os.path.join(wk_root, 'WebKitBuild', 'Configuration')
+    config = 'Debug'
+
+    if os.path.exists(config_file):
+        config = open(config_file).read()
+
+    return config
+
+
+def get_arch(wk_root):
+    arch_file = os.path.join(wk_root, 'WebKitBuild', 'Architecture')
+    arch = 'x86_64'
+
+    if os.path.exists(arch_file):
+        arch = open(arch_file).read()
+
+    return arch
+
+
+def svn_revision():
+    if os.system("git-svn info") == 0:
+        info = commands.getoutput("git-svn info ../..")
+    else:
+        info = commands.getoutput("svn info")
+
+    for line in info.split("\n"):
+        if line.startswith("Revision: "):
+            return line.replace("Revision: ", "").strip()
+
+    return ""
diff --git a/Tools/waf/build/settings.py b/Tools/waf/build/settings.py
new file mode 100644 (file)
index 0000000..bf84b76
--- /dev/null
@@ -0,0 +1,429 @@
+# 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.
+#
+# Common elements of the waf build system shared by all projects.
+
+import commands
+import os
+import platform
+import re
+import sys
+
+import Options
+
+from build_utils import *
+from waf_extensions import *
+
+# to be moved to wx when it supports more configs
+from wxpresets import *
+
+wk_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../..'))
+
+if sys.platform.startswith('win'):
+    if not 'WXWIN' in os.environ:
+        print "Please set WXWIN to the directory containing wxWidgets."
+        sys.exit(1)
+
+    wx_root = os.environ['WXWIN']
+else:
+    wx_root = commands.getoutput('wx-config --prefix')
+
+jscore_dir = os.path.join(wk_root, 'Source', 'JavaScriptCore')
+webcore_dir = os.path.join(wk_root, 'Source', 'WebCore')
+wklibs_dir = os.path.join(wk_root, 'WebKitLibraries')
+
+common_defines = []
+common_cxxflags = []
+common_includes = []
+common_libs = []
+common_libpaths = []
+common_frameworks = []
+
+ports = [
+    'Brew',
+    'Chromium',
+    'Gtk',
+    'Haiku',
+    'Mac',
+    'None',
+    'Qt',
+    'Safari',
+    'Win',
+    'Wince',
+    'wx',
+]
+
+port_uses = {
+    'wx': ['CURL', 'WXGC'],
+}
+
+jscore_dirs = [
+    'API',
+    'bytecode',
+    'bytecompiler',
+    'debugger',
+    'DerivedSources',
+    'heap',
+    'interpreter',
+    'jit',
+    'parser',
+    'profiler',
+    'runtime',
+    'wtf',
+    'wtf/text',
+    'wtf/unicode',
+    'wtf/unicode/icu',
+    'yarr',
+]
+
+webcore_dirs_common = [
+    'Source/WebCore/accessibility',
+    'Source/WebCore/bindings',
+    'Source/WebCore/bindings/cpp',
+    'Source/WebCore/bindings/generic',
+    'Source/WebCore/bindings/js',
+    'Source/WebCore/bridge',
+    'Source/WebCore/bridge/c',
+    'Source/WebCore/bridge/jsc',
+    'Source/WebCore/css',
+    'Source/WebCore/DerivedSources',
+    'Source/WebCore/dom',
+    'Source/WebCore/dom/default',
+    'Source/WebCore/editing',
+    'Source/WebCore/fileapi',
+    'Source/WebCore/history',
+    'Source/WebCore/html',
+    'Source/WebCore/html/canvas',
+    'Source/WebCore/html/parser',
+    'Source/WebCore/html/shadow',
+    'Source/WebCore/inspector',
+    'Source/WebCore/loader',
+    'Source/WebCore/loader/appcache',
+    'Source/WebCore/loader/archive',
+    'Source/WebCore/loader/cache',
+    'Source/WebCore/loader/icon',
+    'Source/WebCore/notifications',
+    'Source/WebCore/page',
+    'Source/WebCore/page/animation',
+    'Source/WebCore/platform',
+    'Source/WebCore/platform/animation',
+    'Source/WebCore/platform/graphics',
+    'Source/WebCore/platform/graphics/filters',
+    'Source/WebCore/platform/graphics/transforms',
+    'Source/WebCore/platform/image-decoders',
+    'Source/WebCore/platform/image-decoders/bmp',
+    'Source/WebCore/platform/image-decoders/gif',
+    'Source/WebCore/platform/image-decoders/ico',
+    'Source/WebCore/platform/image-decoders/jpeg',
+    'Source/WebCore/platform/image-decoders/png',
+    'Source/WebCore/platform/image-decoders/webp',
+    'Source/WebCore/platform/mock',
+    'Source/WebCore/platform/network',
+    'Source/WebCore/platform/sql',
+    'Source/WebCore/platform/text',
+    'Source/WebCore/platform/text/transcoder',
+    'Source/WebCore/plugins',
+    'Source/WebCore/rendering',
+    'Source/WebCore/rendering/style',
+    'Source/WebCore/rendering/svg',
+    'Source/WebCore/storage',
+    'Source/WebCore/svg',
+    'Source/WebCore/svg/animation',
+    'Source/WebCore/svg/graphics',
+    'Source/WebCore/svg/graphics/filters',
+    'Source/WebCore/svg/properties',
+    'Source/WebCore/websockets',
+    'Source/WebCore/xml',
+]
+
+config = get_config(wk_root)
+arch = get_arch(wk_root)
+config_dir = config + git_branch_name()
+
+output_dir = os.path.join(wk_root, 'WebKitBuild', config_dir)
+
+building_on_win32 = sys.platform.startswith('win')
+
+default_port = 'Mac'
+if building_on_win32:
+    deafult_port = "Win"
+
+build_port = default_port
+
+
+def get_config():
+    waf_configname = config.upper().strip()
+    if building_on_win32:
+        isReleaseCRT = (config == 'Release')
+        if build_port == 'wx':
+            if Options.options.wxpython:
+                isReleaseCRT = True
+
+        if isReleaseCRT:
+            waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL'
+        else:
+            waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL_DBG'
+
+    return waf_configname
+
+create_hash_table = wk_root + "/Source/JavaScriptCore/create_hash_table"
+if building_on_win32:
+    create_hash_table = get_output('cygpath --unix "%s"' % create_hash_table)
+os.environ['CREATE_HASH_TABLE'] = create_hash_table
+
+feature_defines = []
+
+msvc_version = 'msvc2008'
+
+msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
+
+
+def get_path_to_wxconfig():
+    if 'WX_CONFIG' in os.environ:
+        return os.environ['WX_CONFIG']
+    else:
+        return 'wx-config'
+
+
+def common_set_options(opt):
+    """
+    Initialize common options provided to the user.
+    """
+    opt.tool_options('compiler_cxx')
+    opt.tool_options('compiler_cc')
+    opt.tool_options('python')
+
+    opt.add_option('--port', action='store', default=default_port, help='Which WebKit port to build.')
+    opt.add_option('--wxpython', action='store_true', default=False, help='Create the wxPython bindings.')
+    opt.add_option('--wx-compiler-prefix', action='store', default='vc',
+                   help='Specify a different compiler prefix (do this if you used COMPILER_PREFIX when building wx itself)')
+    opt.add_option('--macosx-version', action='store', default='', help="Version of OS X to build for.")
+    opt.add_option('--msvc-version', action='store', default='', help="MSVC version to use to build. Use 8 for 2005, 9 for 2008")
+
+
+def common_configure(conf):
+    """
+    Configuration used by all targets, called from the target's configure() step.
+    """
+
+    conf.env['MSVC_TARGETS'] = ['x86']
+
+    build_port = Options.options.port
+
+    feature_defines = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER',
+                    'ENABLE_SVG', 'ENABLE_SVG_USE', 'ENABLE_FILTERS', 'ENABLE_SVG_FONTS',
+                    'ENABLE_SVG_ANIMATION', 'ENABLE_SVG_AS_IMAGE', 'ENABLE_SVG_FOREIGN_OBJECT',
+                    'ENABLE_JIT', 'ENABLE_DOM_STORAGE', 'BUILDING_%s' % build_port.upper()]
+
+    conf.env["FEATURE_DEFINES"] = ' '.join(feature_defines)
+
+    if Options.options.msvc_version and Options.options.msvc_version != '':
+        print "msvc version = %s" % Options.options.msvc_version
+        conf.env['MSVC_VERSIONS'] = ['msvc %s.0' % Options.options.msvc_version]
+    else:
+        print "msvc not set!"
+        conf.env['MSVC_VERSIONS'] = ['msvc 9.0', 'msvc 8.0']
+
+    if sys.platform.startswith('cygwin'):
+        print "ERROR: You must use the Win32 Python from python.org, not Cygwin Python, when building on Windows."
+        sys.exit(1)
+
+    conf.check_tool('compiler_cxx')
+    conf.check_tool('compiler_cc')
+
+    if sys.platform.startswith('darwin'):
+        conf.check_tool('osx')
+
+    global msvc_version
+    global msvclibs_dir
+
+    libprefix = ''
+
+    if building_on_win32:
+        libprefix = 'lib'
+
+        found = conf.get_msvc_versions()
+        found_versions = []
+        for version in found:
+            found_versions.append(version[0])
+
+        if 'msvc 9.0' in conf.env['MSVC_VERSIONS'] and 'msvc 9.0' in found_versions:
+            msvc_version = 'msvc2008'
+        elif 'msvc 8.0' in conf.env['MSVC_VERSIONS'] and 'msvc 8.0' in found_versions:
+            msvc_version = 'msvc2005'
+
+        msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win')
+
+        # Disable several warnings which occur many times during the build.
+        # Some of them are harmless (4099, 4344, 4396, 4800) and working around
+        # them in WebKit code is probably just not worth it. We can simply do
+        # nothing about the others (4503). A couple are possibly valid but
+        # there are just too many of them in the code so fixing them is
+        # impossible in practice and just results in tons of distracting output
+        # (4244, 4291). Finally 4996 is actively harmful as it is given for
+        # just about any use of standard C/C++ library facilities.
+        conf.env.append_value('CXXFLAGS', [
+            '/wd4099',  # type name first seen using 'struct' now seen using 'class'
+            '/wd4244',  # conversion from 'xxx' to 'yyy', possible loss of data:
+            '/wd4291',  # no matching operator delete found (for placement new)
+            '/wd4344',  # behaviour change in template deduction
+            '/wd4396',  # inline can't be used in friend declaration
+            '/wd4503',  # decorated name length exceeded, name was truncated
+            '/wd4800',  # forcing value to bool 'true' or 'false'
+            '/wd4996',  # deprecated function
+        ])
+
+        # This one also occurs in C code, so disable it there as well.
+        conf.env.append_value('CCFLAGS', ['/wd4996'])
+
+    if build_port == "wx":
+        update_wx_deps(conf, wk_root, msvc_version)
+
+        conf.env.append_value('CXXDEFINES', ['BUILDING_WX__=1', 'JS_NO_EXPORT'])
+
+        if building_on_win32:
+            conf.env.append_value('LIBPATH', os.path.join(msvclibs_dir, 'lib'))
+            # wx settings
+            global config
+            is_debug = (config == 'Debug')
+            wxdefines, wxincludes, wxlibs, wxlibpaths = get_wxmsw_settings(wx_root, shared=True, unicode=True, debug=is_debug, wxPython=Options.options.wxpython)
+            conf.env['CXXDEFINES_WX'] = wxdefines
+            conf.env['CPPPATH_WX'] = wxincludes
+            conf.env['LIB_WX'] = wxlibs
+            conf.env['LIBPATH_WX'] = wxlibpaths
+        else:
+            conf.check_cfg(path=get_path_to_wxconfig(), args='--cxxflags --libs', package='', uselib_store='WX', mandatory=True)
+
+    if sys.platform.startswith('darwin'):
+        conf.env['LIB_ICU'] = ['icucore']
+
+        conf.env.append_value('CPPPATH', wklibs_dir)
+        conf.env.append_value('LIBPATH', wklibs_dir)
+
+        min_version = None
+
+        mac_target = 'MACOSX_DEPLOYMENT_TARGET'
+        if Options.options.macosx_version != '':
+            min_version = Options.options.macosx_version
+
+        # WebKit only supports 10.4+, but ppc systems often set this to earlier systems
+        if not min_version:
+            min_version = commands.getoutput('sw_vers -productVersion')[:4]
+            if min_version in ['10.1', '10.2', '10.3']:
+                min_version = '10.4'
+
+        sdk_version = min_version
+        if min_version == "10.4":
+            sdk_version += "u"
+            conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceTiger'])
+        else:
+            # NOTE: There is a WebKitSystemInterfaceSnowLeopard, but when we use that
+            # on 10.6, we get a strange missing symbol error, and this library seems to
+            # work fine for wx's purposes.
+            conf.env.append_value('LIB_WKINTERFACE', ['WebKitSystemInterfaceLeopard'])
+
+        # match WebKit Mac's default here unless we're building on platforms that won't support 64-bit.
+        global arch
+        is_cocoa = "__WXOSX_COCOA__" in conf.env["CXXDEFINES_WX"]
+        if min_version == "10.4" or not is_cocoa:
+            arch = "i386"
+
+        sdkroot = '/Developer/SDKs/MacOSX%s.sdk' % sdk_version
+        sdkflags = ['-arch', arch, '-isysroot', sdkroot]
+
+        conf.env.append_value('CPPFLAGS', sdkflags)
+        conf.env.append_value('LINKFLAGS', sdkflags)
+
+        conf.env.append_value('LINKFLAGS', ['-framework', 'Security'])
+
+        conf.env.append_value('CPPPATH_SQLITE3', [os.path.join(wklibs_dir, 'WebCoreSQLite3')])
+        conf.env.append_value('LIB_SQLITE3', ['WebCoreSQLite3'])
+
+    # NOTE: The order here is important, because python sets the MACOSX_DEPLOYMENT_TARGET to
+    # 10.3 even on intel. So we must first set the SDK and arch flags, then load Python's config,
+    # and finally override the value Python set for MACOSX_DEPLOYMENT_TARGET
+    if Options.options.wxpython:
+        conf.check_tool('python')
+        conf.check_python_headers()
+
+    if sys.platform.startswith('darwin'):
+        os.environ[mac_target] = conf.env[mac_target] = min_version
+
+    conf.env.append_value('CXXDEFINES', feature_defines)
+    if config == 'Release':
+        conf.env.append_value('CPPDEFINES', 'NDEBUG')
+
+    if building_on_win32:
+        conf.env.append_value('CPPPATH', [
+            os.path.join(jscore_dir, 'os-win32'),
+            os.path.join(msvclibs_dir, 'include'),
+            os.path.join(msvclibs_dir, 'include', 'pthreads'),
+            os.path.join(msvclibs_dir, 'lib'),
+            ])
+
+        conf.env.append_value('LIB', ['libpng', 'libjpeg', 'pthreadVC2'])
+        # common win libs
+        conf.env.append_value('LIB', [
+            'kernel32', 'user32', 'gdi32', 'comdlg32', 'winspool', 'winmm',
+            'shell32', 'shlwapi', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32',
+            'wsock32', 'gdiplus', 'usp10', 'version'])
+
+        conf.env['LIB_ICU'] = ['icudt', 'icule', 'iculx', 'icuuc', 'icuin', 'icuio', 'icutu']
+
+        #curl
+        conf.env['LIB_CURL'] = ['libcurl']
+
+        #sqlite3
+        conf.env['CPPPATH_SQLITE3'] = [os.path.join(msvclibs_dir, 'include', 'SQLite')]
+        conf.env['LIB_SQLITE3'] = ['sqlite3']
+
+        #libxml2
+        conf.env['LIB_XML'] = ['libxml2']
+
+        #libxslt
+        conf.env['LIB_XSLT'] = ['libxslt']
+    else:
+        if build_port == 'wx':
+            port_uses['wx'].append('PTHREADS')
+            conf.env.append_value('LIB', ['jpeg', 'png', 'pthread'])
+            conf.env.append_value('LIBPATH', os.path.join(wklibs_dir, 'unix', 'lib'))
+            conf.env.append_value('CPPPATH', os.path.join(wklibs_dir, 'unix', 'include'))
+            conf.env.append_value('CXXFLAGS', ['-fPIC', '-DPIC'])
+
+        conf.check_cfg(msg='Checking for libxslt', path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT', mandatory=True)
+        conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML', mandatory=True)
+        if sys.platform.startswith('darwin') and min_version and min_version == '10.4':
+            conf.check_cfg(path=os.path.join(wklibs_dir, 'unix', 'bin', 'curl-config'), args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
+        else:
+            conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL', mandatory=True)
+
+        if not sys.platform.startswith('darwin'):
+            conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX', mandatory=True)
+            conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX', mandatory=True)
+            conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX', mandatory=True)
+            conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3', mandatory=True)
+            conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU', mandatory=True)
+
+    if build_port in port_uses:
+        for use in port_uses[build_port]:
+            conf.env.append_value('CXXDEFINES', ['WTF_USE_%s' % use])
diff --git a/Tools/waf/build/waf_extensions.py b/Tools/waf/build/waf_extensions.py
new file mode 100644 (file)
index 0000000..e8c35f9
--- /dev/null
@@ -0,0 +1,102 @@
+# 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.
+#
+# This module is for code where we override waf's default behavior or extend waf
+
+import os
+import subprocess
+import sys
+
+import Utils
+
+
+# version of exec_command that handles Windows command lines longer than 32000 chars
+def exec_command(s, **kw):
+    filename = ''
+    if sys.platform.startswith('win') and len(' '.join(s)) > 32000:
+        import tempfile
+        (fd, filename) = tempfile.mkstemp()
+        t = []
+        for i in s:
+            if i.find(" ") != -1:
+                i = '"%s"' % i
+            t.append(i)
+
+        t1 = t[1:]
+        # Fix for LNK1170 error
+        filename_str = '@' + filename
+        filename2_str = None
+        if len(' '.join(s)) > 131070:
+            t2 = t[len(t) / 2:]
+            t1 = t[1:len(t) / 2]
+            (fd2, filename2) = tempfile.mkstemp()
+            os.write(fd2, ' '.join(t2))
+            os.close(fd2)
+            filename2_str = '@' + filename2
+        os.write(fd, ' '.join(t1))
+        os.close(fd)
+
+        s = [s[0]]
+        s.append(filename_str)
+        if filename2_str:
+            s.append(filename2_str)
+
+    if 'log' in kw:
+        kw['stdout'] = kw['stderr'] = kw['log']
+        del(kw['log'])
+    kw['shell'] = isinstance(s, str)
+
+    def cleanup():
+        try:
+            if os.path.exists(filename):
+                os.remove(filename)
+        except:
+            pass
+
+    try:
+        proc = subprocess.Popen(s, **kw)
+        result = proc.wait()
+        cleanup()
+        return result
+
+    except OSError:
+        cleanup()
+        raise
+
+Utils.exec_command = exec_command
+
+# Better performing h_file to keep hashing from consuming lots of time
+import stat
+
+
+def h_file(filename):
+    st = os.stat(filename)
+    if stat.S_ISDIR(st[stat.ST_MODE]):
+        raise IOError('not a file')
+    m = Utils.md5()
+    m.update(str(st.st_mtime))
+    m.update(str(st.st_size))
+    m.update(filename)
+    return m.digest()
+
+Utils.h_file = h_file
diff --git a/Tools/waf/build/wxpresets.py b/Tools/waf/build/wxpresets.py
new file mode 100644 (file)
index 0000000..f8a49c3
--- /dev/null
@@ -0,0 +1,127 @@
+# 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.
+#
+# Library for functions to determine wx settings based on configuration
+
+import os
+import re
+
+import Options
+
+
+def parse_build_cfg(filename):
+    cfg_file = open(filename, 'r')
+    cfg = {}
+    for cfg_line in cfg_file.readlines():
+        key = None
+        value = None
+        parts = cfg_line.split('=')
+        if len(parts) >= 1:
+            key = parts[0].strip()
+
+        if len(parts) >= 2:
+            value = parts[1].strip()
+            if value.isdigit():
+                value = int(value)
+
+        if key:
+            cfg[key] = value
+
+    return cfg
+
+
+def get_wx_version(wx_root):
+    versionText = open(os.path.join(wx_root, "include", "wx", "version.h"), "r").read()
+
+    majorVersion = re.search("#define\swxMAJOR_VERSION\s+(\d+)", versionText).group(1)
+    minorVersion = re.search("#define\swxMINOR_VERSION\s+(\d+)", versionText).group(1)
+    releaseVersion = re.search("#define\swxRELEASE_NUMBER\s+(\d+)", versionText).group(1)
+
+    release = [majorVersion, minorVersion]
+    if int(minorVersion) % 2 == 1:
+        release.append(releaseVersion)
+    return release
+
+
+def get_wxmsw_settings(wx_root, shared=False, unicode=False, debug=False, wxPython=False):
+    if not os.path.exists(wx_root):
+        print "Directory %s does not exist." % wx_root
+        sys.exit(1)
+
+    defines = ['__WXMSW__']
+    includes = [os.path.join(wx_root, 'include')]
+    cxxflags = []
+    libs = []
+    libpaths = []
+
+    libdir = os.path.join(wx_root, 'lib')
+    ext = ''
+    postfix = 'vc'
+
+    version_str_nodot = ''.join(get_wx_version(wx_root)[0:2])
+
+    if shared:
+        defines.append('WXUSINGDLL')
+        libdir = os.path.join(libdir, Options.options.wx_compiler_prefix + '_dll')
+    else:
+        libdir = os.path.join(libdir, Options.options.wx_compiler_prefix + '_lib')
+
+    if unicode:
+        defines.append('_UNICODE')
+        ext += 'u'
+
+    depext = ''
+    if wxPython and not version_str_nodot.startswith('29'):
+        ext += 'h'
+        depext += 'h'
+    elif debug:
+        ext += 'd'
+        depext += 'd'
+
+    configdir = os.path.join(libdir, 'msw' + ext)
+
+    monolithic = False
+    cfg_file = os.path.join(configdir, 'build.cfg')
+    if os.path.exists(cfg_file):
+        cfg = parse_build_cfg(cfg_file)
+        if "MONOLITHIC" in cfg:
+            monolithic = cfg["MONOLITHIC"]
+    libpaths.append(libdir)
+    includes.append(configdir)
+
+    def get_wxlib_name(name):
+        if name == 'base':
+            return 'wxbase%s%s' % (version_str_nodot, ext)
+
+        return "wxmsw%s%s_%s" % (version_str_nodot, ext, name)
+
+    libs.extend(['wxzlib' + depext, 'wxjpeg' + depext, 'wxpng' + depext, 'wxexpat' + depext])
+    if monolithic:
+        libs.extend(["wxmsw%s%s" % (version_str_nodot, ext)])
+    else:
+        libs.extend([get_wxlib_name('base'), get_wxlib_name('core')])
+
+    if wxPython or debug:
+        defines.append('__WXDEBUG__')
+
+    return (defines, includes, libs, libpaths)
diff --git a/wscript b/wscript
index 8f6c227..e508cbe 100644 (file)
--- a/wscript
+++ b/wscript
@@ -29,98 +29,11 @@ import Options
 
 from settings import *
 
-if build_port == "wx":
-    webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
-
-wk_includes = ['.',
-                os.path.join(wk_root, 'Source', 'JavaScriptCore'),
-                os.path.join(wk_root, 'Source', 'JavaScriptCore', 'wtf', 'text'),
-                os.path.join(wk_root, 'Source', 'WebCore'),
-                os.path.join(wk_root, 'Source', 'WebCore', 'DerivedSources'),
-                os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'image-decoders'),
-                os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'),
-                os.path.join(wk_root, 'Source', 'WebCore', 'workers'),
-                os.path.join(output_dir),
-        ]
-
-if build_port == "wx":
-    wk_includes.append(os.path.join(wk_root, 'Source', 'WebKit', 'wx'))
-    wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'wx', 'wxcode'))
-
-if sys.platform.startswith("win"):
-    wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'))
-    wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics', 'win'))
-
-windows_deps = [
-                'lib/pthreadVC2.dll',
-                'bin/icuuc40.dll', 'bin/icudt40.dll', 'bin/icuin40.dll',
-                'bin/libcurl.dll', 'bin/libeay32.dll', 'bin/ssleay32.dll', 'bin/zlib1.dll',
-                'lib/sqlite3.dll', 'bin/libxml2.dll', 'bin/libxslt.dll', 'bin/iconv.dll',
-                ]
-
-webcore_sources = {}
-
-if build_port == "wx":
-    webcore_sources['wx'] = [
-        'Source/WebCore/bindings/cpp/WebDOMEventTarget.cpp',
-        'Source/WebCore/platform/KillRingNone.cpp',                     
-        'Source/WebCore/platform/text/LocalizedNumberNone.cpp'
-    ]  
-
-    if building_on_win32:
-        # make sure platform/wx comes after this so we get the right
-        # FontPlatformData.h
-        webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win'])
-        webcore_sources['wx-win'] = [
-               'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp',
-               'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp',
-               'Source/WebCore/platform/ScrollAnimatorWin.cpp',
-               # wxTimer on Windows has a bug that causes it to eat crashes in callbacks
-               # so we need to use the Win port's implementation until the wx bug fix is
-               # widely available (it was fixed in 2.8.10).
-               'Source/WebCore/platform/win/SharedTimerWin.cpp',
-               'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp',
-               # Use the Windows plugin architecture
-               #'Source/WebCore/plugins/win/PluginDataWin.cpp',
-               'Source/WebCore/plugins/win/PluginDatabaseWin.cpp',
-               'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp',
-               'Source/WebCore/plugins/win/PluginPackageWin.cpp',
-               'Source/WebCore/plugins/win/PluginViewWin.cpp',
-        ]
-    elif sys.platform.startswith('darwin'):
-        webcore_dirs.append('Source/WebCore/plugins/mac')
-        webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
-        webcore_dirs.append('Source/WebCore/platform/mac')
-        webcore_dirs.append('Source/WebCore/platform/text/mac')
-        webcore_sources['wx-mac'] = [
-               'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
-               'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
-               'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
-               'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
-               'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
-               'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp',
-               'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
-               'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
-               'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
-               'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
-               'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
-               'Source/WebCore/platform/text/mac/ShapeArabic.c',
-               'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
-               'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
-               'Source/WebCore/plugins/mac/PluginViewMac.mm'
-        ]
-    else:
-        webcore_sources['wx-gtk'] = [
-               'Source/WebCore/plugins/PluginViewNone.cpp',
-               'Source/WebCore/plugins/PluginPackageNone.cpp'
-        ]
-        webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
-        
 import TaskGen
 from TaskGen import taskgen, feature, after
 import Task, ccroot
 
-def generate_webcore_derived_sources():
+def generate_webcore_derived_sources(conf):
     # build the derived sources
     derived_sources_dir = os.path.join(webcore_dir, 'DerivedSources')
     wc_dir = webcore_dir
@@ -136,12 +49,12 @@ def generate_webcore_derived_sources():
     if building_on_win32:
         oldpath = os.environ["PATH"]
         os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
-    os.system('make -f %s/DerivedSources.make WebCore=%s SOURCE_ROOT=%s all FEATURE_DEFINES="%s"' % (wc_dir, wc_dir, wc_dir, ' '.join(feature_defines)))
+    os.system('make -f %s/DerivedSources.make WebCore=%s SOURCE_ROOT=%s all FEATURE_DEFINES="%s"' % (wc_dir, wc_dir, wc_dir, conf.env["FEATURE_DEFINES"]))
     if building_on_win32:
         os.environ["PATH"] = oldpath
     os.chdir(olddir)
 
-def generate_jscore_derived_sources():
+def generate_jscore_derived_sources(conf):
     # build the derived sources
     js_dir = jscore_dir
     if building_on_win32:
@@ -157,7 +70,7 @@ def generate_jscore_derived_sources():
     if building_on_win32:
         oldpath = os.environ["PATH"]
         os.environ["PATH"] = "/usr/bin" + os.pathsep + os.environ["PATH"]
-    command = 'make -f %s/DerivedSources.make JavaScriptCore=%s BUILT_PRODUCTS_DIR=%s all FEATURE_DEFINES="%s"' % (js_dir, js_dir, js_dir, ' '.join(feature_defines))
+    command = 'make -f %s/DerivedSources.make JavaScriptCore=%s BUILT_PRODUCTS_DIR=%s all FEATURE_DEFINES="%s"' % (js_dir, js_dir, js_dir, conf.env["FEATURE_DEFINES"])
     os.system(command)
     if building_on_win32:
         os.environ["PATH"] = oldpath
@@ -168,9 +81,9 @@ def set_options(opt):
 
 def configure(conf):
     common_configure(conf)
-    generate_jscore_derived_sources()
-    generate_webcore_derived_sources()
-    if build_port == "wx" and sys.platform.startswith('win'):
+    generate_jscore_derived_sources(conf)
+    generate_webcore_derived_sources(conf)
+    if Options.options.port == "wx" and sys.platform.startswith('win'):
         graphics_dir = os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics')
         # HACK ALERT: MSVC automatically adds the source file's directory as the first entry in the
         # path. Unfortunately, that means when compiling these files we will end up including
@@ -188,14 +101,104 @@ def configure(conf):
     for api_file in glob.glob(os.path.join(jscore_dir, 'API/*.h')):
         shutil.copy(api_file, os.path.join(jscore_out_dir, os.path.basename(api_file)))
 
-    if build_port == "wx" and Options.options.wxpython:
+    if Options.options.port == "wx" and Options.options.wxpython:
         common_configure(conf)
         conf.check_tool('swig', tooldir='Source/WebKit/wx/bindings/python')
         conf.check_swig_version('1.3.29')
 
-def build(bld):  
+def build(bld):
+
+    webcore_dirs = list(webcore_dirs_common)
+
+    if Options.options.port == "wx":
+        webcore_dirs.extend(['Source/WebKit/wx', 'Source/WebKit/wx/WebKitSupport'])
+    
+    wk_includes = ['.',
+                    os.path.join(wk_root, 'Source', 'JavaScriptCore'),
+                    os.path.join(wk_root, 'Source', 'JavaScriptCore', 'wtf', 'text'),
+                    os.path.join(wk_root, 'Source', 'WebCore'),
+                    os.path.join(wk_root, 'Source', 'WebCore', 'DerivedSources'),
+                    os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'image-decoders'),
+                    os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'),
+                    os.path.join(wk_root, 'Source', 'WebCore', 'workers'),
+                    os.path.join(output_dir),
+            ]
+    
+    if Options.options.port == "wx":
+        wk_includes.append(os.path.join(wk_root, 'Source', 'WebKit', 'wx'))
+        wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'wx', 'wxcode'))
+    
+    if sys.platform.startswith("win"):
+        wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'win'))
+        wk_includes.append(os.path.join(wk_root, 'Source', 'WebCore', 'platform', 'graphics', 'win'))
+    
+    windows_deps = [
+                    'lib/pthreadVC2.dll',
+                    'bin/icuuc40.dll', 'bin/icudt40.dll', 'bin/icuin40.dll',
+                    'bin/libcurl.dll', 'bin/libeay32.dll', 'bin/ssleay32.dll', 'bin/zlib1.dll',
+                    'lib/sqlite3.dll', 'bin/libxml2.dll', 'bin/libxslt.dll', 'bin/iconv.dll',
+                    ]
+    
+    webcore_sources = {}
+    
+    if Options.options.port == "wx":
+        webcore_sources['wx'] = [
+            'Source/WebCore/bindings/cpp/WebDOMEventTarget.cpp',
+            'Source/WebCore/platform/KillRingNone.cpp',                     
+            'Source/WebCore/platform/text/LocalizedNumberNone.cpp'
+        ]  
+    
+        if building_on_win32:
+            # make sure platform/wx comes after this so we get the right
+            # FontPlatformData.h
+            webcore_dirs.extend(['Source/WebCore/platform/wx/wxcode/win', 'Source/WebCore/plugins/win'])
+            webcore_sources['wx-win'] = [
+                   'Source/WebCore/platform/graphics/win/GlyphPageTreeNodeCairoWin.cpp',
+                   'Source/WebCore/platform/graphics/win/TransformationMatrixWin.cpp',
+                   'Source/WebCore/platform/ScrollAnimatorWin.cpp',
+                   # wxTimer on Windows has a bug that causes it to eat crashes in callbacks
+                   # so we need to use the Win port's implementation until the wx bug fix is
+                   # widely available (it was fixed in 2.8.10).
+                   'Source/WebCore/platform/win/SharedTimerWin.cpp',
+                   'Source/WebCore/platform/win/WebCoreInstanceHandle.cpp',
+                   # Use the Windows plugin architecture
+                   #'Source/WebCore/plugins/win/PluginDataWin.cpp',
+                   'Source/WebCore/plugins/win/PluginDatabaseWin.cpp',
+                   'Source/WebCore/plugins/win/PluginMessageThrottlerWin.cpp',
+                   'Source/WebCore/plugins/win/PluginPackageWin.cpp',
+                   'Source/WebCore/plugins/win/PluginViewWin.cpp',
+            ]
+        elif sys.platform.startswith('darwin'):
+            webcore_dirs.append('Source/WebCore/plugins/mac')
+            webcore_dirs.append('Source/WebCore/platform/wx/wxcode/mac/carbon')
+            webcore_dirs.append('Source/WebCore/platform/mac')
+            webcore_dirs.append('Source/WebCore/platform/text/mac')
+            webcore_sources['wx-mac'] = [
+                   'Source/WebCore/platform/mac/PurgeableBufferMac.cpp',
+                   'Source/WebCore/platform/mac/WebCoreNSStringExtras.mm',
+                   'Source/WebCore/platform/mac/WebCoreSystemInterface.mm',
+                   'Source/WebCore/platform/graphics/cg/FloatSizeCG.cpp',
+                   'Source/WebCore/platform/graphics/mac/ComplexTextController.cpp',
+                   'Source/WebCore/platform/graphics/mac/ComplexTextControllerCoreText.cpp',
+                   'Source/WebCore/platform/graphics/mac/ComplexTextControllerATSUI.cpp',
+                   'Source/WebCore/platform/graphics/mac/GlyphPageTreeNodeMac.cpp',
+                   'Source/WebCore/platform/graphics/mac/SimpleFontDataATSUI.mm',
+                   'Source/WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp',
+                   'Source/WebCore/platform/graphics/wx/FontPlatformDataWxMac.mm',
+                   'Source/WebCore/platform/text/mac/ShapeArabic.c',
+                   'Source/WebCore/platform/wx/wxcode/mac/carbon/fontprops.mm',
+                   'Source/WebCore/plugins/mac/PluginPackageMac.cpp',
+                   'Source/WebCore/plugins/mac/PluginViewMac.mm'
+            ]
+        else:
+            webcore_sources['wx-gtk'] = [
+                   'Source/WebCore/plugins/PluginViewNone.cpp',
+                   'Source/WebCore/plugins/PluginPackageNone.cpp'
+            ]
+            webcore_dirs.append('Source/WebCore/platform/wx/wxcode/gtk')
+        
+
     import TaskGen
-    global wk_includes
 
     # FIXME: Does this need to be Source/JavaScriptCore?
     bld.add_subdirs('Source/JavaScriptCore')
@@ -204,11 +207,11 @@ def build(bld):
         TaskGen.task_gen.mappings['.mm'] = TaskGen.task_gen.mappings['.cxx']
         TaskGen.task_gen.mappings['.m'] = TaskGen.task_gen.mappings['.cxx']
 
-    features = [build_port]
+    features = [Options.options.port.lower()]
     exclude_patterns = ['*AllInOne.cpp', '*Brew.cpp', '*CFNet.cpp', '*Chromium*.cpp', 
             '*Efl.cpp', '*Gtk.cpp', '*Haiku.cpp', '*Mac.cpp', '*None.cpp', '*Qt.cpp', '*Safari.cpp',
             'test*bindings.*', '*WinCE.cpp', "WebDOMCanvas*.cpp", "WebDOMSVG*.cpp"]
-    if build_port == 'wx':
+    if Options.options.port == 'wx':
         features.append('curl')
         exclude_patterns.append('*Win.cpp')
         
@@ -261,7 +264,7 @@ def build(bld):
         
     excludes = []
     
-    if build_port == 'wx':
+    if Options.options.port == 'wx':
         excludes = get_excludes(webcore_dir, exclude_patterns)
         excludes.extend(['UserStyleSheetLoader.cpp', 'RenderMediaControls.cpp'])
 
@@ -343,5 +346,5 @@ def build(bld):
 
     bld.add_group()
     
-    if build_port == "wx":    
+    if Options.options.port == "wx":    
         bld.add_subdirs(['Tools/DumpRenderTree', 'Tools/wx/browser', 'Source/WebKit/wx/bindings/python'])