# # 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 #include #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.