Browse files

New file. Documents how to install using lcc.

Estimated hours taken: 3

README.lcc:
        New file.  Documents how to install using lcc.
  • Loading branch information...
1 parent cf99344 commit 0289345454c498f95852b41dd944c6c50779f800 Fergus Henderson committed Feb 6, 2001
Showing with 167 additions and 0 deletions.
  1. +167 −0 README.lcc
View
167 README.lcc
@@ -0,0 +1,167 @@
+This file documents how to use lcc 4.1 as the C compiler when
+installing Mercury on Linux.
+
+Some of the same issues may arise when using lcc on other systems,
+or when using other versions of lcc.
+
+1. You can get lcc from <http://www.cs.princeton.edu/software/lcc/>.
+ In particular Linux RPM's are available from
+ <ftp://ftp.cs.princeton.edu/pub/packages/lcc/contrib>.
+
+2. Apply the following patches:
+
+(i) On at least some versions of Linux, the following patch must be
+applied to /usr/include/stdint.h. This is because the Boehm (et al)
+collector uses elf.h, and the version of elf.h that gets installed on
+Linux uses by default is not compatible with lcc -- it uses
+typedefs defined as `long long' in stdint.h.
+
+If you prefer you can copy stdint.h to /usr/local/lib/lcc-4.1/include
+and then apply the patch there.
+
+This should be fixed in newer versions of glibc.
+
+--- /usr/include/stdint.h Sun Nov 7 03:23:27 1999
++++ ./stdint.h Tue Nov 21 05:25:39 2000
+@@ -28,6 +28,22 @@
+ #include <stddef.h>
+ #include <bits/wordsize.h>
+
++#ifdef __GNUC__
++__extension__
++typedef long long __long_long;
++__extension__
++typedef unsigned long long __u_long_long;
++#else
++typedef struct {
++ long __ll_first;
++ long __ll_second;
++} __long_long;
++typedef struct {
++ unsigned long __ull_first;
++ unsigned long __ull_second;
++} __u_long_long;
++#endif
++
+ /* Exact integral types. */
+
+ /* Signed. */
+@@ -42,8 +58,10 @@
+ typedef long int int64_t;
+ # else
+ __extension__
+-typedef long long int int64_t;
++typedef __long_long int64_t;
+ # endif
++#else
++typedef __long_long int64_t;
+ #endif
+
+ /* Unsigned. */
+@@ -54,7 +72,7 @@
+ typedef unsigned long int uint64_t;
+ #else
+ __extension__
+-typedef unsigned long long int uint64_t;
++typedef __u_long_long uint64_t;
+ #endif
+
+
+@@ -68,7 +86,7 @@
+ typedef long int int_least64_t;
+ #else
+ __extension__
+-typedef long long int int_least64_t;
++typedef __long_long int_least64_t;
+ #endif
+
+ /* Unsigned. */
+@@ -79,7 +97,7 @@
+ typedef unsigned long int uint_least64_t;
+ #else
+ __extension__
+-typedef unsigned long long int uint_least64_t;
++typedef __u_long_long uint_least64_t;
+ #endif
+
+
+@@ -95,7 +113,7 @@
+ typedef int int_fast16_t;
+ typedef int int_fast32_t;
+ __extension__
+-typedef long long int int_fast64_t;
++typedef __long_long int_fast64_t;
+ #endif
+
+ /* Unsigned. */
+@@ -108,7 +126,7 @@
+ typedef unsigned int uint_fast16_t;
+ typedef unsigned int uint_fast32_t;
+ __extension__
+-typedef unsigned long long int uint_fast64_t;
++typedef __u_long_long uint_fast64_t;
+ #endif
+
+
+@@ -134,9 +152,9 @@
+ typedef unsigned long int uintmax_t;
+ #else
+ __extension__
+-typedef long long int intmax_t;
++typedef __long_long intmax_t;
+ __extension__
+-typedef unsigned long long int uintmax_t;
++typedef __u_long_long uintmax_t;
+ #endif
+
+(ii) On some versions of Linux, the following patch must be
+applied to /usr/local/lib/lcc-4.1/include/stdio.h.
+This is due to an incompatibility between glibc's <sys/types.h>
+and lcc's <stdio.h>.
+
+--- stdio.h.orig Thu Jul 6 10:12:07 2000
++++ stdio.h Sun Feb 4 18:33:46 2001
+@@ -444,18 +444,20 @@
+ are originally defined in the Large File Support API. */
+
+ /* Types needed in these functions. */
+-#ifndef off_t
++#if !defined off_t && !defined __off_t_defined
+ # ifndef __USE_FILE_OFFSET64
+ typedef __off_t off_t;
+ # else
+ typedef __off64_t off_t;
+ # endif
+ # define off_t off_t
++# define __off_t_defined
+ #endif
+
+-#if defined __USE_LARGEFILE64 && !defined off64_t
++#if defined __USE_LARGEFILE64 && !defined off64_t && !defined __off64_t_defined
+ typedef __off64_t off64_t;
+ # define off64_t off64_t
++# define __off64_t_defined
+ #endif
+
+(iii) lcc 4.1 on at least some versions of Linux has a bug where
+`lcc -static' is broken. To work around that, rename the
+original `lcc' program as `lcc.orig' and replace it with the
+following script:
+
+ #!/bin/sh
+ lcc.orig "$@" -lc -lgcc
+
+This results in some spurious warnings when invoking `lcc -c ...',
+but ensures that `lcc -static ...' works.
+
+3. When invoking `configure', use the `--with-cc=lcc' option.
+
+4. If you run into a fixed limit with lcc, it might be necessary
+ to pass the `--max-jump-table-size' to mmc, e.g. by putting
+ `EXTRA_MCFLAGS=--max-jump-table-size 100' in Mmake.params.
+ This requires recompiling the Mercury sources to C,
+ so you need to have a working Mercury compiler already installed
+ (e.g. one built using gcc instead of lcc).
+
+5. Otherwise, follow the normal installation instructions in the INSTALL file.
+

0 comments on commit 0289345

Please sign in to comment.