[comp.unix.microport] perl 3.0 pl6 is running on Microport 2.4

dwm@msc.umn.edu (Don Mears) (12/18/89)

Here are the steps to get perl patchlevel 6 running on Microport Un*x 2.4.

(1) Get the directory routines (opendir, readdir, etc) from an archive 
    somewhere.   I got mine from uunet:  comp.sources.unix/volume9/gwyn-dir-lib
    and comp.sources.unix/volume10/dir-lib.pch.   Compile a large memory
    version of the library and put it in /usr/lib/large/dir.a.  Also put
    the dir.h include file in /usr/include/sys.

(2) Configure causes sh to get a segmentation fault when it reads does the
    ". config.sh" near line 2551.   You will have to remove that line 
    from Configure and make sure you get your configuration info right 
    the first time or start over if you make a mistake.  

(3) If you are using C-shell, put a blank line at the start of Configure so it
    wont get executed by the C-shell.   If you are using ksh, you will have to
    execute Configure with 'sh Configure'.  Configure does not work with
    ksh.

(4) When you run Configure, select compilation option -DCRIPPLED_CC.
    I also selected -DDEBUGGING to make debugging easier.  I recommend it.
    You can use -O, but you will then have to compile consarg.c and util.c
    separately without -O because the optimizer generates bad code for these
    routines.   The optimizer also dies harmlessly while optimizing cmd.c,
    eval.c (who can blame it?), and toke.c.   I am still trying to isolate
    the remaining optimization problems in consarg.c and util.c.

(5) After you run Configure, you will get a config.h file that has 
    I_SYSTIMETOO and I_TIMETOO defined.   These will cause compilation
    errors because time.h will be included twice.   Just undefine both of 
    these.

(6) Then apply the patches that follow.   They just circumvent compiler bugs
    except for the patch to x2p/a2p.h which shrinks an array that was too large
    for and 80286 segment.  The patches are simple enough that they can be
    easily applied by hand even if you don't have patch.   The stab.c and
    stab.h part redefines complex macros as functions and the toke.c
    part assigns the result of a type double function to a dummy double 
    variable instead of casting it to void.   Be sure to keep    
    the original code around so you can restore it before installing
    any official patchs from Larry Wall.

Followups to comp.unix.microport

Unofficial unauthorized patches... Use at you own risk!
Good luck  (with a 80286 + uport, you will need it)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	perl.uport
# This archive created: Sun Dec 17 11:51:32 1989
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'perl.uport'" '(3514 characters)'
if test -f 'perl.uport'
then
	echo shar: "will not over-write existing file 'perl.uport'"
