+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.