OSXHorrors » History » Version 22

Chris Cannam, 2011-03-24 10:07 AM

1 1 Chris Cannam
2 1 Chris Cannam
3 1 Chris Cannam
h1. OS/X version, hardware platform, and Qt version compatibility
4 1 Chris Cannam
5 22 Chris Cannam
{{>toc}}
6 22 Chris Cannam
7 22 Chris Cannam
8 6 Chris Cannam
*Executive summary:* For a program like EasyHg that demands the widest possible compatibility, we currently want to hit the following targets:
9 6 Chris Cannam
10 6 Chris Cannam
* 10.4 PPC 32-bit Carbon
11 6 Chris Cannam
* 10.4 Intel 32-bit Carbon
12 6 Chris Cannam
* 10.6 Intel 64-bit Cocoa
13 1 Chris Cannam
14 8 Chris Cannam
To do this, we currently need at least two builds of Qt:
15 8 Chris Cannam
16 12 Chris Cannam
* 10.6 gcc-4.2 Cocoa x86_64
17 8 Chris Cannam
* 10.4 gcc-4.0 Carbon PPC and i386
18 1 Chris Cannam
19 15 Chris Cannam
This should mean the Qt 4.7.1 default distribution plus a separate Carbon build will do.  BUT see Qt Plugins and Python sections below.
20 9 Chris Cannam
21 1 Chris Cannam
Note it is not possible to cover all platforms in a single build step, we always need to do at least two separate builds plus lipo.
22 12 Chris Cannam
23 12 Chris Cannam
If we are going to make a 3-way universal binary, we need to ensure the 10.4 build gets selected for i386 -- i.e. to pull only the x86_64 architecture from any 10.5 or 10.6 SDK build we do.  The inability to select between different i386 versions from a single universal binary is a strong incentive to stick to a single 10.4+ Carbon build for all 32-bit platforms.
24 1 Chris Cannam
25 5 Chris Cannam
h2. OS/X 10.6
26 5 Chris Cannam
27 1 Chris Cannam
h3. As target
28 1 Chris Cannam
29 11 Chris Cannam
* By far the most common version as of Feb 2011 (apparently >80%)
30 5 Chris Cannam
* Not supported on PPC
31 5 Chris Cannam
* Runs in 64-bit mode by default where possible
32 10 Chris Cannam
* Note Python is also 64-bit by default, so PyQt needs to be as well
33 5 Chris Cannam
* Is _not_ always 64-bit -- it is supported on 32-bit-only hardware such as Core Duo (first Intel Macs)
34 1 Chris Cannam
35 1 Chris Cannam
h3. As build host
36 1 Chris Cannam
37 5 Chris Cannam
* Builds 64-bit by default
38 5 Chris Cannam
* Can be used to do 32-bit Intel and PPC builds
39 1 Chris Cannam
40 1 Chris Cannam
h2. OS/X 10.5
41 1 Chris Cannam
42 1 Chris Cannam
h3. As target
43 1 Chris Cannam
44 2 Chris Cannam
* Not all that much more widely used than 10.4 -- if we were dropping 10.4, we probably might as well drop 10.5 as well
45 1 Chris Cannam
* Last version supported for PPC platforms
46 1 Chris Cannam
* Runs in 32-bit mode by default
47 1 Chris Cannam
* Can build for it from 10.5, 10.6
48 1 Chris Cannam
* Requires SDK @/Developer/SDKs/MacOSX10.5.SDK@
49 1 Chris Cannam
* First version to support Objective-C 2.0
50 1 Chris Cannam
* Qt Cocoa supported
51 1 Chris Cannam
52 1 Chris Cannam
h3. As build host
53 1 Chris Cannam
54 1 Chris Cannam
* Builds 32-bit by default
55 1 Chris Cannam
* Can be used to do 64-bit builds
56 1 Chris Cannam
57 5 Chris Cannam
h2. OS/X 10.4
58 1 Chris Cannam
59 1 Chris Cannam
h3. As target
60 1 Chris Cannam
61 5 Chris Cannam
* Oldest version still apparently in use as of Feb 2011: not very widespread (low single digit %age of Mac users), but at least two researchers here use it
62 5 Chris Cannam
* Appears in PPC and i386 systems
63 5 Chris Cannam
* Runs in 32-bit mode only
64 5 Chris Cannam
* Can build for it from 10.4, 10.5, 10.6
65 5 Chris Cannam
* Requires SDK @/Developer/SDKs/MacOSX10.4u.SDK@
66 5 Chris Cannam
* Requires @-mmacosx-version-min=10.4@ on 10.5+
67 5 Chris Cannam
* Requires gcc-4.0 to be requested explicitly on 10.6
68 5 Chris Cannam
* Does not support Objective-C 2.0
69 5 Chris Cannam
* Not a supported target for Qt's Cocoa builds, Qt Carbon needed
70 2 Chris Cannam
71 2 Chris Cannam
h3. As build host
72 2 Chris Cannam
73 5 Chris Cannam
* Does not support Objective-C 2.0
74 5 Chris Cannam
* 10.4u SDK can be used to build 64-bit executables of simple C/C++ programs such as plugins, but not of GUIs or anything using Core frameworks
75 13 Chris Cannam
76 15 Chris Cannam
h2. Qt Plugins
77 1 Chris Cannam
78 15 Chris Cannam
Qt will by default load any plugins for e.g. image format support that it finds in the system.  There are various ways to block plugin loading (e.g. through build key) but I can't see any way that will prevent Qt from at least dlopen()ing the shared object and rifling through its drawers.
79 15 Chris Cannam
80 15 Chris Cannam
This is a problem, because the plugins have dependencies on the Qt framework components, so we may end up with two different versions of Qt (the one in our bundle and the system one) being loaded at once.  Result: mysterious crashes.
81 15 Chris Cannam
82 17 Chris Cannam
For the moment we "fix" this by applying the following elegant patch to our Qt build:
83 15 Chris Cannam
84 16 Chris Cannam
<pre>
85 16 Chris Cannam
--- src/corelib/plugin/qfactoryloader.cpp_	2011-03-14 12:21:11.000000000 +0000
86 16 Chris Cannam
+++ src/corelib/plugin/qfactoryloader.cpp	2011-03-14 12:22:04.000000000 +0000
87 16 Chris Cannam
@@ -104,7 +104,7 @@
88 16 Chris Cannam
 
