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 datetime 30 import distutils.sysconfig 31 import glob 32 import optparse 33 import os 34 import shutil 35 import string 36 import sys 37 import tempfile 38 39 script_dir = os.path.abspath(os.path.dirname(__file__)) 40 sys.path.append(os.path.abspath(os.path.join(script_dir, "..", "build"))) 41 42 from build_utils import * 43 44 import wx 45 46 wxwk_root = os.path.abspath(os.path.join(script_dir, "..", "..", "..")) 47 wxwebkit_dir = os.path.abspath(os.path.join(wxwk_root, "WebKitBuild", get_config(wxwk_root) + git_branch_name())) 48 49 wx_version = wx.__version__[:5] 50 py_version = sys.version[:3] 51 52 date = str(datetime.date.today()) 53 54 platform = "osx" 55 56 pkgname = "wxWebKit-%s-wx%s-py%s-%s" % (platform, wx_version[:3], py_version, date) 57 58 tempdir = "/tmp/%s" % (pkgname) 59 60 if os.path.exists(tempdir): 61 shutil.rmtree(tempdir) 62 os.makedirs(tempdir) 63 64 installroot = os.path.join(tempdir, "install-root") 65 installapps = os.path.join(tempdir, "install-apps") 66 67 sp_root = distutils.sysconfig.get_python_lib() 68 wx_root = sp_root 69 if sys.platform.startswith("darwin"): 70 wx_root = "/usr/local/lib/wxPython-unicode-%s" % wx.__version__ 71 sp_root = "%s/lib/python%s/site-packages" % (wx_root, py_version) 72 sitepackages = "%s/wx-%s-mac-unicode/wx" % (sp_root, wx_version[:3]) 73 prefix = wx_root + "/lib" 74 75 def mac_update_dependencies(dylib, prefix): 76 """ 77 Copies any non-system dependencies into the bundle, and 78 updates the install name path to the new path in the bundle. 79 """ 80 global wx_root 81 system_prefixes = ["/usr/lib", "/System/Library", wx_root] 82 83 output = commands.getoutput("otool -L %s" % dylib).strip() 84 for line in output.split("\n"): 85 filename = line.split("(")[0].strip() 86 if os.path.exists(filename): 87 print "checking dll %s" % filename 88 copy = True 89 for sys_prefix in system_prefixes: 90 if filename.startswith(sys_prefix): 91 copy = False 92 93 if copy: 94 copydir = os.path.dirname(dylib) 95 96 filedir, basename = os.path.split(filename) 97 dest_filename = os.path.join(prefix, basename) 98 copyname = os.path.join(copydir, basename) 99 if not os.path.exists(copyname): 100 shutil.copy(filename, copydir) 101 os.system("install_name_tool -id %s %s" % (dest_filename, copyname)) 102 103 os.system("install_name_tool -change %s %s %s" % (filename, dest_filename, dylib)) 104 105 def exitIfError(cmd): 106 print cmd 107 retval = os.system(cmd) 108 if retval != 0: 109 if os.path.exists(tempdir): 110 shutil.rmtree(tempdir) 111 sys.exit(1) 112 113 wxroot = installroot + prefix 114 wxpythonroot = installroot + sitepackages 115 116 try: 117 if not os.path.exists(wxroot): 118 os.makedirs(wxroot) 119 120 if not os.path.exists(wxpythonroot): 121 os.makedirs(wxpythonroot) 122 123 for wildcard in ["*.py", "*.so"]: 124 files = glob.glob(os.path.join(wxwebkit_dir, wildcard)) 125 for afile in files: 126 shutil.copy(afile, wxpythonroot) 127 128 for wildcard in ["*.dylib"]: 129 files = glob.glob(os.path.join(wxwebkit_dir, wildcard)) 130 for afile in files: 131 shutil.copy(afile, wxroot) 132 133 if sys.platform.startswith("darwin"): 134 dylib_path = os.path.join(wxroot, "libwxwebkit.dylib") 135 os.system("install_name_tool -id %s %s" % (os.path.join(prefix, "libwxwebkit.dylib"), dylib_path)) 136 mac_update_dependencies(dylib_path, prefix) 137 mac_update_dependencies(os.path.join(wxpythonroot, "_webview.so"), prefix) 138 139 demodir = installroot + "/Applications/wxWebKit/Demos" 140 if not os.path.exists(demodir): 141 os.makedirs(demodir) 142 143 shutil.copy(os.path.join(wxwk_root, "Source", "WebKit", "wx", "bindings", "python", "samples", "simple.py"), demodir) 144 145 if os.path.exists(pkgname + ".pkg"): 146 shutil.rmtree(pkgname + ".pkg") 147 148 pkg_args = ['--title ' + pkgname, 149 '--out %s.pkg' % pkgname, 150 '--version ' + date.strip(), 151 '--id org.wxwebkit.wxwebkit', 152 '--domain system', 153 '--root-volume-only', 154 '--root ' + installroot, 155 '--verbose' 156 ] 157 158 packagemaker = "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker" 159 exitIfError(packagemaker + " %s" % (string.join(pkg_args, " "))) 160 finally: 161 if os.path.exists(tempdir): 162 shutil.rmtree(tempdir) 163