diff options
author | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2007-06-17 14:48:11 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2007-06-17 14:48:11 +0000 |
commit | 9c12f1e5a87cce227357eea4b0780c0323f952f0 (patch) | |
tree | 8783f5876aa090d78ce738e4fe2e959420d75dc4 /hints | |
parent | d1a15766ff5cdfaf84d91442a68bc2a05880bf12 (diff) | |
download | perl-9c12f1e5a87cce227357eea4b0780c0323f952f0.tar.gz |
Patches to compile perl on Cray XT4 Catamount/Qk, by Jarkko
p4raw-id: //depot/perl@31404
Diffstat (limited to 'hints')
-rw-r--r-- | hints/catamount.sh | 351 | ||||
-rw-r--r-- | hints/linux.sh | 10 |
2 files changed, 360 insertions, 1 deletions
diff --git a/hints/catamount.sh b/hints/catamount.sh new file mode 100644 index 0000000000..50641f7b8b --- /dev/null +++ b/hints/catamount.sh @@ -0,0 +1,351 @@ +# +# 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. diff --git a/hints/linux.sh b/hints/linux.sh index fea63e0671..af73cc8411 100644 --- a/hints/linux.sh +++ b/hints/linux.sh @@ -32,7 +32,15 @@ d_suidsafe='undef' # libgdbmg1-dev (development version of GNU libc 2-linked GDBM library) # So make sure that for any libraries you wish to link Perl with under # Debian or Red Hat you have the -dev packages installed. -# + +# SuSE Linux can be used as cross-compilation host for Cray XT4 Catamount/Qk. +if test -d /opt/xt-pe +then + case "`cc -V 2>&1`" in + *catamount*) . hints/catamount.sh; return ;; + esac +fi + # Some operating systems (e.g., Solaris 2.6) will link to a versioned shared # library implicitly. For example, on Solaris, `ld foo.o -lgdbm' will find an # appropriate version of libgdbm, if one is available; Linux, however, doesn't |