README.cygwin32 Notes about Cygwin32 port
README.dos Notes about dos/djgpp port
README.lexwarn Notes about lexical warnings
+README.mint Notes about Atari MiNT port
README.mpeix Notes about MPE/iX port
README.os2 Notes about OS/2 port
README.os390 Notes about OS/390 (nee MVS) port
ext/POSIX/POSIX.xs POSIX extension external subroutines
ext/POSIX/hints/bsdos.pl Hint for POSIX for named architecture
ext/POSIX/hints/dynixptx.pl Hint for POSIX for named architecture
-ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture
-ext/POSIX/hints/linux.pl Hint for POSIX for named architecture
-ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture
-ext/POSIX/hints/next_3.pl Hint for POSIX for named architecture
+ext/POSIX/hints/freebsd.pl Hint for POSIX for named architecture
+ext/POSIX/hints/linux.pl Hint for POSIX for named architecture
+ext/POSIX/hints/mint.pl Hint for POSIX for named architecture
+ext/POSIX/hints/netbsd.pl Hint for POSIX for named architecture
+ext/POSIX/hints/next_3.pl Hint for POSIX for named architecture
ext/POSIX/hints/openbsd.pl Hint for POSIX for named architecture
ext/POSIX/hints/sunos_4.pl Hint for POSIX for named architecture
ext/POSIX/typemap POSIX extension interface types
hints/lynxos.sh Hints for named architecture
hints/machten.sh Hints for named architecture
hints/machten_2.sh Hints for named architecture
+hints/mint.sh Hints for named architecture
hints/mips.sh Hints for named architecture
hints/mpc.sh Hints for named architecture
hints/mpeix.sh Hints for named architecture
mg.h Magic header
minimod.pl Writes lib/ExtUtils/Miniperl.pm
miniperlmain.c Basic perl w/o dynamic loading or extensions
+mint/errno.h MiNT port
+mint/Makefile MiNT port
+mint/pwd.c MiNT port
+mint/README MiNT port
+mint/stdio.h MiNT port
+mint/sys/time.h MiNT port
+mint/time.h MiNT port
mpeix/mpeixish.h MPE/iX port
mpeix/nm MPE/iX port
mpeix/relink MPE/iX port
--- /dev/null
+##########################################################################
+# *** README.mint
+##########################################################################
+
+If you want to build perl yourself on MiNT (or maybe on an Atari without
+MiNT) you may want to accept some advice from somebody who already did it...
+
+There was a perl port for Atari ST done by ++jrb bammi@cadence.com.
+This port tried very hard to build on non-MiNT-systems. For the
+sake of efficiency I've left this way. Yet, I haven't removed bammi's
+patches but left them intact. Unfortunately some of the files that
+bammi contributed to the perl distribution seem to have vanished?
+
+So, how can you distinguish my patches from bammi's patches? All of
+bammi's stuff is embedded in "#ifdef atarist" preprocessor macros.
+My MiNT port uses "#ifdef __MINT__" instead (and unconditionally
+undefines "atarist". If you want to continue on bammi's port, all
+you have to do is to swap the "-D" and "-U" switches for "__MINT__"
+and "atarist" in the variable ccflags.
+
+However, I think that my version will still run on non-MiNT-systems
+provided that the user has a Eunuchs-like environment (i.e. the
+standard envariables like $PATH, $HOME, ... are set, there is a
+POSIX compliant shell in /bin/sh, and...)
+
+Known problems
+==============
+
+The problems you may encounter when building perl on your machine
+are most probably due to deficiencies in MiNT resp. the Atari
+platform in general.
+
+First of all, if you have less than 8 MB of RAM you shouldn't
+even try to build Perl yourself. Better grab a binary pre-compiled
+version somewhere. Even if you have more memory you should take
+some care. Try to run in a fresh environment (without memory
+fragmented too much) with as few daemons, accessories, xcontrol
+modules etc. as possible. If you run some AES you should
+consider to start a console based environment instead.
+
+A problem has been reported with sed. Sed is used to create
+some configuration files based on the answers you have given
+to the Configure script. Unfortunately the Perl Configure script
+shows sed on MiNT its limits. I have sed 2.05 with a stacksize
+of 64k and I have encountered no problems. If sed crashes
+during your configuration process you should first try to
+augment sed's stacksize:
+
+ fixstk 64k /usr/bin/sed
+
+(or similar). If it still doesn't help you may have a look
+which other versions of sed are installed on your system.
+If you have a KGMD 1.0 installation you will find three
+in /usr/bin. Have a look there.
+
+Perl has some "mammut" C files. If gcc reports "internal
+compiler error: program cc1 got fatal signal 10" this is very
+likely due to a stack overflow in program cc1. Find cc1
+and fix its stack. I have made good experiences with
+
+ fixstk 2 cc1
+
+This doesn't establish a stack of 2 Bytes only as you might
+think. It really reserves one half of the available memory
+for cc1's stack. A setting of 1 would reserve the entire
+memory for cc1, 3 would reserve three thirds. You will have
+to find out the value that suits to your system yourself.
+
+BTW, cc1 is maybe a little hard to find. It is generally installed
+as
+ /usr/local/lib/gcc-lib/<platform>/<gcc-version>/cc1
+
+where <platform> is probably something like "m68k-atari-mint"
+and <version> is the gcc version you use (find out with
+"gcc --version"). Maybe "gcc-lib" is not installed in
+"/usr/local/lib" but "/usr/lib" on your system.
+
+Now run make (maybe "make -k"). If you get a fatal signal 10
+increase cc1's stacksize, if you run out of memory you should
+either decrease the stacksize or follow some more hints:
+
+Perl's building process is very handy on machines with a lot
+of virtual memory but may result in a desaster if you are short
+of memory. If gcc fails to compile many source files you should
+reduce the optimization. Grep for "optimize" in the file
+config.sh and change the flags.
+
+If only several huge files cause problems (actually it is not a
+matter of the file size resp. the amount of code but depends on
+the size of the individual funtions) it is useful to bypass
+the make program and compile these files directly from the
+command line. For example if you got something like the
+following from make:
+
+ CCCMD = gcc -DPERL_CORE ....
+ ...
+ ...: virtual memory exhausted
+
+you should hack into the shell:
+
+ gcc -DPERL_CORE ... toke.c
+
+Please note that you have to add the name of the source file
+(here toke.c) at the end.
+
+If none of this helps, you're helpless. Wait for a binary
+release. If you have succeded you may encounter another problem
+at the linking process. If gcc complains that it can't find
+some libraries within the perl distribution you probably have
+an old linker. If it complains for example about "file not
+found for xxx.olb" you should cd into the directory in
+question and
+
+ ln -s libxxx.a xxx.olb
+
+This will fix the problem.
+
+This version (5.00402) of perl has passed most of the tests on my system:
+
+Failed Test Status Wstat Total Fail Failed List of failed
+------------------------------------------------------------------------------
+io/pipe.t 10 2 20.00% 7, 9
+io/tell.t 13 1 7.69% 12
+lib/complex.t 762 13 1.71% 84-85, 248-251, 257, 272-273,
+ 371, 380, 419-420
+lib/io_pipe.t 10 1 10.00% 9
+lib/io_tell.t 13 1 7.69% 12
+op/magic.t 30 2 6.67% 29-30
+Failed 6/152 test scripts, 96.05% okay. 20/4359 subtests failed, 99.54% okay.
+
+Pipes always cause problems with MiNT, it's actually a surprise that
+most of the tests did work. I've got no idea why the "tell" test failed,
+this shouldn't mean too big a problem however.
+
+Most of the failures of lib/complex seem to be harmless, actually errors
+far right to the decimal point... Two failures seem to be serious:
+The sign of the results is reversed. I would say that this is due
+to minor bugs in the portable math lib that I compiled perl with.
+
+I haven't bothered very much to find the reason for the failures
+with op/magic.t and op/stat.t. Maybe you'll find it out.
+
+##########################################################################
+
+Another possible problem may arise from the implementation of the "pwd"
+command. It happened to add a carriage return and newline to its output
+no matter what the setting of $UNIXMODE is. This is quite annoying since many
+library modules for perl take the output of pwd, chop off the
+trailing newline character and then expect to see a valid path in
+that. But the carriage return (last but second character!) isn't
+chopped off. You can either try to patch all library modules (at
+the price of performance for the extra transformation) or you can
+use my version of pwd that doesn't suffer from this deficiency.
+
+The fixed implementation is in the mint subdirectory. Running
+"Configure" will attempt to build and install it if necessary
+(hints/mint.sh will do this work) but you can build and install it
+explicitly by:
+
+ cd mint
+ make install
+
+This is the fastest solution.
+
+Just in case you want to go the hard way: perl won't even build with a
+broken pwd! You will have to fix the library modules
+(ext/POSIX/POSIX.pm, lib/Cwd.pm, lib/pwd.pl) at last after building
+miniperl.
+
+A major nuisance of current MiNTLib versions is the implementation
+of system() which is far from being POSIX compliant. A real system()
+should fork and then exec /bin/sh with its argument as a command
+line to the shell. The MiNTLib system() however doesn't expect
+that every user has a POSIX shell in /bin/sh. It tries to work
+around the problem by forking and exec'ing the first token in its argument
+string. To get a little bit of compliance to POSIX system() it
+tries to handle at least redirection ("<" or ">") on its own
+behalf.
+
+This isn't a good idea since many programs expect that they can
+pass a command line to system() that exploits all features of a
+POSIX shell. If you use the MiNTLib version of system() with
+perl the Perl function system() will suffer from the same deficiencies.
+
+You will find a fixed version of system() in the mint subdirectory.
+You can easily insert this version into your system libc:
+
+ cd mint
+ make system.o
+ ar r /usr/lib/libc.a
+ ranlib /usr/lib/libc.a
+
+If you are suspicious you should either back up your libc before
+or extract the original system.o from your libc with
+"ar x /usr/lib/libc.a system.o". You can then backup the system.o
+module somewhere before you succeed.
+
+Anything missing? Yep, I've almost forgotten...
+No file in this distribution without a fine saying. Take this one:
+
+ "From a thief you should learn: (1) to work at night;
+ (2) if one cannot gain what one wants in one night to
+ try again the next night; (3) to love one's coworkers
+ just as thieves love each other; (4) to be willing to
+ risk one's life even for a little thing; (5) not to
+ attach too much value to things even though one has
+ risked one's life for them - just as a thief will resell
+ a stolen article for a fraction of its real value;
+ (6) to withstand all kinds of beatings and tortures
+ but to remain what you are; and (7) to believe your
+ work is worthwhile and not be willing to change it."
+
+ -- Rabbi Dov Baer, Maggid of Mezeritch
+
+OK, this was my motto while working on Perl for MiNT, especially rule (1)...
+
+Have fun with Perl!
+
+Guido Flohr
+--
+mailto:gufl0000@stud.uni-sb.de
+http://stud.uni-sb.de/~gufl0000
if (flag != TRUE)
croak("panic: unsetting binmode"); /* Not implemented yet */
#ifdef DOSISH
-#ifdef atarist
+#if defined(atarist) || defined(__MINT__)
if (!PerlIO_flush(fp) && (fp->_flag |= _IOBIN))
return 1;
else
--- /dev/null
+$self->{CCFLAGS} = $Config{ccflags} . ' -DNO_LOCALECONV_GROUPING -DNO_LOCALECONV_MON_GROUPING';
+
--- /dev/null
+# hints/mint.sh
+#
+# talk to gufl0000@stud.uni-sb.de if you want to change this file.
+# Please read the README.mint file.
+#
+# misc stuff
+
+case `uname -m` in
+ atarist*) archname="m68000-mint"
+ ;;
+ *) archname="m68k-mint"
+ ;;
+esac
+
+here=`pwd | tr -d '\015'`
+
+cc='gcc'
+
+# The weird include path is really to work around some bugs in
+# broken system header files.
+ccflags="-D__MINT__ -Uatarist -DDEBUGGING -I$here/../mint"
+
+# libs
+
+libpth="$prefix/lib /usr/lib /usr/local/lib"
+glibpth="$libpth"
+xlibpth="$libpth"
+
+libswanted='gdbm socket port m'
+so='none'
+
+#
+# compiler & linker flags
+#
+optimize='-O2 -fomit-frame-pointer -fno-defer-pop -fstrength-reduce'
+
+# The setlocale function in the MiNTLib is actually a bad joke. We
+# lend a workaround from Ultrix. If neither LC_ALL nor LANG is
+# set in the environment, perl won't complain. If one is set to
+# anything but "C" you will see a warning. Note that you can
+# still use the GNU extension "$LANGUAGE" if you want to use
+# the i18n features of some GNU packages.
+util_cflags='ccflags="$ccflags -DLOCALE_ENVIRON_REQUIRED"'
+
+#
+# Some good answers to the questions in Configure:
+usenm='true'
+d_suidsafe='true'
+clocktype='long'
+usevfork='true'
+d_fsetpos='fpos_t'
+gidtype='gid_t'
+groupstype='gid_t'
+lseektype='long'
+models='none'
+modetype='mode_t'
+sizetype='size_t'
+timetype='time_t'
+uidtype='uid_t'
+
+# Don't remove that leading tab character (Configure Black Magic (TM)).
+ broken_pwd=
+case "`/bin/pwd|tr -d xy|tr '\015\012' 'xy'`" in
+*xy) broken_pwd=yes ;;
+esac
+
+if test X"$broken_pwd" = Xyes
+then
+ echo " "
+ echo "*** Building fixed 'pwd'... (as described in README.mint) ***"
+ echo " "
+ cd mint
+ make pwd
+ cd ..
+ if test -x mint/pwd -a -w /usr/bin
+ then
+ echo " "
+ echo "*** Installing fixed 'pwd'... ***"
+ echo " "
+ cd mint
+ make install
+ cd ..
+ if cmp -s mint/pwd /usr/bin/pwd
+ then
+ echo "*** Installed fixed 'pwd' successfully. ***"
+ else
+ echo "*** Failed to install fixed 'pwd'. Aborting. ***"
+ exit 1
+ fi
+ else
+ echo "*** Cannot install fixed 'pwd'. Aborting. ***"
+ exit 1
+ fi
+fi
#define MIN_BUC_POW2 (sizeof(void*) > 4 ? 3 : 2) /* Allow for 4-byte arena. */
#define MIN_BUCKET (MIN_BUC_POW2 * BUCKETS_PER_POW2)
-#if !(defined(I286) || defined(atarist))
+#if !(defined(I286) || defined(atarist) || defined(__MINT__))
/* take 2k unless the block is bigger than that */
# define LOG_OF_MIN_ARENA 11
#else
#define u_short unsigned short
/* 286 and atarist like big chunks, which gives too much overhead. */
-#if (defined(RCHECK) || defined(I286) || defined(atarist)) && defined(PACK_MALLOC)
+#if (defined(RCHECK) || defined(I286) || defined(atarist) || defined(__MINT__)) && defined(PACK_MALLOC)
# undef PACK_MALLOC
#endif
/* Second, check alignment. */
slack = 0;
-#ifndef atarist /* on the atari we dont have to worry about this */
+#if !defined(atarist) && !defined(__MINT__) /* on the atari we dont have to worry about this */
# ifndef I286 /* The sbrk(0) call on the I286 always returns the next segment */
/* WANTED_ALIGNMENT may be more than NEEDED_ALIGNMENT, but this may
improve performance of memory access. */
add += slack;
}
# endif
-#endif /* atarist */
+#endif /* !atarist && !MINT */
if (add) {
DEBUG_m(PerlIO_printf(Perl_debug_log,
static void xs_init _((void));
static PerlInterpreter *my_perl;
+#if defined (__MINT__) || defined (atarist)
+/* The Atari operating system doesn't have a dynamic stack. The
+ stack size is determined from this value. */
+long _stksize = 64 * 1024;
+#endif
+
int
main(int argc, char **argv, char **env)
{
--- /dev/null
+# IMPORTANT: This Makefile is not intended to build Perl itself but
+# only to replace a broken pwd command!
+
+all: pwd
+
+pwd: pwd.c
+ $(CC) -O3 -o pwd pwd.c
+
+install: pwd
+ (new_pwd=`which pwd` && cp -f $$new_pwd $$new_pwd.broken \
+ && cp -f pwd $$new_pwd)
+
+clean:
+ rm -f pwd.o pwd
+
--- /dev/null
+This subdirectory contains some additional files which are necessary
+(or at least useful) when compiling Perl on MiNT.
+
+"Makefile" and "pwd.c" will build and install a fixed version of the
+pwd command if your system pwd is broken.
+
+The header files are wrappers around broken system header files. Make
+sure that this directory stands at first place in your include path
+when compiling Perl.
+
+The file system.c is an enhanced version of the system() function
+in the MiNTLib. It is strongly recommended that you insert this
+version into your libc before you compile Perl (see README.MiNT
+in the toplevel directory for details).
--- /dev/null
+/* Wrapper around broken system errno.h. */
+
+#ifndef _PERL_WRAPPER_AROUND_ERRNO_H
+# define _PERL_WRAPPER_AROUND_ERRNO_H 1
+
+/* First include the system file. */
+#include_next <errno.h>
+
+/* Now add the missing stuff.
+#ifndef EAGAIN
+# define EAGAIN EWOULDBLOCK
+#endif
+
+/* This one is problematic. If you open() a directory with the
+ MiNTLib you can't detect from errno if it is really a directory
+ or if the file simply doesn't exist. You'll get ENOENT
+ ("file not found") in either case.
+
+ Defining EISDIR as ENOENT is actually a bad idea but works fine
+ in general. In praxi, if code checks for errno == EISDIR it
+ will attempt an opendir() call on the file in question and this
+ call will also file if the file really can't be found. But
+ you may get compile-time errors if the errno checking is embedded
+ in a switch statement ("duplicate case value in switch").
+
+ Anyway, here the define works alright. */
+#ifndef EISDIR
+# define EISDIR ENOENT
+#endif
+
+#endif
+
--- /dev/null
+/* pwd.c - replacement for broken pwd command.
+ * Copyright 1997 Guido Flohr, <gufl0000@stud.uni-sb.de>.
+ * Do with it as you please.
+ */
+#include <stdio.h>
+#include <limits.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+
+#if defined(__STDC__) || defined(__cplusplus)
+int main (int argc, char* argv[])
+#else
+int main (argc, argv)
+ int argc;
+ char* argv[];
+#endif
+{
+ char path_buf[PATH_MAX + 1];
+
+ if (argc > 1) {
+ int i;
+
+ fflush (stdout);
+ fputs (argv[0], stderr);
+ fputs (": ignoring garbage arguments\n", stderr);
+ }
+
+ if (!getcwd (path_buf, PATH_MAX + 1)) {
+ fflush (stdout);
+ /* Save space, memory and the whales, avoid fprintf. */
+ fputs (argv[0], stderr);
+ fputs (": can\'t get current working directory: ", stderr);
+ fputs (strerror (errno), stderr);
+ fputc ('\n', stderr);
+ return 1;
+ }
+ if (puts (path_buf) < 0) {
+ return 1;
+ }
+ return 0;
+}
+/* End of pwd.c. */
--- /dev/null
+/* Wrapper around broken system stdio.h. */
+
+#ifndef _PERL_WRAPPER_AROUND_STDIO_H
+# define _PERL_WRAPPER_AROUND_STDIO_H 1
+
+/* The MiNTLib has a macro called EOS in stdio.h. This conflicts
+ with regnode.h. Who had this glorious idea. */
+#ifdef EOS
+# define PERL_EOS EOS
+#endif
+
+/* First include the system file. */
+#include_next <stdio.h>
+
+#ifdef EOS
+# undef EOS
+# define EOS PERL_EOS
+#endif
+
+#endif
+
--- /dev/null
+#include <time.h>
+
--- /dev/null
+/* Wrapper around broken system time.h. */
+
+#ifndef _PERL_WRAPPER_AROUND_TIME_H
+# define _PERL_WRAPPER_AROUND_TIME_H 1
+
+/* Recent versions of the MiNTLib have a macro HAS_TZNAME in
+ time.h resp. sys/time.h. Wow, I wonder why they didn't
+ define HAVE_CONFIG_H ... */
+#ifdef HAS_TZNAME
+# define PERL_HAS_TZNAME HAS_TZNAME
+#endif
+
+/* First include the system file. */
+#include_next <time.h>
+
+#ifdef HAS_TZNAME
+# undef HAS_TZNAME
+# define HAS_TZNAME PERL_HAS_TZNAME
+#endif
+
+#endif
+
#ifdef POSIX_BC
printf("BS2000 (POSIX) port by Start Amadeus GmbH, 1998\n");
#endif
+#ifdef __MINT__
+ printf("MiNT port by Guido Flohr, 1997\n");
+#endif
#ifdef BINARY_BUILD_NOTICE
BINARY_BUILD_NOTICE;
#endif
use Config;
-$Is_Dosish = ($^O eq 'dos' or $^O eq 'os2');
+$Is_Dosish = ($^O eq 'dos' or $^O eq 'os2' or $^O eq 'mint');
# avoid win32 (for now)
do { print "1..0\n"; exit(0); } if $^O eq 'MSWin32';
print "1..0\n";
exit 0;
}
- # test 30 rather naughtily expects English error messages
- $ENV{'LC_ALL'} = 'C';
+ # test 30 rather naughtily expects English error messages
+ $ENV{'LC_ALL'} = 'C';
}
# Tests Todo:
my $t = 30;
$cpt->rdo('/non/existant/file.name');
-print +(($! =~ /No such file/ || $! =~ /file specification syntax error/) ||
- $! =~ /A file or directory in the path name does not exist/ ||
- $! =~ /Invalid argument/ ||
- $! =~ /Device not configured/ ?
- "ok $t\n" : "not ok $t # $!\n"); $t++;
+# The regexp is getting rather baroque.
+print $! =~ /No such file|file specification syntax error|A file or directory in the path name does not exist|Invalid argument|Device not configured|file not found/i ? "ok $t\n" : "not ok $t # $!\n"; $t++;
+# test #31 is gone.
print 1 ? "ok $t\n" : "not ok $t\n#$@/$!\n"; $t++;
#my $rdo_file = "tmp_rdo.tpl";
#!./perl
-$ENV{PATH} = '/bin:/usr/bin:/usr/xpg4/bin:/usr/ucb';
+$ENV{PATH} ="/bin:/usr/bin:/usr/xpg4/bin:/usr/ucb" .
+ exists $ENV{PATH} ? ":$ENV{PATH}" : "";
+$ENV{LC_ALL} = "C"; # so that external utilities speak English
# We have to find a command that prints all (effective
# and real) group names (not ids). The known commands are:
print (-d 'blurfl' ? "ok 4\n" : "not ok 4\n");
print (rmdir('blurfl') ? "ok 5\n" : "not ok 5\n");
print (rmdir('blurfl') ? "not ok 6\n" : "ok 6\n");
-print ($! =~ /such|exist/ ? "ok 7\n" : "not ok 7\n");
+print ($! =~ /such|exist|not found/i ? "ok 7\n" : "not ok 7\n");
test 72, $@ eq '', $@; # NB: This should be allowed
# Try first new style but allow also old style.
- test 73, $!{ENOENT} || $! == 2 || ($Is_Dos && $! == 22); # File not found
+ test 73, $!{ENOENT} ||
+ $! == 2 || # File not found
+ ($Is_Dos && $! == 22) ||
+ ($^O eq 'mint' && $! == 33);
test 74, eval { open FOO, "> $foo" } eq '', 'open for write';
test 75, $@ =~ /^Insecure dependency/, $@;
if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
continue; /* don't search dir with too-long name */
if (len
-#if defined(atarist) || defined(DOSISH)
+#if defined(atarist) || defined(__MINT__) || defined(DOSISH)
&& tmpbuf[len - 1] != '/'
&& tmpbuf[len - 1] != '\\'
#endif