~hilaire-fernandes/drgeo/trunk

« back to all changes in this revision

Viewing changes to VMs/iPad/source/unix/doc/HowToBuildFromSource.html/HowToBuildFromSource-node5.html

  • Committer: Hilaire Fernandes
  • Date: 2012-01-27 21:15:40 UTC
  • Revision ID: hilaire.fernandes@gmail.com-20120127211540-912spf97bhpx6mve
Initial additions

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 
2
 
 
3
<!--Converted with LaTeX2HTML 2002-2-1 (1.71)
 
4
original version by:  Nikos Drakos, CBLU, University of Leeds
 
5
* revised and updated by:  Marcus Hennecke, Ross Moore, Herb Swan
 
6
* with significant contributions from:
 
7
  Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
 
8
<HTML>
 
9
<HEAD>
 
10
<TITLE>3 Adding your own plugins</TITLE>
 
11
<META NAME="description" CONTENT="3 Adding your own plugins">
 
12
<META NAME="keywords" CONTENT="HowToBuildFromSource">
 
13
<META NAME="resource-type" CONTENT="document">
 
14
<META NAME="distribution" CONTENT="global">
 
15
 
 
16
<META NAME="Generator" CONTENT="LaTeX2HTML v2002-2-1">
 
17
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
 
18
 
 
19
<LINK REL="STYLESHEET" HREF="HowToBuildFromSource.css">
 
20
 
 
21
<LINK REL="next" HREF="HowToBuildFromSource-node6.html">
 
22
<LINK REL="previous" HREF="HowToBuildFromSource-node4.html">
 
23
<LINK REL="up" HREF="HowToBuildFromSource.html">
 
24
<LINK REL="next" HREF="HowToBuildFromSource-node6.html">
 
25
</HEAD>
 
26
 
 
27
<BODY >
 
28
 
 
29
<DIV CLASS="navigation"><!--Navigation Panel-->
 
30
<A NAME="tex2html111"
 
31
  HREF="HowToBuildFromSource-node6.html">
 
32
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A> 
 
33
<A NAME="tex2html105"
 
34
  HREF="HowToBuildFromSource.html">
 
35
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A> 
 
36
<A NAME="tex2html99"
 
37
  HREF="HowToBuildFromSource-node4.html">
 
38
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A> 
 
39
<A NAME="tex2html107"
 
40
  HREF="HowToBuildFromSource-node1.html">
 
41
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A> 
 
42
<A NAME="tex2html109"
 
43
  HREF="HowToBuildFromSource-node6.html">
 
44
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A> 
 
45
<BR>
 
46
<B> Next:</B> <A NAME="tex2html112"
 
47
  HREF="HowToBuildFromSource-node6.html">Index</A>
 
48
<B> Up:</B> <A NAME="tex2html106"
 
