1
0
Fork 0
compile-scheme/compile-r7rs

267 lines
7.0 KiB
Bash
Executable File

#!/bin/sh
if [ ! "${COMPILE_R7RS_DEBUG}" = "" ]; then set -x; fi
CC=gcc
if [ "" = "${CC}" ]
then
CC=${CC}
fi
output="a.out"
libdirs=""
while getopts "I:A:o:" flag
do
case $flag in
o) output="${OPTARG}";;
A) libdirs="$libdirs ${OPTARG}";;
I) libdirs="${OPTARG} $libdirs";;
esac
done
for main; do true; done # Get the last argument
if [ ! "" = "${main}" ]; then output="${main%.*}"; fi
#tmpdir="${HOME}/.cache/compile-r7rs/$(md5sum $main)/"
tmpdir="${HOME}/.cache/compile-r7rs/test"
if [ ! "${COMPILE_R7RS_DEBUG}" = "" ]; then echo "SCMC: ${SCMC}"; fi
case "${SCMC}" in
chibi-scheme)
paths="-I $tmpdir"
for dir in $libdirs
do
paths="$paths -I $tmpdir/${dir#./}"
done
scm_cmd="chibi-scheme $paths"
;;
csi)
paths="-I $tmpdir/*"
for dir in $libdirs
do
paths="$paths -I $tmpdir/${dir#./}/*"
done
scm_cmd="csi -b -R r7rs $paths -script"
;;
csc)
paths="-I $tmpdir"
objects=""
units="r7rs,scheme.base,scheme.case-lambda,scheme.char,scheme.complex,scheme.cxr,scheme.eval,scheme.file,scheme.inexact,scheme.lazy,scheme.load,scheme.process-context,scheme.read,scheme.repl,scheme.time,scheme.write,scheme.r5rs"
for dir in $libdirs
do
paths="$paths -I $tmpdir/${dir#./}"
for lib in $(find "${dir}" -name "*.sld")
do
unit0=$(cd "${dir}" && find . -name $(basename "${lib}"))
unit1=$(echo "${unit0#\./}" | sed 's/\//\./g')
unit=${unit1%.sld}
echo "Compiling $lib as unit ${unit}"
csc -X r7rs -R r7rs -cc ${CC} ${CSCFLAGS} -c -J -unit ${unit} -uses "${units}" "$lib" -o "${unit}.o"
units="${units},${unit}"
objects="$objects ${lib%.sld}.o"
done
done
csc -X r7rs -R r7rs -cc ${CC} ${CSCFLAGS} -o $output -static -uses ${units} $main
chmod +x "$output"
exit 0
;;
icyc)
paths="-I $tmpdir"
for dir in $libdirs
do
paths="$paths -I $tmpdir/${dir#./}"
done
scm_cmd="icyc $paths -s"
;;
gsi)
paths="${tmpdir%/}/" # / is needed
for dir in $libdirs
do
paths="$paths $tmpdir/${dir#./}/" # / is needed
done
scm_cmd="gsi -:s $paths"
;;
gosh)
paths="-I $tmpdir"
for dir in $libdirs
do
paths="$paths -I $tmpdir/${dir#./}"
done
scm_cmd="gosh -r7 $paths"
;;
gxi) # FIXME
paths=""
for dir in $libdirs
do
paths="$paths :module $tmpdir/${dir#./}"
done
scm_cmd="gxi --lang r7rs"
;;
gxc) # FIXME
echo "(prelude: :scheme/r7rs)" > gerbil.pkg
paths=""
libs=""
for dir in $libdirs
do
paths="$paths ${dir#./}"
for lib in $(find "$dir" -name "*.sld")
do
libs="$libs $lib"
done
done
gxc -o $output -static $libs $main
rm -rf gerbil.pkg
exit
;;
guile)
paths="-L $tmpdir"
for dir in $libdirs
do
paths="$paths -L $tmpdir/${dir#./}"
done
scm_cmd="guile --r7rs $paths"
;;
kawa)
jar xf kawa.jar
paths=""
for dir in $libdirs
do
paths="$paths $dir"
for lib in $(find "$dir" -name "*.sld")
do
kawa -C $lib
done
done
{
echo "Main-Class: main"
echo "Class-Path: . gnu kawa $paths"
} > /tmp/compile-r7rs-MANIFEST.mf
kawa --main -C $main
classfiles=$(find .- name "*.class")
jar cvfm "${output}.jar" /tmp/compile-r7rs-MANIFEST.mf kawa gnu $classfiles
rm -rf gnu kawa
rm -rf META-INF
exit
;;
mosh)
paths="$tmpdir"
for dir in $libdirs
do
paths="$paths:$tmpdir/${dir#./}"
done
scm_cmd="mosh --loadpath=$paths"
;;
racket)
paths=""
for dir in $libdirs
do
paths="${PWD}/${dir#./}:$paths"
for lib in $(find "$dir" -name "*.sld")
do
{
echo "#lang r7rs"
echo "(import (scheme base))"
echo "(include \"$(basename $lib)\")"
} > "${lib%.sld}.rkt"
done
done
{
echo "#lang r7rs"
cat "$main"
} > "${main%.scm}.rkt"
PLTCOLLECTS="$paths" raco exe --orig-exe -o $output ++lang r7rs "${main%.scm}.rkt"
exit
;;
racket.exe)
paths="${PWD}"
for dir in $libdirs
do
paths="$paths;$(winepath ${PWD}/${dir#./})"
for lib in $(find "$dir" -name "*.sld")
do
{
echo "#lang r7rs"
echo "(import (scheme base))"
echo "(include \"$(basename $lib)\")"
} > "${lib%.sld}.rkt"
done
done
{
echo "#lang r7rs"
cat "$main"
} > "${main%.scm}.rkt"
set -x
WINEPATH="${HOME}/.wine/drive_c/Program Files/Racket" \
PLTCOLLECTS="$paths" \
wine raco.exe exe --orig-exe --embed-dlls -o "${output}.exe" ++lang r7rs "${main%.scm}.rkt"
exit
;;
sash)
paths="-L $tmpdir"
for dir in $libdirs
do
paths="$paths -L $tmpdir/${dir#./}"
done
scm_cmd="sash -r7 $paths"
;;
stklos)
paths="-I $tmpdir"
for dir in $libdirs
do
paths="$paths -I $tmpdir/${dir#./}"
done
scm_cmd="stklos $paths"
;;
skint)
paths="-I ${tmpdir%/}/"
for dir in $libdirs
do
dir1=${dir#./}
paths="$paths -I $tmpdir/${dir1%/}/" # / is needed
done
scm_cmd="skint $paths"
;;
tr7i)
paths="$tmpdir"
for dir in $libdirs
do
paths="$paths:$tmpdir/${dir%./}/" # / is needed
done
scm_cmd="TR7_LIB_PATH=\"$paths:${TR7_LIB_PATH}\" tr7i"
;;
ypsilon)
paths="${tmpdir}/"
for dir in $libdirs
do
paths="$paths:$tmpdir/${dir#./}"
done
scm_cmd="ypsilon --r7rs $paths --top-level-program"
;;
*)
echo "Unsupported SCMC (SCheMe Compiler) implementation or environment value not set."
exit 1
esac
command="$scm_cmd $tmpdir/$main"
rm -rf "$output"
{
echo "#!/bin/sh"
echo "mkdir -p $tmpdir"
echo 'CURDIR=${PWD}'
echo "cd $tmpdir"
echo "{"
shar -M --quiet-unshar --no-check-existing --no-timestamp $main $(find $libdirs -name "*.scm" -o -name "*.sld" -o -name "*.rkt") | grep -v "exit 0"
echo "} > /dev/null"
echo 'cd ${CURDIR}'
echo "$command \"\$@\""
} > "$output"
chmod +x "$output"
echo "Command: $command"