diff -r 000000000000 -r 4f2f89ce4247 WebKitTools/wx/build/build_utils.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKitTools/wx/build/build_utils.py Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,188 @@ +# 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, '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 + wxpy_dir = os.path.join(wk_root, '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/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 + +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 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 ""