49
  HREF="HowToBuildFromSource.html">Building Unix Squeak (</A>
 
50
<B> Previous:</B> <A NAME="tex2html100"
 
51
  HREF="HowToBuildFromSource-node4.html">2 Generating your own</A>
 
52
 &nbsp; <B>  <A NAME="tex2html108"
 
53
  HREF="HowToBuildFromSource-node1.html">Contents</A></B> 
 
54
 &nbsp; <B>  <A NAME="tex2html110"
 
55
  HREF="HowToBuildFromSource-node6.html">Index</A></B> 
 
56
<BR>
 
57
<BR></DIV>
 
58
<!--End of Navigation Panel-->
 
59
<!--Table of Child-Links-->
 
60
<A NAME="CHILD_LINKS"><STRONG>Subsections</STRONG></A>
 
61
 
 
62
<UL CLASS="ChildLinks">
 
63
<LI><A NAME="tex2html113"
 
64
  HREF="HowToBuildFromSource-node5.html#SECTION00051000000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN> Plugin-specific configuration</A>
 
65
<UL>
 
66
<LI><A NAME="tex2html114"
 
67
  HREF="HowToBuildFromSource-node5.html#SECTION00051100000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN> <TT>AC_PLUGIN_CHECK_LIB(<SPAN  CLASS="textit">lib</SPAN>,<SPAN  CLASS="textit">func</SPAN>)</TT></A>
 
68
<LI><A NAME="tex2html115"
 
69
  HREF="HowToBuildFromSource-node5.html#SECTION00051200000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN> <TT>AC_PLUGIN_DEFINE_UNQUOTED(<SPAN  CLASS="textit">keyword</SPAN>,<SPAN  CLASS="textit">text</SPAN>)</TT></A>
 
70
<LI><A NAME="tex2html116"
 
71
  HREF="HowToBuildFromSource-node5.html#SECTION00051300000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN> Plugin-specific variables</A>
 
72
</UL>
 
73
<BR>
 
74
<LI><A NAME="tex2html117"
 
75
  HREF="HowToBuildFromSource-node5.html#SECTION00052000000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN> Plugin-specific <TT>Makefile</TT> declarations and rules</A>
 
76
<UL>
 
77
<LI><A NAME="tex2html118"
 
78
  HREF="HowToBuildFromSource-node5.html#SECTION00052100000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN> The anatomy of a plugin's <TT>Makefile</TT></A>
 
79
<LI><A NAME="tex2html119"
 
80
  HREF="HowToBuildFromSource-node5.html#SECTION00052200000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN> A note about <TT>$(COMPILE)</TT> and <TT>$(LINK)</TT> commands</A>
 
81
<LI><A NAME="tex2html120"
 
82
  HREF="HowToBuildFromSource-node5.html#SECTION00052300000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">3</SPAN> Specifying additional source directories</A>
 
83
<LI><A NAME="tex2html121"
 
84
  HREF="HowToBuildFromSource-node5.html#SECTION00052400000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN> Including additional material in the default <TT>Makefile</TT></A>
 
85
<LI><A NAME="tex2html122"
 
86
  HREF="HowToBuildFromSource-node5.html#SECTION00052500000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN> Replacing the default <TT>Makefile</TT> entirely</A>
 
87
</UL>
 
88
<BR>
 
89
<LI><A NAME="tex2html123"
 
90
  HREF="HowToBuildFromSource-node5.html#SECTION00053000000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN> Examples taken from existing plugins</A>
 
91
<UL>
 
92
<LI><A NAME="tex2html124"
 
93
  HREF="HowToBuildFromSource-node5.html#SECTION00053100000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN> Configuration</A>
 
94
<LI><A NAME="tex2html125"
 
95
  HREF="HowToBuildFromSource-node5.html#SECTION00053200000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN> Customising the <TT>Makefile</TT></A>
 
96
</UL>
 
97
<BR>
 
98
<LI><A NAME="tex2html126"
 
99
  HREF="HowToBuildFromSource-node5.html#SECTION00054000000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN> Coping with VMMaker quirks</A>
 
100
<LI><A NAME="tex2html127"
 
101
  HREF="HowToBuildFromSource-node5.html#SECTION00055000000000000000"><SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN> If all else fails</A>
 
102
</UL>
 
103
<!--End of Table of Child-Links-->
 
104
<HR>
 
105
 
 
106
<H1><A NAME="SECTION00050000000000000000">
 
107
<SPAN CLASS="arabic">3</SPAN> Adding your own plugins</A>
 
108
</H1>
 
109
 
 
110
<P>
 
111
<BLOCKQUOTE>
 
112
<FONT COLOR="#ff0000"> Note: This section is intended primarily for plugin developers.
 
113
</FONT></BLOCKQUOTE>
 
114
<P>
 
115
If your plugin<A NAME="189"></A>
 
116
 requires no platform-specific tweaks then there's
 
117
nothing for you to do.  <TT>configure</TT> (and <TT>config.status</TT>)
 
118
will provide a default <TT>Makefile</TT> for it that should work.  If your
 
119
plugin requires only platform-independent tweaks (and/or additional
 
120
hand-written code) then these go in <TT>platforms/Cross/plugins</TT>, and
 
121
there's nothing for you to do (in Unixland).
 
122
 
 
123
<P>
 
124
On the other hand, if you require special <TT>configure</TT> tests or
 
125
additional declarations/rules in your plugin's <TT>Makefile</TT> then you
 
126
need to specify them explicitly.
 
127
 
 
128
<P>
 
129
<BLOCKQUOTE>
 
130
<FONT COLOR="#ff0000"> Note: Unix Squeak subscribes to the following philopsophy:
 
131
</FONT></BLOCKQUOTE>
 
132
<P>
 
133
<BLOCKQUOTE><FONT COLOR="#ff0000"><SPAN  CLASS="textit">Absolutely everything that is specific<A NAME="197"></A>
 
134
 to Unix (sources,
 
135
headers, <TT>configure</TT> and <TT>Makefile</TT> extensions, etc.) lives
 
136
under <TT>platforms/unix</TT>.</SPAN>
 
137
</FONT></BLOCKQUOTE>
 
138
<P>
 
139
<BLOCKQUOTE><FONT COLOR="#ff0000">In other words: there is not (nor aught there be) <SPAN  CLASS="textit">any</SPAN>
 
140
Unix-related information under the <TT>platforms/Cross</TT>
 
141
directory.  (Unix Squeak is entirely encapsulated
 
142
under <TT>platforms/unix</TT> and is utterly immune to
 
143
``random junk'' elsewhere in the <TT>platforms</TT> tree.)
 
144
</FONT></BLOCKQUOTE>
 
145
<P>
 
146
First you must create a new directory<A NAME="206"></A>
 
147
under <TT>platforms/unix/plugins</TT> named after your plugin.  This directory
 
148
will hold the files describing the additional configuration checks
 
149
and/or <TT>Makefile</TT> contents.  For example, if your plugin is
 
150
called ``MyCoolPlugin'' then
 
151
<SPAN ID="hue574">
 
152
 
 
153
<DIV CLASS="alltt" ALIGN="LEFT">
 
154
<TT>
 
155
 
 
156
<FONT COLOR="#0000ff">
 
157
<BR>&nbsp;&nbsp;$ mkdir platforms/unix/plugins/MyCoolPlugin
 
158
<BR></FONT></TT>
 
159
</DIV>
 
160
</SPAN>
 
161
<P>
 
162
would be the thing to do.  (The following sections will refer to this
 
163
directory as <TT>platdep</TT> since the full path is quite a mouthful of
 
164
typing for my lazy fingers.)
 
165
 
 
166
<P>
 
167
 
 
168
<H2><A NAME="SECTION00051000000000000000">
 
169
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN> Plugin-specific configuration</A>
 
170
</H2>
 
171
 
 
172
<P>
 
173
Your plugin can ask <TT>configure</TT><A NAME="216"></A>
 
174
to run additional tests (and to
 
175
set additional variables in its output files) simply by including a
 
176
file called <TT>acinclude.m4</TT><A NAME="575"></A>
 
177
in it's <TT>platdep</TT> directory.
 
178
 
 
179
<P>
 
180
<BLOCKQUOTE>
 
181
<FONT COLOR="#ff0000"> Note: The <TT>configure</TT><A NAME="576"></A>
 
182
script is `compiled' from several other files.  If
 
183
you create a `<TT>platdep./acinclude.m4</TT>' file then you <SPAN  CLASS="textit">must</SPAN>
 
184
`recompile'<A NAME="577"></A>
 
185
<TT>configure</TT>.  You can do this by `<TT>cd</TT>'ing to
 
186
<TT>unix/config</TT> and running `<TT>make</TT>', or (if you have GNU
 
187
<TT>make</TT>) from the <TT>blddir</TT> like this:
 
188
<SPAN ID="hue579">
 
189
 
 
190
<DIV CLASS="alltt" ALIGN="LEFT">
 
191
<TT>
 
192
 
 
193
<FONT COLOR="#ff0000">
 
194
<BR>&nbsp;&nbsp;$ make -C ../platforms/unix/config
 
195
<BR></FONT></TT>
 
196
</DIV>
 
197
</SPAN>
 
198
</FONT></BLOCKQUOTE>
 
199
<P>
 
200
In addition to the usual <TT>autoconf</TT> macros, the following
 
201
macros<A NAME="580"></A>
 
202
are available specifically for Squeak plugins to use:
 
203
 
 
204
<P>
 
205
 
 
206
<H3><A NAME="SECTION00051100000000000000">
 
207
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">1</SPAN> <TT>AC_PLUGIN_CHECK_LIB(<SPAN  CLASS="textit">lib</SPAN>,<SPAN  CLASS="textit">func</SPAN>)</TT></A>
 
208
</H3>
 
209
<A NAME="582"></A>
 
210
 
 
211
<P>
 
212
This is similar to the <TT>autoconf</TT> `<TT>AC_CHECK_LIB</TT>' macro.
 
213
 
 
214
<P>
 
215
<SPAN  CLASS="textit">func</SPAN> is the name of a function required by the plugin, defined
 
216
in the external (system) library <SPAN  CLASS="textit">lib</SPAN>.  The macro checks that
 
217
the library is available (via `<TT>-l<SPAN  CLASS="textit">lib</SPAN></TT>') and then adds it
 
218
to the list of libraries required by the plugin (see the explanation
 
219
of <TT>[plibs]</TT> in Section&nbsp;<A HREF="#sec:plibs">3.2.1</A> for a description of
 
220
how library dependencies for plugins are handled).
 
221
 
 
222
<P>
 
223
If <SPAN  CLASS="textit">func</SPAN> cannot be found in <SPAN  CLASS="textit">lib</SPAN> then the plugin will be
 
224
disabled and a message to that effect printed during configuration.
 
225
(The VM can still be built, <SPAN  CLASS="textit">without</SPAN> rerunning VMMaker or
 
226
reconfiguring, and the plugin will simply be ommitted from it.)
 
227
 
 
228
<P>
 
229
 
 
230
<H3><A NAME="SECTION00051200000000000000">
 
231
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">2</SPAN> <TT>AC_PLUGIN_DEFINE_UNQUOTED(<SPAN  CLASS="textit">keyword</SPAN>,<SPAN  CLASS="textit">text</SPAN>)</TT></A>
 
232
</H3>
 
233
 
 
234
<P>
 
235
This<A NAME="585"></A>
 
236
is similar to the <TT>autoconf</TT> `<TT>AC_DEFINE_UNQUOTED</TT>' macro.
 
237
 
 
238
<P>
 
239
<SPAN  CLASS="textit">keyword</SPAN> is a <TT>Makefile</TT> keyword (usually of the form
 
240
`[<SPAN  CLASS="textit">name</SPAN>]') and <SPAN  CLASS="textit">text</SPAN> is arbitrary text to be
 
241
associated with it.  Calling this macro causes <TT>mkmf</TT> to
 
242
substitute <SPAN  CLASS="textit">text</SPAN> for all occurrences of <SPAN  CLASS="textit">keyword</SPAN> in the
 
243
<TT>Makefile</TT> generated for the plugin.
 
244
 
 
245
<P>
 
246
 
 
247
<H3><A NAME="SECTION00051300000000000000">
 
248
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN>.<SPAN CLASS="arabic">3</SPAN> Plugin-specific variables</A>
 
249
</H3>
 
250
 
 
251
<P>
 
252
The following variables are also set during the execution of a
 
253
plugin-specific <TT>acinclude.m4</TT>:
 
254
 
 
255
<P>
 
256
<DL COMPACT>
 
257
<DT></DT>
 
258
<DD><TT>${plugin}</TT> is the name of the plugin;
 
259
</DD>
 
260
<DT></DT>
 
261
<DD><TT>${topdir}</TT> is the path to the top-level directory (containing
 
262
  <TT>platforms</TT>);
 
263
</DD>
 
264
<DT></DT>
 
265
<DD><TT>${vmmdir}</TT> is the path to the VMMaker `<TT>src</TT>' directory.
 
266
</DD>
 
267
</DL>
 
268
 
 
269
<P>
 
270
 
 
271
<H2><A NAME="SECTION00052000000000000000">
 
272
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN> Plugin-specific <TT>Makefile</TT> declarations and rules</A>
 
273
</H2>
 
274
 
 
275
<P>
 
276
Three<A NAME="587"></A>
 
277
mechanisms are avilable for this:
 
278
 
 
279
<OL>
 
280
<LI>scanning additional dirrectories for sources and headers;
 
281
</LI>
 
282
<LI>including a few additional lines into the default <TT>Makefile</TT>;
 
283
  and 
 
284
</LI>
 
285
<LI>replacing entirely the default <TT>Makefile</TT> with a
 
286
  hand-written one.
 
287
</LI>
 
288
</OL>
 
289
(The last option isn't as scary as it might sound: read on...)
 
290
 
 
291
<P>
 
292
 
 
293
<H3><A NAME="SECTION00052100000000000000">
 
294
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">1</SPAN> The anatomy of a plugin's <TT>Makefile</TT></A>
 
295
</H3>
 
296
 
 
297
<P>
 
298
Before proceeding, let's take a minute to understand how Unix Squeak
 
299
compiles and links files in its default <TT>Makefile</TT> for plugins.
 
300
The default
 
301
<TT>Makefile</TT><A NAME="589"></A><A NAME="590"></A>
 
302
looks like this:
 
303
 
 
304
<P>
 
305
<BLOCKQUOTE>
 
306
<BLOCKQUOTE>
 
307
<SPAN ID="hue593">
 
308
 
 
309
<DIV CLASS="alltt" ALIGN="LEFT">
 
310
<TT>
 
311
 # default Makefile for Unix Squeak plugins
 
312
<BR>
 
313
<BR>[make_cfg]
 
314
<BR>[make_plg]
 
315
<BR>
 
316
<BR>
 
317
XINCLUDES &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= [includes]
 
318
<BR>
 
319
OBJS &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= [targets]
 
320
<BR>
 
321
TARGET &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= [target]
 
322
<BR>
 
323
PLIBS &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= [plibs]
 
324
<BR>
 
325
<BR>[make_inc]
 
326
<BR>
 
327
<BR>$(TARGET) : $(OBJS) Makefile
 
328
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(LINK) $(TARGET) $(OBJS) $(PLIBS)
 
329
<BR>
 
330
<BR>[make_targets]
 
331
<BR>
 
332
<BR>.force :
 
333
<BR></TT>
 
334
</DIV>
 
335
</SPAN>
 
336
</BLOCKQUOTE>
 
337
</BLOCKQUOTE>
 
338
 
 
339
<P>
 
340
<BLOCKQUOTE>
 
341
<FONT COLOR="#ff0000"> Note: The keywords<A NAME="594"></A>
 
342
appearing between `<TT>[</TT> square brackets <TT>]</TT>'
 
343
are substituted during configuration by a preprocessor called
 
344
`<TT>mkmf</TT>'<A NAME="595"></A>
 
345
according to the kind of plugin (internal/external) being built.
 
346
</FONT></BLOCKQUOTE>
 
347
<P>
 
348
<TT><SPAN  CLASS="textbf">[make_cfg]</SPAN></TT><A NAME="597"></A>
 
349
<A NAME="598"></A>
 
350
is the configured variable section.  It
 
351
contains the platform-specific information gleaned by <TT>configure</TT>
 
352
while it was figuring out which compiler you have, what flags your
 
353
linker needs, where to install stuff, and so on.
 
354
 
 
355
<P>
 
356
<TT><SPAN  CLASS="textbf">[make_plg]</SPAN></TT><A NAME="600"></A>
 
357
<A NAME="601"></A>
 
358
contains a handful of definitions which
 
359
depend on whether the plugin is being compiled as internal or
 
360
external:
 
361
<BLOCKQUOTE>
 
362
<TABLE CELLPADDING=3>
 
363
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">o       </TT></TD>
 
364
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">the extension for object files</TD>
 
365
</TR>
 
366
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">a       </TT></TD>
 
367
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">the extension for plugins</TD>
 
368
</TR>
 
369
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">COMPILE </TT></TD>
 
370
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">the command to compile a source file into an object file</TD>
 
371
</TR>
 
372
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">LINK    </TT></TD>
 
373
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">the command to link one or more object files into a plugin</TD>
 
374
</TR>
 
375
</TABLE>
 
376
</BLOCKQUOTE>
 
377
 
 
378
<P>
 
379
For internal plugins: <TT>$o</TT> is `<TT>.o</TT>' and <TT>$a</TT> is
 
380
`<TT>.a</TT>'.  <TT>$(COMPILE)</TT> is the C compiler
 
381
(`<TT>$(CC)&nbsp;...&nbsp;-o</TT>', so the first thing after the command
 
382
<SPAN  CLASS="textit">must</SPAN> be the output filename) and <TT>$(LINK)</TT> is archiver
 
383
(`<TT>ar -rc</TT>', again requiring the output file to follow
 
384
immediately).  Note that internal plugins are built as `<TT>ar</TT>'
 
385
archives before being linked into the final binary.
 
386
 
 
387
<P>
 
388
For external plugins: <TT>$o</TT> is `<TT>.lo</TT>', <TT>$a</TT> is
 
389
`<TT>.la</TT>', and <TT>$(COMPILE)</TT> and <TT>$(LINK)</TT> are
 
390
invocations of `<TT>libtool</TT>' to create position-independent objects and
 
391
shared libraries (with a `<TT>-o</TT>' appearing right at the end, so the
 
392
first thing after the command <SPAN  CLASS="textit">must</SPAN> be the output filename).
 
393
 
 
394
<P>
 
395
<TT><SPAN  CLASS="textbf">[includes]</SPAN></TT><A NAME="604"></A>
 
396
<A NAME="605"></A>
 
397
is a list of&nbsp;`<TT>-I<SPAN  CLASS="textit">dir</SPAN></TT>'
 
398
compiler flags, one for each of the
 
399
directories<A NAME="607"></A>
 
400
<SPAN ID="hue608">
 
401
 
 
402
<DIV CLASS="alltt" ALIGN="LEFT">
 
403
<TT>
 
404
 &nbsp;&nbsp;src/plugins/<SPAN &nbsp;CLASS="textit">name</SPAN>
 
405
<BR>&nbsp;&nbsp;src/vm/intplugins/<SPAN &nbsp;CLASS="textit">name</SPAN>
 
406
<BR>&nbsp;&nbsp;platforms/Cross/plugins/<SPAN &nbsp;CLASS="textit">name</SPAN>
 
407
<BR>&nbsp;&nbsp;platforms/unix/plugins/<SPAN &nbsp;CLASS="textit">name</SPAN>
 
408
<BR></TT>
 
409
</DIV>
 
410
</SPAN>in which at least one header file is present.
 
411
 
 
412
<P>
 
413
<TT><SPAN  CLASS="textbf">[targets]</SPAN></TT><A NAME="610"></A>
 
414
<A NAME="611"></A>
 
415
is a list of object files
 
416
corresponding to the source (<TT>.c</TT>) files found in
 
417
the directories:<A NAME="612"></A>
 
418
<SPAN ID="hue613">
 
419
 
 
420
<DIV CLASS="alltt" ALIGN="LEFT">
 
421
<TT>
 
422
 &nbsp;&nbsp;src/plugins/<SPAN &nbsp;CLASS="textit">name</SPAN>/*.c
 
423
<BR>&nbsp;&nbsp;src/vm/intplugins/<SPAN &nbsp;CLASS="textit">name</SPAN>/*.c
 
424
<BR>&nbsp;&nbsp;platforms/Cross/plugins/<SPAN &nbsp;CLASS="textit">name</SPAN>/*.c
 
425
<BR>&nbsp;&nbsp;platforms/unix/plugins/<SPAN &nbsp;CLASS="textit">name</SPAN>/*.c
 
426
<BR></TT>
 
427
</DIV>
 
428
</SPAN>where each source file has been stripped of the directory name and had the
 
429
`<TT>.c</TT>' converted into `<TT>$o</TT>'.
 
430
 
 
431
<P>
 
432
<TT><SPAN  CLASS="textbf">[target]</SPAN></TT><A NAME="615"></A>
 
433
<A NAME="616"></A>
 
434
is the name of the plugin, including the
 
435
<TT>$a</TT> extension.
 
436
 
 
437
<P>
 
438
<TT><SPAN  CLASS="textbf">[plibs]</SPAN></TT><A NAME="618"></A>
 
439
<A NAME="619"></A>
 
440
<A NAME="sec:plibs"></A>is a list of zero or more libraries on which the plugin depends (as
 
441
detected using the macro <TT>AC_PLUGIN_CHECK_LIB</TT> in the
 
442
plugin-specific <TT>acinclude.m4</TT>).  If the plugin
 
443
is being built internally then this list is empty and the required libraries
 
444
are included in the final link command.  If the plugin is being built
 
445
externally then the plugin itself (a shared object) is linked against
 
446
these libraries (via <TT>[plist]</TT>) rather than with the main VM binary.
 
447
 
 
448
<P>
 
449
(This is to ensure that a missing shared object needed by an external plugin
 
450
will only affect the operation of that plugin and not prevent the rest
 
451
of the VM from running, which would be the case if the entire VM were
 
452
linked against it.)
 
453
 
 
454
<P>
 
455
<TT><SPAN  CLASS="textbf">[make_inc]</SPAN></TT><A NAME="621"></A>
 
456
<A NAME="622"></A>
 
457
is the contents of the
 
458
<TT>Makefile.inc</TT> file in your plugin's <TT>platdep</TT> directory (or
 
459
empty if this file doesn't exist).
 
460
 
 
461
<P>
 
462
<TT><SPAN  CLASS="textbf">[make_targets]</SPAN></TT><A NAME="624"></A>
 
463
<A NAME="625"></A>
 
464
is a list of rules<A NAME="626"></A>
 
465
for building the files listed in <TT>[targets]</TT>.
 
466
Each rule<A NAME="388"></A>
 
467
looks like this:
 
468
 
 
469
<P>
 
470
 
 
471
<DIV CLASS="alltt" ALIGN="LEFT">
 
472
<TT>
 
473
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name$o : <SPAN &nbsp;CLASS="textit">original/source/dir/</SPAN>name.c
 
474
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(COMPILE) name$o <SPAN &nbsp;CLASS="textit">original/source/dir/</SPAN>name.c
 
475
<BR></TT>
 
476
</DIV>
 
477
 
 
478
<P>
 
479
 
 
480
<H3><A NAME="SECTION00052200000000000000">
 
481
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">2</SPAN> A note about <TT>$(COMPILE)</TT> and <TT>$(LINK)</TT> commands</A>
 
482
</H3>
 
483
 
 
484
<P>
 
485
You should <SPAN  CLASS="textit">never</SPAN> pass additional flags to these
 
486
commands<A NAME="628"></A><A NAME="629"></A><A NAME="630"></A>
 
487
explicitly.  This is because you cannot know how they are defined.
 
488
(Their definitions depend on whether the plugin is being built
 
489
internally or externally&nbsp;-- and might even change radically in future
 
490
releases of Unix Squeak.)
 
491
 
 
492
<P>
 
493
Instead you should pass additional compiler/linker
 
494
flags<A NAME="631"></A>
 
495
to these commands by setting the following variables in `<TT>Makefile.inc</TT>' or
 
496
`<TT>Makefile.in</TT>':
 
497
<BLOCKQUOTE>
 
498
<A NAME="632"></A>
 
499
<A NAME="633"></A>
 
500
<A NAME="634"></A>
 
501
<A NAME="635"></A>
 
502
<TABLE CELLPADDING=3>
 
503
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">XCPPFLAGS        </TT></TD>
 
504
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">`<TT>-I</TT>' flags for <TT>cpp</TT></TD>
 
505
</TR>
 
506
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">XDEFS            </TT></TD>
 
507
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">`<TT>-D</TT>' flags for <TT>cpp</TT></TD>
 
508
</TR>
 
509
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">XCFLAGS          </TT></TD>
 
510
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">anything to be passed to the compiler</TD>
 
511
</TR>
 
512
<TR><TD ALIGN="LEFT"><TT></TD><TD ALIGN="LEFT">XLDFLAGS </TT></TD>
 
513
<TD ALIGN="LEFT">&nbsp;&nbsp;&nbsp;</TD><TD ALIGN="LEFT">anything to be passed to the linker</TD>
 
514
</TR>
 
515
</TABLE>
 
516
</BLOCKQUOTE>
 
517
<BLOCKQUOTE>
 
518
<FONT COLOR="#ff0000"> Note: `<TT>mkmf</TT>' already uses `<TT>XINCLUDES</TT>'<A NAME="637"></A>
 
519
<A NAME="638"></A>
 
520
to pass the list of
 
521
directories containing plugin header files to <TT>cpp</TT>.  You can
 
522
redefine it if you like, but make sure that `<TT>[includes]</TT>'
 
523
appears in its definition (or in the definition of `<TT>XCPPFLAGS</TT>').
 
524
</FONT></BLOCKQUOTE>
 
525
<P>
 
526
 
 
527
<H3><A NAME="SECTION00052300000000000000">
 
528
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">3</SPAN> Specifying additional source directories</A>
 
529
</H3>
 
530
 
 
531
<P>
 
532
<TT>mkmf</TT><A NAME="639"></A>
 
533
looks for a file in your plugin's
 
534
<TT>platdep</TT> directory called
 
535
`<TT>mkmf.subdirs</TT>'.<A NAME="640"></A>
 
536
If this file exists then it should contain a list of directory names relative to
 
537
the top-level directory (the one containing the <TT>src</TT> and
 
538
<TT>platform</TT> directories).  These
 
539
directories<A NAME="434"></A>
 
540
will be added to the list of locations searched for
 
541
`<TT>.c</TT>' and `<TT>.h</TT>' files while
 
542
constructing the substitutions for `<TT>[includes]</TT>',
 
543
`<TT>[targets]</TT>' and `<TT>[make_targets]</TT>'.
 
544
 
 
545
<P>
 
546
 
 
547
<H3><A NAME="SECTION00052400000000000000">
 
548
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">4</SPAN> Including additional material in the default <TT>Makefile</TT></A>
 
549
</H3>
 
550
 
 
551
<P>
 
552
If the file <TT>platdep/Makefile.inc</TT><A NAME="642"></A>
 
553
exists then <TT>mkmf</TT> will
 
554
substitute its contents into the <TT>Makefile</TT> in place of the
 
555
<TT>[make_inc]</TT> keyword.
 
556
 
 
557
<P>
 
558
<BLOCKQUOTE>
 
559
<FONT COLOR="#ff0000"> Note: <TT>Makefile.inc</TT><A NAME="643"></A>
 
560
is read into the <TT>Makefile</TT> under
 
561
construction <SPAN  CLASS="textit">before</SPAN> <TT>mkmf</TT> performs substitutions on the
 
562
`<TT>[keyword]</TT>'s.  In other words, your <TT>Makefile.inc</TT> can
 
563
use the above keywords to include relevant declarations and rules
 
564
without worrying about whether the plugin is internal or external.
 
565
</FONT></BLOCKQUOTE>
 
566
<P>
 
567
 
 
568
<H3><A NAME="SECTION00052500000000000000">
 
569
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN>.<SPAN CLASS="arabic">5</SPAN> Replacing the default <TT>Makefile</TT> entirely</A>
 
570
</H3>
 
571
 
 
572
<P>
 
573
If neither of the above are sufficient then you can create a complete
 
574
<TT>Makefile</TT><A NAME="645"></A>
 
575
template called <TT>platdep/Makefile.in</TT>.<A NAME="646"></A>
 
576
<TT>mkmf</TT> will use this template instead of the default <TT>Makefile</TT> template
 
577
shown earlier, and will perform keyword substitutions on it as
 
578
described above to create the final <TT>Makefile</TT>.  (In other words,
 
579
simply copying the default template shown earlier will result in a
 
580
<TT>Makefile</TT> identical to the one that <TT>mkmf</TT> would have
 
581
produced by default.
 
582
 
 
583
<P>
 
584
 
 
585
<H2><A NAME="SECTION00053000000000000000">
 
586
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN> Examples taken from existing plugins</A>
 
587
</H2>
 
588
 
 
589
<P>
 
590
By way of example we'll look at how two existing plugins specialise
 
591
their configuration and <TT>Makefile</TT>s.
 
592
 
 
593
<P>
 
594
 
 
595
<H3><A NAME="SECTION00053100000000000000">
 
596
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">1</SPAN> Configuration</A>
 
597
</H3>
 
598
 
 
599
<P>
 
600
The <TT>B3DAcceleratorPlugin</TT> requires OpenGL in order to compile.
 
601
The file <TT>unix/plugins/B3DAcceleratorPlugin/acinclude.m4</TT><A NAME="647"></A>
 
602
contains a single call to an <TT>autoconf</TT>-style macro:
 
603
 
 
604
<P>
 
605
 
 
606
<DIV CLASS="alltt" ALIGN="LEFT">
 
607
<TT>
 
608
 &nbsp;&nbsp;&nbsp;&nbsp;AC_PLUGIN_SEARCH_LIBS(glIsEnabled, GL)
 
609
<BR></TT>
 
610
</DIV>
 
611
 
 
612
<P>
 
613
This works similarly to the <TT>autoconf</TT> `<TT>AC_SEARCH_LIBS</TT>'
 
614
macro: If a library <TT>libGL.{a,so}</TT> (OpenGL) exists and exports
 
615
the function <TT>glIsEnabled()</TT> then `<TT>-lGL</TT>' is added to the
 
616
final VM link command.  Otherwise the plugin is disabled (and a
 
617
message warning of the fact is printed).
 
618
 
 
619
<P>
 
620
<BLOCKQUOTE>
 
621
<FONT COLOR="#ff0000"> Note: There's a bug here.  This should also check for `<TT>GL_VERSION_1_1</TT>' in headers.
 
622
</FONT></BLOCKQUOTE>
 
623
<P>
 
624
 
 
625
<H3><A NAME="SECTION00053200000000000000">
 
626
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">2</SPAN> Customising the <TT>Makefile</TT></A>
 
627
</H3>
 
628
 
 
629
<P>
 
630
The <TT>Mpeg3Plugin</TT> requires a (modified) <TT>libmpeg</TT> to be
 
631
compiled along with it.  The sources for this library are in (several)
 
632
subdirectories of <TT>Cross/Meg3Plugin</TT> and they require additional
 
633
<TT>cpp</TT> definitions in order to compile correctly.
 
634
 
 
635
<P>
 
636
To cope with the additional directories,
 
637
<TT>unix/plugins/Mpeg3Plugin/mkmf.subdirs</TT><A NAME="649"></A>
 
638
simply lists them:
 
639
 
 
640
<P>
 
641
 
 
642
<DIV CLASS="alltt" ALIGN="LEFT">
 
643
<TT>
 
644
 &nbsp;&nbsp;platforms/Cross/plugins/Mpeg3Plugin/libmpeg
 
645
<BR>&nbsp;&nbsp;platforms/Cross/plugins/Mpeg3Plugin/libmpeg/audio
 
646
<BR>&nbsp;&nbsp;platforms/Cross/plugins/Mpeg3Plugin/libmpeg/video
 
647
<BR></TT>
 
648
</DIV>
 
649
 
 
650
<P>
 
651
To cope with the additional <TT>cpp</TT> definitions, we could have
 
652
written a tiny <TT>Makefile.inc</TT><A NAME="650"></A>
 
653
containing:
 
654
 
 
655
<P>
 
656
 
 
657
<DIV CLASS="alltt" ALIGN="LEFT">
 
658
<TT>
 
659
 &nbsp;&nbsp;&nbsp;&nbsp;XDEFS &nbsp;&nbsp;= -DNOPTHREADS
 
660
<BR></TT>
 
661
</DIV>
 
662
 
 
663
<P>
 
664
Unfortunately the additional source directories contain various
 
665
utility and test programs (which <SPAN  CLASS="textit">must not</SPAN> be built) so we
 
666
cannot rely on <TT>mkmf</TT> generating the correct <TT>[targets]</TT> list.
 
667
 
 
668
<P>
 
669
Instead we just copy the default <TT>Makefile</TT> ``template'' (shown
 
670
above) as <TT>Mpeg3Plugin/Makefile.in</TT>
 
671
and insert the required list of targets (and <TT>cpp</TT>
 
672
definition) manually.  The end result<A NAME="651"></A>
 
673
looks like this:
 
674
<BLOCKQUOTE>
 
675
<BLOCKQUOTE>
 
676
<SPAN ID="hue655">
 
677
 
 
678
<DIV CLASS="alltt" ALIGN="LEFT">
 
679
<TT>
 
680
 # Makefile.in for Mpeg3Plugin in Unix Squeak
 
681
<BR>
 
682
<BR>[make_cfg]
 
683
<BR>[make_plg]
 
684
<BR>
 
685
<BR>
 
686
TARGET &nbsp;= Mpeg3Plugin$a
 
687
<BR>
 
688
<BR>
 
689
PLUGIN &nbsp;= Mpeg3Plugin$o
 
690
<BR>
 
691
VIDEO &nbsp;&nbsp;= getpicture$o headers$o idct$o macroblocks$o <SPAN &nbsp;CLASS="textit">etc...</SPAN>
 
692
<BR>
 
693
AUDIO &nbsp;&nbsp;= dct$o header$o layer1$o layer2$o layer3$o <SPAN &nbsp;CLASS="textit">etc...</SPAN>
 
694
<BR>
 
695
LIBMPEG = bitstream$o changesForSqueak$o libmpeg3$o <SPAN &nbsp;CLASS="textit">etc...</SPAN>
 
696
<BR>
 
697
<BR>
 
698
OBJS &nbsp;&nbsp;&nbsp;= $(PLUGIN) $(VIDEO) $(AUDIO) $(LIBMPEG)
 
699
<BR>
 
700
<BR>
 
701
XINCLUDES &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= [includes]
 
702
<BR>
 
703
XDEFS &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= -DNOPTHREADS
 
704
<BR>
 
705
<BR>$(TARGET) : $(OBJS) Makefile
 
706
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$(LINK) $(TARGET) $(OBJS)
 
707
<BR>
 
708
<BR>[make_targets]
 
709
<BR>
 
710
<BR>.force :
 
711
<BR></TT>
 
712
</DIV>
 
713
</SPAN>
 
714
</BLOCKQUOTE>
 
715
</BLOCKQUOTE>
 
716
 
 
717
<P>
 
718
<BLOCKQUOTE>
 
719
<FONT COLOR="#ff0000"> Note: The default `<TT>[make_targets]</TT>' will contain additional rules for the
 
720
objects that we're trying to avoid building (because it's built from
 
721
an exhaustive list of `<TT>.c</TT>' files in the source directories).  This
 
722
does no harm since the offending rules can never be triggered (their
 
723
targets are not listed in `<TT>OBJS</TT>').
 
724
</FONT></BLOCKQUOTE>
 
725
<P>
 
726
 
 
727
<H2><A NAME="SECTION00054000000000000000">
 
728
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">4</SPAN> Coping with VMMaker quirks</A>
 
729
</H2>
 
730
 
 
731
<P>
 
732
VMMaker<A NAME="521"></A>
 
733
will refuse to compile a plugin if it thinks the plugin
 
734
requires platform support.  This is ``all-or-nothing'': if platform
 
735
support is required on <SPAN  CLASS="textit">one</SPAN> platform then it is required on
 
736
<SPAN  CLASS="textit">all</SPAN> platforms (even if the plugin compiles quite happily
 
737
without platform support in Unix).
 
738
 
 
739
<P>
 
740
The easiest way to add ``null'' platform support is to place an empty
 
741
`<TT>Makefile.inc</TT>' in the plugin's <TT>platdep</TT> directory.  (To see
 
742
this in action, look in <TT>unix/plugins/JPEGReadWriter2Plugin</TT>.)
 
743
 
 
744
<P>
 
745
 
 
746
<H2><A NAME="SECTION00055000000000000000">
 
747
<SPAN CLASS="arabic">3</SPAN>.<SPAN CLASS="arabic">5</SPAN> If all else fails</A>
 
748
</H2>
 
749
 
 
750
<P>
 
751
(Where<A NAME="528"></A>
 
752
``all else failing'' is defined as: ``after trying for 20
 
753
minutes and still getting nowhere''.)
 
754
 
 
755
<P>
 
756
If you're writing a plugin that needs platform support (beyond dumb
 
757
inclusion of a few additional `<TT>.c</TT>' files) and this document has
 
758
been of no help at all (or if you understood it but you're still
 
759
suffering from ``all else failing'') then send me
 
760
<A NAME="tex2html3"
 
761
  HREF="mailto:ian.piumarta@squeakland.org">mail</A>
 
762
and I'll be
 
763
happy to help you with the various platdep files.
 
764
 
 
765
<P>
 
766
 
 
767
<P>
 
768
 
 
769
<DIV CLASS="navigation"><HR>
 
770
<!--Navigation Panel-->
 
771
<A NAME="tex2html111"
 
772
  HREF="HowToBuildFromSource-node6.html">
 
773
<IMG WIDTH="37" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next" SRC="next.png"></A> 
 
774
<A NAME="tex2html105"
 
775
  HREF="HowToBuildFromSource.html">
 
776
<IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" SRC="up.png"></A> 
 
777
<A NAME="tex2html99"
 
778
  HREF="HowToBuildFromSource-node4.html">
 
779
<IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" SRC="prev.png"></A> 
 
780
<A NAME="tex2html107"
 
781
  HREF="HowToBuildFromSource-node1.html">
 
782
<IMG WIDTH="65" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="contents" SRC="contents.png"></A> 
 
783
<A NAME="tex2html109"
 
784
  HREF="HowToBuildFromSource-node6.html">
 
785
<IMG WIDTH="43" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="index" SRC="index.png"></A> 
 
786
<BR>
 
787
<B> Next:</B> <A NAME="tex2html112"
 
788
  HREF="HowToBuildFromSource-node6.html">Index</A>
 
789
<B> Up:</B> <A NAME="tex2html106"
 
790
  HREF="HowToBuildFromSource.html">Building Unix Squeak (</A>
 
791
<B> Previous:</B> <A NAME="tex2html100"
 
792
  HREF="HowToBuildFromSource-node4.html">2 Generating your own</A>
 
793
 &nbsp; <B>  <A NAME="tex2html108"
 
794
  HREF="HowToBuildFromSource-node1.html">Contents</A></B> 
 
795
 &nbsp; <B>  <A NAME="tex2html110"
 
796
  HREF="HowToBuildFromSource-node6.html">Index</A></B> </DIV>
 
797
<!--End of Navigation Panel-->
 
798
<ADDRESS>
 
799
 
 
800
2009-08-12
 
801
</ADDRESS>
 
802
</BODY>
 
803
</HTML>