Reviewed by Kevin Ollivier.
[WebKit-https.git] / WebKitTools / wx / packaging / build-mac-installer.py
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)