]> git.saurik.com Git - wxWidgets.git/blame - docs/tech/tn0020.txt
Improve composite flags handling in the property grid wxFlagsProperty.
[wxWidgets.git] / docs / tech / tn0020.txt
CommitLineData
d69f7c58 1 Binary Compatibility and wxWidgets
e6d67b57
VZ
2 ==================================
30. Purpose
4----------
5
fdbd931b 6This is a broad technote covering all aspects of binary compatibility with
e6d67b57
VZ
7wxWidgets.
8
91. Releases
10-----------
11
fdbd931b 12General overview of releases can be found in tn0012.txt, but for
e6d67b57
VZ
13completeness the wxWidgets release version number is as follows:
14
152.6.2
16
17Where
18
19 2 6 2
20Major Minor Release
21
22(I.E. Major.Minor.Release).
23
d69f7c58
VZ
24All versions with EVEN minor version component (e.g. 2.4.x, 2.6.x etc.)
25are expected to be binary compatible (ODD minors are development versions
26and the compatibility constraints don't apply to them). Note that by
27preserving binary compatibility we mean BACKWARDS compatibility only,
28meaning that applications built with old wxWidgets headers should continue
29to work with new wxWidgets (shared/dynamic) libraries without the need to
30rebuild. There is no requirement to preserve compatibility in the other
31direction (i.e. make new headers compatible with old libraries) as this
32would preclude any additions whatsoever to the stable branch. But see
33also section (4).
e6d67b57 34
d69f7c58
VZ
35
362. What kind of changes are NOT binary compatible
e6d67b57
VZ
37-------------------------------------------------
38
39If its still up, the KDE guide is a good reference:
fdbd931b 40http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++
e6d67b57 41
d69f7c58 42The changes that are NOT binary compatible:
e6d67b57
VZ
43- Adding a virtual function
44- Changing the name of a any function or variable
fdbd931b 45- Changing the signature of a virtual function (adding a parameter,
e6d67b57
VZ
46even a default one)
47- Changing the order of the virtual functions in a class
48["switching" them, etc.]
63dd461b
VZ
49- Changing access privileges of a function: some compilers (among which MSVC)
50 use the function access specifier in its mangled name. Moreover, while
51 changing a private function to public should be compatible (as the old
52 symbol can't be referenced from outside the library anyhow), changing a
53 virtual private function to public is NOT compatible because the old symbol
54 is referenced by the virtual tables in the executable code and so an old
55 program compiled with MSVC wouldn't start up with a new DLL even if it
56 doesn't use the affected symbol at all!
e6d67b57
VZ
57- Adding a member variable
58- Changing the order of non-static member variables
59
60
d69f7c58
VZ
613. Changes which are compatible
62-------------------------------
63
64- Adding a new class
65- Adding a new non-virtual method to an existing class
fdbd931b 66- Adding a new constructor to an existing class
d69f7c58
VZ
67- Overriding the implementation of an existing virtual function
68[this is considered to be backwards binary compatible until we find a
69 counter example; currently it's known to work with Apple gcc at least]
70- Anything which doesn't result in ABI change at all, e.g. adding new
71 macros, constants and, of course, private changes in the implementation
72
73
744. wxABI_VERSION and "forward" binary compatibility
e6d67b57
VZ
75--------------------------------------------------
76
d69f7c58
VZ
77As mentioned we do not support "forward" binary compatibility, that is the
78ability to run applications compiled with new wxWidgets headers on systems
79with old wxWidgets libraries.
80
81However, for the developers who want to ensure that their application works
82with some fixed old wxWidgets version and doesn't (inadvertently) require
83features added in later releases, we provide the macro wxABI_VERSION which
84can be defined to restrict the API exported by wxWidgets headers to that of
85a fixed old release.
e6d67b57 86
d69f7c58
VZ
87For this to work, all new symbols added to binary compatible releases must
88be #if'ed with wxABI_VERSION.
e6d67b57
VZ
89
90The layout of wxABI_VERSION is as follows:
91
9220602
93
94where
95
6afac89e 96 2 06 02
e6d67b57
VZ
97Major Minor Release
98
d69f7c58 99I.E. it corresponds to the wxWidgets release in (1).
e6d67b57
VZ
100
101An example of using wxABI_VERSION is as follows for symbols
102only in a 2.6.2 release:
103
104#if wxABI_VERSION >= 20602 /* 2.6.2+ only */
105bool Load(const wxURI& location, const wxURI& proxy);
106
107wxFileOffset GetDownloadProgress();
108wxFileOffset GetDownloadTotal();
109
110bool ShowPlayerControls(
111 wxMediaCtrlPlayerControls flags =
112 wxMEDIACTRLPLAYERCONTROLS_DEFAULT);
113
114//helpers for the wxPython people
115bool LoadURI(const wxString& fileName)
116{ return Load(wxURI(fileName)); }
fdbd931b 117bool LoadURIWithProxy(const wxString& fileName, const wxString& proxy)
e6d67b57
VZ
118{ return Load(wxURI(fileName), wxURI(proxy)); }
119#endif
120
121
d69f7c58 1225. Workarounds for adding virtual functions
e6d67b57
VZ
123-------------------------------------------
124
d69f7c58 125Originally the idea for adding virtual functions to binary compatible
e6d67b57
VZ
126releases was to pad out some empty "reserved" functions and then
127rename those later when someone needed to add a virtual function.
128
129However, after there was some actual testing of the idea a lot of
130controversy erupted. Eventually we decided against the idea, and
131instead devised a new method for doing so called wxShadowObject.
132
133wxShadowObject is a class derived from wxObject that provides a means
134of adding functions and/or member variables to a class internally
135to wxWidgets. It does so by storing these in a hash map inside of
136it, looking it up when the function etc. is called. wxShadowObject
137is generally stored inside a reserved member variable.
138
139wxShadowObject resides in include/wx/clntdata.h.
140
141To use wxShadowObject, you first call AddMethod or AddField with
142the first parameter being the name of the field and/or method
fdbd931b 143you want, and the second parameter being the value of the
e6d67b57
VZ
144field and/or method.
145
146In the case of fields this is a void*, and in the case of method
147is a wxShadowObjectMethod which is a typedef:
148typedef int (*wxShadowObjectMethod)(void*, void*);
149
150After you add a field, you can set it via SetField with the same
d69f7c58 151parameters as AddField, the second parameter being the value to set
e6d67b57
VZ
152the field to. You can get the field after you call AddField
153via GetField, with the parameters as the other two field functions,
fdbd931b
FM
154only in the case the second parameter is the fallback
155value for the field in the case of it not being found in the
156hash map.
e6d67b57
VZ
157
158You can call a method after you add it via InvokeMethod, which
159returns a bool indicating whether or not the method was found
160in the hash map, and has 4 parameters. The first parameter is
161the name of the method you wish to call, the second is the first
fdbd931b 162parameter passed to the wxShadowObjectMethod, the third is the
e6d67b57
VZ
163second parameter passed to that wxShadowObjectMethod, and the
164fourth is the return value of the wxShadowObjectMethod.
165
d69f7c58 1666. version-script.in
e6d67b57
VZ
167--------------------
168
169For ld/libtool we use sun-style version scripts. Basically
d69f7c58 170anything which fits the conditions of being #if'ed via wxABI_VERSION
e6d67b57
VZ
171needs to go here also.
172
6afac89e
MW
173See 'info ld scripts version' on a GNU system, it's online here:
174http://www.gnu.org/software/binutils/manual/ld-2.9.1/html_node/ld_25.html
175
176Or see chapter 5 of the 'Linker and Libraries Guide' for Solaris, available
177online here:
178http://docsun.cites.uiuc.edu/sun_docs/C/solaris_9/SUNWdev/LLM/p1.html
179
e6d67b57
VZ
180The file has the layout as follows:
181
182@WX_VERSION_TAG@.X
183
184Where X is the current Release as mentioned earlier, i.e. 2. This
185is following by an opening bracket "{", followed by "global:",
6afac89e 186followed by patterns matching added symbols, then followed by "}", and then
fdbd931b 187the file is either followed by earlier Releases or ended by
e6d67b57
VZ
188a @WX_VERSION_TAG@ block without the period or Release.
189
6afac89e
MW
190The patterns used to specify added symbols are globbing patters and can
191contain wildcards such as '*'.
192
193For example for a new class member such as:
194 wxFont wxGenericListCtrl::GetItemFont( long item ) const;
195
196the mangled symbol might be:
197 _ZNK17wxGenericListCtrl11GetItemFontEl
198
199so a line like this could be added to version-script.in:
200 *wxGenericListCtrl*GetItemFont*;
201
202Allow for the fact that the name mangling is going to vary from compiler to
203complier.
204
205When adding a class you can match all the symbols it adds with a single
206pattern, so long as that pattern is not likely to also match other symbols.
207For example for wxLogBuffer a line like this:
208 *wxLogBuffer*;
209
210
d69f7c58
VZ
2117. Checking the version information in libraries and programs
212-------------------------------------------------------------
6afac89e
MW
213
214On Sun there is a tool for this, see pvs(1). On GNU you can use objdump, below
215are some examples.
216
217To see what versions of each library a program (or library) depends on:
218
219$ objdump -p widgets | sed -ne '/Version References/,/^$/p'
220Version References:
221 required from libgcc_s.so.1:
222 0x0b792650 0x00 10 GCC_3.0
223 required from libwx_based-2.6.so.0:
224 0x0cca2546 0x00 07 WXD_2.6
225 required from libstdc++.so.6:
226 0x056bafd3 0x00 09 CXXABI_1.3
227 0x08922974 0x00 06 GLIBCXX_3.4
228 required from libwx_gtk2d_core-2.6.so.0:
229 0x0a2545d2 0x00 08 WXD_2.6.2
230 0x0cca2546 0x00 05 WXD_2.6
231 required from libc.so.6:
232 0x09691a75 0x00 04 GLIBC_2.2.5
233
234To see what WXD_2.6.2 symbols a program uses:
235
236$ objdump -T widgets | grep 'WXD_2\.6\.2'
2370000000000000000 g DO *ABS* 0000000000000000 WXD_2.6.2 WXD_2.6.2
23800000000004126d8 DF *UND* 0000000000000177 WXD_2.6.2 _ZN19wxTopLevelWindowGTK20RequestUserAttentionEi
239
240To see what WXD_2.6.2 symbols a library defines:
241
242$ objdump -T libwx_based-2.6.so | grep 'WXD_2\.6\.2' | grep -v 'UND\|ABS'
2430000000000259a10 w DO .data 0000000000000018 WXD_2.6.2 _ZTI19wxMessageOutputBest
24400000000002599e0 w DO .data 0000000000000028 WXD_2.6.2 _ZTV19wxMessageOutputBest
245000000000010a98e w DF .text 000000000000003e WXD_2.6.2 _ZN19wxMessageOutputBestD0Ev
2460000000000114efb w DO .rodata 000000000000000e WXD_2.6.2 _ZTS11wxLogBuffer
2470000000000255590 w DO .data 0000000000000018 WXD_2.6.2 _ZTI11wxLogBuffer
248000000000011b550 w DO .rodata 0000000000000016 WXD_2.6.2 _ZTS19wxMessageOutputBest
24900000000000bfcc8 g DF .text 00000000000000dd WXD_2.6.2 _ZN11wxLogBuffer5DoLogEmPKcl
250000000000010a3a6 g DF .text 0000000000000153 WXD_2.6.2 _ZN19wxMessageOutputBest6PrintfEPKcz
25100000000000c0b22 w DF .text 000000000000004b WXD_2.6.2 _ZN11wxLogBufferD0Ev
25200000000000bfc3e g DF .text 0000000000000089 WXD_2.6.2 _ZN11wxLogBuffer5FlushEv
25300000000000c0ad6 w DF .text 000000000000004b WXD_2.6.2 _ZN11wxLogBufferD1Ev
25400000000000b1130 w DF .text 0000000000000036 WXD_2.6.2 _ZN11wxLogBufferC1Ev
25500000000000c095c w DF .text 0000000000000029 WXD_2.6.2 _ZN19wxMessageOutputBestC1Ev
25600000000000c08e8 w DF .text 000000000000003e WXD_2.6.2 _ZN19wxMessageOutputBestD1Ev
25700000000002554c0 w DO .data 0000000000000038 WXD_2.6.2 _ZTV11wxLogBuffer
25800000000000bfda6 g DF .text 0000000000000036 WXD_2.6.2 _ZN11wxLogBuffer11DoLogStringEPKcl
25900000000000abe10 g DF .text 0000000000000088 WXD_2.6.2 _ZN14wxZipFSHandler7CleanupEv
e6d67b57 260
e6d67b57 261
d69f7c58 2628. Testing binary compatibility between releases
e6d67b57
VZ
263------------------------------------------------
264
d69f7c58 265An easy way of testing binary compatibility is just to build wxWidgets
e6d67b57
VZ
266in dll/dynamic library mode and then switch out the current library
267in question with an earlier stable version of the library, then running
268the application in question again. If it runs OK then there is usually
d69f7c58 269binary compatibility between those releases.
e6d67b57
VZ
270
271You can also break into your debugger or whatever program you want
272to use and check the memory layout of the class. If it is the same
d69f7c58 273then it is binary compatible.
d075fb7a
FM
274(In GDB the command x/d will show addresses as pointers to functions if
275possible so you can see if the order of the functions in vtbl doesn't change.)
276
277Another way to check for binary compatibility is to build wxWidgets in shared mode
278and use the 'abicheck.sh --generate' script before doing your changes to generate
279the current ABI (if the 'expected_abi' file is not already in the repo).
280Then rebuild wxWidgets with your changes and use 'abicheck.sh' to compare the
281resulting ABI with the expected one.
282Note that the abicheck.sh script is in the "lib" folder.
172f04f5 283
e6d67b57
VZ
284
285=== EOF ===
286
287Author: RN