BSD 4_3_Net_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Tue, 30 Apr 1991 08:33:55 +0000 (00:33 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Tue, 30 Apr 1991 08:33:55 +0000 (00:33 -0800)
Work on file usr/src/usr.bin/groff/INSTALL.gnu

Synthesized-from: CSRG/cd2/net.2

usr/src/usr.bin/groff/INSTALL.gnu [new file with mode: 0644]

diff --git a/usr/src/usr.bin/groff/INSTALL.gnu b/usr/src/usr.bin/groff/INSTALL.gnu
new file mode 100644 (file)
index 0000000..3e93e82
--- /dev/null
@@ -0,0 +1,403 @@
+Groff has been compiled on a Sun 4 under SunOS 4.0.3 with g++ 1.37.1
+and with AT&T C++ 2.0, and on a 386 PC under 386/ix 2.0.1 with g++
+1.37.1 using Michael Bloom's GNU COFF patches.  You may encounter
+problems on other machines that I cannot anticipate.
+
+If you are using g++, you will need to install the header files from
+libg++.  The only other parts of libg++ used by groff are contained in
+the files xyzzy.c and gnulib3.c; the libg++.a that I use contains only
+xyzzy.o and gnulib3.o.  You don't need xyzzy.o unless you're using GNU
+ld.
+
+If you are using g++ 1.37.2 alpha, you'll need the following fix (from
+Michael Tiemann):
+
+*** cplus-tree.c~      Sat Jun 23 16:10:41 1990
+--- cplus-tree.c       Sat Jun 30 23:45:09 1990
+***************
+*** 685,688 ****
+--- 685,689 ----
+  }
+  
++ /* Constructor for hashed lists.  */
+  tree
+  hash_tree_chain (value, chain)
+***************
+*** 701,705 ****
+--- 702,721 ----
+  }
+  
++ /* Similar, but used for concatenating two lists.  */
+  tree
++ hash_chainon (list1, list2)
++      tree list1, list2;
++ {
++   if (list2 == 0)
++     return list1;
++   if (list1 == 0)
++     return list2;
++   if (TREE_CHAIN (list1) == NULL_TREE)
++     return hash_tree_chain (TREE_VALUE (list1), list2);
++   return hash_tree_chain (TREE_VALUE (list1),
++                        hash_chainon (TREE_CHAIN (list1), list2));
++ }
++ 
++ tree
+  build_decl_list_1 (value)
+       tree value;
+***************
+*** 926,930 ****
+      {
+        if (DECL_NAME (decl))
+!      return IDENTIFIER_POINTER (DECL_NAME (decl));
+        return "((anonymous))";
+      }
+--- 942,950 ----
+      {
+        if (DECL_NAME (decl))
+!      {
+!        if (THIS_NAME_P (DECL_NAME (decl)))
+!          return "this";
+!        return IDENTIFIER_POINTER (DECL_NAME (decl));
+!      }
+        return "((anonymous))";
+      }
+*** cplus-parse.y~     Mon Jun  4 23:52:34 1990
+--- cplus-parse.y      Sat Jun 30 23:45:09 1990
+***************
+*** 501,505 ****
+                   error ("no base initializers given following ':'");
+                 setup_vtbl_ptr ();
+!               }
+       ;
+  
+--- 501,505 ----
+                   error ("no base initializers given following ':'");
+                 setup_vtbl_ptr ();
+!              }
+       ;
+  
+***************
+*** 1274,1278 ****
+               { $$ = hash_tree_chain ($1, $2); }
+       | declmods typespec reserved_declspecs
+!              { $$ = hash_tree_chain ($2, chainon ($3, $1)); }
+       ;
+  
+--- 1274,1278 ----
+               { $$ = hash_tree_chain ($1, $2); }
+       | declmods typespec reserved_declspecs
+!              { $$ = hash_tree_chain ($2, hash_chainon ($3, $1)); }
+       ;
+  
+***************
+*** 1319,1323 ****
+               { $$ = decl_tree_cons (NULL_TREE, $1, $2); }
+       | nonempty_type_quals typespec reserved_typespecquals
+!              { $$ = decl_tree_cons (NULL_TREE, $2, chainon ($3, $1)); }
+       ;
+  
+--- 1319,1323 ----
+               { $$ = decl_tree_cons (NULL_TREE, $1, $2); }
+       | nonempty_type_quals typespec reserved_typespecquals
+!              { $$ = decl_tree_cons (NULL_TREE, $2, hash_chainon ($3, $1)); }
+       ;
+  
+
+If you're using g++ 1.39 on a sparc you'll probably want to apply the
+following fix (from Casper H.S. Dik):
+
+*** config/out-sparc.c.org     Wed Dec 12 03:13:57 1990
+--- config/out-sparc.c Sat Feb 23 23:21:26 1991
+***************
+*** 908,925 ****
+       else if (GET_CODE (XEXP (operands[1], 0)) == PLUS)
+         {
+           rtx inc_reg = XEXP (XEXP (operands[1], 0), 0);
+           if (inc_reg == frame_pointer_rtx
+               && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == REG
+!              && XEXP (XEXP (operands[1], 0), 0) != frame_pointer_rtx)
+             inc_reg = XEXP (XEXP (operands[1], 0), 1);
+           if (inc_reg == frame_pointer_rtx)
+             {
+               output_asm_insn ("mov %%fp,%%g1", xoperands);
+               inc_reg = gen_rtx (REG, SImode, 1);
+             }
+           xoperands[1] = inc_reg;
+           output_asm_insn ("add 4,%1,%1", xoperands);
+!          xoperands[1] = operands[1];
+           output_asm_insn ("ld %1,%0", xoperands);
+           xoperands[1] = inc_reg;
+           output_asm_insn ("add -4,%1,%1", xoperands);
+--- 908,931 ----
+       else if (GET_CODE (XEXP (operands[1], 0)) == PLUS)
+         {
+           rtx inc_reg = XEXP (XEXP (operands[1], 0), 0);
++          rtx from = operands[1];
+           if (inc_reg == frame_pointer_rtx
+               && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == REG
+!              && XEXP (XEXP (operands[1], 0), 1) != frame_pointer_rtx)
+             inc_reg = XEXP (XEXP (operands[1], 0), 1);
+           if (inc_reg == frame_pointer_rtx)
+             {
+               output_asm_insn ("mov %%fp,%%g1", xoperands);
+               inc_reg = gen_rtx (REG, SImode, 1);
++              from = gen_rtx (GET_CODE (operands[1]),
++                              GET_MODE (operands[1]),
++                              gen_rtx (PLUS, GET_MODE (XEXP (operands[1], 0)),
++                                             inc_reg,
++                                             XEXP (XEXP (operands[1], 0), 1)));
+             }
+           xoperands[1] = inc_reg;
+           output_asm_insn ("add 4,%1,%1", xoperands);
+!          xoperands[1] = from;
+           output_asm_insn ("ld %1,%0", xoperands);
+           xoperands[1] = inc_reg;
+           output_asm_insn ("add -4,%1,%1", xoperands);
+***************
+*** 989,1006 ****
+       else if (GET_CODE (XEXP (operands[0], 0)) == PLUS)
+         {
+           rtx inc_reg = XEXP (XEXP (operands[0], 0), 0);
+           if (inc_reg == frame_pointer_rtx
+               && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == REG
+!              && XEXP (XEXP (operands[0], 0), 0) != frame_pointer_rtx)
+             inc_reg = XEXP (XEXP (operands[0], 0), 1);
+           if (inc_reg == frame_pointer_rtx)
+             {
+               output_asm_insn ("mov %%fp,%%g1", xoperands);
+               inc_reg = gen_rtx (REG, SImode, 1);
+             }
+           xoperands[0] = inc_reg;
+           output_asm_insn ("add 4,%0,%0", xoperands);
+!          xoperands[0] = operands[0];
+           output_asm_insn ("st %r1,%0", xoperands);
+           xoperands[0] = inc_reg;
+           output_asm_insn ("add -4,%0,%0", xoperands);
+--- 995,1018 ----
+       else if (GET_CODE (XEXP (operands[0], 0)) == PLUS)
+         {
+           rtx inc_reg = XEXP (XEXP (operands[0], 0), 0);
++          rtx to = operands[0];
+           if (inc_reg == frame_pointer_rtx
+               && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == REG
+!              && XEXP (XEXP (operands[0], 0), 1) != frame_pointer_rtx)
+             inc_reg = XEXP (XEXP (operands[0], 0), 1);
+           if (inc_reg == frame_pointer_rtx)
+             {
+               output_asm_insn ("mov %%fp,%%g1", xoperands);
+               inc_reg = gen_rtx (REG, SImode, 1);
++              to = gen_rtx (GET_CODE (operands[0]),
++                              GET_MODE (operands[0]),
++                              gen_rtx (PLUS, GET_MODE (XEXP (operands[0], 0)),
++                                             inc_reg,
++                                             XEXP (XEXP (operands[0], 0), 1)));
+             }
+           xoperands[0] = inc_reg;
+           output_asm_insn ("add 4,%0,%0", xoperands);
+!          xoperands[0] = to;
+           output_asm_insn ("st %r1,%0", xoperands);
+           xoperands[0] = inc_reg;
+           output_asm_insn ("add -4,%0,%0", xoperands);
+
+On a Sun 3 and other 68k machines, using libg++ 1.37.0 you will need
+to apply the following change to g++-include/math.h:
+
+*** math.h-    Sat Jan  6 14:09:52 1990
+--- math.h     Tue Mar 13 02:07:01 1990
+***************
+*** 32,39 ****
+  
+  
+  #ifdef __HAVE_68881__                /* MC68881/2 Floating-Point Coprocessor */
+- #include <math-68881.h>
+  extern "C" {                 /* fill in what we've left out */
+  
+  double  acosh(double);
+  double  asinh(double);
+--- 32,39 ----
+  
+  
+  #ifdef __HAVE_68881__                /* MC68881/2 Floating-Point Coprocessor */
+  extern "C" {                 /* fill in what we've left out */
++ #include <math-68881.h>
+  
+  double  acosh(double);
+  double  asinh(double);
+
+If you have bison 1.11, you will need to apply the following fix to
+bison.simple if you want change any of the grammars:
+
+*** bison.simple.~1~   Fri Aug 10 12:13:41 1990
+--- bison.simple       Fri Aug 10 12:24:46 1990
+***************
+*** 20,26 ****
+--- 20,28 ----
+  
+  
+  #ifdef __GNUC__
++ #ifndef alloca
+  #define alloca __builtin_alloca
++ #endif /* Not alloca. */
+  #else /* Not GNU C.  */
+  #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
+  #include <alloca.h>
+***************
+*** 114,123 ****
+--- 116,129 ----
+  /* This is the most reliable way to avoid incompatibilities
+     in available built-in functions on various systems.  */
+  static void
++ #ifdef __cplusplus
++ __yy_bcopy (char *from, char *to, int count)
++ #else
+  __yy_bcopy (from, to, count)
+       char *from;
+       char *to;
+       int count;
++ #endif
+  {
+    register char *f = from;
+    register char *t = to;
+***************
+*** 127,133 ****
+      *t++ = *f++;
+  }
+  
+! #line 131 "/usr/local/lib/bison.simple"
+  int
+  yyparse()
+  {
+--- 133,139 ----
+      *t++ = *f++;
+  }
+  
+! #line 137 "/usr/local/lib/bison.simple"
+  int
+  yyparse()
+  {
+
+For gas 1.36 on a Sun 4, the following fix is desirable:
+
+*** sparc.c.~1~        Mon May 21 19:06:18 1990
+--- sparc.c    Sat Aug 11 11:09:12 1990
+***************
+*** 56,65 ****
+--- 56,67 ----
+  static struct hash_control *op_hash = NULL;
+  
+  static void s_seg(), s_proc(), s_data1(), s_reserve(), s_common();
++ static void s_sparc_align();
+  extern void s_globl(), s_long(), s_short(), s_space(), cons();
+  
+  pseudo_typeS
+  md_pseudo_table[] = {
++     { "align",           s_sparc_align, 0 },
+      { "common",     s_common,   0 },
+      { "global",     s_globl,    0 },
+      { "half",       cons,       2 },
+
+*** read.c.~1~ Tue Mar  6 21:08:29 1990
+--- read.c     Sat Aug 11 11:07:23 1990
+***************
+*** 175,181 ****
+--- 175,183 ----
+  potable[] =
+  {
+    { "abort", s_abort,        0       },
++ #ifndef SPARC
+    { "align", s_align,        0       },
++ #endif
+    { "ascii", stringer,       0       },
+    { "asciz", stringer,       1       },
+    { "byte",  cons,           1       },
+
+
+On a Sequent Symmetry S27 running Dynix 3.0.17, you'll need to use GNU
+make or add 'MAKE=make' to Makefiles which use $(MAKE).  You'll also
+need to change
+
+  dev=${GROFF_TYPESETTER:-@DEVICE@}
+
+to
+
+  dev=$GROFF_TYPESETTER
+
+in groff.sh.  You should use gcc to compile xditview.
+
+You should only have to edit the top-level Makefile.  The comments
+should make it clear what has to be changed.  If you don't have a
+separate directory tree for local manual pages you can make
+MAN[157]EXT be l (that's an ell) or n, and MANROOT be /usr/man.  The
+changes you make to the top-level Makefile will be propagated to
+sub-makes, but this won't happen if you invoke make in the
+sub-directories.
+
+You might also need to edit groff.sh.  This is a shell-script that
+runs gtroff, an appropriate postprocessor and optionally various
+preprocessors.  (Actually, the shell-script is created from groff.sh
+by substituting for some variables surrounded by @s).  If your kernel
+doesn't understand #!, you will need to arrange for the script to be
+run by /bin/sh in some other way.
+
+If you want to use existing troff drivers you should change groff.sh
+so that it recognises them.  It is also a good idea to copy over the
+dev* directory for the device into a directory that's only searched by
+groff (eg /usr/local/lib/groff/font), so that you can take advantage
+of the groff extensions to the DESC and font formats.  Groff only uses
+the ASCII versions of the device files so you only need copy them.  If
+you want to use GNU eqn, it is essential that the font files contain
+correct height and depth information.  The format for this information
+is described in the groff_font(5) page.  The best way to add this
+information is to modify the program that generates the font files.
+As a last resort you could try using the program addftinfo: it
+attempts to guess plausible heights and depths.  To obtain good
+results you would probably have to do more work on addftinfo.
+
+To compile everything, just do a `make'.  If that works, then do a
+`make install'.
+
+If you have problems compiling pic/pic.tab.c or eqn/eqn.tab.c, you might
+want to try using your system's yacc.  Set YACC=yacc in the top-level
+Makefile, and also do
+
+  mv pic/pic.tab.c pic/pic.tab.c.dist
+  mv eqn/eqn.tab.c eqn/eqn.tab.c.dist
+
+so that the parsers will be regenerated using yacc (the supplied
+*.tab.[ch] files were generated by bison.)
+
+If you want to install xditview, you'll need to do that separately:
+change directory to xditview, edit the Makefile, do a make and a make
+install. You'll need to be running X11R4.
+
+The dvi files produced by grodvi can use fonts at non-standard
+magnifications.  You may need to compile fonts with Metafont at these
+magnifications. The CompileFonts script in the dvi/devdvi directory
+may help you to do this. (It will take a *long* time.)
+
+If you have problems printing existing troff documents, read the
+section on `Incompatbilities' in gtroff(1).  If you have existing
+macro packages that are in the habit of omitting the space between a
+macro or request and its arguments, it is good idea to produce a
+version with spaces so that you can use it with groff (without having
+to use the -C flag).  The file macros/fixmacros.sed is a sed script
+which will attempt to edit a file of macros so that it can be used
+with groff without the -C flag.  If you have the DWB 2.0 mm macros
+installed on your machine, you might want to do a `make install.mm';
+this will copy the mm macros to groff's macro directory and fix a few
+problems that occur when using the mm macros with groff; this requires
+the `patch' program.  If the patch in macros/mm.diff is rejected,
+carefully apply it by hand.
+
+You can share groff with a friend who has the same type of machine as
+you, but does not have a C++ compiler.  First do `make bindist'; this
+will create a subdirectory `bindist' containing a set of binaries, a
+Makefile and a README.  If you want to strip the binaries, now do a
+`make strip' in the bindist directory.  Rename the bindist directory
+to something more meaningful, tar it up, and give to your friend along
+with the original groff source distribution.  Your friend can then
+install groff just by editing the Makefile in the bindist directory
+and doing a make there; this will automatically install the non-binary
+parts of the groff source distribution as well as the binaries from
+the bindist directory.