Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

install.html (45293B)


      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
      2 <html>
      3 
      4 <head>
      5 <link HREF="mailto:drh@cs.princeton.edu" REV="made" TITLE="David R. Hanson">
      6 <title>Installing lcc</title>
      7 </head>
      8 
      9 <body>
     10 
     11 <h1>Installing lcc</h1>
     12 
     13 <p ALIGN="LEFT"><strong><a HREF="http://www.research.microsoft.com/~cwfraser/">Christopher
     14 W. Fraser</a> and <a HREF="http://www.research.microsoft.com/~drh/">David R. Hanson</a>, <a
     15 HREF="http://www.research.microsoft.com/">Microsoft Research</a></strong></p>
     16 
     17 <h2>Contents</h2>
     18 
     19 <dir>
     20   <li><a HREF="#intro">Introduction</a></li>
     21   <li><a HREF="#unix">Installation on UNIX</a></li>
     22   <li><a HREF="#driver">Building the Driver</a></li>
     23   <li><a HREF="#rcc">Building the Compiler and Accessories</a></li>
     24   <li><a HREF="#win32">Installation on Windows NT 4.0 and Windows 95/98</a></li>
     25   <li><a HREF="#bugs">Reporting Bugs</a></li>
     26   <li><a HREF="#mailinglist">Keeping in Touch</a></li>
     27 </dir>
     28 
     29 <h2><a NAME="intro">Introduction</a></h2>
     30 
     31 <p><a HREF="http://www.cs.princeton.edu/software/lcc/">lcc</a> is the ANSI C compiler
     32 described in our book <cite>A Retargetable C Compiler: Design and Implementation</cite>
     33 (Addison-Wesley, 1995, ISBN 0-8053-1670-1).</p>
     34 
     35 <p>If you're installing lcc on a UNIX system, read the remainder of this section and
     36 continue with the next section. If you're installing lcc on a Windows NT 4.0 or Windows
     37 95/98 system, and you intend only to <u>use</u> lcc, you can run the <a
     38 href="ftp://ftp.cs.princeton.edu/pub/packages/lcc/lcc41.exe">InstallShield executable</a>,
     39 which installs the binaries and the documentation. If you want to <u>modify</u> lcc or <u>rebuild</u>
     40 it from the source files, you need the <a
     41 href="ftp://ftp.cs.princeton.edu/packages/lcc/lcc41.zip">complete distribution</a>, and
     42 you should read the rest of the section, the following three sections, and the <a
     43 HREF="#win32">Windows NT/95/98</a> section.</p>
     44 
     45 <p>Extract the distribution into its own directory. All non-absolute paths below are
     46 relative to this directory. The distribution holds the following subdirectories.</p>
     47 
     48 <blockquote>
     49   <table BORDER="0" CELLPADDING="1" CELLSPACING="1" WIDTH="80%">
     50     <tr>
     51       <td><a HREF="../src"><code>src</code></a></td>
     52       <td></td>
     53       <td>source code</td>
     54     </tr>
     55     <tr>
     56       <td><a HREF="../etc"><code>etc</code></a></td>
     57       <td></td>
     58       <td>driver, accessories</td>
     59     </tr>
     60     <tr>
     61       <td><a HREF="../lib"><code>lib</code></a></td>
     62       <td></td>
     63       <td>runtime library source code</td>
     64     </tr>
     65     <tr>
     66       <td><a HREF="../cpp"><code>cpp</code></a></td>
     67       <td></td>
     68       <td>preprocessor source code</td>
     69     </tr>
     70     <tr>
     71       <td><a HREF="../lburg"><code>lburg</code></a></td>
     72       <td></td>
     73       <td>code-generator generator source code</td>
     74     </tr>
     75     <tr>
     76       <td><a HREF="../doc"><code>doc</code></a></td>
     77       <td></td>
     78       <td>this document, man pages</td>
     79     </tr>
     80     <tr>
     81       <td><code><a HREF="../include">include</a>/*/*</code></td>
     82       <td></td>
     83       <td>include files</td>
     84     </tr>
     85     <tr>
     86       <td><a HREF="../tst"><code>tst</code></a></td>
     87       <td></td>
     88       <td>test suite</td>
     89     </tr>
     90     <tr>
     91       <td><code><a HREF="../alpha">alpha</a>/*/tst</code></td>
     92       <td></td>
     93       <td>ALPHA test outputs</td>
     94     </tr>
     95     <tr>
     96       <td><code><a HREF="../mips">mips</a>/*/tst</code></td>
     97       <td></td>
     98       <td>MIPS test outputs</td>
     99     </tr>
    100     <tr>
    101       <td><code><a HREF="../sparc">sparc</a>/*/tst</code></td>
    102       <td></td>
    103       <td>SPARC test outputs</td>
    104     </tr>
    105     <tr>
    106       <td><code><a HREF="../x86">x86</a>/*/tst</code></td>
    107       <td></td>
    108       <td>X86 test outputs</td>
    109     </tr>
    110   </table>
    111 </blockquote>
    112 
    113 <p><code>doc/install.html</code> is the HTML file for this document. <a HREF="4.html"><code>doc/4.html</code></a>
    114 describes the internal differences between lcc 3.x and 4.1.</p>
    115 
    116 <p>The installation makefile is designed so that lcc can be installed from a read-only
    117 file system or directory, which is common in networked environments, so the distribution
    118 can be unloaded on a central file server. <strong>You will need an existing ANSI/ISO C
    119 compiler to build and install lcc.</strong></p>
    120 
    121 <h2><a NAME="unix">Installation on UNIX</a></h2>
    122 
    123 <p>The compilation components (the preprocessor, include files, and compiler proper, etc.)
    124 are installed in a single <em>build directory</em>. On multi-platform systems supported by
    125 a central file server, it's common to store the build directory in a location specific to
    126 the platform and to the version of lcc, and to point a symbolic link to this location. For
    127 example,</p>
    128 
    129 <blockquote>
    130   <pre>% ln -s /usr/local/lib/lcc-4.1/sparc-solaris /usr/local/lib/lcc</pre>
    131 </blockquote>
    132 
    133 <p>points <code>/usr/local/lib/lcc</code> to a build directory for lcc version 4.1 on the
    134 SPARC under Solaris. Links into <code>/usr/local/lib</code> are created for the programs <code>lcc</code>
    135 and <code>bprint</code>. Thus, a new distribution can be installed by building it in its
    136 own build directory and changing one symbolic link to point to that directory. If these
    137 conventions or their equivalents are followed, the host-specific parts of the driver
    138 program, <code>lcc</code>, can be used unmodified.</p>
    139 
    140 <p>Installation on a UNIX system involves the following steps. Below, the build directory
    141 is referred to as <code>BUILDDIR</code>. 
    142 
    143 <ol>
    144   <li>Create the build directory, using a version- and platform-specific naming convention as
    145     suggested above, and record the name of this directory in the <code>BUILDDIR</code>
    146     environment variable:<blockquote>
    147       <pre>% setenv BUILDDIR /usr/local/lib/lcc-4.1/sparc-solaris
    148 % mkdir -p $BUILDDIR</pre>
    149     </blockquote>
    150     <p>Here and below, commands assume the C shell. Also, you'll need a version of <code>mkdir</code>
    151     that supports the <code>-p</code> option, which creates intermediate directories as
    152     necessary.</p>
    153   </li>
    154   <li>Copy the man pages to the repository for local man pages, e.g.,<blockquote>
    155       <pre>% cp doc/*.1 /usr/local/man/man1</pre>
    156     </blockquote>
    157     <p>Some users copy the man pages to the build directory and create the appropriate
    158     symbolic links, e.g., </p>
    159     <blockquote>
    160       <pre>% cp doc/*.1 $BUILDDIR
    161 % ln -s $BUILDDIR/*.1 /usr/local/man/man1</pre>
    162     </blockquote>
    163   </li>
    164   <li>Platform-specific include files are in directories named <code>include/</code><em>target</em><code>/</code><em>os</em>.
    165     Create the include directory in the build directory, and copy the include hierarchy for
    166     your platform to this directory, e.g.,<blockquote>
    167       <pre>% mkdir $BUILDDIR/include
    168 % cp -p -R include/sparc/solaris/* $BUILDDIR/include</pre>
    169     </blockquote>
    170     <p>Again, some users create a symbolic link to the appropriate directory in the
    171     distribution instead of copying the include files. For example, at Princeton, the
    172     distributions are stored under <code>/proj/pkg/lcc</code>, so the included files are
    173     &quot;installed&quot; by creating one symbolic link: </p>
    174     <blockquote>
    175       <pre>% ln -s /proj/pkg/lcc/4.1/include/sparc/solaris $BUILDDIR/include</pre>
    176     </blockquote>
    177     <p>If you're installing lcc on Linux, you <em>must</em> also plant a symbolic link named <code>gcc</code>
    178     to gcc's library directory, because lcc uses gcc's C preprocessor and most of gcc's header
    179     files:</p>
    180     <blockquote>
    181       <pre>% ln -s /usr/lib/gcc-lib/i486-linux/2.7.2.2 $BUILDDIR/gcc</pre>
    182     </blockquote>
    183     <p>The library directory shown above may be different on your Linux machine; to determine
    184     the correct directory, browse <code>/usr/lib/gcc-lib</code>, or execute</p>
    185     <blockquote>
    186       <pre>% cc -v tst/8q.c</pre>
    187     </blockquote>
    188     <p>and examine the diagnostic output. Make sure that <code>$BUILDDIR/gcc/cpp</code> and <code>$BUILDDIR/gcc/include</code>
    189     point to, respectively, gcc's C preprocessor and header files. On Linux, lcc looks for
    190     include files in <code>$BUILDDIR/include</code>, <code>$BUILDDIR/gcc/include</code>, and <code>/usr/include</code>,
    191     in that order; see <a HREF="#driver"><em>Building the Driver</em></a> and <a
    192     href="../etc/linux.c"><code>etc/linux.c</code></a> for details.</p>
    193   </li>
    194   <li>The <a HREF="../makefile"><code>makefile</code></a> includes the file named by the <code>CUSTOM</code>
    195     macro; the default is <code>custom.mk</code>, and an empty <code>custom.mk</code> is
    196     included in the distribution. If desired, prepare a site-specification customization file
    197     and define <code>CUSTOM</code> to the path of that file when invoking make in steps 5 and
    198     6, e.g.,<blockquote>
    199       <pre>make CUSTOM=/users/drh/solaris.mk</pre>
    200     </blockquote>
    201     <p>You can, for example, use customization files to record site-specific values for macros
    202     instead of using environment variables, and to record targets for the steps in this list.</p>
    203   </li>
    204   <li>Build the host-specific driver, creating a custom host-specific part, if necessary. See <a
    205     HREF="#driver"><em>Building the Driver</em></a>.</li>
    206   <li>Build the preprocessor, compiler proper, library, and other accessories. See <a
    207     HREF="#rcc"><em>Building the Compiler</em></a>.</li>
    208   <li>Plant symbolic links to the build directory and to the installed programs, e.g.,<blockquote>
    209       <pre>% ln -s $BUILDDIR /usr/local/lib/lcc
    210 % ln -s /usr/local/lib/{lcc,bprint} /usr/local/bin</pre>
    211     </blockquote>
    212     <p>Some users copy <code>bprint</code> and <code>lcc</code> into <code>/usr/local/bin</code>
    213     instead of creating symbolic links. The advantange of creating the links for <code>lcc</code>
    214     and <code>bprint</code> as shown is that, once established, they point indirectly to
    215     whatever <code>/usr/local/lib/lcc</code> points to; installing a new version of lcc, say,
    216     4.2, can be done by changing <code>/usr/local/lib/lcc</code> to point to the 4.2 build
    217     directory.</p>
    218   </li>
    219 </ol>
    220 
    221 <h2><a NAME="driver">Building the Driver</a></h2>
    222 
    223 <p>The preprocessor, compiler, assembler, and loader are invoked by a driver program, <code>lcc</code>,
    224 which is similar to <code>cc</code> on most systems. It's described in the man page <code>doc/lcc.1</code>.
    225 The driver is built by combining the host-independent part, <a href="../etc/lcc.c"><code>etc/lcc.c</code></a>,
    226 with a small host-specific part. Distributed host-specific parts are named <code>etc/</code><em>os</em><code>.c</code>,
    227 where <em>os</em> is the name of the operating system for the host on which <code>lcc</code>
    228 is being installed. If you're following the installations conventions described above, you
    229 can probably use one of the host-specific parts unmodified; otherwise, pick one that is
    230 closely related to your platform, copy it to <em>whatever</em><code>.c</code>, and edit it
    231 as described below. You should not have to edit <code>etc/lcc.c</code>.</p>
    232 
    233 <p>We'll use <a HREF="../etc/solaris.c"><code>etc/solaris.c</code></a> as an example in
    234 describing how the host-specific part works. This example illustrates all the important
    235 features. Make sure you have the environment variable <code>BUILDDIR</code> set correctly,
    236 and build the driver with a <code>make</code> command, e.g.,</p>
    237 
    238 <blockquote>
    239   <pre>% make HOSTFILE=etc/solaris.c lcc
    240 cc -g -c -DTEMPDIR=\&quot;/tmp\&quot; -o /usr/local/lib/lcc-4.1/sparc-solaris/lcc.o etc/lcc.c
    241 cc -g -c -o /usr/local/lib/lcc-4.1/sparc-solaris/host.o etc/solaris.c
    242 cc -g -o /usr/local/lib/lcc-4.1/sparc-solaris/lcc /usr/local/lib/lcc-4.1/sparc-solaris/lcc.o /usr/local/lib/lcc-4.1/sparc-solaris/host.o</pre>
    243 </blockquote>
    244 
    245 <p>The symbolic name <code>HOSTFILE</code> specifies the path to the host-specific part,
    246 either one in the distribution or <em>whatever</em><code>.c</code>. Some versions of make
    247 may require the <code>-e</code> option in order to read the environment.</p>
    248 
    249 <p>Here's <code>etc/solaris.c</code>:</p>
    250 
    251 <blockquote>
    252   <pre>/* Sparcs running Solaris 2.5.1 at CS Dept., Princeton University */
    253 
    254 #include &lt;string.h&gt;
    255 
    256 static char rcsid[] = &quot;$ Id: solaris.c,v 1.10 1998/09/14 20:36:33 drh Exp $&quot;;
    257 
    258 #ifndef LCCDIR
    259 #define LCCDIR &quot;/usr/local/lib/lcc/&quot;
    260 #endif
    261 #ifndef SUNDIR
    262 #define SUNDIR &quot;/opt/SUNWspro/SC4.2/lib/&quot;
    263 #endif
    264 
    265 char *suffixes[] = { &quot;.c&quot;, &quot;.i&quot;, &quot;.s&quot;, &quot;.o&quot;, &quot;.out&quot;, 0 };
    266 char inputs[256] = &quot;&quot;;
    267 char *cpp[] = { LCCDIR &quot;cpp&quot;,
    268 	&quot;-D__STDC__=1&quot;, &quot;-Dsparc&quot;, &quot;-D__sparc__&quot;, &quot;-Dsun&quot;, &quot;-D__sun__&quot;, &quot;-Dunix&quot;,
    269 	&quot;$1&quot;, &quot;$2&quot;, &quot;$3&quot;, 0 };
    270 char *include[] = { &quot;-I&quot; LCCDIR &quot;include&quot;, &quot;-I/usr/local/include&quot;,
    271 	&quot;-I/usr/include&quot;, 0 };
    272 char *com[] = { LCCDIR &quot;rcc&quot;, &quot;-target=sparc/solaris&quot;,
    273 	&quot;$1&quot;, &quot;$2&quot;, &quot;$3&quot;, 0 };
    274 char *as[] = { &quot;/usr/ccs/bin/as&quot;, &quot;-Qy&quot;, &quot;-s&quot;, &quot;-o&quot;, &quot;$3&quot;, &quot;$1&quot;, &quot;$2&quot;, 0 };
    275 char *ld[] = { &quot;/usr/ccs/bin/ld&quot;, &quot;-o&quot;, &quot;$3&quot;, &quot;$1&quot;,
    276 	SUNDIR &quot;crti.o&quot;, SUNDIR &quot;crt1.o&quot;,
    277 	SUNDIR &quot;values-xa.o&quot;, &quot;$2&quot;, &quot;&quot;,
    278 	&quot;-Y&quot;, &quot;P,&quot; SUNDIR &quot;:/usr/ccs/lib:/usr/lib&quot;, &quot;-Qy&quot;,
    279 	&quot;-L&quot; LCCDIR, &quot;-llcc&quot;, &quot;-lm&quot;, &quot;-lc&quot;, SUNDIR &quot;crtn.o&quot;, 0 };
    280 
    281 extern char *concat(char *, char *);
    282 
    283 int option(char *arg) {
    284 	if (strncmp(arg, &quot;-lccdir=&quot;, 8) == 0) {
    285 		cpp[0] = concat(&amp;arg[8], &quot;/cpp&quot;);
    286 		include[0] = concat(&quot;-I&quot;, concat(&amp;arg[8], &quot;/include&quot;));
    287 		ld[12] = concat(&quot;-L&quot;, &amp;arg[8]);
    288 		com[0] = concat(&amp;arg[8], &quot;/rcc&quot;);
    289 	} else if (strcmp(arg, &quot;-p&quot;) == 0) {
    290 		ld[5] = SUNDIR &quot;mcrt1.o&quot;;
    291 		ld[10] = &quot;P,&quot; SUNDIR &quot;libp:/usr/ccs/lib/libp:/usr/lib/libp:&quot;
    292 			 SUNDIR &quot;:/usr/ccs/lib:/usr/lib&quot;;
    293 	} else if (strcmp(arg, &quot;-b&quot;) == 0)
    294 		;
    295 	else if (strncmp(arg, &quot;-ld=&quot;, 4) == 0)
    296 		ld[0] = &amp;arg[4];
    297 	else
    298 		return 0;
    299 	return 1;
    300 }</pre>
    301 </blockquote>
    302 
    303 <p><code>LCCDIR</code> defaults to <code>&quot;/usr/local/lib/lcc/&quot;</code> unless
    304 it's defined by a <code>-D</code> option as part of <code>CFLAGS</code> in the make
    305 command, e.g.,</p>
    306 
    307 <blockquote>
    308   <pre>% make HOSTFILE=etc/solaris.c CFLAGS='-DLCCDIR=\&quot;/v/lib/lcc/\&quot;' lcc</pre>
    309 </blockquote>
    310 
    311 <p>Note the trailing slash; <code>SUNDIR</code> is provided so you can use <code>etc/solaris.c</code>
    312 even if you have a different version of the Sun Pro compiler suite. If you're using the
    313 gcc compiler tools instead of the Sun Pro tools, see <a HREF="../etc/gcc-solaris.c"><code>etc/gcc-solaris.c</code></a>.</p>
    314 
    315 <p>Most of the host-specific code is platform-specific data and templates for the commands
    316 that invoke the preprocessor, compiler, assembler, and loader. The <code>suffixes</code>
    317 array lists the file name suffixes for C source files, preprocessed source files, assembly
    318 language source files, object files, and executable files. <code>suffixes</code> must be
    319 terminated with a null pointer, as shown above. The initialization of <code>suffixes</code>
    320 in <code><a HREF="../etc/solaris.c">etc/solaris.c</a></code> are the typical ones for UNIX
    321 systems. Each element of <code>suffixes</code> is actually a list of suffixes, separated
    322 by semicolons; <code><a HREF="../etc/win32.c">etc/win32.c</a></code> holds an example:</p>
    323 
    324 <blockquote>
    325   <pre>char *suffixes[] = { &quot;.c;.C&quot;, &quot;.i;.I&quot;, &quot;.asm;.ASM;.s;.S&quot;, &quot;.obj;.OBJ&quot;, &quot;.exe&quot;, 0 };</pre>
    326 </blockquote>
    327 
    328 <p>When a list is given, the first suffix is used whenever lcc needs to generate a file
    329 name. For example, with <code><a HREF="../etc/win32.c">etc/win32.c</a></code>, lcc emits
    330 the generated assembly code into <code>.asm</code> files.</p>
    331 
    332 <p>The <code>inputs</code> array holds a null-terminated string of directories separated
    333 by colons or semicolons. These are used as the default value of <code>LCCINPUTS</code>, if
    334 the environment variable <code>LCCINPUTS</code> is not set; see the <a HREF="lcc.pdf">man
    335 page</a>.</p>
    336 
    337 <p>Each command template is an array of pointers to strings terminated with a null
    338 pointer; the strings are full path names of commands, arguments, or argument placeholders,
    339 which are described below. Commands are executed in a child process, and templates can
    340 contain multiple commands by separating commands with newlines. The driver runs each
    341 command in a new process.</p>
    342 
    343 <p>The <code>cpp</code> array gives the command for running lcc's preprocessor, <code>cpp</code>.
    344 Literal arguments specified in templates, e.g., <code>&quot;-Dsparc&quot;</code> in the <code>cpp</code>
    345 command above, are passed to the command as given.</p>
    346 
    347 <p>The strings <code>&quot;$1&quot;</code>, <code>&quot;$2&quot;</code>, and <code>&quot;$3&quot;</code>
    348 in templates are placeholders for <em>lists</em> of arguments that are substituted in a
    349 copy of the template before the command is executed. <code>$1</code> is replaced by the <em>options</em>
    350 specified by the user; for the preprocessor, this list always contains at least <code>-D__LCC__</code>.
    351 <code>$2</code> is replaced by the <em>input</em> files, and <code>$3</code> is replaced
    352 by the <em>output</em> file.</p>
    353 
    354 <p>Zero-length arguments after replacement are removed from the argument list before the
    355 command is invoked. So, for example, if the preprocessor is invoked without an output
    356 file, <code>&quot;$3&quot;</code> becomes <code>&quot;&quot;</code>, which is removed from
    357 the final argument list.</p>
    358 
    359 <p>The <code>include</code> array is a list of <code>-I</code> options that specify which
    360 directives should be searched to satisfy include directives. These directories are
    361 searched in the order given. The first directory should be the one to which the ANSI
    362 header files were copied as described in <a HREF="#unix">UNIX</a> or <a HREF="#win32">Windows</a>
    363 installation instructions. The driver adds these options to <code>cpp</code>'s arguments
    364 when it invokes the preprocessor, except when <code>-N</code> is specified.</p>
    365 
    366 <p><code>com</code> gives the command for invoking the compiler. This template can appear
    367 as shown above in a custom host-specific part, but the option <code>-target=sparc/solaris</code>
    368 should be edited to the <em>target</em><code>/</code><em>os</em> for your platform. If <code>com[1]</code>
    369 includes the string &quot;<code>win32</code>&quot;, the driver assumes it's running on
    370 Windows. lcc can generate code for <em>all</em> of the <em>target</em><code>/</code><em>os</em>
    371 combinations listed in the file <code>src/bind.c</code>. The <code>-target</code> option
    372 specifies the default combination. The driver's <code>-Wf</code> option can be used to
    373 specify other combinations; the <a HREF="lcc.pdf">man page</a> elaborates.</p>
    374 
    375 <p><code>as</code> gives the command for invoking the assembler. On Linux, you must be
    376 running at least version 2.8.1 of the GNU assembler; earlier versions mis-assemble some
    377 instructions emitted by lcc.</p>
    378 
    379 <p><code>ld</code> gives the command for invoking the loader. For the other commands, the
    380 list <code>$2</code> contains a single file; for <code>ld</code>, <code>$2</code> contains
    381 all &quot;.o&quot; files and libraries, and <code>$3</code> is <code>a.out</code>, unless
    382 the <code>-o</code> option is specified. As suggested in the code above, <code>ld</code>
    383 must also specify the appropriate startup code and default libraries, including the lcc
    384 library, <code>liblcc.a</code>.</p>
    385 
    386 <p>The <code>option</code> function is described below; the minimal <code>option</code>
    387 function just returns 0.</p>
    388 
    389 <p>You can test <code>lcc</code> with the options <code>-v -v</code> to display the
    390 commands that would be executed, e.g.,</p>
    391 
    392 <blockquote>
    393   <pre>% $BUILDDIR/lcc -v -v foo.c baz.c mylib.a -lX11
    394 /usr/local/lib/lcc-4.1/lcc $ Id: solaris.c,v 1.10 1998/09/14 20:36:33 drh Exp $
    395 foo.c:
    396 /usr/local/lib/lcc/cpp -D__STDC__=1 -Dsparc -D__sparc__ -Dsun -D__sun__ -Dunix -D__LCC__ -I/usr/local/lib/lcc/include -I/usr/local/include -I/usr/include foo.c /tmp/lcc266290.i
    397 /usr/local/lib/lcc/rcc -target=sparc/solaris -v /tmp/lcc266290.i /tmp/lcc266291.
    398 s
    399 /usr/ccs/bin/as -Qy -s -o /tmp/lcc266292.o /tmp/lcc266291.s
    400 baz.c:
    401 /usr/local/lib/lcc/cpp -D__STDC__=1 -Dsparc -D__sparc__ -Dsun -D__sun__ -Dunix -D__LCC__ -I/usr/local/lib/lcc/include -I/usr/local/include -I/usr/include baz.c /tmp/lcc266290.i
    402 /usr/local/lib/lcc/rcc -target=sparc/solaris -v /tmp/lcc266290.i /tmp/lcc266291.s
    403 /usr/ccs/bin/as -Qy -s -o /tmp/lcc266293.o /tmp/lcc266291.s
    404 /usr/ccs/bin/ld -o a.out /opt/SUNWspro/SC4.2/lib/crti.o /opt/SUNWspro/SC4.2/lib/crt1.o /opt/SUNWspro/SC4.2/lib/values-xa.o /tmp/lcc266292.o /tmp/lcc266293.o mylib.a -lX11 -Y P,/opt/SUNWspro/SC4.2/lib/:/usr/ccs/lib:/usr/lib -Qy -L/usr/local/lib/lcc/ -llcc -lm -lc /opt/SUNWspro/SC4.2/lib/crtn.o
    405 rm /tmp/lcc266293.o /tmp/lcc266290.i /tmp/lcc266291.s /tmp/lcc266292.o</pre>
    406 </blockquote>
    407 
    408 <p>As the output shows, <code>lcc</code> places temporary files in <code>/tmp</code>; if
    409 any of the environment variables <code>TMP</code>, <code>TEMP</code>, and <code>TMPDIR</code>
    410 are set, they override this default (in the order shown) as does the <code>-tempdir=</code><em>dir</em>
    411 option. The default can be changed by defining <code>TEMPDIR</code> in <code>CFLAGS</code>
    412 when building the driver.</p>
    413 
    414 <p>The <code>option</code> function is called for the options <code>-Wo</code>, <code>-g</code>,
    415 <code>-p</code>, <code>-pg</code>, and <code>-b</code> because these compiler options
    416 might also affect the loader's arguments. For these options, the driver calls <code>option(arg)</code>
    417 to give the host-specific code an opportunity to edit the <code>ld</code> command, if
    418 necessary. <code>option</code> can change <code>ld</code>, if necessary, and return 1 to
    419 announce its acceptance of the option. If the option is unsupported, <code>option</code>
    420 should return 0.</p>
    421 
    422 <p>For example, in response to <code>-g</code>, the <code>option</code> function shown
    423 above accepts the option but does nothing else, because the <code>ld</code> and <code>as</code>
    424 commands don't need to be modified on the SPARC. <code>-g</code> will also be added to the
    425 compiler's options by the host-independent part of the driver. The <code>-p</code> causes <code>option</code>
    426 to change the name of the startup code and changed the list of libraries. The <code>-b</code>
    427 option turns on <code>lcc</code>'s per-expression profiling, the code for which is in <code>liblcc.a</code>,
    428 so <code>option</code> need no nothing.</p>
    429 
    430 <p>On SPARCs, the driver also recognizes <code>-Bstatic</code> and <code>-Bdynamic</code>
    431 as linker options. The driver recognizes but ignores &quot;<code>-target</code> <em>name</em>&quot;
    432 option.</p>
    433 
    434 <p>The option <code>-Wo</code><em>arg</em> causes the driver to pass <em>arg</em> to <code>option</code>.
    435 Such options have no other effect; this mechanism is provided to support system-specific
    436 options that affect the commands executed by the driver. As illustrated above,
    437 host-specific parts should support the <code>-Wo-lccdir=</code><em>dir</em> option, which
    438 causes lcc's compilation components to be found in <em>dir</em>, because this option is
    439 used by the test scripts, and because the driver simulates a <code>-Wo-lccdir</code>
    440 option with the value of the environment variable <code>LCCDIR</code>, if it's defined.
    441 The code above rebuilds the paths to the include files, preprocessor, compiler, and
    442 library by calling <code>concat</code>, which is defined in <code>etc/lcc.c</code>.</p>
    443 
    444 <h2><a NAME="rcc">Building the Compiler and Accessories</a></h2>
    445 
    446 <p>To build the rest of compilation components make sure <code>BUILDDIR</code> is set
    447 appropriately and type &quot;<code>make all</code>&quot;. This command builds <code>librcc.a</code>
    448 (the compiler's private library), <code>rcc</code> (the compiler proper), <code>lburg</code>
    449 (the code-generator generator), <code>cpp</code> (the preprocessor), <code>liblcc.a</code>
    450 (the runtime library), and <code>bprint</code> (the profile printer), all in <code>BUILDDIR</code>.
    451 There may be warnings, but there should be no errors. If you're using an ANSI/ISO compiler
    452 other than <code>cc</code>, specify its name with the <code>CC=</code> option, e.g.,
    453 &quot;<code>make CC=gcc all</code>&quot;. If you're running on a DEC ALPHA, use &quot;<code>make
    454 CC='cc -std1' all</code>&quot;; the <code>-std1</code> option is essential on the ALPHA.
    455 If you're on a DEC 5000 running Ultrix 4.3, use &quot;<code>make CC=c89 all</code>&quot;.</p>
    456 
    457 <p>Once <code>rcc</code> is built with the host C compiler, run the test suite to verify
    458 that <code>rcc</code> is working correctly. If any of the steps below fail, contact us
    459 (see <a HREF="#bugs"><em>Reporting Bugs</em></a>). The commands in the makefile run the
    460 shell script <code>src/run.sh</code> on each C program in the test suite, <code>tst/*.c</code>.
    461 It uses the driver, <code>$BUILDDIR/lcc</code>, so you must have the driver in the build
    462 directory before testing <code>rcc</code>. The <em>target</em><code>/</code><em>os</em>
    463 combination is read from the variable <code>TARGET</code>, which must be specified when
    464 invoking <code>make</code>:</p>
    465 
    466 <blockquote>
    467   <pre>% make TARGET=sparc/solaris test
    468 mkdir -p /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst
    469 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/8q.s:
    470 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/array.s:
    471 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/cf.s:
    472 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/cq.s:
    473 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/cvt.s:
    474 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/fields.s:
    475 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/front.s:
    476 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/incr.s:
    477 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/init.s:
    478 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/limits.s:
    479 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/paranoia.s:
    480 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/sort.s:
    481 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/spill.s:
    482 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/stdarg.s:
    483 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/struct.s:
    484 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/switch.s:
    485 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/wf1.s:
    486 /usr/local/lib/lcc-4.1/sparc-solaris/rcc -target=sparc/solaris /usr/local/lib/lcc-4.1/sparc-solaris/sparc/solaris/tst/yacc.s:</pre>
    487 </blockquote>
    488 
    489 <p>Each line in the output above is of the form</p>
    490 
    491 <blockquote>
    492   <p><code>$BUILDDIR/rcc -target=</code><em>target</em><code>/</code><em>os</em><code>$BUILDDIR/</code><em>target</em><code>/</code><em>os</em><code>/</code><em>X</em><code>.s:</code></p>
    493 </blockquote>
    494 
    495 <p>where <em>X</em> is the base name of the C program <em>X</em><code>.c</code> in the
    496 test suite. This output identifies the compiler and the target, e.g., &quot;<code>$BUILDDIR/rcc</code>
    497 is generating code for a <code>sparc</code> running the <code>solaris</code> operating
    498 system.&quot;</p>
    499 
    500 <p>For each program in the test suite, <code>src/run.sh</code> compiles the program, drops
    501 the generated assembly language code in <code>BUILDDIR</code>/<em>target</em><code>/</code><em>os</em>,
    502 and uses <code>diff</code> to compare the generated assembly code with the expected code
    503 (the code expected for <code>tst/8q.c</code> on the SPARC under Solaris is in <code>sparc/solaris/tst/8q.sbk</code>,
    504 etc.). If there are differences, the script executes the generated code with the input
    505 given in <code>tst</code> (the input for <code>tst/8q.c</code> is in <code>tst/8q.0</code>,
    506 etc.) and compares the output with the expected output (the expected output from <code>tst/8q.c</code>
    507 on the SPARC under Solaris is in <code>sparc/solaris/tst/8q.1bk</code>, etc.). The script
    508 also compares the diagnostics from the compiler with the expected diagnostics.</p>
    509 
    510 <p>On some systems, there may be a few differences between the generated code and the
    511 expected code. These differences occur because the expected code is generated by cross
    512 compilation and the least significant bits of some floating-point constants differ from
    513 those bits in constants generated on your system. On Linux, there may be differences
    514 because of differences in the header files between our system and yours. There should be
    515 no differences in the output from executing the test programs.</p>
    516 
    517 <p>Next, run the &quot;triple test&quot;, which builds <code>rcc</code> using itself:</p>
    518 
    519 <blockquote>
    520   <pre>% make triple
    521 /usr/local/lib/lcc-4.1/sparc-solaris/lcc -o /usr/local/lib/lcc-4.1/sparc-solaris/1rcc -d0.6 -Wo-lccdir=/usr/local/lib/lcc-4.1/sparc-solaris -B/usr/local/lib/lcc-4.1/sparc-solaris/  -Isrc src/*.c
    522 src/alloc.c:
    523 ...
    524 src/x86.c:
    525 /usr/local/lib/lcc-4.1/sparc-solaris/lcc -o /usr/local/lib/lcc-4.1/sparc-solaris/1rcc -d0.6 -Wo-lccdir=/usr/local/lib/lcc-4.1/sparc-solaris -B/usr/local/lib/lcc-4.1/sparc-solaris/  -Isrc src/*.c
    526 src/alloc.c:
    527 ...
    528 src/x86.c:
    529 strip /usr/local/lib/lcc-4.1/sparc-solaris/[12]rcc
    530 dd if=/usr/local/lib/lcc-4.1/sparc-solaris/1rcc of=/usr/local/lib/lcc-4.1/sparc-solaris/rcc1 bs=512 skip=1
    531 769+1 records in
    532 769+1 records out
    533 dd if=/usr/local/lib/lcc-4.1/sparc-solaris/2rcc of=/usr/local/lib/lcc-4.1/sparc-solaris/rcc2 bs=512 skip=1
    534 769+1 records in
    535 769+1 records out
    536 if cmp /usr/local/lib/lcc-4.1/sparc-solaris/rcc[12]; then \
    537         mv /usr/local/lib/lcc-4.1/sparc-solaris/2rcc /usr/local/lib/lcc-4.1/sparc-solaris/rcc; \
    538         rm -f /usr/local/lib/lcc-4.1/sparc-solaris/1rcc /usr/local/lib/lcc-4.1/sparc-solaris/rcc[12]; fi</pre>
    539 </blockquote>
    540 
    541 <p>This command builds <code>rcc</code> twice; once using the <code>rcc</code> built by <code>cc</code>
    542 and again using the <code>rcc</code> built by <code>lcc</code>. The resulting binaries are
    543 compared. They should be identical, as shown at the end of the output above. If they
    544 aren't, our compiler is generating incorrect code; <a HREF="#bugs">contact</a> us.</p>
    545 
    546 <p>The final version of <code>rcc</code> should also pass the test suite; that is, the
    547 output from</p>
    548 
    549 <blockquote>
    550   <pre>% make TARGET=sparc/solaris test</pre>
    551 </blockquote>
    552 
    553 <p>should be identical to that from the previous <code>make test</code>.</p>
    554 
    555 <p>The command &quot;<code>make clean</code>&quot; cleans up, but does not remove <code>rcc</code>,
    556 etc., and &quot;<code>make clobber</code>&quot; cleans up and removes <code>lcc</code>, <code>rcc</code>,
    557 and the other accessories. Test directories under <code>BUILDDIR</code> are <em>not</em>
    558 removed; you'll need to remove these by hand, e.g.,</p>
    559 
    560 <blockquote>
    561   <pre>% rm -fr $BUILDDIR/sparc</pre>
    562 </blockquote>
    563 
    564 <p>The code generators for the other targets can be tested by specifying the desired <em>target</em><code>/</code><em>os</em>
    565 and setting an environment variable that controls what <code>src/run.sh</code> does. For
    566 example, to test the MIPS code generator, type</p>
    567 
    568 <blockquote>
    569   <pre>% setenv REMOTEHOST noexecute
    570 % make TARGET=mips/irix test</pre>
    571 </blockquote>
    572 
    573 <p>As above, <code>src/run.sh</code> compares the MIPS code generated with what's
    574 expected. There should be no differences. Setting <code>REMOTEHOST</code> to <code>noexecute</code>
    575 suppresses the assembly and execution of the generated code. If you set <code>REMOTEHOST</code>
    576 to the name of a MIPS machine to which you can <code>rlogin</code>, <code>src/run.sh</code>
    577 will <code>rcp</code> the generated code to that machine and execute it there, if
    578 necessary. See <code>src/run.sh</code> for the details.</p>
    579 
    580 <p>You can use lcc as a cross compiler. The options <code>-S</code> and <code>-Wf-target=</code><em>target/os</em>
    581 generate assembly code for the specified target, which is any of those listed in the file <code>src/bind.c</code>.
    582 For example, </p>
    583 
    584 <blockquote>
    585   <pre>% lcc -Wf-target=mips/irix -S tst/8q.c</pre>
    586 </blockquote>
    587 
    588 <p>generates MIPS code for <code>tst/8q.c</code> in <code>8q.s</code>.</p>
    589 
    590 <p>lcc can also generate code for a &quot;symbolic&quot; target. This target is used
    591 routinely in front-end development, and its output is a printable representation of the
    592 input program, e.g., the dags constructed by the front end are printed, and other
    593 interface functions print their arguments. You can specify this target with the option <code>-Wf-target=symbolic</code>.
    594 For example,</p>
    595 
    596 <blockquote>
    597   <pre>% lcc -Wf-target=symbolic -S tst/8q.c</pre>
    598 </blockquote>
    599 
    600 <p>generates symbolic output for <code>tst/8q.c</code> in <code>8q.s</code>. Adding <code>-Wf-html</code>
    601 causes the symbolic target to emit HTML instead of plain text. Finally, the option <code>-Wf-target=null</code>
    602 specifies the &quot;null&quot; target for which lcc emits nothing and thus only checks the
    603 syntax and semantics of its input files.</p>
    604 
    605 <h2><a NAME="win32">Installation on Windows NT 4.0 or Windows 95/98</a></h2>
    606 
    607 <p>On Windows NT 4.0 and Windows 95/98, lcc is designed to work with Microsoft's Visual
    608 C++ 5.0 (VC) and Microsoft's Assembler, MASM 6.11d. It uses the VC header files,
    609 libraries, and command-line tools, and it uses MASM to assemble the code it generates. If
    610 you have MASM 6.11, make sure you <a
    611 HREF="http://support.microsoft.com/support/kb/articles/Q138/9/83.asp">upgrade to 6.11d</a>,
    612 because earlier 6.11 releases do not generate correct COFF object files.</p>
    613 
    614 <p>Building the distribution components from the ground up requires Microsoft's Visual
    615 C/C++ 5.0 compiler, Microsoft's make, <code>nmake</code>, and the standard Windows command
    616 interpreter. <a HREF="../makefile.nt"><code>makefile.nt</code></a> is written to use only <code>nmake</code>.
    617 As on UNIX systems, the compilation components are installed in a single <em>build
    618 directory</em>, and the top-level programs, <code>lcc.exe</code> and <code>bprint.exe</code>,
    619 are installed in a directory on the PATH. If the conventions used below are followed, the
    620 Windows-specific parts of the driver program, <code>lcc.exe</code>, can be used
    621 unmodified.</p>
    622 
    623 <p>Building from the source distribution on a Windows system involves the following steps.
    624 Below, the build directory is referred to as <code>BUILDDIR</code>, and the distribution
    625 is in <code>\dist\lcc\4.1</code>. 
    626 
    627 <ol>
    628   <li>Create the build directory, perhaps using a version- and platform-specific naming
    629     convention as suggested in <a HREF="#unix"><em>Installation on UNIX</em></a>, and record
    630     the name of this directory in the <code>BUILDDIR</code> environment variable:<blockquote>
    631       <pre>C:\dist\lcc\4.1&gt;set BUILDDIR=\progra~1\lcc\4.1\bin
    632 C:\dist\lcc\4.1&gt;mkdir %BUILDDIR%</pre>
    633     </blockquote>
    634     <p>The default build, or installation, directory is <code>\Program Files\lcc\4.1\bin</code>,
    635     but the <code>nmake</code> commands require that you use the corresponding 8.3 file name, <code>progra~1</code>,
    636     instead of <code>Program Files</code>.</p>
    637   </li>
    638   <li><a HREF="../etc/win32.c"><code>etc\win32.c</code></a> is the Windows-specific part of
    639     the driver. It assumes that environment variable <code>include</code> gives the locations
    640     of the VC header files and that the linker (<code>link.exe</code>) and the assembler (<code>ml.exe</code>)
    641     are on the PATH. It also assumes that the macro <code>LCCDIR</code> gives the build
    642     directory. If necessary, revise a copy of <a HREF="../etc/win32.c"><code>etc\win32.c</code></a>
    643     to reflect the conventions on your computer (see <a HREF="#driver"><em>Building the Driver</em></a>),
    644     then build the driver, specifying the default temporary directory, if necessary:<blockquote>
    645       <pre>C:\dist\lcc\4.1&gt;nmake -f makefile.nt TEMPDIR=\\temp HOSTFILE=etc/win32.c lcc
    646 ...
    647         cl -nologo -Zi -MLd -Fd\progra~1\lcc\4.1\bin\ -c -DTEMPDIR=\&quot;\\temp\&quot; -Fo\progra~1\lcc\4.1\bin\lcc.obj etc/lcc.c
    648 lcc.c
    649         cl -nologo -Zi -MLd -Fd\progra~1\lcc\4.1\bin\ -c -Fo\progra~1\lcc\4.1\bin\host.obj etc/win32.c
    650 win32.c
    651         cl -nologo -Zi -MLd -Fd\progra~1\lcc\4.1\bin\ -Fe\progra~1\lcc\4.1\bin\lcc.exe \progra~1\lcc\4.1\bin\lcc.obj \progra~1\lcc\4.1\bin\host.obj</pre>
    652     </blockquote>
    653     <p>If you make a copy of <code>etc\win32.c</code>, specify the path of the copy as the
    654     value of <code>HOSTFILE</code>. For example, if you copy <code>etc\win32.c</code> to <code>BUILDDIR</code>
    655     and edit it, use the command</p>
    656     <blockquote>
    657       <pre>C:\dist\lcc\4.1&gt;nmake -f makefile.nt TEMPDIR=\\temp HOSTFILE=%BUILDDIR%\win32.c lcc</pre>
    658     </blockquote>
    659   </li>
    660   <li>Build the preprocessor, compiler proper, library, and other accessories (see <a
    661     HREF="#rcc"><em>Building the Compiler</em></a>):<blockquote>
    662       <pre>C:\dist\lcc\4.1&gt;nmake -f makefile.nt all</pre>
    663     </blockquote>
    664     <p>This command uses the VC command-line tools <code>cl</code> and <code>lib</code> to
    665     build <code>bprint.exe</code>, <code>cpp.exe</code>, <code>lburg.exe</code>, <code>liblcc.lib</code>,
    666     <code>librcc.lib</code>, and <code>rcc.exe</code>, all in <code>BUILDDIR</code>. There may
    667     be some warnings, but there should be no warnings.</p>
    668   </li>
    669   <li>Create a test directory and run the test suite:<blockquote>
    670       <pre>C:\dist\lcc\4.1&gt;mkdir %BUILDDIR%\x86\win32\tst
    671 C:\dist\lcc\4.1&gt;nmake -f makefile.nt test</pre>
    672     </blockquote>
    673     <p>This command compiles each program in <a HREF="../tst">tst</a>, compares the generated
    674     assembly code and diagnostics with the expected assembly code and diagnostics, executes
    675     the program, and compares the output with the expected output (using <code>fc</code>). For
    676     example, when the nmake command compiles <a HREF="../tst/8q.c"><code>tst\8q.c</code></a>,
    677     it leaves the generated assembly code and diagnostic output in <code>%BUILDDIR%\x86\win32\tst\8q.s</code>
    678     and <code>%BUILDDIR%\x86\win32\tst\8q.2</code>, and it compares them with the expected
    679     results in <code>x86\win32\tst\8q.sbk</code>. It builds the executable program in <code>%BUILDDIR%\x86\win32\tst\8q.exe</code>,
    680     runs it, and redirects the output to <code>%BUILDDIR%\x86\win32\tst\8q.1</code>, which it
    681     compares with <code>x86\win32\tst\8q.1bk</code>. The output from this step is voluminous,
    682     but there should be no differences and no errors.</p>
    683   </li>
    684   <li>Run the &quot;triple&quot; test, which compiles <code>rcc</code> with itself and
    685     verifies the results:<blockquote>
    686       <pre>C:\dist\lcc\4.1&gt;nmake -f makefile.nt triple
    687 ...
    688 \progra~1\lcc\4.1\bin\x86.c:
    689  Assembling: C:/TEMP/lcc2001.asm
    690         fc /b \progra~1\lcc\4.1\bin\1rcc.exe \progra~1\lcc\4.1\bin\2rcc.exe
    691 Comparing files \progra~1\lcc\4.1\bin\1rcc.exe and \progra~1\lcc\4.1\bin\2RCC.EXE
    692 00000088: B4 D5</pre>
    693     </blockquote>
    694     <p>This command builds <code>rcc</code> twice; once using the <code>rcc</code> built by VC
    695     and again using the <code>rcc</code> built by <code>lcc</code>. The resulting binaries are
    696     compared using <code>fc</code>. They should be identical, except for one or two bytes of
    697     timestamp data, as shown at the end of the output above. If they aren't, our compiler is
    698     generating incorrect code; <a HREF="#bugs">contact</a> us.</p>
    699   </li>
    700   <li>Copy <code>lcc.exe</code> and <code>bprint.exe</code> to a directory on your PATH, e.g.,<blockquote>
    701       <pre>C:\dist\lcc\4.1&gt;copy %BUILDDIR%\lcc.exe \bin
    702         1 file(s) copied.
    703 
    704 C:\dist\lcc\4.1&gt;copy %BUILDDIR%\bprint.exe \bin
    705         1 file(s) copied.</pre>
    706     </blockquote>
    707   </li>
    708   <li>Finally, clean up:<blockquote>
    709       <pre>C:\dist\lcc\4.1&gt;nmake -f makefile.nt clean</pre>
    710     </blockquote>
    711     <p>This command removes the derived files in <code>BUILDDIR</code>, but does not remove <code>rcc.exe</code>,
    712     etc.; &quot;<code>nmake -f makefile.nt clobber</code>&quot; cleans up and removes all
    713     executables and libraries. Test directories under <code>BUILDDIR</code> are <em>not</em>
    714     removed; you'll need to remove these by hand, e.g.,</p>
    715     <blockquote>
    716       <pre>C:\dist\lcc\4.1&gt;rmdir %BUILDDIR%\x86 /s
    717 \progra~1\lcc\4.1\bin\x86, Are you sure (Y/N)? y</pre>
    718     </blockquote>
    719   </li>
    720 </ol>
    721 
    722 <h2><a NAME="bugs">Reporting Bugs</a></h2>
    723 
    724 <p>lcc is a large, complex program. We find and repair errors routinely. If you think that
    725 you've found a error, follow the steps below, which are adapted from the instructions in
    726 Chapter 1 of <cite>A Retargetable C Compiler: Design and Implementation</cite>. 
    727 
    728 <ol>
    729   <li>If you don't have a source file that displays the error, create one. Most errors are
    730     exposed when programmers try to compile a program they think is valid, so you probably
    731     have a demonstration program already.</li>
    732   <li>Preprocess the source file and capture the preprocessor output. Discard the original
    733     code.</li>
    734   <li>Prune your source code until it can be pruned no more without sending the error into
    735     hiding. We prune most error demonstrations to fewer than five lines.</li>
    736   <li>Confirm that the source file displays the error with the <em>distributed</em> version of
    737     lcc. If you've changed lcc and the error appears only in your version, then you'll have to
    738     chase the error yourself, even if it turns out to be our fault, because we can't work on
    739     your code.</li>
    740   <li>Annotate your code with comments that explain why you think that lcc is wrong. If lcc
    741     dies with an assertion failure, please tell us where it died. If lcc crashes, please
    742     report the last part of the call chain if you can. If lcc is rejecting a program you think
    743     is valid, please tell us why you think it's valid, and include supporting page numbers in
    744     the ANSI Standard, Appendix A in <cite>The C Programming Language</cite>, or the
    745     appropriate section in <cite>C: A Reference Manual</cite>, 4th edition by S. B. Harbison
    746     and G. L. Steele, Jr. (Prentice Hall, 1995). If lcc silently generates incorrect code for
    747     some construct, please include the corrupt assembly code in the comments and flag the
    748     incorrect instructions if you can.</li>
    749   <li>Confirm that your error hasn't been fixed already. The latest version of lcc is always
    750     available for anonymous <code>ftp</code> from <code>ftp.cs.princeton.edu</code> in <a
    751     HREF="ftp://ftp.cs.princeton.edu/pub/lcc"><code>pub/lcc</code></a>. A <a
    752     HREF="ftp://ftp.cs.princeton.edu/pub/lcc/README"><code>README</code></a> file there gives
    753     acquistion details, and the <a HREF="../LOG"><code>LOG</code></a> file reports what errors
    754     were fixed and when they were fixed. If you report a error that's been fixed, you might
    755     get a canned reply.</li>
    756   <li>Send your program by electronic mail to <code>lcc-bugs@cs.princeton.edu</code>. Please
    757     send only valid C programs; put all remarks in C comments so that we can process reports
    758     semiautomatically.</li>
    759 </ol>
    760 
    761 <h2><a NAME="mailinglist">Keeping in Touch</a></h2>
    762 
    763 <p>There is an lcc mailing list for general information about lcc. To be added to the
    764 list, send a message with the 1-line body</p>
    765 
    766 <blockquote>
    767   <pre>subscribe lcc</pre>
    768 </blockquote>
    769 
    770 <p>to <code>majordomo@cs.princeton.edu</code>. This line must appear in the message body;
    771 &quot;Subject:&quot; lines are ignored. To learn more about mailing lists served by <code>majordomo</code>,
    772 send a message with the 1-word body &quot;<code>help</code>&quot; to <code>majordomo@cs.princeton.edu</code>.
    773 Mail sent to <code>lcc@cs.princeton.edu</code> is forwarded to everyone on the mailing
    774 list.</p>
    775 
    776 <p>There is also an <code>lcc-bugs</code> mailing list for reporting bugs; subscribe to it
    777 by sending a message with the 1-line body </p>
    778 
    779 <blockquote>
    780   <pre>subscribe lcc-bugs</pre>
    781 </blockquote>
    782 
    783 <p>to <code>majordomo@cs.princeton.edu</code>. Mail addressed to <var>lcc-bugs@cs.princeton.edu</var>
    784 is forwarded to everyone on this list.</p>
    785 
    786 <hr>
    787 
    788 <address>
    789   <a HREF="http://www.research.microsoft.com/~cwfraser/">Chris Fraser</a> / <a
    790   HREF="mailto:cwfraser@microsoft.com">cwfraser@microsoft.com</a><br>
    791   <a HREF="http://www.research.microsoft.com/~drh/">David Hanson</a> / <a
    792   HREF="mailto:drh@microsoft.com">drh@microsoft.com</a><br>
    793   $Revision: 145 $ $Date: 2001-10-17 16:53:10 -0500 (Wed, 17 Oct 2001) $ 
    794 </address>
    795 </body>
    796 </html>