Move the documentation for 'ShowDirSymlinks' where it belongs: to the
[wine/gsoc_dplay.git] / documentation / winelib-toolkit.sgml
bloba91c4b324ecf75863c7533ebd57d50e18273af60
1 <chapter id="winelib-toolkit">
2 <title id="winelib-toolkit.title">The Winelib development toolkit</title>
4 <sect1 id="winemaker">
5 <title id="winemaker.title">Winemaker</title>
7 <sect2 id="vc-projects">
8 <title id="vc-projects.title">Support for Visual C++ projects</title>
9 <para>
10 Unfortunately Winemaker does not support the Visual C++ project
11 files, ...yet. Supporting Visual C++ project files (the
12 <filename>.dsp</filename> and some <filename>.mak</filename> files
13 for older versions of Visual C++) is definitely on
14 the list of important Winemaker improvements as it will allow it to
15 properly detect the defines to be used, any custom include path, the
16 list of libraries to link with, and exactly which source files to use
17 to build a specific target. All things that the current version of
18 Winemaker has to guess or that you have to tell it as will become
19 clear in the next section.
20 </para>
21 <para>
22 When the time comes Winemaker, and its associated build system, will
23 need some extensions to support:
24 </para>
25 <itemizedlist>
26 <listitem>
27 <para>
28 per file defines and include paths. Visual C++ projects allow
29 the user to specify compiler options for each individual file
30 being compiled. But this is probably not very frequent so it
31 might not be that important.
32 </para>
33 </listitem>
34 <listitem>
35 <para>
36 multiple configurations. Visual C++ projects usually have at
37 least a 'Debug' and a 'Release' configuration which are compiled
38 with different compiler options. How exactly we deal with these
39 configurations remains to be determined.
40 </para>
41 </listitem>
42 </itemizedlist>
43 </sect2>
45 <sect2 id="source-analysis">
46 <title id="source-analysis.title">Winemaker's source analysis</title>
47 <para>
48 Winemaker can do its work even without a Windows makefile or a
49 Visual Studio project to start from (it would not know what to do
50 with a windows makefile anyway). This involves doing many educated
51 guesses which may be wrong. But by and large it works. The purpose
52 of this section is to describe in more details how winemaker
53 proceeds so that you can better understand why it gets things
54 wrong and how to fix it/avoid it.
55 </para>
56 <para>
57 At the core winemaker does a recursive traversal of
58 your source tree looking for targets (things to build) and source
59 files. Let's start with the targets.
60 </para>
61 <para>
62 First are executables and dlls. Each time it finds one of these in
63 a directory, winemaker puts it in the list of things to build and
64 will later generate a <filename>Makefile.in</filename> file in this
65 directory. Note that Winemaker also knows about the commonly used
66 <filename>Release</filename> and <filename>Debug</filename>
67 directories, so it will attribute the executables and libraries
68 found in these to their parent directory. When it finds an
69 executable or a dll winemaker is happy because these give it more
70 information than the other cases described below.
71 </para>
72 <para>
73 If it does not find any executable or dll winemaker will look for
74 files with a <filename>.mak</filename> extension. If they are not
75 disguised Visual C++ projects (and currently even if they are),
76 winemaker will assume that a target by that name should be built
77 in this directory. But it will not know whether this target is an
78 executable or a library. So it will assume it is of the default
79 type, i.e. a graphical application, which you can override by using
80 the <option>--cuiexe</option> and <option>--dll</option> options.
81 </para>
82 <para>
83 Finally winemaker will check to see if there is a file called
84 <filename>makefile</filename>. If there is, then it will assume
85 that there is exactly one target to build for this directory. But
86 it will not know the name or type of this target. For the type it
87 will do as in the above case. And for the name it will use the
88 directory's name. Actually, if the directory starts with
89 <filename>src</filename> winemaker will try to make use of the name
90 of the parent directory instead.
91 </para>
92 <para>
93 Once the target list for a directory has been established,
94 winemaker will check whether it contains a mix of executables and
95 libraries. If it is so, then winemaker will make it so that each
96 executable is linked with all the libraries of that directory.
97 </para>
98 <para>
99 If the previous two steps don't produce the expected results (or
100 you think they will not) then you should put winemaker in
101 interactive mode (see <xref linkend="interactive"
102 endterm="interactive.title">). This will allow you to specify the
103 target list (and more) for each directory.
104 </para>
105 <para>
106 In each directory winemaker also looks for source files: C, C++
107 or resource files. If it also found targets to build in this
108 directory it will then try to assign each source file to one of
109 these targets based on their names. Source files that do not seem
110 to match any specific target are put in a global list for this
111 directory, see the <literal>EXTRA_xxx</literal> variables in the
112 <filename>Makefile.in</filename>, and linked with each of the
113 targets. The assumption here is that these source files contain
114 common code which is shared by all the targets.
115 If no targets were found in the directory where these files are
116 located, then they are assigned to the parent's directory. So if a
117 target is found in the parent directory it will also 'inherit' the
118 source files found in its subdirectories.
119 </para>
120 <para>
121 Finally winemaker also looks for more exotic files like
122 <filename>.h</filename> headers, <filename>.inl</filename> files
123 containing inline functions and a few others. These are not put in
124 the regular source file lists since they are not compiled directly.
125 But winemaker will still remember them so that they are processed
126 when the time comes to fix the source files.
127 </para>
128 <para>
129 Fixing the source files is done as soon as winemaker has finished
130 its recursive directory traversal. The two main tasks in this step
131 are fixing the CRLF issues and verifying the case of the include
132 statements.
133 </para>
134 <para>
135 Winemaker makes a backup of each source file (in such a way that
136 symbolic links are preserved), then reads it fixing the CRLF
137 issues and the other issues as it goes. Once it has finished
138 working on a file it checks whether it has done any non
139 CRLF-related modification and deletes the backup file if it did
140 not (or if you used <option>--nobackup</option>).
141 </para>
142 <para>
143 Checking the case of the include statements (of any form,
144 including files referenced by resource files), is done in the
145 context of that source file's project. This way winemaker can use
146 the proper include path when looking for the file that is included.
147 If winemaker fails to find a file in any of the directories of the
148 include path, it will rename it to lowercase on the basis that it
149 is most likely a system header and that all system headers names
150 are lowercase (this can be overriden by using
151 <option>--nolower-include</option>).
152 </para>
153 <para>
154 Finally winemaker generates the <filename>Makefile.in</filename>
155 files and other support files (wrapper files, spec files,
156 <filename>configure.in</filename>,
157 <filename>Make.rules.in</filename>). From the above description
158 you can guess at the items that winemaker may get wrong in
159 this phase: macro definitions, include path, dll path, dlls to
160 import, library path, libraries to link with. You can deal with
161 these issues by using winemaker's <option>-D</>, <option>-P</>,
162 <option>-i</>, <option>-I</>, <option>-L</> and <option>-l</>
163 options if they are
164 homogeneous enough between all your targets. Otherwise you may
165 want to use winemaker's <link linkend="interactive">interactive
166 mode</link> so that you can specify different settings for each
167 project / target.
168 </para>
169 <para>
170 For instance, one of the problems you are likely to encounter is
171 that of the <varname>STRICT</varname> macro. Some programs will
172 not compile if <varname>STRICT</varname> is not turned on, and
173 others will not compile if it is. Fortunately all the files in a
174 given source tree use the same setting so that all you have to do
175 is add <literal>-DSTRICT</literal> on winemaker's command line
176 or in the <filename>Makefile.in</filename> file(s).
177 </para>
178 <para>
179 Finally the most likely reasons for missing or duplicate symbols
180 are:
181 </para>
182 <itemizedlist>
183 <listitem>
184 <para>
185 The target is not importing the right set of dlls, or is not
186 being linked with the right set of libraries. You can avoid
187 this by using winemaker's <option>-P</>, <option>-i</>,
188 <option>-L</option> and <option>-l</> options or adding these
189 dlls and libraries to the <filename>Makefile.in</> file.
190 </para>
191 </listitem>
192 <listitem>
193 <para>
194 Maybe you have multiple targets in a single directory and
195 winemaker guessed wrong when trying to match the source files
196 with the targets. The only way to fix this kind of problem is
197 to edit the <filename>Makefile.in</filename> file manually.
198 </para>
199 </listitem>
200 <listitem>
201 <para>
202 Winemaker assumes you have organized your source files
203 hierarchically. If a target uses source files that are in a
204 sibling directory, e.g. if you link with
205 <filename>../hello/world.o</filename> then you will get missing
206 symbols. Again the only solution is to manually edit the
207 <filename>Makefile.in</filename> file.
208 </para>
209 </listitem>
210 </itemizedlist>
211 </sect2>
213 <sect2 id="interactive">
214 <title id="interactive.title">The interactive mode</title>
215 <para>
216 what is it,
217 when to use it,
218 how to use it
219 </para>
220 </sect2>
222 <sect2 id="Makefile.in">
223 <title id="Makefile.in.title">The Makefile.in files</title>
224 <para>
225 The <filename>Makefile.in</filename> is your makefile. More
226 precisely it is the template from which the actual makefile will
227 be generated by the <filename>configure</filename> script. It also
228 relies on the <filename>Make.rules</filename> file for most of
229 the actual logic. This way it only contains a relatively simple
230 description of what needs to be built, not the complex logic of
231 how things are actually built.
232 </para>
233 <para>
234 So this is the file to modify if you want to customize things.
235 Here's a detailed description of its content:
236 </para>
237 <programlisting>
238 ### Generic autoconf variables
240 TOPSRCDIR = @top_srcdir@
241 TOPOBJDIR = .
242 SRCDIR = @srcdir@
243 VPATH = @srcdir@
244 </programlisting>
245 <para>
246 The above is part of the standard autoconf boiler-plate. These
247 variables make it possible to have per-architecture directories for
248 compiled files and other similar goodies (But note that this kind
249 of functionality has not been tested with winemaker generated
250 <filename>Makefile.in</filename> files yet).
251 </para>
252 <programlisting>
253 SUBDIRS =
254 DLLS =
255 EXES = hello
256 </programlisting>
257 <para>
258 This is where the targets for this directory are listed. The names
259 are pretty self-explanatory. <varname>SUBDIRS</varname> is usually
260 only present in the top-level makefile. For libraries you should
261 put the full Unix name, e.g. <literal>libfoo.so</literal>.
262 </para>
263 <programlisting>
264 ### Global settings
266 DEFINES = -DSTRICT
267 INCLUDE_PATH =
268 LIBRARY_PATH =
269 LIBRARIES =
270 </programlisting>
271 <para>
272 This section contains the global compilation settings: they apply
273 to all the targets in this makefile. The <varname>LIBRARIES</varname>
274 variable allows you to specify additional Unix libraries to link with.
275 Note that you would normally not specify Winelib libraries there. To
276 link with a Winelib library, one uses the 'import' statement of the
277 <link linkend="spec-file">spec files</link>. The exception is when you
278 have not explicitly exported the functions of a Winelib library. One
279 library you are likely to find here is <literal>mfc</literal> (note,
280 the '-l' is omitted).
281 </para>
282 <para>
283 The other variable
284 names should be self-explanatory. You can also use three additional
285 variables that are usually not present in the file:
286 <varname>CEXTRA</varname>, <varname>CXXEXTRA</varname> and
287 <varname>WRCEXTRA</varname> which allow you to specify additional
288 flags for, respectively, the C compiler, the C++ compiler and the
289 resource compiler. Finally note that all these variable contain
290 the option's name except <varname>IMPORTS</varname>. So you should
291 put <literal>-DSTRICT</literal> in <varname>DEFINES</varname> but
292 <literal>winmm</literal> in <varname>IMPORTS</varname>.
293 </para>
294 <para>
295 Then come one section per target, each describing the various
296 components that target is made of.
297 </para>
298 <programlisting>
299 ### hello sources and settings
301 hello_C_SRCS = hello.c
302 hello_CXX_SRCS =
303 hello_RC_SRCS =
304 hello_SPEC_SRCS = hello.spec
305 </programlisting>
306 <para>
307 Each section will start with a comment indicating the name of the
308 target. Then come a series of variables prefixed with the name of
309 that target. Note that the name of the prefix may be slightly
310 different from that of the target because of restrictions on the
311 variable names.
312 </para>
313 <para>
314 The above variables list the sources that are used togenerate the
315 target. Note that there should only be one resource file in
316 <varname>RC_SRCS</varname>, and that <varname>SPEC_SRCS</varname>
317 will always contain a single spec file.
318 </para>
319 <programlisting>
320 hello_LIBRARY_PATH =
321 hello_LIBRARIES =
322 hello_DEPENDS =
323 </programlisting>
324 <para>
325 The above variables specify how to link the target. Note that they
326 add to the global settings we saw at the beginning of this file.
327 </para>
328 <para>
329 <varname>DEPENDS</varname>, when present, specifies a list of other
330 targets that this target depends on. Winemaker will automatically
331 fill this field, and the <varname>LIBRARIES</varname> field, when an
332 executable and a library are built in the same directory.
333 </para>
334 <para>
335 The reason why winemaker also links with libraries in the Unix sense
336 in the case above is because functions will not be properly exported.
337 Once you have exported all the functions in the library's spec file
338 you should remove them from the <varname>LIBRARIES</varname> field.
339 </para>
340 <programlisting>
341 hello_OBJS = $(hello_C_SRCS:.c=.o) \
342 $(hello_CXX_SRCS:.cpp=.o) \
343 $(EXTRA_OBJS)
344 </programlisting>
345 <para>
346 The above just builds a list of all the object files that
347 correspond to this target. This list is later used for the link
348 command.
349 </para>
350 <programlisting>
351 ### Global source lists
353 C_SRCS = $(hello_C_SRCS)
354 CXX_SRCS = $(hello_CXX_SRCS)
355 RC_SRCS = $(hello_RC_SRCS)
356 SPEC_SRCS = $(hello_SPEC_SRCS)
357 </programlisting>
358 <para>
359 This section builds 'summary' lists of source files. These lists are
360 used by the <filename>Make.rules</filename> file.
361 </para>
362 <programlisting>
363 ### Generic autoconf targets
365 all: $(DLLS) $(EXES:%=%.so)
367 @MAKE_RULES@
369 install::
370 for i in $(EXES); do $(INSTALL_PROGRAM) $$i $(bindir); done
371 for i in $(EXES:%=%.so) $(DLLS); do $(INSTALL_LIBRARY) $$i $(libdir); done
373 uninstall::
374 for i in $(EXES); do $(RM) $(bindir)/$$i;done
375 for i in $(EXES:%=%.so) $(DLLS); do $(RM) $(libdir)/$$i;done
376 </programlisting>
377 <para>
378 The above first defines the default target for this makefile. Here
379 it consists in trying to build all the targets. Then it includes
380 the <filename>Make.rules</filename> file which contains the build
381 logic, and provides a few more standard targets to install /
382 uninstall the targets.
383 </para>
384 <programlisting>
385 ### Target specific build rules
387 $(hello_SPEC_SRCS:.spec=.tmp.o): $(hello_OBJS)
388 $(LDCOMBINE) $(hello_OBJS) -o $@
389 -$(STRIP) $(STRIPFLAGS) $@
391 $(hello_SPEC_SRCS:.spec=.spec.c): $(hello_SPEC_SRCS:.spec) $(hello_SPEC_SRCS:.spec=.tmp.o) $(hello_RC_SRCS:.rc=.res)
392 $(WINEBUILD) -fPIC $(hello_LIBRARY_PATH) $(WINE_LIBRARY_PATH) -sym $(hello_SPEC_SRCS:.spec=.tmp.o) -o $@ -spec $(hello_SPEC_SRCS)
394 hello.so: $(hello_SPEC_SRCS:.spec=.spec.o) $(hello_OBJS) $(hello_DEP
395 ENDS)
396 $(LDSHARED) $(LDDLLFLAGS) -o $@ $(hello_OBJS) $(hello_SPEC_SRCS:.spec=.spec.o) $(hello_LIBRARY_PATH) $(hello_LIBRARIES:%=-l%) $(DLL_LINK) $(LIBS)
397 test -f hello || $(LN_S) $(WINE) hello
398 </programlisting>
399 <para>
400 Then come additional directives to link the executables and
401 libraries. These are pretty much standard and you should not need
402 to modify them.
403 </para>
404 </sect2>
406 <sect2 id="Make.rules.in">
407 <title id="Make.rules.in.title">The Make.rules.in file</title>
408 <para>
409 What's in the Make.rules.in...
410 </para>
411 </sect2>
413 <sect2 id="configure.in">
414 <title id="configure.in.title">The configure.in file</title>
415 <para>
416 What's in the configure.in...
417 </para>
418 </sect2>
419 </sect1>
421 <sect1 id="wrc">
422 <title id="wrc.title">Compiling resource files: WRC</title>
423 <para>
424 To compile resources you should use the Wine Resource Compiler,
425 wrc for short, which produces a binary <filename>.res</filename>
426 file. This resource file is then used by winebuild when compiling
427 the spec file (see <xref linkend="spec-file"
428 endterm="spec-file.title">).
429 </para>
430 <para>
431 Again the makefiles generated by winemaker take care of this for you.
432 But if you were to write your own makefile you would put something
433 like the following:
434 </para>
435 <programlisting>
436 WRC=$(WINE_DIR)/tools/wrc/wrc
438 WINELIB_FLAGS = -I$(WINE_DIR)/include -DWINELIB -D_REENTRANT
439 WRCFLAGS = -r -L
441 .SUFFIXES: .rc .res
443 .rc.res:
444 $(WRC) $(WRCFLAGS) $(WINELIB_FLAGS) -o $@ $<
445 </programlisting>
446 <para>
447 There are two issues you are likely to encounter with resource files.
448 </para>
449 <para>
450 The first problem is with the C library headers. WRC does not know
451 where these headers are located. So if an RC file, of a file it
452 includes, references such a header you will get a 'file not found'
453 error from wrc. Here are a few ways to deal with this:
454 </para>
455 <itemizedlist>
456 <listitem>
457 <para>
458 The solution traditionally used by the Winelib headers is to
459 enclose the offending include statement in an
460 <literal>#ifndef RC_INVOKED</literal> statement where
461 <varname>RC_INVOKED</varname> is a macro name which is
462 automatically defined by wrc.
463 </para>
464 </listitem>
465 <listitem>
466 <para>
467 Alternately you can add one or more <option>-I</option> directive
468 to your wrc command so that it finds you system files. For
469 instance you may add <literal>-I/usr/include
470 -I/usr/lib/gcc-lib/i386-linux/2.95.2/include</literal> to cater
471 to both C and C++ headers. But this supposes that you know where
472 these header files reside which decreases the portability of your
473 makefiles to other platforms (unless you automatically detect all
474 the necessary directories in the autoconf script).
475 </para>
476 <para>
477 Or you could use the C/C++ compiler to perform the preprocessing.
478 To do so, simply modify your makefile as follows:
479 </para>
480 <programlisting>
481 .rc.res:
482 $(CC) $(CC_OPTS) -DRC_INVOKED -E -x c $< | $(WRC) -N $(WRCFLAGS) $(WINELIB_FLAGS) -o $@
484 </programlisting>
485 <!-- FIXME: does this still cause problems for the line numbers? -->
486 </listitem>
487 </itemizedlist>
488 <para>
489 The second problem is that the headers may contain constructs that
490 WRC fails to understand. A typical example is a function which return
491 a 'const' type. WRC expects a function to be two identifiers followed
492 by an opening parenthesis. With the const this is three identifiers
493 followed by a parenthesis and thus WRC is confused (note: WRC should
494 in fact ignore all this like the windows resource compiler does).
495 The current work-around is to enclose offending statement(s) in an
496 <literal>#ifndef RC_INVOKED</literal>.
497 </para>
499 <para>
500 Using GIF files in resources is problematic. For best results,
501 convert them to BMP and change your <filename>.res</filename>
502 file.
503 </para>
504 <para>
505 If you use common controls/dialogs in your resource files, you
506 will need to add <function>#include &lt;commctrl.h></function>
507 after the <function>#include &lt;windows.h></function> line,
508 so that <command>wrc</command> knows the values of control
509 specific flags.
510 </para>
511 </sect1>
513 <sect1 id="wmc">
514 <title id="wmc.title">Compiling message files: WMC</title>
515 <para>
516 how does one use it???
517 </para>
518 </sect1>
520 <sect1 id="spec-file">
521 <title id="spec-file.title">The Spec file</title>
523 <sect2 id="spec-intro">
524 <title id="spec-intro.title">Introduction</title>
525 <para>
526 In Windows the program's life starts either when its
527 <function>main</function> is called, for console applications, or
528 when its <function>WinMain</function> is called, for windows
529 applications in the 'windows' subsystem. On Unix it is always
530 <function>main</function> that is called. Furthermore in Winelib it
531 has some special tasks to accomplish, such as initializing Winelib,
532 that a normal <function>main</function> does not have to do.
533 </para>
534 <para>
535 Furthermore windows applications and libraries contain some
536 information which are necessary to make APIs such as
537 <function>GetProcAddress</function> work. So it is necessary to
538 duplicate these data structures in the Unix world to make these
539 same APIs work with Winelib applications and libraries.
540 </para>
541 <para>
542 The spec file is there to solve the semantic gap described above.
543 It provides the <function>main</function> function that initializes
544 Winelib and calls the module's <function>WinMain</function> /
545 <function>DllMain</function>, and it contains information about
546 each API exported from a Dll so that the appropriate tables can be
547 generated.
548 </para>
549 <para>
550 A typical spec file will look something like this:
551 </para>
552 <screen>
553 name hello
554 type win32
555 mode guiexe
556 init WinMain
557 rsrc resource.res
559 import winmm.dll
560 </screen>
561 <para>
562 And here are the entries you will probably want to change:
563 </para>
564 <variablelist>
565 <varlistentry>
566 <term>name</term>
567 <listitem>
568 <para>
569 This is the name of the Win32 module. Usually this is the
570 same as that of the application or library (but without the
571 'lib' and the '.so').
572 </para>
573 </listitem>
574 </varlistentry>
575 <varlistentry>
576 <term>mode</term>
577 <term>init</term>
578 <listitem>
579 <para>
580 <literal>mode</literal> defines whether what you are
581 building is a library, <literal>dll</literal>, a console
582 application, <literal>cuiexe</literal> or a regular
583 graphical application <literal>guiexe</literal>. Then
584 <literal>init</literal> defines what is the entry point of
585 that module. For a library this is customarily set to
586 <literal>DllMain</literal>, for a console application this
587 is <literal>main</literal> and for a graphical application
588 this is <literal>WinMain</literal>.
589 </para>
590 </listitem>
591 </varlistentry>
592 <varlistentry>
593 <term>import</term>
594 <listitem>
595 <para>
596 Add an 'import' statement for each library that this
597 executable depends on. If you don't, these libraries will
598 not get initialized in which case they may very well not
599 work (e.g. winmm).
600 </para>
601 </listitem>
602 </varlistentry>
603 <varlistentry>
604 <term>rsrc</term>
605 <listitem>
606 <para>
607 This item specifies the name of the compiled resource file
608 to link with your module. If your resource file is called
609 <filename>hello.rc</filename> then the wrc compilation step
610 (see <xref linkend="wrc" endterm="wrc.title">) will generate
611 a file called <filename>hello.res</filename>. This is the
612 name you must provide here. Note that because of this you
613 cannot compile the spec file before you have compiled the
614 resource file. So you should put a rule like the following
615 in your makefile:
616 </para>
617 <programlisting>
618 hello.spec.c: hello.res
619 </programlisting>
620 <para>
621 If your project does not have a resource file then you must
622 omit this entry altogether.
623 </para>
624 </listitem>
625 </varlistentry>
626 <varlistentry>
627 <term>@</term>
628 <listitem>
629 <para>
630 This entry is not shown above because it is not always
631 necessary. In fact it is only necessary to export functions
632 when you plan to dynamically load the library with
633 <function>LoadLibrary</function> and then do a
634 <function>GetProcAddress</function> on these functions.
635 This is not necessary if you just plan on linking with the
636 library and calling the functions normally. For more details
637 about this see: <xref linkend="spec-reference"
638 endterm="spec-reference.title">.
639 </para>
640 </listitem>
641 </varlistentry>
642 </variablelist>
643 </sect2>
645 <sect2 id="spec-compiling">
646 <title id="spec-compiling.title">Compiling it</title>
647 <note><para>
648 FIXME: This section is very outdated and does not correctly
649 describe the current use of winebuild and spec files. In
650 particular, with recent versions of winebuild most of the
651 information that used to be in the spec files is now specified on
652 the command line.
653 </para></note>
654 <para>
655 Compiling a spec file is a two step process. It is first
656 converted into a C file by winebuild, and then compiled into an
657 object file using your regular C compiler. This is all taken
658 care of by the winemaker generated makefiles of course. But
659 here's what it would like if you had to do it by hand:
660 </para>
661 <screen>
662 WINEBUILD=$(WINE_DIR)/tools/winebuild
664 .SUFFIXES: .spec .spec.c .spec.o
666 .spec.spec.c:
667 $(WINEBUILD) -fPIC -o $@ -spec $<
669 .spec.c.spec.o:
670 $(CC) -c -o $*.spec.o $<
671 </screen>
672 <para>
673 Nothing really complex there. Just don't forget the
674 <literal>.SUFFIXES</literal> statement, and beware of the tab if
675 you copy this straight to your Makefile.
676 </para>
677 </sect2>
679 <sect2 id="spec-reference">
680 <title id="spec-reference.title">More details</title>
681 <para>
682 (Extracted from tools/winebuild/README)
683 </para>
685 <para>
686 Here is a more detailed description of the spec file's format.
687 </para>
689 <programlisting>
690 # comment text
691 </programlisting>
692 <para>
693 Anything after a '#' will be ignored as comments.
694 </para>
696 <programlisting>
697 name NAME
698 type win16|win32 &lt;--- the |'s mean it's one or the other
699 </programlisting>
700 <para>
701 These two fields are mandatory. <literal>name</literal>
702 defines the name of your module and <literal>type</literal>
703 whether it is a Win16 or Win32 module. Note that for Winelib
704 you should only be using Win32 modules.
705 </para>
707 <programlisting>
708 file WINFILENAME
709 </programlisting>
710 <para>
711 This field is optional. It gives the name of the Windows file that
712 is replaced by the builtin. <literal>&lt;name&gt;.DLL</literal>
713 is assumed if none is given. This is important for kernel, which
714 lives in the Windows file <filename>KRNL386.EXE</filename>.
715 </para>
717 <programlisting>
718 heap SIZE
719 </programlisting>
720 <para>
721 This field is optional and specific to Win16 modules. It defines
722 the size of the module local heap. The default is no local heap.
723 </para>
725 <programlisting>
726 mode dll|cuiexe|guiexe
727 </programlisting>
728 <para>
729 This field is optional. It specifies specifies whether it is the
730 spec file for a dll or the main exe. This is only valid for Win32
731 spec files.
732 </para>
734 <programlisting>
735 init FUNCTION
736 </programlisting>
737 <para>
738 This field is optional and specific to Win32 modules. It
739 specifies a function which will be called when the dll is loaded
740 or the executable started.
741 </para>
743 <programlisting>
744 import DLL
745 </programlisting>
746 <para>
747 This field can be present zero or more times.
748 Each instance names a dll that this module depends on (only for
749 Win32 modules at the present).
750 </para>
752 <programlisting>
753 rsrc RES_FILE
754 </programlisting>
755 <para>
756 This field is optional. If present it specifies the name of the
757 .res file containing the compiled resources. See <xref
758 linkend="wrc" endterm="wrc.title"> for details on compiling a
759 resource file.
760 </para>
762 <programlisting>
763 ORDINAL VARTYPE EXPORTNAME (DATA [DATA [DATA [...]]])
764 2 byte Variable(-1 0xff 0 0)
765 </programlisting>
766 <para>
767 This field can be present zero or more times.
768 Each instance defines data storage at the ordinal specified. You
769 may store items as bytes, 16-bit words, or 32-bit words.
770 <literal>ORDINAL</literal> is replaced by the ordinal number
771 corresponding to the variable. <literal>VARTYPE</literal> should
772 be <literal>byte</literal>, <literal>word</literal> or
773 <literal>long</literal> for 8, 16, or 32 bits respectively.
774 <literal>EXPORTNAME</literal> will be the name available for
775 dynamic linking. <literal>DATA</literal> can be a decimal number
776 or a hex number preceeded by "0x". The example defines the
777 variable <literal>Variable</literal> at ordinal 2 and containing
778 4 bytes.
779 </para>
781 <programlisting>
782 ORDINAL equate EXPORTNAME DATA
783 </programlisting>
784 <para>
785 This field can be present zero or more times.
786 Each instance defines an ordinal as an absolute value.
787 <literal>ORDINAL</literal> is replaced by the ordinal number
788 corresponding to the variable. <literal>EXPORTNAME</literal> will
789 be the name available for dynamic linking.
790 <literal>DATA</literal> can be a decimal number or a hex number
791 preceeded by "0x".
792 </para>
794 <programlisting>
795 ORDINAL FUNCTYPE EXPORTNAME([ARGTYPE [ARGTYPE [...]]]) HANDLERNAME
796 100 pascal CreateWindow(ptr ptr long s_word s_word s_word s_word
797 word word word ptr)
798 WIN_CreateWindow
799 101 pascal GetFocus() WIN_GetFocus()
800 </programlisting>
801 <para>
802 This field can be present zero or more times.
803 Each instance defines a function entry point. The prototype
804 defined by <literal>EXPORTNAME ([ARGTYPE [ARGTYPE [...]]])</literal>
805 specifies the name available for dynamic linking and the format
806 of the arguments. <literal>ORDINAL</literal> is replaced
807 by the ordinal number corresponding to the function, or
808 <literal>@</literal> for automatic ordinal allocation (Win32 only).
809 </para>
810 <para>
811 <literal>FUNCTYPE</literal> should be one of:
812 </para>
813 <variablelist>
814 <varlistentry>
815 <term>pascal16</term>
816 <listitem><para>for a Win16 function returning a 16-bit value</para></listitem>
817 </varlistentry>
818 <varlistentry>
819 <term>pascal</term>
820 <listitem><para>for a Win16 function returning a 32-bit value</para></listitem>
821 </varlistentry>
822 <varlistentry>
823 <term>register</term>
824 <listitem><para>for a function using CPU register to pass arguments</para></listitem>
825 </varlistentry>
826 <varlistentry>
827 <term>interrupt</term>
828 <listitem><para>for a Win16 interrupt handler routine</para></listitem>
829 </varlistentry>
830 <varlistentry>
831 <term>stdcall</term>
832 <listitem><para>for a normal Win32 function</para></listitem>
833 </varlistentry>
834 <varlistentry>
835 <term>cdecl</term>
836 <listitem><para>for a Win32 function using the C calling convention</para></listitem>
837 </varlistentry>
838 <varlistentry>
839 <term>varargs</term>
840 <listitem><para>for a Win32 function taking a variable number of arguments</para></listitem>
841 </varlistentry>
842 </variablelist>
844 <para>
845 <literal>ARGTYPE</literal> should be one of:
846 </para>
847 <variablelist>
848 <varlistentry>
849 <term>word</term>
850 <listitem><para>for a 16 bit word</para></listitem>
851 </varlistentry>
852 <varlistentry>
853 <term>long</term>
854 <listitem><para>a 32 bit value</para></listitem>
855 </varlistentry>
856 <varlistentry>
857 <term>ptr</term>
858 <listitem><para>for a linear pointer</para></listitem>
859 </varlistentry>
860 <varlistentry>
861 <term>str</term>
862 <listitem><para>for a linear pointer to a null-terminated string</para></listitem>
863 </varlistentry>
864 <varlistentry>
865 <term>s_word</term>
866 <listitem><para>for a 16 bit signed word</para></listitem>
867 </varlistentry>
868 <varlistentry>
869 <term>segptr</term>
870 <listitem><para>for a segmented pointer</para></listitem>
871 </varlistentry>
872 <varlistentry>
873 <term>segstr</term>
874 <listitem><para>for a segmented pointer to a null-terminated string</para></listitem>
875 </varlistentry>
876 <varlistentry>
877 <term>wstr</term>
878 <listitem><para>for a linear pointer to a null-terminated wide
879 (16-bit Unicode) string</para></listitem>
880 </varlistentry>
881 </variablelist>
883 <para>
884 Only <literal>ptr</literal>, <literal>str</literal>,
885 <literal>wstr</literal> and
886 <literal>long</literal> are valid for Win32 functions.
887 <literal>HANDLERNAME</literal> is the name of the actual Wine
888 function that will process the request in 32-bit mode.
889 </para>
890 <para>
891 Strings should almost always map to str,
892 wide strings - wstr.
893 As the general rule it depends on whether the
894 parameter is IN, OUT or IN/OUT.
895 </para>
896 <itemizedlist>
897 <listitem>
898 <para>
899 IN: str/wstr
900 </para>
901 </listitem>
902 <listitem>
903 <para>
904 OUT: ptr
905 </para>
906 </listitem>
907 <listitem>
908 <para>
909 IN/OUT: str/wstr
910 </para>
911 </listitem>
912 </itemizedlist>
913 <para>
914 It is for debug messages. If the parameter is OUT
915 it might not be initialized as thus it should not
916 be printed as a string.
917 </para>
918 <para>
919 The two examples define an entry point for the
920 <function>CreateWindow</function> and <function>GetFocus</function>
921 calls respectively. The ordinals used are just examples.
922 </para>
923 <para>
924 To declare a function using a variable number of arguments in
925 Win16, specify the function as taking no arguments. The arguments
926 are then available with CURRENT_STACK16->args. In Win32, specify
927 the function as <literal>varargs</literal> and declare it with a
928 '...' parameter in the C file. See the wsprintf* functions in
929 <filename>user.spec</filename> and
930 <filename>user32.spec</filename> for an example.
931 </para>
933 <programlisting>
934 ORDINAL stub EXPORTNAME
935 </programlisting>
936 <para>
937 This field can be present zero or more times.
938 Each instance defines a stub function. It makes the ordinal
939 available for dynamic linking, but will terminate execution with
940 an error message if the function is ever called.
941 </para>
943 <programlisting>
944 ORDINAL extern EXPORTNAME SYMBOLNAME
945 </programlisting>
946 <para>
947 This field can be present zero or more times.
948 Each instance defines an entry that simply maps to a Wine symbol
949 (variable or function); <literal>EXPORTNAME</literal> will point
950 to the symbol <literal>SYMBOLNAME</literal> that must be defined
951 in C code. This type only works with Win32.
952 </para>
954 <programlisting>
955 ORDINAL forward EXPORTNAME SYMBOLNAME
956 </programlisting>
957 <para>
958 This field can be present zero or more times.
959 Each instance defines an entry that is forwarded to another entry
960 point (kind of a symbolic link). <literal>EXPORTNAME</literal>
961 will forward to the entry point <literal>SYMBOLNAME</literal>
962 that must be of the form <literal>DLL.Function</literal>. This
963 type only works with Win32.
964 </para>
965 </sect2>
966 </sect1>
968 <sect1 id="linking">
969 <title id="linking.title">Linking it all together</title>
970 <!-- FIXME: This is outdated -->
971 <para>
972 To link an executable you need to link together: your object files,
973 the spec file, any Windows libraries that your application depends
974 on, gdi32 for instance, and any additional library that you use. All
975 the libraries you link with should be available as '.so' libraries.
976 If one of them is available only in '.dll' form then consult
977 <xref linkend="bindlls" endterm="bindlls.title">.
978 </para>
979 <para>
980 It is also when attempting to link your executable that you will
981 discover whether you have missing symbols or not in your custom
982 libraries. On Windows when you build a library, the linker will
983 immediately tell you if a symbol it is supposed to export is
984 undefined. In Unix, and in Winelib, this is not the case. The symbol
985 will silently be marked as undefined and it is only when you try to
986 produce an executable that the linker will verify all the symbols are
987 accounted for.
988 </para>
989 <para>
990 So before declaring victory when first converting a library to
991 Winelib, you should first try to link it to an executable (but you
992 would have done that to test it anyway, right?). At this point you
993 may discover some undefined symbols that you thought were implemented
994 by the library. Then, you to the library sources and fix it. But you
995 may also discover that the missing symbols are defined in, say,
996 gdi32. This is because you did not link the said library with gdi32.
997 One way to fix it is to link this executable, and any other that also
998 uses your library, with gdi32. But it is better to go back to your
999 library's makefile and explicitly link it with gdi32.
1000 </para>
1001 <para>
1002 As you will quickly notice, this has unfortunately not been
1003 (completely) done for Winelib's own libraries. So if an application
1004 must link with ole32, you will also need to link with advapi32,
1005 rpcrt4 and others even if you don't use them directly. This can be
1006 annoying and hopefully will be fixed soon (feel free to submit a
1007 patch).
1008 </para>
1009 <!-- FIXME: try to give some sort of concrete example -->
1010 </sect1>
1011 </chapter>
1013 <!-- Keep this comment at the end of the file
1014 Local variables:
1015 mode: sgml
1016 sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
1017 End: