1 <chapter id="winelib-introduction">
2 <title id="introduction.title">Winelib Introduction</title>
5 <title>What is Winelib?</title>
8 Winelib is a development toolkit which allows you to compile your
9 Windows applications on Unix.
12 Most of Winelib's code consists of the Win32 API implementation.
13 Fortunately this part is 100 percent shared with Wine. The remainder
14 consists of Windows compatible headers and tools like the resource
15 compiler (and even these are used when compiling Wine).
18 Thanks to the above, Winelib supports most C and C++ 32bit source code,
19 resource and message files, and can generate graphical or console
20 applications as well as dynamic libraries.
23 What is not supported is 16bit source code as the types it depends on
24 (especially segmented pointers) are not supported by Unix compilers.
25 Also missing are some of the more exotic features of Microsoft's
26 compiler like native COM support and structured exception handling.
27 So you may need to perform some modifications in your code when
28 recompiling your application with Winelib. This guide is here to help
32 What you gain by recompiling your application with Winelib is the
33 ability to make calls to Unix APIs, directly from your
34 Windows source code. This allows for a better integration with the
35 Unix environment than is allowed by runnning an unmodified Windows
36 application running in Wine. Another benefit is that a Winelib
37 application can relatively easily be recompiled on a non-Intel
38 architecture and run there without the need for a slow software
39 emulation of the processor.
43 <sect1 id="winelib-requirements">
44 <title id="requirements.title">System requirements</title>
46 The requirements for Winelib are similar to those for Wine.
49 Basically if you can run Wine on your computer then you can run
50 Winelib. But the converse is not true. You can also build Winelib
51 and Winelib applications on platforms not supported by Wine,
52 typically platforms with a non i386 processor. But this is still
53 pretty much an uncharted territory. It would be more reasonable to
54 first target one of the more mundane i386-based platforms first.
57 The main difference is that the compiler becomes much more important.
58 It is highly recommended that you use gcc, g++,
59 and the GNU binutils. The more recent your gcc compiler the better.
60 For any serious amount of code you should not consider anything older
61 than gcc 2.95.2. The latest gcc snapshots contain some useful bug
62 fixes and much better support for anonymous structs and unions. This
63 can help reduce the number of changes you have to do in your code but
64 these are not stable releases of the compiler so you may not want to
65 use them in production.
69 <sect1 id="winelib-getting-started">
70 <title id="getting-started.title">Getting Started</title>
72 <sect2 id="winemaker-introduction">
73 <title id="winemaker-introduction.title">Winemaker introduction</title>
75 So what is needed to compile a Windows application with Winelib?
76 Well, it really depends on the complexity of your application but
77 here are some issues that are shared by all applications:
82 the case of your files may be bad. For example they could be
83 in all caps: <filename>HELLO.C</filename>. It's not very nice to
84 work with and probably not what you intended.
89 then the case of the filenames in your include statements may be
90 wrong: maybe they include 'Windows.h' instead of 'windows.h'.
95 your include statements may use '\' instead of '/'. '\' is not
96 recognized by Unix compilers while '/' is recognized in both
102 you will need to perform the usual Dos to Unix text file conversion
103 otherwise you'll get in trouble when the compiler considers that
104 your '\' is not at the end of the line since it is followed by a
105 pesky carriage return.
110 you will have to write new makefiles.
116 The best way to take care of all these issues is to use winemaker.
119 Winemaker is a perl script which is designed to help you bootstrap
120 the conversion of your Windows projects to Winelib. In order to do
121 this it will go analyze your code, fixing the issues listed above
122 and generate autoconf-based Makefiles.
125 Let's suppose that Wine/Winelib has been installed in the
126 <filename class="Directory">/usr/local/wine</filename>
127 directory, and that you are already in the top directory of your
128 sources. Then converting your project to Winelib may be as simple
129 as just running the three commands below:
132 $ winemaker --lower-uppercase .
133 $ ./configure --with-wine=/usr/local/wine
138 But of course things are not always that simple which is why we have
143 <sect2 id="winemaker-guide">
144 <title id="winemaker-guide.title">Step by step guide</title>
147 Let's retrace the steps above in more details.
151 <term><option>Getting the source</option></term>
154 First if you can try to get the sources together with the
155 executables/libraries that they build. In the current state of
156 winemaker having these around can help it guess what it is that
157 your project is trying to build. Later, when it is able to
158 understand Visual C++ projects, and if you use them, this will
159 no longer be necessary. Usually the executables and libraries
160 are in a <filename class="Directory">Release</filename> or
161 <filename class="Directory">Debug</filename> subdirectory of the
162 directory where the sources are. So it's best if you can
163 transfer the source files and either of these directories to
164 Linux. Note that you don't need to transfer the
165 <filename>.obj</filename>, <filename>.pch</filename>,
166 <filename>.sbr</filename> and other files that also reside in
167 these directories; especially as they tend to be quite big.
172 <term><option>cd <root_dir></option></term>
175 Then go to the root directory where are your source files.
176 Winemaker can deal with a whole directory hierarchy at once so
177 you don't need to go into a leaf directory, quite the contrary.
178 Winemaker will automatically generate makefiles in each
179 directory where one is required, and will generate a global
180 makefile so that you can rebuild all your executables and
181 libraries with a single <command>make</command> command.
186 <term><option>Making the source writable</option></term>
189 Then make sure you have write access to your sources. It may
190 sound obvious, but if you copied your source files from a
191 CD-ROM or if they are in Source Safe on Windows, chances are
192 that they will be read-only.
193 But Winemaker needs write access so that it can fix them. You
194 can arrange that by running <command>chmod -R u+w .</command>.
195 Also you will want to make sure that you have a backup copy of
196 your sources in case something went horribly wrong, or more
197 likely, just for reference at a later point. If you use a
198 version control system you're already covered.
201 If you have already modified your source files and you want
202 to make sure that winemaker will not make further changes to
203 them then you can use the --nosource-fix option to protect
209 <term><option>Running winemaker</option></term>
212 Then you'll run winemaker. Here are the options you will most
217 <term><option>--lower-uppercase</option></term>
218 <term><option>--lower-all</option></term>
221 These options specify how to deal with files, and
222 directories, that have an 'incorrect' case.
223 <option>--lower-uppercase</option> specifies they should
224 only be renamed if their name is all uppercase. So files
225 that have a mixed case, like 'Hello.c' would not be
226 renamed. <option>--lower-all</option> will rename any
227 file. If neither is specified then no file or directory
228 will be renamed, almost. As you will see
229 <link linkend="renaming">later</link> winemaker may
230 still have to rename some files.
235 <term><option>--nobackup</option></term>
238 Winemaker normally makes a backup of all the files in which
239 it does more than the standard Dos to Unix conversion.
240 But if you already have (handy) copies of these files
241 elsewhere you may not need these so you should use this
247 <term><option>--dll</option></term>
248 <term><option>--console</option></term>
251 These option lets winemaker know what kind of target you are
252 building. If you have the windows library in your source
253 hierarchy then you should not need to specify
254 <option>--dll</option>. But if you have console executables
255 then you will need to use the corresponding option.
260 <term><option>--mfc</option></term>
263 This option tells winemaker that you are building an MFC
269 <term><option>-Dmacro[=defn]</option></term>
270 <term><option>-Idir</option></term>
271 <term><option>-Ldir</option></term>
272 <term><option>-idll</option></term>
273 <term><option>-llibrary</option></term>
276 The <option>-i</option> specifies a Winelib library to
277 import via the <link linkend="spec-file">spec file</>
278 mechanism. Contrast this with the <option>-l</option>
279 which specifies a Unix library to link with. The other
280 options work the same way they would with a C
281 compiler. All are applied to all the targets found.
282 When specifying a directory with either
283 <option>-I</option> or <option>-L</option>, winemaker
284 will prefix a relative path with
285 <literal>$(TOPDIRECTORY)/</literal> so that it is valid
286 from any of the source directories. You can also use a
287 variable in the path yourself if you wish (but don't
288 forget to escape the '$'). For instance you could specify
289 <literal>-I\$(WINELIB_INCLUDE_ROOT)/msvcrt</literal>.
295 So your command may finally look like:
296 <literal>winemaker --lower-uppercase -Imylib/include .</literal>
301 <term id="renaming"><option>File renaming</option></term>
304 When you execute winemaker it will first rename files to bring
305 their character case in line with your expectations and so that they can
306 be processed by the makefiles. This later category implies that
307 files with a non lowercase extension will be renamed so that the
308 extension is in lowercase. So, for instance,
309 <filename>HELLO.C</filename> will be renamed to
310 <filename>HELLO.c</filename>. Also if a file or directory name
311 contains a space or a dollar, then this
312 character will be replaced with an underscore. This is because
313 these characters cause problems with current versions of autoconf
314 (2.13) and make (3.79).
319 <term><option>Source modifications and makefile generation</option></term>
322 winemaker will then proceed to modify the source files so that
323 they will compile more readily with Winelib. As it does so it
324 may print warnings when it has to make a guess or identifies a
325 construct that it cannot correct. Finally it will generate the
326 autoconf-based makefiles. Once all this is done you can review
327 the changes that winemaker did to your files by using
328 <command>diff -uw</command>. For instance:
329 <command>diff -uw hello.c.bak hello.c</command>
334 <term><option>Running the configure script</option></term>
337 Before you run <command>make</command> you must run the
338 autoconf <command>configure</command> script. The goal of this
339 step is to analyze your system and generate customized
340 makefiles from the <filename>Makefile.in</filename> files. This
341 is also when you have to tell where Winelib resides on your
342 system. If wine is installed in a single directory or you have
343 the Wine sources compiled somewhere then you can just run
344 <command>./configure --with-wine=/usr/local/bin</command>
345 or <command>./configure --with-wine=~/wine</command>
351 <term><option>Running make</option></term>
354 This is a pretty simple step: just type <command>make</command>
355 and voila, you should have all your executables and libraries.
356 If this did not work out, then it means that you will have to
357 read this guide further to:
361 review the <filename>Makefile.in</filename> files to
362 adjust the default compilation and link options set by
363 winemaker. See the <xref linkend="source-analysis"
364 endterm="source-analysis.title"> section for some hints.
369 fix the portability issues in your sources. See
370 <xref linkend="portability-issues"
371 endterm="portability-issues.title"> for more details.
377 If you find yourself modifying the Makefile.in to specify the
378 location of the Wine header or library files then go back to
379 the previous step (the configure script) and use the various
380 --with-wine-* options to specify where they are.
389 <!-- Keep this comment at the end of the file
392 sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")