Some generic problems you might encounter (for other machine-specific
problems, see MACHINES):

* Conflicts between the declarations of read/malloc/free in the flex
  scanner and include files.  Solution: use the distributed
  lex.yy.c-dist, generated with flex, which uses a flex.skel slightly
  modified by karl.


* For DOS, you may have to change the definitions of WORDS_BIGENDIAN and
  DOS in lib/c-auto.h.  Here are some notes:
  
From: Richard Mansfield <melvin@math.psu.edu>
Date: Mon, 9 Nov 92 14:24:10 -0500

Make the changes in site.h. I don't know if I got the default
directories to work. TEXPOOL seemed to work fine (using /), but I had trouble
with TEXINPUTS. After minimal attempts to get it right, I punted
and decided to use environmental variables. In the variables I use 
\ and ; as a separator as in DOS. Thinking about in some more as I write
this, my troubles could have been caused by not correctly reading tex.pool
although I don't know.  

My method for getting the source files was to do
make TeX > tex.log
on the SUN and then editing tex.log to become tex.bat. I then carried
the .c and .h files home on a floppy and compiled them at home.

DOS gcc does have yacc and bison, but I did not use them.

If you want to see my exact set up. ftp to ftp.math.psu.edu,
look in directory pub/melvin/pctex and get the files read.me
and tex.zip.

* GNU sed 1.06 cannot handle the sed script in mf/convert; neither can
  1.07.  1.08 and later fix it.

* GNU Make 3.57 does not pass arguments to shell scripts (like convert),
under system V.  3.56 does not have this problem, and neither do later
versions.

* On an i386 machine, GNU C 1.36 does not compile tex5.c correctly when
making a 32-bit TeX.  1.37 fixes this bug.

* On the AT&T 3b2, under System V release 3.2, cc thinks that
eject_penalty (which is -1000, defined at line 3216), is a very large
positive number.  oc@vmp.com is developing a port for the 3b2; he has
contributed some (incomplete) patches; they are below.

* On a Sun 3 running 3.x, cc cannot compile mf2.c or mf4.c, because the
preprocessor puts a # directive at the end of line 1811 (or
thereabouts), instead of at the beginning.  You have to manually move
it.

* On a Sun 386i running 4.0.1, cc cannot compile Metafont with -O, because it
can't compile x = x + y correctly.  Don't use -O, or don't use cc. 
(From morgan@ics.uci.edu.)