89 16 Chris Cannam
 void QFactoryLoader::update()
90 16 Chris Cannam
 {
91 16 Chris Cannam
-#ifdef QT_SHARED
92 16 Chris Cannam
+#ifdef NO_WE_DONT_WANT_PLUGINS_THANKS
93 16 Chris Cannam
     Q_D(QFactoryLoader);
94 16 Chris Cannam
     QStringList paths = QCoreApplication::libraryPaths();
95 16 Chris Cannam
     QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));
96 16 Chris Cannam
--- src/corelib/plugin/qpluginloader.cpp_	2011-03-14 12:23:31.000000000 +0000
97 16 Chris Cannam
+++ src/corelib/plugin/qpluginloader.cpp	2011-03-14 12:23:53.000000000 +0000
98 16 Chris Cannam
@@ -285,7 +285,7 @@
99 16 Chris Cannam
 */
100 16 Chris Cannam
 void QPluginLoader::setFileName(const QString &fileName)
101 16 Chris Cannam
 {
102 16 Chris Cannam
-#if defined(QT_SHARED)
103 16 Chris Cannam
+#if defined(NO_WE_DONT_WANT_PLUGINS_THANKS)
104 16 Chris Cannam
     QLibrary::LoadHints lh;
105 16 Chris Cannam
     if (d) {
106 16 Chris Cannam
         lh = d->loadHints;
107 16 Chris Cannam
</pre>
108 15 Chris Cannam
109 15 Chris Cannam
h2. Python versions
110 1 Chris Cannam
111 15 Chris Cannam
Python versioning and compatibility is a bit of a nightmare.  We need to load a Python module with C components (using PyQt) in Mercurial, so we need to take into account both the Python version and the architecture.
112 15 Chris Cannam
113 22 Chris Cannam
The system Python is 2.5 on 10.4/10.5 and 2.6 on 10.6.  PyQt compiled for 2.5 will not work in 2.6, and vice versa.  This makes it very difficult to provide a single bundle for all platforms, as we have no easy way (without an installer script) to ensure that the PyQt modules for the right version of Python get loaded.
114 14 Chris Cannam
115 14 Chris Cannam
On 10.6, Python is 32-/64-bit universal which runs in 64-bit by default on a 64-bit system, so any modules need to be available both ways as well (troubleshooting this when it goes wrong is quite tricky).  There is an environment variable @VERSIONER_PYTHON_PREFER_32_BIT@ which you can set to cause it always to run in 32-bit.
116 13 Chris Cannam
117 13 Chris Cannam
Where things get complicated is when users install additional versions of Python from other ports repositories; this seems to be quite common around these parts.  Then your user-installed Python is likely to get picked up before the system one, and you don't know whether it's going to be 32- or 64-bit, and it won't support the versioning environment variable.  My impression is that people get custom Python installs dragged in as dependencies of other packages, and that tends to break quite a lot of things.
118 13 Chris Cannam
119 13 Chris Cannam
Some 10.6 system Pythons have a problem loading modules, apparently something getting broken during the upgrade from 10.5 -- this affects my home machine, but I haven't had time to look into it properly yet.