WebKitTools/wx/build/build_utils.py
changeset 0 4f2f89ce4247
--- /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 ""