else
sed 's/^x//' << \SHAR_EOF > 'perl.uport'
x*** stab.h.old	Sun Oct 29 15:50:34 1989
x--- stab.h	Sun Dec 17 10:35:37 1989
x***************
x*** 29,41 ****
x--- 29,49 ----
x  #define stab_io(stab)		(((STBP*)(stab->str_ptr))->stbp_io)
x  #define stab_form(stab)		(((STBP*)(stab->str_ptr))->stbp_form)
x  #define stab_xarray(stab)	(((STBP*)(stab->str_ptr))->stbp_array)
x+ #ifdef	CRIPPLED_CC	/* Microport 2.4 hack */
x+ ARRAY *stab_array();
x+ #else
x  #define stab_array(stab)	(((STBP*)(stab->str_ptr))->stbp_array ? \
x  				 ((STBP*)(stab->str_ptr))->stbp_array : \
x  				 ((STBP*)(aadd(stab)->str_ptr))->stbp_array)
x+ #endif
x  #define stab_xhash(stab)	(((STBP*)(stab->str_ptr))->stbp_hash)
x+ #ifdef	CRIPPLED_CC	/* Microport 2.4 hack */
x+ HASH *stab_hash();
x+ #else
x  #define stab_hash(stab)		(((STBP*)(stab->str_ptr))->stbp_hash ? \
x  				 ((STBP*)(stab->str_ptr))->stbp_hash : \
x  				 ((STBP*)(hadd(stab)->str_ptr))->stbp_hash)
x+ #endif			/* Microport 2.4 hack */
x  #define stab_sub(stab)		(((STBP*)(stab->str_ptr))->stbp_sub)
x  #define stab_lastexpr(stab)	(((STBP*)(stab->str_ptr))->stbp_lastexpr)
x  #define stab_line(stab)		(((STBP*)(stab->str_ptr))->stbp_line)
x*** stab.c.old	Mon Nov 27 17:02:58 1989
x--- stab.c	Sun Dec 17 10:35:30 1989
x***************
x*** 30,35 ****
x--- 30,60 ----
x  extern int sys_nerr;
x  extern char *sys_errlist[];
x  
x+ #ifndef	stab_array	/* Microport 2.4 hack */
x+ ARRAY *
x+ stab_array(stab)
x+ register STAB *stab;
x+ {
x+     register ARRAY *a = ((STBP*)(stab->str_ptr))->stbp_array;
x+     if( a == 0 ) a = ((STBP*)(aadd(stab)->str_ptr))->stbp_array;
x+     return( a );
x+ }
x+ #endif			/* Microport 2.4 hack */
x+ 
x+ #ifndef	stab_hash	/* Microport 2.4 hack */
x+ HASH *
x+ stab_hash(stab)
x+ register STAB *stab;
x+ {
x+     register HASH *h = ((STBP*)(stab->str_ptr))->stbp_hash;
x+     if( h == 0 ) h = ((STBP*)(hadd(stab)->str_ptr))->stbp_hash;
x+     return( h);
x+ }
x+ #endif			/* Microport 2.4 hack */
x+ 
x+ 
x+ 
x+ 
x  STR *
x  stab_str(str)
x  STR *str;
x***************
x*** toke.c.old	Mon Nov 27 17:03:03 1989
x--- toke.c	Sun Dec 17 10:35:51 1989
x***************
x*** 1675,1681 ****
x--- 1675,1685 ----
x  	  out:
x  	    (void)sprintf(tokenbuf,"%ld",i);
x  	    arg[1].arg_ptr.arg_str = str_make(tokenbuf,strlen(tokenbuf));
x+ #ifdef CRIPPLED_CC	/* Microport 2.4 hack */
x+ 	    { double zz = str_2num(arg[1].arg_ptr.arg_str); }
x+ #else
x  	    (void)str_2num(arg[1].arg_ptr.arg_str);
x+ #endif		/* Microport 2.4 hack */
x  	}
x  	break;
x      case '1': case '2': case '3': case '4': case '5':
x***************
x*** 1707,1713 ****
x--- 1711,1721 ----
x  	}
x  	*d = '\0';
x  	arg[1].arg_ptr.arg_str = str_make(tokenbuf, d - tokenbuf);
x+ #ifdef CRIPPLED_CC	/* Microport 2.4 hack */
x+ 	{ double zz = str_2num(arg[1].arg_ptr.arg_str); }
x+ #else
x  	(void)str_2num(arg[1].arg_ptr.arg_str);
x+ #endif		/* Microport 2.4 hack */
x  	break;
x      case '<':
x  	if (*++s == '<') {
x*** x2p/a2p.h.old	Mon Nov 13 10:05:59 1989
x--- x2p/a2p.h	Sun Dec 17 11:01:19 1989
x***************
x*** 213,223 ****
x  
x  EXT int mop INIT(1);
x  
x! #define OPSMAX 50000
x! union {
x      int ival;
x      char *cval;
x! } ops[OPSMAX];		/* hope they have 200k to spare */
x  
x  #include <stdio.h>
x  #include <ctype.h>
x--- 213,228 ----
x  
x  EXT int mop INIT(1);
x  
x! union u_ops {
x      int ival;
x      char *cval;
x! };
x! #if defined(iAPX286) || defined(M_I286) || defined(I80286) 	/* 80286 hack */
x! #define OPSMAX (64000/sizeof(union u_ops))	/* approx. max segment size */
x! #else
x! #define OPSMAX 50000
x! #endif						 	/* 80286 hack */
x! union u_ops ops[OPSMAX];
x  
x  #include <stdio.h>
x  #include <ctype.h>
SHAR_EOF
if test 3514 -ne "`wc -c < 'perl.uport'`"
then
	echo shar: "error transmitting 'perl.uport'" '(should have been 3514 characters)'
fi
fi
exit 0
#	End of shell archive