[comp.lang.perl] perl 4.0 beta

marc@athena.mit.edu (Marc Horowitz) (02/20/91)

I've built perl 4.0 beta for the following systems.  All passed all
tests.

VAX, BSD 4.3, AFS, gcc version 1.39 -g -O
IBM RT, AOS 4 (BSD 4.3), AFS, hc2.1y -O
DECstation 3100, Ultrix 3.1, AFS, gcc version 1.37.1 OSF 1.9.2.13
		Ultrix Dec Mips Dec 14 1990 -g -O

I will be attempting to build on a PS/2, AIX 1.2 and a NeXT 2.0 later
this week.

I haven't had a chance to seriously test this version, but so far I
haven't had any difficulty.

Here is my file of bugs/comments/patches from building/installing the
beta release.  All patches are mine, submitted to Larry for his
approval.

===

Configure uses test -x.  test -x doesn't exist everywhere.  It
definitely does not exist in BSD or Ultrix {3.1,4.0}.  I am told it
exists in SunOS and GNU test.

===

installperl doesn't install the man pages properly.

From installperl:

	for (@manpages) {
	    ($new = $_) =~ s/man$/$manext/;
	    print STDERR "  Installing $mansrc/$new\n";
	    next if $nonono;
	    open(MI,$_);
	    open(MO,">$new");
	    print MO ".ds RP Release $release Patchlevel $patchlevel\n";
	    while (<MI>) {
		print MO;
	    }
	    close MI;
	    close MO;
	}

If I understood everything correctly, $mansrc contains the directory
nroff-source man pages should go in, from config.sh.  But this isn't
in he name of the output file, and there's no chdir to put it there.

*** /tmp/,RCSt1a06552   Mon Feb 18 21:59:29 1991
--- installperl Mon Feb 18 21:57:24 1991
***************
*** 113,119 ****
            print STDERR "  Installing $mansrc/$new\n";
            next if $nonono;
            open(MI,$_);
