Home | History | Annotate | Download | only in packaging
      1 #!/usr/bin/env python
      2 
      3 # Copyright (C) 2009 Kevin Ollivier  All rights reserved.
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 # 1. Redistributions of source code must retain the above copyright
      9 #    notice, this list of conditions and the following disclaimer.
     10 # 2. Redistributions in binary form must reproduce the above copyright
     11 #    notice, this list of conditions and the following disclaimer in the
     12 #    documentation and/or other materials provided with the distribution.
     13 #
     14 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     15 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     18 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
     25 #
     26 # Script for building Mac .pkg installer
     27 
     28 import commands
     29 import distutils.sysconfig
     30 import glob
     31 import optparse
     32 import os
     33 import shutil
     34 import string
     35 import sys
     36 import tempfile
     37 
     38 script_dir = os.path.abspath(os.path.dirname(__file__))
     39 sys.path.append(os.path.abspath(os.path.join(script_dir, "..", "build")))
     40 
     41 from build_utils import *
     42 
     43 import wx
     44 
     45 wxwk_root = os.path.abspath(os.path.join(script_dir, "..", "..", ".."))
     46 wxwebkit_dir = os.path.abspath(os.path.join(wxwk_root, "WebKitBuild", get_config(wxwk_root) + git_branch_name()))
     47 
     48 wx_version = wx.__version__[:5]
     49 py_version = sys.version[:3]
     50 
     51 wxwk_version = svn_revision()
     52 
     53 platform = "osx"
     54     
     55 pkgname = "wxWebKit-%s-wx%s-py%s" % (platform, wx_version[:3], py_version)
     56 
     57 tempdir = "/tmp/%s" % (pkgname)
     58 
     59 if os.path.exists(tempdir):
     60     shutil.rmtree(tempdir)
     61     os.makedirs(tempdir)
     62 
     63 installroot = os.path.join(tempdir, "install-root")
     64 installapps = os.path.join(tempdir, "install-apps")
     65 
     66 sp_root = distutils.sysconfig.get_python_lib()
     67 wx_root = sp_root
     68 if sys.platform.startswith("darwin"):
     69     wx_root = "/usr/local/lib/wxPython-unicode-%s" % wx.__version__
     70     sp_root = "%s/lib/python%s/site-packages" % (wx_root, py_version)
     71 sitepackages = "%s/wx-%s-mac-unicode/wx" % (sp_root, wx_version[:3])
     72 prefix = sitepackages
     73 
     74 def mac_update_dependencies(dylib, prefix):
     75     """
     76     Copies any non-system dependencies into the bundle, and
     77     updates the install name path to the new path in the bundle.
     78     """
     79     global wx_root
     80     system_prefixes = ["/usr/lib", "/System/Library", wx_root]
     81 
     82     output = commands.getoutput("otool -L %s" % dylib).strip()
     83     for line in output.split("\n"):
     84         filename = line.split("(")[0].strip()
     85         if os.path.exists(filename):
     86             print "checking dll %s" % filename
     87             copy = True
     88             for sys_prefix in system_prefixes:
     89                 if filename.startswith(sys_prefix):
     90                     copy = False
     91             
     92             if copy:
     93                 copydir = os.path.dirname(dylib)
     94                 
     95                 filedir, basename = os.path.split(filename)
     96                 dest_filename = os.path.join(prefix, basename)
     97                 copyname = os.path.join(copydir, basename)
     98                 if not os.path.exists(copyname):
     99                     shutil.copy(filename, copydir)
    100                     os.system("install_name_tool -id %s %s" % (dest_filename, copyname))
    101                 
    102                 os.system("install_name_tool -change %s %s %s" % (filename, dest_filename, dylib))
    103 
    104 def exitIfError(cmd):
    105     print cmd
    106     retval = os.system(cmd)
    107     if retval != 0:
    108         if os.path.exists(tempdir):
    109             shutil.rmtree(tempdir)
    110         sys.exit(1)
    111 
    112 wxroot = installroot + prefix
    113 wxpythonroot = installroot + sitepackages
    114 
    115 try:
    116     if not os.path.exists(wxroot):
    117         os.makedirs(wxroot)
    118     
    119     if not os.path.exists(wxpythonroot):
    120         os.makedirs(wxpythonroot)
    121     
    122     for wildcard in ["*.py", "*.so", "*.dylib"]:
    123         files = glob.glob(os.path.join(wxwebkit_dir, wildcard))
    124         for afile in files:
    125             shutil.copy(afile, wxpythonroot)
    126     
    127     if sys.platform.startswith("darwin"):
    128         dylib_path = os.path.join(wxpythonroot, "libwxwebkit.dylib")
    129         os.system("install_name_tool -id %s %s" % (os.path.join(prefix, "libwxwebkit.dylib"), dylib_path))
    130         mac_update_dependencies(dylib_path, prefix)
    131         mac_update_dependencies(os.path.join(wxpythonroot, "_webview.so"), prefix)
    132         
    133         demodir = installroot + "/Applications/wxWebKit/Demos"
    134         if not os.path.exists(demodir):
    135             os.makedirs(demodir)
    136             
    137         shutil.copy(os.path.join(wxwk_root, "WebKit", "wx", "bindings", "python", "samples", "simple.py"), demodir)
    138         
    139         if os.path.exists(pkgname + ".pkg"):
    140             shutil.rmtree(pkgname + ".pkg")
    141     
    142         pkg_args = ['--title ' + pkgname,
    143                     '--out %s.pkg' % pkgname,
    144                     '--version ' + wxwk_version.strip(),
    145                     '--id org.wxwebkit.wxwebkit',
    146                     '--domain system',
    147                     '--root-volume-only',
    148                     '--root ' + installroot,
    149                     '--resources %s/mac/resources' % script_dir,
    150                     '--verbose'
    151                     ]
    152     
    153         packagemaker = "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker"
    154         exitIfError(packagemaker + " %s" % (string.join(pkg_args, " ")))
    155 finally:
    156     if os.path.exists(tempdir):
    157         shutil.rmtree(tempdir)
    158