--- /dev/null
+#
+# Hints for the Cray XT4 Catamount/Qk system:
+# cross-compilation host is a SuSE x86_64-linux,
+# execution at the target with the 'yod' utility,
+# linux.sh will run this hints file when necessary.
+#
+# cc.sh: compiles the code with the cross-compiler, patches main/exit/_exit
+# (and traps signals) to be wrappers that echo the exit code.
+#
+# run.sh: runs the executable with yod and collects the exit status,
+# and exits with that status.
+#
+# You probably should do the compilation in non-Lustre filesystem
+# because Lustre does not support all the POSIX system calls, which may
+# cause weird errors during the Perl build:
+# 1182003549.604836:3-24:(super.c:1516:llu_iop_fcntl()): unsupported fcntl cmd 2
+#
+# As of 2007-Jun (pre-5.9.5) miniperl and libperl.a can be successfully built;
+# building any extensions would be hard since Perl cannot run anything
+# external (which breaks MakeMaker, and confuses ext/util/make_ext).
+#
+# To build libperl.a (which also gets miniperl built):
+#
+# sh Configure -des -Dusedevel
+# make libperl.a
+#
+# The -Dusedevel is required for Perl 5.9, it is not required for Perl 5.10
+# sources, once they come out. You will need to have the run.sh execution
+# wrapper around (it gets created in the Perl build directory) if you want to
+# run the miniperl in the XT4. It collects the exit status (note that yod
+# is run with "-sz 1", so only one instance is run), and possible crash status.
+# For example:
+#
+# sh run.sh ./miniperl -le 'print 42'
+#
+
+case "$prefix" in
+'') prefix=/opt/perl-catamount ;;
+esac
+cat >&4 <<__EOF1__
+***
+*** You seem to be compiling in Linux for the Catamount/Qk environment.
+*** I'm therefore not going to install perl as /usr/bin/perl.
+*** Perl will be installed under $prefix.
+***
+__EOF1__
+
+archname='x86_64-catamount'
+archobjs='cata.o'
+d_mmap='undef'
+d_setlocale='undef' # There is setlocale() but no locales.
+d_vprintf='define'
+hintfile='catamount'
+i_arpainet='undef'
+i_db='undef'
+i_netdb='undef'
+i_niin='undef'
+incpth=' '
+installusrbinperl='undef'
+libswanted="m crypt c"
+libpth=' '
+locincpth=''
+onlyextensions='Fcntl' # Not that we can build this, really.
+osname='catamount'
+procselfexe='undef'
+usedl='undef'
+useithreads='undef'
+uselargefiles='define'
+usenm='undef'
+usethreads='undef'
+use64bitall='define'
+
+BUILD=$PWD
+
+case "`yod -Version 2>&1`" in
+Red*) ;; # E.g. "Red Storm Protocol Release 2.1.0"
+*) echo >&4 "Could not find 'yod', aborting."
+ exit 1 ;;
+esac
+run=$BUILD/run.sh
+cat > $run <<'__EOF2__'
+#!/bin/sh
+#
+# $run
+#
+yod -sz 1 "$@" 2> .yod$$e > .yod$$o
+status=`awk '/^cata: exe .* pid [0-9][0-9]* (main|exit|_exit) [0-9][0-9]*$/ {print $NF}' .yod$$o|tail -1`
+grep -v "sz is 1" .yod$$e
+grep -v "^cata: exe .* pid [0-9][0-9]* " .yod$$o
+grep "^cata: exe .* signal " .yod$$o
+rm -f .yod$$o .yod$$e
+exit $status
+__EOF2__
+chmod 755 $run
+case "`cc -V 2>&1`" in
+*catamount*) ;; # E.g. "/opt/xt-pe/1.5.41/bin/snos64/cc: INFO: catamount target is being used"
+*) echo "Could not find 'cc' for catamount, aborting."
+ exit 1 ;;
+esac
+
+cc=$BUILD/cc.sh
+cat > $cc <<__EOF3a__
+#!/bin/sh
+#
+# $0
+#
+# This is essentially a frontend driver for the Catamount cc.
+# We arrange for (1) the main(), exit(), _exit() being wrapped (cpp-defined)
+# catamain(), cataexit(), and _cataexit() (2) the actual main() etc. are in
+# cata.c, and cata.o is linked in when needed (3) signals being caught
+# All this mostly for being able to catch the exit status (or crash cause).
+#
+argv=''
+srco=''
+srct=''
+exe=''
+defs='-Dmain=catamain -Dexit=cataexit -D_exit=_cataexit'
+argv=''
+BUILD=/wrk/jhi/perl-5.9.x@31393+cata
+__EOF3a__
+cat >> $cc <<'__EOF3b__'
+case "$1" in
+--cata_o) ;;
+*) if test ! -f cata.o
+ then
+ if test ! -f cata.c
+ then
+ if test -f ../cata.c # If compiling in UU during Configure.
+ then
+ cp ../cata.c cata.c
+ cp ../cata.h cata.h
+ fi
+ fi
+ $0 --cata_o -c cata.c || exit 1
+ fi
+ ;;
+esac
+while test $# -ne 0
+do
+ i=$1
+ shift
+ case "$i" in
+ --cata_o) ;;
+ *.c)
+ argv="$argv $defs"
+ defs=""
+ if test ! -f $i
+ then
+ echo "$0: $i: No such file or directory"
+ exit 1
+ fi
+ j=$i$$.c
+ rm -f $j
+ if grep -q -s '#include "cata.h"' $i
+ then
+ :
+ else
+ cat >>$j<<__EOF4__
+#include "cata.h"
+# 1 "$i"
+__EOF4__
+ fi
+ cat $i >>$j
+ if grep -q -s 'int main()' $i
+ then
+ argv="$argv -Dmain0"
+ else
+ if grep -q -s 'int main([^,]*,[^,]*)' $i
+ then
+ argv="$argv -Dmain2"
+ else
+ if grep -q -s 'int main([^,]*,[^,]*,[^,]*)' $i
+ then
+ argv="$argv -Dmain3"
+ fi
+ fi
+ fi
+ argv="$argv $j"
+ srct="$j"
+ srco="$i"
+ ;;
+ *.o)
+ if test ! -f "$i"
+ then
+ c=$(echo $i|sed 's/\.o$/.c/')
+ $0 -c $c || exit 1
+ fi
+ argv="$argv $i"
+ ;;
+ -o)
+ exe="$1"
+ argv="$argv -o $exe -Dargv0=$exe"
+ shift
+ ;;
+ *)
+ argv="$argv $i"
+ ;;
+ esac
+done
+case "$exe" in
+'') ;;
+*) case "$argv" in
+ *cata.o*) ;;
+ *) argv="$argv cata.o" ;;
+ esac
+ ;;
+esac
+cc -I$BUILD $argv 2> .cc$$e > .cc$$o
+status=$?
+egrep -v 'catamount target|'$$'\.c:$' .cc$$e 1>&2
+case "`grep "is not implemented" .cc$$e`" in
+*"will always fail"*) status=1 ;;
+esac
+cat .cc$$o
+rm -f .cc$$o
+case "$status" in
+0) rm -f .cc$$e $srct
+ ;;
+esac
+objt=`echo $srct|sed -e 's/\.c$/.o/'`
+objo=`echo $srco|sed -e 's/\.c$/.o/'`
+if test -n "$objt" -a -f "$objt"
+then
+ mv -f $objt $objo
+fi
+exit $status
+__EOF3b__
+chmod 755 $cc
+
+cat >cata.h<<__EOF6__
+#ifndef CATA_H
+#define CATA_H
+void cataexit(int status);
+void _cataexit(int status);
+void catasigsetup();
+void catasighandle(int signum);
+#ifdef main0
+int catamain();
+#else
+#ifdef main2
+int main(int argc, char **argv);
+#else
+int main(int argc, char **argv, char **env);
+#endif
+#endif
+#endif
+__EOF6__
+
+cat >cata.c<<__EOF7__
+#include <stdio.h>
+#include <signal.h>
+#undef printf
+#undef main
+#undef exit
+#undef _exit
+#include "cata.h"
+#ifndef STRINGIFY
+#define STRINGIFY(a) #a
+#endif
+#ifdef argv0
+#define ARGV0 STRINGIFY(argv0)
+#else
+static char* argv0;
+#define ARGV0 argv0
+#endif
+void cataexit(int status) {
+ printf("cata: exe %s pid %d exit %d\n", ARGV0, getpid(), status);
+ exit(status);
+}
+void _cataexit(int status) {
+ printf("cata: exe %s pid %d _exit %d\n", ARGV0, getpid(), status);
+ _exit(status);
+}
+void catasighandle(int signum) {
+ int core = 0;
+ printf("cata: exe %s pid %d signal %d\n", ARGV0, getpid(), signum);
+ switch (signum) {
+ case SIGQUIT:
+ case SIGILL:
+ case SIGTRAP:
+ case SIGABRT:
+ case SIGBUS:
+ case SIGSEGV:
+ case SIGXCPU:
+ case SIGXFSZ:
+ core = 0200;
+ break;
+ default:
+ break;
+ }
+ cataexit(core << 8 | signum);
+}
+void catasigsetup() {
+ signal(SIGHUP, catasighandle);
+ signal(SIGINT, catasighandle);
+ signal(SIGQUIT, catasighandle);
+ signal(SIGILL, catasighandle);
+ signal(SIGTRAP, catasighandle);
+ signal(SIGABRT, catasighandle);
+ signal(SIGIOT, catasighandle);
+ /* KILL */
+ signal(SIGBUS, catasighandle);
+ signal(SIGFPE, catasighandle);
+ signal(SIGUSR1, catasighandle);
+ signal(SIGUSR2, catasighandle);
+ signal(SIGSEGV, catasighandle);
+ signal(SIGPIPE, catasighandle);
+ signal(SIGALRM, catasighandle);
+ signal(SIGTERM, catasighandle);
+ signal(SIGSTKFLT, catasighandle);
+ signal(SIGCHLD, catasighandle);
+ signal(SIGCONT, catasighandle);
+ /* STOP */
+ signal(SIGTSTP, catasighandle);
+ signal(SIGTTIN, catasighandle);
+ signal(SIGTTOU, catasighandle);
+ signal(SIGURG, catasighandle);
+ signal(SIGXCPU, catasighandle);
+ signal(SIGXFSZ, catasighandle);
+ signal(SIGVTALRM, catasighandle);
+ signal(SIGPROF, catasighandle);
+ signal(SIGWINCH, catasighandle);
+ signal(SIGIO, catasighandle);
+ signal(SIGPWR, catasighandle);
+ signal(SIGSYS, catasighandle);
+}
+int main(int argc, char *argv[], char *envv[]) {
+ int status;
+#ifndef argv0
+ argv0 = argv[0];
+#endif
+ catasigsetup();
+ status =
+#ifdef main0
+ catamain();
+#else
+#ifdef main2
+ catamain(argc, argv);
+#else
+ catamain(argc, argv, envv);
+#endif
+#endif
+ printf("cata: exe %s pid %d main %d\n", ARGV0, getpid(), status);
+ return status;
+}
+__EOF7__
+
+echo "Faking DynaLoader"
+touch DynaLoader.o # Oh, the agony.
+
+# That's it.
PerlIO *
Perl_my_popen_list(pTHX_ char *mode, int n, SV **args)
{
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(NETWARE)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__)
dVAR;
int p[2];
register I32 This, that;
}
/* VMS' my_popen() is in VMS.c, same with OS/2. */
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
PerlIO *
Perl_my_popen(pTHX_ const char *cmd, const char *mode)
{
*/
return PerlIO_importFILE(djgpp_popen(cmd, mode), 0);
}
+#else
+#if defined(__LIBCATAMOUNT__)
+PerlIO *
+Perl_my_popen(pTHX_ const char *cmd, const char *mode)
+{
+ return NULL;
+}
+#endif
#endif
#endif
#endif /* !PERL_MICRO */
/* VMS' my_pclose() is in VMS.c; same with OS/2 */
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
I32
Perl_my_pclose(pTHX_ PerlIO *ptr)
{
}
return(pid2 < 0 ? pid2 : status == 0 ? 0 : (errno = 0, status));
}
+#else
+#if defined(__LIBCATAMOUNT__)
+I32
+Perl_my_pclose(pTHX_ PerlIO *ptr)
+{
+ return -1;
+}
+#endif
#endif /* !DOSISH */
-#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(MACOS_TRADITIONAL)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
I32
Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
{