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