[wx] Build fixes after recent changes.
[WebKit-https.git] / Tools / 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 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 = wxroot + "/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(wxpythonroot, "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, "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                     '--resources %s/mac/resources' % script_dir,
156                     '--verbose'
157                     ]
158     
159         packagemaker = "/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker"
160         exitIfError(packagemaker + " %s" % (string.join(pkg_args, " ")))
161 finally:
162     if os.path.exists(tempdir):
163         shutil.rmtree(tempdir)