* Make loses heavily if you are using a networked filesystem, and the
  server and the local machine have different times.  You might have
  this problem if `initex' gets made twice, for instance.

* On a *86 running Xenix, if you use flex you may have to add the
  following to c-auto.h (although it seems to karl that configure should
  be able to handle this).  From wally@lpds.sublink.org.

#ifndef FLEX_SCANNER		/* Flex treat unput('\n') differently from
				   what Xenix (and probably others) lex does.
				   I don't remember the problem but the
				   following redefinition let compile TeX
				   correctly -wp10/16/92. */
#undef DECLARE_YYTEXT
#define DECLARE_YYTEXT extern char yytext[];
#undef unput
# define unput(c) {yytchar=(c);if(yytchar=='\n')yylineno--;else*yysptr++=yytchar;}
#endif /* FLEX_SCANNER */

* On a 386 machine running 386/ix, cc cannot compile itex.c, according
to Reiner Petersen <reiner@db0tui62.bitnet>.  Here is an ed script to
get around the problem (alternatively, you can get gcc, and compile with
that):

:
#       Reiner Petersen (reiner@coma.uucp)
#       Technical University of Berlin
#
ed - $1 << end-of-edscript
!echo change:
/  register integer for_end; i = 1 ; for_end = 31 ; if ( i <= for_end) do
+1,.+2p
-2,.c
  register integer for_end;
   register char j;             /* 386/ix cc bug workaround  rp */
   i = 1 ;
   for_end = 31 ;
   if ( i <= for_end) do 
        j = i;
        xchr [ j ] = chr ( i ) ;
    
    while ( i++ < for_end ) ; 
.
!echo to:
-8,.p
w $1
end-of-edscript

If you want, you can put this into the pipeline in ./tex/convert.

* undump doesn't work under 386/ix.  Here is a diff to undump.SYS_V.c to
fix this, again contributed by reiner:
*** undump.SYS_V.c      Mon Apr 20 00:57:23 1987
--- undump.c    Fri Aug 19 17:55:27 1988
***************
*** 1,7 ****
  /*
   * undump - resurrect a core file into a running program.
   *
!  *    for UNIX System V on a 3Bx
   *    that uses the Common Object File Format
   *
   * Author:
--- 1,7 ----
  /*
   * undump - resurrect a core file into a running program.
   *
!  *    for UNIX System V on a 3Bx or Interactive 386/ix
   *    that uses the Common Object File Format
   *
   * Author:
***************
*** 9,14 ****
--- 9,19 ----
   *    New York University
   *    Tue Mar  3 13:18:25 EST 1987
   *
+  * Additions for 386/ix:
+  *    Reiner Petersen (reiner@coma.uucp)
+  *    Technical University of Berlin
+  *    Thu Aug 18 13:40:20 MET DST 1988
+  *
   * Adapted from:
   *     Spencer Thomas's undump and the file unexec.c in GNU emacs
   */
***************
*** 15,22 ****
--- 20,33 ----

  #include <sys/param.h>
  #include <sys/types.h>
+
+ #ifndef       ISC_386ix       /* not availible in ISC 386/ix */
+
  #include <sys/psw.h>
  #include <sys/pcb.h>
+
+ #endif        /* ISC_386ix */
+
  #include <sys/signal.h>
  #include <sys/fs/s5dir.h>
  #include <sys/user.h>
***************
*** 37,46 ****
--- 48,66 ----
  struct scnhdr dsc;
  struct scnhdr bsc;

+ #ifdef        ISC_386ix
+ struct scnhdr csc;            /* Comment section used by ISC 386/ix */
+ #endif        /* ISC_386ix */
+
  long bias;
  long lnnoptr;
  long text_scnptr;
  long data_scnptr;
+
+ #ifdef        ISC_386ix
+ long comment_scnptr;
+ #endif        /* ISC_386ix */
+
  long symlocptr;

  main(argc, argv)
***************
*** 89,94 ****
--- 109,118 ----
                        dsc = sc;
                 else if (strcmp(sc.s_name, ".bss") == 0) 
                        bsc = sc;
+ #ifdef        ISC_386ix
+                else if (strcmp(sc.s_name, ".comment") == 0) 
+                       csc = sc;
+ #endif        /* ISC_386ix */
                
        

***************
*** 97,103 ****
        if (u.u_exdata.ux_tsize != aout.tsize ||
            u.u_exdata.ux_dsize != aout.dsize ||
            u.u_exdata.ux_bsize != aout.bsize) 
!               fprintf("mismatch between %s and %s sizes\n", a_out_name,
 core_name);
                exit(1);
        

--- 121,128 ----
        if (u.u_exdata.ux_tsize != aout.tsize ||
            u.u_exdata.ux_dsize != aout.dsize ||
            u.u_exdata.ux_bsize != aout.bsize) 
!               fprintf( stderr, "mismatch between %s and %s sizes\n",
!                                                       a_out_name, core_name);
                exit(1);
        

***************
*** 122,128 ****
--- 147,159 ----
        bsc.s_paddr = bsc.s_vaddr = aout.data_start + aout.dsize;
        bsc.s_size = aout.bsize;
        bsc.s_scnptr = 0L;
+ #ifndef       ISC_386ix
        bias = dsc.s_scnptr + dsc.s_size - lnnoptr;
+ #else
+       comment_scnptr = csc.s_scnptr;
+       csc.s_scnptr = dsc.s_scnptr + dsc.s_size;
+       bias = csc.s_scnptr + csc.s_size - lnnoptr;
+ #endif        /* ISC_386ix */

        if (fh.f_symptr > 0L)
                fh.f_symptr += bias;
***************
*** 139,149 ****
--- 170,186 ----
                Perror("ds write");
        if (fwrite(&bsc, sizeof(bsc), 1, nfp) != 1)
                Perror("bs write");
+       if (fwrite(&csc, sizeof(csc), 1, nfp) != 1)
+               Perror("cs write");
        fseek(nfp, (long)text_scnptr, 0);
        copy(afp, nfp, aout.tsize);
        fseek(cfp, off, 0);
        fseek(nfp, (long)data_scnptr, 0);
        copy(cfp, nfp, size);
+ #ifdef        ISC_386ix
+       fseek(afp, (long)comment_scnptr, 0);
+       copy(afp, nfp, csc.s_size);
+ #endif        /* ISC_386ix */
        copy_syms(afp, nfp);
        fclose(nfp);
        fclose(afp);



These patches for the 3b2 machine are meant to serve as a starting point
only, as they are for pre-2.992 TeX.  If you work on this, contact oc@vmp.com.

#
# 3b2patch.sh, to fix web2c for 3B2s
#      for TeX 2.9*
#
# First, make sure we have EXTRA.c and ITEX.c that are the
# same as the distribution versions of extra.c and itex.c
# since we're going to modify those files.
#
if [ -f EXTRA.c ]
then
	cp EXTRA.c extra.c
else
	cp extra.c EXTRA.c
fi
if [ -f ITEX.c ]
then
	cp ITEX.c itex.c
else
	cp itex.c ITEX.c
fi
#
# Then use a "sed" script to fix the "too may case statements"
# in tex8.c
#
sed '/maincontrol/a\
  int fallthrough;
	/switch/i\
  fallthrough = 0;
	/case 71/i\
  default : fallthgrough = 1 ; break ;\
  }\
  if ( fallthrough )\
  switch ( abs ( curlist .modefield ) + curcmd ) {' <tex8.c >$$t8 &&
mv $$t8 tex8.c
#
# Then find those screwy negative array pointers in texd.h
# and fix them throughout all the files
#
# first find the base numbers we're looking for
#
XEQL=`sed -n 's/^#define xeqlevel (.*-\([0-9][0-9]*\).*/\1/p' <texd.h`
HASH=`sed -n 's/^#define hash (.*-\([0-9][0-9]*\).*/\1/p' <texd.h`
#
# then get rid of the negatives in texd.h
#
sed 's/\(#define xeqlevel (.*\)-[0-9][0-9]*/\1/
	s/\(#define hash (.*\)-[0-9][0-9]*/\1/' <texd.h >$$td &&
mv $$td texd.h
#
# finally fix all the *.c files to do the subtraction
# at array addressing time
#
for i in tex[0-8].c extra.c itex.c
do
	sed 's/\([^a-z]xeqlevel \[\)/\1 -'${XEQL}' +/g
	     s/\([^a-z]hash \[\)/\1 -'${HASH}' +/g' < $i > tkshl$$ &&
		mv tkshl$$ $i
done



When compiling for an Atari ST, some of Metafont's constants have to be
decreased (even beyond small.sed), according to
ridderbusch.pad@nixdorf.com.

*** /tmp/,RCSt1a00228	Tue Nov 20 09:44:11 1990
--- cmf.ch	Mon Nov 19 10:11:30 1990
***************
*** 143,149 ****
  @d file_name_size == FILENAMESIZE {Get value from \.{site.h}.}
  
  @<Constants...@>=
! @!mem_max=60000; {greatest index in \MF's internal |mem| array;
    must be strictly less than |max_halfword|;
    must be equal to |mem_top| in \.{INIMF}, otherwise |>=mem_top|}
  @!max_internal=100; {maximum number of internal quantities}
--- 143,149 ----
  @d file_name_size == FILENAMESIZE {Get value from \.{site.h}.}
  
  @<Constants...@>=
! @!mem_max=30000; {greatest index in \MF's internal |mem| array;
    must be strictly less than |max_halfword|;
    must be equal to |mem_top| in \.{INIMF}, otherwise |>=mem_top|}
  @!max_internal=100; {maximum number of internal quantities}
***************
*** 166,172 ****
    length of \MF's own strings, which is currently about 22000}
  @!move_size=5000; {space for storing moves in a single octant}
  @!max_wiggle=300; {number of autorounded points per cycle}
! @!gf_buf_size=16384; {size of the output buffer, must be a multiple of 8}
  @!pool_name='mf.pool';
    {string of length |file_name_size|; tells where the string pool appears}
  @!path_size=300; {maximum number of knots between breakpoints of a path}
--- 166,172 ----
    length of \MF's own strings, which is currently about 22000}
  @!move_size=5000; {space for storing moves in a single octant}
  @!max_wiggle=300; {number of autorounded points per cycle}
! @!gf_buf_size=4096; {size of the output buffer, must be a multiple of 8}
  @!pool_name='mf.pool';
    {string of length |file_name_size|; tells where the string pool appears}
  @!path_size=300; {maximum number of knots between breakpoints of a path}
***************
*** 177,183 ****
    at least 255 and at most 32510}
  @!max_kerns=500; {maximum number of distinct kern amounts}
  @!max_font_dimen=50; {maximum number of \&{fontdimen} parameters}
! @!mem_top=60000; {largest index in the |mem| array dumped by \.{INIMF};
    must be substantially larger than |mem_min|
    and not greater than |mem_max|}
  @z
--- 177,183 ----
    at least 255 and at most 32510}
  @!max_kerns=500; {maximum number of distinct kern amounts}
  @!max_font_dimen=50; {maximum number of \&{fontdimen} parameters}
! @!mem_top=30000; {largest index in the |mem| array dumped by \.{INIMF};
    must be substantially larger than |mem_min|
    and not greater than |mem_max|}
  @z
