diff options
Diffstat (limited to 'WebKitTools/wx/build')
-rw-r--r-- | WebKitTools/wx/build/build_utils.py | 143 | ||||
-rw-r--r-- | WebKitTools/wx/build/settings.py | 265 | ||||
-rw-r--r-- | WebKitTools/wx/build/waf_extensions.py | 79 | ||||
-rw-r--r-- | WebKitTools/wx/build/wxpresets.py | 78 |
4 files changed, 565 insertions, 0 deletions
diff --git a/WebKitTools/wx/build/build_utils.py b/WebKitTools/wx/build/build_utils.py new file mode 100644 index 0000000..f6daf3a --- /dev/null +++ b/WebKitTools/wx/build/build_utils.py @@ -0,0 +1,143 @@ +# 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 glob +import os +import sys +import urllib +import urlparse + +import Logs + +def get_output(command): + """ + Windows-compatible function for getting output from a command. + """ + f = os.popen(command) + return f.read().strip() + +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(wk_root, msvc_version='msvc2008'): + """ + Download and update tools needed to build the wx port. + """ + 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, 'WebKitTools', '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 + #swig_module = download_if_newer('http://wxwebkit.wxcommunity.com/downloads/deps/swig.py', os.path.join(wk_root, 'WebKit', 'wx', 'bindings', 'python')) + + 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'): + os.system('%s/WebKitTools/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 diff --git a/WebKitTools/wx/build/settings.py b/WebKitTools/wx/build/settings.py new file mode 100644 index 0000000..b09f0bc --- /dev/null +++ b/WebKitTools/wx/build/settings.py @@ -0,0 +1,265 @@ +# 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 sys + +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, 'JavaScriptCore') +webcore_dir = os.path.join(wk_root, 'WebCore') +wklibs_dir = os.path.join(wk_root, 'WebKitLibraries') + +common_defines = [] +common_cxxflags = [] +common_includes = [] +common_libs = [] +common_libpaths = [] +common_frameworks = [] + +jscore_dirs = [ + 'API', + 'bytecode', + 'bytecompiler', + 'debugger', + 'DerivedSources', + 'interpreter', + 'jit', + 'parser', + 'pcre', + 'profiler', + 'runtime', + 'wtf', + 'wtf/unicode', + 'wtf/unicode/icu', +] + +webcore_dirs = [ + 'accessibility', + 'bindings/js', + 'bridge', + 'bridge/c', + 'css', + 'DerivedSources', + 'dom', + 'dom/default', + 'editing', + 'history', + 'html', + 'inspector', + 'loader', + 'loader/appcache', + 'loader/archive', + 'loader/icon', + 'page', + 'page/animation', + 'platform', + 'platform/animation', + 'platform/graphics', + 'platform/graphics/transforms', + 'platform/image-decoders', + 'platform/image-decoders/bmp', + 'platform/image-decoders/gif', + 'platform/image-decoders/ico', + 'platform/image-decoders/jpeg', + 'platform/image-decoders/png', + 'platform/image-decoders/xbm', + 'platform/image-decoders/zlib', + 'platform/network', + 'platform/sql', + 'platform/text', + 'plugins', + 'rendering', + 'rendering/style', + 'storage', + 'xml' +] + +config_file = os.path.join(wk_root, 'WebKitBuild', 'Configuration') +config = 'Debug' + +if os.path.exists(config_file): + config = open(config_file).read() + +output_dir = os.path.join(wk_root, 'WebKitBuild', config) + +waf_configname = config.upper() + +build_port = "wx" +building_on_win32 = sys.platform.startswith('win') + +if building_on_win32: + if config == 'Release': + waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL' + else: + waf_configname = waf_configname + ' CRT_MULTITHREADED_DLL_DBG' + +create_hash_table = wk_root + "/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 = ['ENABLE_DATABASE', 'ENABLE_XSLT', 'ENABLE_JAVASCRIPT_DEBUGGER'] + +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('--wxpython', action='store_true', default=False, help='Create the wxPython bindings.') + +def common_configure(conf): + """ + Configuration used by all targets, called from the target's configure() step. + """ + conf.check_tool('compiler_cxx') + conf.check_tool('compiler_cc') + conf.check_tool('python') + conf.check_python_headers() + + if sys.platform.startswith('darwin'): + conf.check_tool('osx') + + msvc_version = 'msvc2008' + if building_on_win32: + found_versions = conf.get_msvc_versions() + if found_versions[0][0] == 'msvc 9.0': + msvc_version = 'msvc2008' + elif found_versions[0][0] == 'msvc 8.0': + msvc_version = 'msvc2005' + + msvclibs_dir = '' + if build_port == "wx": + update_wx_deps(wk_root, msvc_version) + msvclibs_dir = os.path.join(wklibs_dir, msvc_version, 'win') + + conf.env.append_value('CXXDEFINES', ['BUILDING_WX__=1', 'WTF_USE_WXGC=1']) + + if building_on_win32: + conf.env.append_value('LIBPATH', os.path.join(msvclibs_dir, 'lib')) + # wx settings + wxdefines, wxincludes, wxlibs, wxlibpaths = get_wxmsw_settings(wx_root, shared=True, unicode=True, wxPython=True) + conf.env['CXXDEFINES_WX'] = wxdefines + conf.env['CPPPATH_WX'] = wxincludes + conf.env['LIB_WX'] = wxlibs + conf.env['LIBPATH_WX'] = wxlibpaths + + if sys.platform.startswith('darwin'): + conf.env['LIB_ICU'] = ['icucore'] + # Apple does not ship the ICU headers with Mac OS X, so WebKit includes a copy of 3.2 headers + conf.env['CPPPATH_ICU'] = [os.path.join(jscore_dir, 'icu'), os.path.join(webcore_dir, 'icu')] + + conf.env.append_value('CPPPATH', wklibs_dir) + conf.env.append_value('LIBPATH', wklibs_dir) + + #conf.env['PREFIX'] = output_dir + + libprefix = '' + if building_on_win32: + libprefix = 'lib' + + conf.env['LIB_JSCORE'] = [libprefix + 'jscore'] + conf.env['LIB_WEBCORE'] = [libprefix + 'webcore'] + conf.env['LIB_WXWEBKIT'] = ['wxwebkit'] + conf.env['CXXDEFINES_WXWEBKIT'] = ['WXUSINGDLL_WEBKIT'] + + 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', 'comctl32', 'ole32', 'oleaut32', 'uuid', 'advapi32', + 'wsock32', 'gdiplus']) + + 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': + conf.env.append_value('LIB', ['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(path='wx-config', args='--cxxflags --libs', package='', uselib_store='WX') + + conf.check_cfg(path='xslt-config', args='--cflags --libs', package='', uselib_store='XSLT') + conf.check_cfg(path='xml2-config', args='--cflags --libs', package='', uselib_store='XML') + conf.check_cfg(path='curl-config', args='--cflags --libs', package='', uselib_store='CURL') + if sys.platform.startswith('darwin'): + conf.env.append_value('LIB', ['WebCoreSQLite3']) + + if not sys.platform.startswith('darwin'): + conf.check_cfg(package='cairo', args='--cflags --libs', uselib_store='WX') + conf.check_cfg(package='pango', args='--cflags --libs', uselib_store='WX') + conf.check_cfg(package='gtk+-2.0', args='--cflags --libs', uselib_store='WX') + conf.check_cfg(package='sqlite3', args='--cflags --libs', uselib_store='SQLITE3') + conf.check_cfg(path='icu-config', args='--cflags --ldflags', package='', uselib_store='ICU') + + + + diff --git a/WebKitTools/wx/build/waf_extensions.py b/WebKitTools/wx/build/waf_extensions.py new file mode 100644 index 0000000..fcf34df --- /dev/null +++ b/WebKitTools/wx/build/waf_extensions.py @@ -0,0 +1,79 @@ +# 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 + file = tempfile.NamedTemporaryFile(delete=False) + filename = file.name + file.write(' '.join(s[1:])) + file.close() + + s = [s[0], '@' + filename] + + 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/WebKitTools/wx/build/wxpresets.py b/WebKitTools/wx/build/wxpresets.py new file mode 100644 index 0000000..677720c --- /dev/null +++ b/WebKitTools/wx/build/wxpresets.py @@ -0,0 +1,78 @@ +# 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 + +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' + + if shared: + defines.append('WXUSINGDLL') + libdir = os.path.join(libdir, 'vc_dll') + else: + libdir = os.path.join(libdir, 'vc_lib') + + if unicode: + defines.append('_UNICODE') + ext += 'u' + + depext = '' + if wxPython: + ext += 'h' + depext += 'h' + elif debug: + ext += 'd' + depext += 'd' + + configdir = os.path.join(libdir, 'msw' + ext) + libpaths.append(libdir) + includes.append(configdir) + + def get_wxlib_name(name): + prefix = 'wxmsw' + if name == 'base': + return 'wxbase28%s' % (ext) + + return "wxmsw28%s_%s" % (ext, name) + + libs.extend(['wxzlib' + depext, 'wxjpeg' + depext, 'wxpng' + depext, 'wxexpat' + depext]) + libs.extend([get_wxlib_name('base'), get_wxlib_name('core')]) + + if wxPython or debug: + defines.append('__WXDEBUG__') + + return (defines, includes, libs, libpaths) |