!           open(MO,">$new");
            print MO ".ds RP Release $release Patchlevel $patchlevel\n";
            while (<MI>) {
                print MO;
--- 113,119 ----
            print STDERR "  Installing $mansrc/$new\n";
            next if $nonono;
            open(MI,$_);
!           open(MO,">$mansrc/$new");
            print MO ".ds RP Release $release Patchlevel $patchlevel\n";
            while (<MI>) {
                print MO;

===

hc2 warnings which seem to be valid:

w "cons.c",L140/C2:     Expression of type "SUBR*" should be returned.
w "doarg.c",L937/C1:    do_unshift: Function has no return statement.
w "doio.c",L1182/C1:    do_execfree: Function has no return statement.
w "perl.c",L824/C1:     magicname: Function has no return statement.
w "stab.c",L655/C2:     Expression of type "int" should be returned.
	; This one is tricky, as we know the signal handler will never
	; return, but the compiler doesn't know that.  perhaps define a
	; returnfromhandler macro in the same place handlertype is
	; defined?
w "toke.c",L1415/C3:    Expression of type "int" should be returned.

w "util.c",L860/C29:    tmps
|    Passing an argument of type "char*" where "long" is expected.
w "util.c",L860/C6:     fatal: Insufficient number of arguments to function.
w "util.c",L1238/C3:    fatal: Insufficient number of arguments to function.
w "util.c",L1395/C2:    fatal: Insufficient number of arguments to function.
	; This is ALL evil.  you aren't using varargs, when you should be.
	; You are assuming char* and long have the same storage class.
	; There is, of course, no good, portable solution.

w "util.c",L1397: Variable "count" is never referenced.
w "util.c",L1398: Variable "str" is never referenced.

This is all my judgement given that I am not really familiar with the
internals of perl.  hope it all helps.

===

nitpick:

perl.c has an rcs header and comments which imply that the filename is
perly.c, but perly.c is the output from perly.y.

===

on my vax bsd, Configure printed:

No ndir library found, but you have readdir() so we'll use that.
        u_short d_namlen;               /* length of string in d_name */
 * null byte (dp->d_namlen+1), rounded up to a 4 byte boundary.
    ((sizeof (struct direct) - (MAXNAMLEN+1)) + (((dp)->d_namlen+1 + 3) &~ 3))

This is because $contains prints to stdout.  You put >/dev/null 2>&1
in most places, but missed a few:

*** /tmp/,RCSt1a07912   Tue Feb 19 03:19:10 1991
--- Configure   Tue Feb 19 03:18:18 1991
***************
*** 1844,1850 ****
  ndiro=''
  if $test -r $inclPath/usr/include/dirent.h; then
      echo "dirent.h found."
!     if $contains 'd_namlen' $inclPath/usr/include/dirent.h; then
        d_dirnamlen="$define"
      fi
      i_dirent="$define"
--- 1844,1850 ----
  ndiro=''
  if $test -r $inclPath/usr/include/dirent.h; then
      echo "dirent.h found."
!     if $contains 'd_namlen' $inclPath/usr/include/dirent.h >/dev/null 2>&1; then
        d_dirnamlen="$define"
      fi
      i_dirent="$define"
***************
*** 1867,1873 ****
            ;;
        esac
      fi
!     if $contains 'd_namlen' $xxx; then
        d_dirnamlen="$define"
      fi
      case "$xxx" in
--- 1867,1873 ----
            ;;
        esac
      fi
!     if $contains 'd_namlen' $xxx >/dev/null 2>&1; then
        d_dirnamlen="$define"
      fi
      case "$xxx" in
***************
*** 1882,1888 ****
      # The next line used to require this to be a bsd system.
      if $contains '^readdir$' libc.list >/dev/null 2>&1 ; then
        echo "No ndir library found, but you have readdir() so we'll use that."!       if $contains 'd_namlen' $inclPath/usr/include/sys/dir.h; then
            d_dirnamlen="$define"
        fi
        i_sys_dir="$define"
--- 1882,1888 ----
      # The next line used to require this to be a bsd system.
      if $contains '^readdir$' libc.list >/dev/null 2>&1 ; then
        echo "No ndir library found, but you have readdir() so we'll use that."!       if $contains 'd_namlen' $inclPath/usr/include/sys/dir.h >/dev/null 2>&1; then
            d_dirnamlen="$define"
        fi
        i_sys_dir="$define"
***************
*** 1891,1897 ****
  # This will lose since $d_ndir.h is in another directory.
  # I doubt we can rely on it being in ../$d_ndir.h .
  # At least it will fail in a conservative manner.
!       if $contains 'd_namlen' $d_ndir.h; then
            d_dirnamlen="$define"
        fi
        i_my_dir="$define"
--- 1891,1897 ----
  # This will lose since $d_ndir.h is in another directory.
  # I doubt we can rely on it being in ../$d_ndir.h .
  # At least it will fail in a conservative manner.
!       if $contains 'd_namlen' $d_ndir.h >/dev/null 2>&1; then
            d_dirnamlen="$define"
        fi
        i_my_dir="$define"

===

As usual, I had to manually undef waitpid on my ultrix 3.1 box.  I
realize there's no better way to do this.

===

on all machines:

    if test ! -f config.sh; then
	ln ../config.sh . || \
	ln ../../config.sh . || \
	ln ../../../config.sh . || \
	(echo "Can't find config.sh."; exit 1)
    fi

I get "./config.sh: Cross-device link" from the first ln.  Is there a
reason not to send all output from these ln's to /dev/null ?

===

Have fun :-)

		Marc

urlichs@smurf.sub.org (Matthias Urlichs) (02/21/91)

I've built perl 4.0 beta on A/UX 2.0, gcc 1.37.

The only real problem that I've discovered is that suidperl won't work
because of the first setreuid() "paranoia" check.
Since I was compiling with the POSIX compatibility library, this may be a
general POSIX problem; unfortunately I can't trace this problem further right
now due to lack of time.
Another POSIX-related problem is that signal is declared in terms of sigtype
which is declared in terms of (int|void), which throws off Configure.

I also mailed Larry some patches for gdbm.

NB: If you have a -lmalloc library in your system, don't use it.
Chances are that it upsets (g)dbm for empty records because it returns a NULL
pointer when allocating zero bytes of storage.  That may be OK according to
the manuals, but it generates trouble.

Perl's op.dbm should probably read and write an empty value from the
associative array; if Perl dies, you've got problems.

-- 
Matthias Urlichs -- urlichs@smurf.sub.org -- urlichs@smurf.ira.uka.de     /(o\
Humboldtstrasse 7 - 7500 Karlsruhe 1 - FRG -- +49+721+621127(0700-2330)   \o)/