# 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 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 ""