- Fix handling of text color.
[wine] / documentation / winelib-intro.sgml
1   <chapter id="winelib-introduction">
2     <title id="introduction.title">Winelib Introduction</title>
3
4     <sect1>
5       <title>What is Winelib?</title>
6
7       <para>
8         Winelib is a development toolkit which allows you to compile your 
9         Windows applications on Unix.
10       </para>
11       <para>
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).
16       </para>
17       <para>
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.
21       </para>
22       <para>
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 
29         you in this task.
30       </para>
31       <para>
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.
40       </para>
41     </sect1>
42
43     <sect1 id="winelib-requirements">
44       <title id="requirements.title">System requirements</title>
45       <para>
46         The requirements for Winelib are similar to those for Wine.
47       </para>
48       <para>
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.
55       </para>
56       <para>
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.
66       </para>
67     </sect1>
68
69     <sect1 id="winelib-getting-started">
70       <title id="getting-started.title">Getting Started</title>
71
72       <sect2 id="winemaker-introduction">
73         <title id="winemaker-introduction.title">Winemaker introduction</title>
74         <para>
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:
78         </para>
79         <itemizedlist>
80           <listitem>
81             <para>
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.
85             </para>
86           </listitem>
87           <listitem>
88             <para>
89               then the case of the filenames in your include statements may be 
90               wrong: maybe they include 'Windows.h' instead of 'windows.h'.
91             </para>
92           </listitem>
93           <listitem>
94             <para>
95               your include statements may use '\' instead of '/'. '\' is not 
96               recognized by Unix compilers while '/' is recognized in both 
97               environments.
98             </para>
99           </listitem>
100           <listitem>
101             <para>
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.
106             </para>
107           </listitem>
108           <listitem>
109             <para>
110               you will have to write new makefiles.
111             </para>
112           </listitem>
113         </itemizedlist>
114
115         <para>
116           The best way to take care of all these issues is to use winemaker.
117         </para>
118         <para>
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.
123         </para>
124         <para>
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:
130         </para>
131         <programlisting>
132           $ winemaker --lower-uppercase
133           $ ./configure --with-wine=/usr/local/wine
134           $ make
135         </programlisting>
136
137         <para>
138           But of course things are not always that simple which is why we have 
139           this guide at all.
140         </para>
141       </sect2>
142
143       <sect2 id="winemaker-guide">
144         <title id="winemaker-guide.title">Step by step guide</title>
145
146         <para>
147           Let's retrace the steps above in more details.
148         </para>
149         <variablelist>
150           <varlistentry>
151             <term><option>Getting the source</option></term>
152             <listitem>
153               <para>
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.
168               </para>
169             </listitem>
170           </varlistentry>
171           <varlistentry>
172             <term><option>cd &lt;root_dir&gt;</option></term>
173             <listitem>
174               <para>
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.
182               </para>
183             </listitem>
184           </varlistentry>
185           <varlistentry>
186             <term><option>Making the source writable</option></term>
187             <listitem>
188               <para>
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.
199               </para>
200             </listitem>
201           </varlistentry>
202           <varlistentry>
203             <term><option>Running winemaker</option></term>
204             <listitem>
205               <para>
206                 Then you'll run winemaker. Here are the options you will most 
207                 likely want to use.
208               </para>
209               <variablelist>
210                 <varlistentry>
211                   <term><option>--lower-uppercase</option></term>
212                   <term><option>--lower-all</option></term>
213                   <listitem>
214                     <para>
215                       These options specify how to deal with files, and 
216                       directories, that have an 'incorrect' case. 
217                       <option>--lower-uppercase</option> specifies they should 
218                       only be renamed if their name is all uppercase. So files 
219                       that have a mixed case, like 'Hello.c' would not be 
220                       renamed. <option>--lower-all</option> will rename any 
221                       file. If neither is specified then no file or directory 
222                       will be renamed, almost. As you will see 
223                       <link linkend="renaming">later</link> winemaker may 
224                       still have to rename some files.
225                     </para>
226                   </listitem>
227                 </varlistentry>
228                 <varlistentry>
229                   <term><option>--nobackup</option></term>
230                   <listitem>
231                     <para>
232                       Winemaker normally makes a backup of all the files in which 
233                       it does more than the standard Dos to Unix conversion. 
234                       But if you already have (handy) copies of these files 
235                       elsewhere you may not need these so you should use this 
236                       option.
237                     </para>
238                   </listitem>
239                 </varlistentry>
240                 <varlistentry>
241                   <term><option>--dll</option></term>
242                   <term><option>--console</option></term>
243                   <listitem>
244                     <para>
245                       These option lets winemaker know what kind of target you are 
246                       building. If you have the windows library in your source 
247                       hierarchy then you should not need to specify 
248                       <option>--dll</option>. But if you have console executables 
249                       then you will need to use the corresponding option.
250                     </para>
251                   </listitem>
252                 </varlistentry>
253                 <varlistentry>
254                   <term><option>--mfc</option></term>
255                   <listitem>
256                     <para>
257                       This option tells winemaker that you are building an MFC 
258                       application/library.
259                     </para>
260                   </listitem>
261                 </varlistentry>
262                 <varlistentry>
263                   <term><option>-Dmacro[=defn]</option></term>
264                   <term><option>-Idir</option></term>
265                   <term><option>-Ldir</option></term>
266                   <term><option>-idll</option></term>
267                   <term><option>-llibrary</option></term>
268                   <listitem>
269                     <para>
270                       The <option>-i</option> specifies a Winelib library to 
271                       import via the <link linkend="spec-file">spec file</> 
272                       mechanism. Contrast this with the <option>-l</option> 
273                       which specifies a Unix library to link with. The other 
274                       options work the same way they would with a C 
275                       compiler. All are applied to all the targets found. 
276                       When specifying a directory with either 
277                       <option>-I</option> or <option>-L</option>, winemaker 
278                       will prefix a relative path with 
279                       <literal>$(TOPDIRECTORY)/</literal> so that it is valid 
280                       from any of the source directories. You can also use a 
281                       variable in the path yourself if you wish (but don't 
282                       forget to escape the '$'). For instance you could specify 
283                       <literal>-I\$(WINELIB_INCLUDE_ROOT)/msvcrt</literal>.
284                     </para>
285                   </listitem>
286                 </varlistentry>
287               </variablelist>
288               <para>
289                 So your command may finally look like:
290                 <literal>winemaker --lower-uppercase -Imylib/include</literal>
291               </para>
292             </listitem>
293           </varlistentry>
294           <varlistentry>
295             <term id="renaming"><option>File renaming</option></term>
296             <listitem>
297               <para>
298                 When you execute winemaker it will first rename files to bring 
299                 their character case in line with your expectations and so that they can 
300                 be processed by the makefiles. This later category implies that 
301                 files with a non lowercase extension will be renamed so that the 
302                 extension is in lowercase. So, for instance, 
303                 <filename>HELLO.C</filename> will be renamed to 
304                 <filename>HELLO.c</filename>. Also if a file or directory name 
305                 contains a space or a dollar, then this 
306                 character will be replaced with an underscore. This is because 
307                 these characters cause problems with current versions of autoconf 
308                 (2.13) and make (3.79).
309               </para>
310             </listitem>
311           </varlistentry>
312           <varlistentry>
313             <term><option>Source modifications and makefile generation</option></term>
314             <listitem>
315               <para>
316                 winemaker will then proceed to modify the source files so that 
317                 they will compile more readily with Winelib. As it does so it 
318                 may print warnings when it has to make a guess or identifies a 
319                 construct that it cannot correct. Finally it will generate the 
320                 autoconf-based makefiles. Once all this is done you can review 
321                 the changes that winemaker did to your files by using 
322                 <command>diff -uw</command>. For instance: 
323                 <command>diff -uw hello.c.bak hello.c</command>
324               </para>
325             </listitem>
326           </varlistentry>
327           <varlistentry>
328             <term><option>Running the configure script</option></term>
329             <listitem>
330               <para>
331                 Before you run <command>make</command> you must run the 
332                 autoconf <command>configure</command> script. The goal of this 
333                 step is to analyze your system and generate customized 
334                 makefiles from the <filename>Makefile.in</filename> files. This 
335                 is also when you have to tell where Winelib resides on your 
336                 system. If wine is installed in a single directory or you have 
337                 the Wine sources compiled somewhere then you can just run 
338                 <command>./configure --with-wine=/usr/local/bin</command> 
339                 or <command>./configure --with-wine=~/wine</command> 
340                 respectively.
341               </para>
342             </listitem>
343           </varlistentry>
344           <varlistentry>
345             <term><option>Running make</option></term>
346             <listitem>
347               <para>
348                 This is a pretty simple step: just type <command>make</command> 
349                 and voila, you should have all your executables and libraries. 
350                 If this did not work out, then it means that you will have to 
351                 read this guide further to:
352                 <itemizedlist>
353                   <listitem>
354                     <para>
355                       review the <filename>Makefile.in</filename> files to 
356                       adjust the default compilation and link options set by 
357                       winemaker. See the <xref linkend="source-analysis" 
358                                                endterm="source-analysis.title"> section for some hints.
359                     </para>
360                   </listitem>
361                   <listitem>
362                     <para>
363                       fix the portability issues in your sources. See 
364                       <xref linkend="portability-issues" 
365                             endterm="portability-issues.title"> for more details.
366                     </para>
367                   </listitem>
368                 </itemizedlist>
369               </para>
370             </listitem>
371           </varlistentry>
372         </variablelist>
373       </sect2>
374     </sect1>
375   </chapter>
376
377 <!-- Keep this comment at the end of the file
378 Local variables:
379 mode: sgml
380 sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
381 End:
382 -->