Add support for more implementations

This commit is contained in:
retropikzel 2026-01-24 20:55:17 +02:00
parent 51a50c0e85
commit d82742183e
1 changed files with 82 additions and 33 deletions

View File

@ -5,11 +5,12 @@
stringContain() { case $2 in *$1* ) return 0;; *) return 1;; esac ;} stringContain() { case $2 in *$1* ) return 0;; *) return 1;; esac ;}
supported_rnrs="r6rs r7rs" supported_rnrs="r6rs r7rs"
supported_implementations="chezscheme chibi" supported_implementations="chezscheme chibi chicken gambit gauche kawa loko"
## Make sure all arguments are right ## Make sure all arguments are right
if [ "${1}" = "" ]; then if [ "${1}" = "" ]; then
echo "Give implementation name as first argument: ${supported_implementations}" echo "Give implementation name as first argument"
echo "${supported_implementations}"
exit 1 exit 1
fi fi
@ -17,11 +18,13 @@ if stringContain "${1}" "${supported_implementations}"; then
sleep 0 sleep 0
else else
echo "Unsupported implementation: ${1}" echo "Unsupported implementation: ${1}"
echo "${supported_implementations}"
exit 1 exit 1
fi fi
if [ "${2}" = "" ]; then if [ "${2}" = "" ]; then
echo "Give the RnRS as the second argument: ${supported_rnrs}" echo "Give the RnRS as the second argument"
echo "${supported_rnrs}"
exit 1 exit 1
fi fi
@ -29,6 +32,7 @@ if stringContain "${2}" "${supported_rnrs}"; then
sleep 0 sleep 0
else else
echo "Unsupported RnRS: ${2}" echo "Unsupported RnRS: ${2}"
echo "${supported_rnrs}"
exit 1 exit 1
fi fi
@ -47,7 +51,6 @@ implementation="${1}"
rnrs="${2}" rnrs="${2}"
venvpath=$(realpath "${3}") venvpath=$(realpath "${3}")
schemebinpath="${venvpath}/bin/scheme" schemebinpath="${venvpath}/bin/scheme"
scheme_path="${venvpath}/bin"
scheme_compile_cmd="" scheme_compile_cmd=""
scheme_cmd="" scheme_cmd=""
scheme_script_cmd="" scheme_script_cmd=""
@ -62,15 +65,37 @@ mkdir "${venvpath}/lib"
case "${implementation}" in case "${implementation}" in
"chezscheme") scheme_type=interpreter ;; "chezscheme") scheme_type=interpreter ;;
"chibi") scheme_type=interpreter ;; "chibi") scheme_type=interpreter ;;
"chicken") scheme_type=compiler ;;
"gambit") scheme_type=compiler ;;
"gauche") scheme_type=interpreter;;
esac esac
## bin/snow-chibi ## bin/snow-chibi
if [ "${rnrs}" = "r6rs" ]; then
{ {
cat << EOF cat << EOF
#!/bin/sh #!/bin/sh
if [ "\${1}" = "install" ]; then if [ "\${1}" = "install" ]; then
shift shift
snow-chibi install \ PATH="${PATH}" $(which snow-chibi) install \
--impls=generic \
--install-source-dir=${venvpath}/lib \
--install-library-dir=${venvpath}/lib \
--install-data-dir=${venvpath}/lib \
"\$@"
else
snow-chibi "\$@"
fi
EOF
} > "${venvpath}/bin/snow-chibi"
chmod +x "${venvpath}/bin/snow-chibi"
else
{
cat << EOF
#!/bin/sh
if [ "\${1}" = "install" ]; then
shift
PATH="${PATH}" $(which snow-chibi) install \
--impls=${implementation} \ --impls=${implementation} \
--install-source-dir=${venvpath}/lib \ --install-source-dir=${venvpath}/lib \
--install-library-dir=${venvpath}/lib \ --install-library-dir=${venvpath}/lib \
@ -82,13 +107,15 @@ fi
EOF EOF
} > "${venvpath}/bin/snow-chibi" } > "${venvpath}/bin/snow-chibi"
chmod +x "${venvpath}/bin/snow-chibi" chmod +x "${venvpath}/bin/snow-chibi"
fi
## bin/akku ## bin/akku
{ {
cat << EOF cat << EOF
#!/bin/sh #!/bin/sh
cd ${venvpath} cd "${venvpath}/lib"
exec akku \"\$@\" $(which akku) update
$(which akku) "\$@"
EOF EOF
} > "${venvpath}/bin/akku" } > "${venvpath}/bin/akku"
chmod +x "${venvpath}/bin/akku" chmod +x "${venvpath}/bin/akku"
@ -106,7 +133,7 @@ deactivate () {
unset SCHEME_VENV_OLD_PS1 unset SCHEME_VENV_OLD_PS1
export PATH="\${SCHEME_VENV_OLD_PATH}" export PATH="\${SCHEME_VENV_OLD_PATH}"
unset SCHEME_VENV_OLD_PATH unset SCHEME_VENV_OLD_PATH
#hash -r 2> /dev/null hash -r 2> /dev/null
} }
export COMPILE_R7RS=${implementation} export COMPILE_R7RS=${implementation}
@ -121,7 +148,7 @@ export PS1="(\${venvname}) \${PS1:-}"
export SCHEME_VENV_OLD_PATH="\${PATH}" export SCHEME_VENV_OLD_PATH="\${PATH}"
export PATH="${venvpath}/bin:\${PATH}" export PATH="${venvpath}/bin:\${PATH}"
#hash -r 2> /dev/null hash -r 2> /dev/null
echo "${implementation} ${rnrs}" echo "${implementation} ${rnrs}"
EOF EOF
} > "${venvpath}/bin/activate" } > "${venvpath}/bin/activate"
@ -135,16 +162,15 @@ if [ "${rnrs}" = "r6rs" ]; then
"chezscheme") "chezscheme")
if command -v chezscheme >/dev/null 2>&1 if command -v chezscheme >/dev/null 2>&1
then then
scheme_path="${scheme_path}/chezscheme" scheme_cmd="chezscheme --libdirs ${venvpath}/lib/.akku/lib --program \"\${1}\""
scheme_cmd="exec chezscheme --libdirs \"${venvpath}/lib\" \"\$@\""
scheme_script_cmd="exec chezscheme --libdirs ${venvpath}/lib --program \"\${1}\""
else else
scheme_path="${scheme_path}/scheme" scheme_cmd="scheme --libdirs \"${venvpath}/lib/.akku/lib\" --program \"\${1}\""
scheme_cmd="exec scheme \"\$@\""
scheme_cmd="exec scheme --libdirs \"${venvpath}/lib\" \"\$@\""
scheme_script_cmd="exec scheme --libdirs ${venvpath}/lib --program \"\${1}\""
fi fi
;; ;;
"loko")
scheme_cmd="LOKO_LIBRARY_PATH=\"${venvpath}/lib\" loko -std=r6rs --program \"\${1}\""
scheme_compile_cmd="LOKO_LIBRARY_PATH=\"${venvpath}/lib\" loko -std=r6rs -o \"\${OF}\" --compile \"\${IF}\""
;;
*) *)
>&2 echo "Unsupported implementation RnRS combination: ${implementation} ${rnrs}" >&2 echo "Unsupported implementation RnRS combination: ${implementation} ${rnrs}"
exit 1 exit 1
@ -155,9 +181,26 @@ else
## R7RS ## R7RS
case "${implementation}" in case "${implementation}" in
"chibi") "chibi")
scheme_path="${scheme_path}/chibi-scheme" scheme_cmd="chibi-scheme -I \"${venvpath}/lib\" \"\${1}\""
scheme_cmd="exec chibi-scheme -I \"${venvpath}/lib\" \"\$@\"" ;;
scheme_script_cmd="exec chibi-scheme -I \"${venvpath}/lib\" \"\${1}\"" "chicken")
scheme_cmd="echo \"Chicken scripts not yet supported\" && exit 1"
scheme_compile_cmd="csc -static -X r7rs -R r7rs -o \"\${OF}\" \"\${IF}\""
;;
"gambit")
scheme_cmd="gsi \"${venvpath}/lib/\" \"\${1}\""
#scheme_compile_cmd="gsc -o \"\${OF}\" -exe -nopreload \"${venvpath}/lib/\" \"\${IF}\""
scheme_compile_cmd="echo \"Gambit compiler not yet supported\" && exit 1"
;;
"gauche")
scheme_cmd="gosh -r7 -I \"${venvpath}/lib\" \"\${1}\""
;;
"kawa")
scheme_cmd="kawa --r7rs -Dkawa.import.path=\"${venvpath}/lib/*.sld\" \"\${1}\""
;;
"loko")
scheme_cmd="LOKO_LIBRARY_PATH=\"${venvpath}/lib\" loko -std=r7rs --program \"\${1}\""
scheme_compile_cmd="LOKO_LIBRARY_PATH=\"${venvpath}/lib\" loko -std=r7rs -o \"\${OF}\" --compile \"\${IF}\""
;; ;;
*) *)
>&2 echo "Unsupported implementation RnRS combination: ${implementation} ${rnrs}" >&2 echo "Unsupported implementation RnRS combination: ${implementation} ${rnrs}"
@ -167,26 +210,32 @@ else
echo "${scheme_script_cmd}" > "${venvpath}/bin/scheme-r7rs" echo "${scheme_script_cmd}" > "${venvpath}/bin/scheme-r7rs"
fi fi
## bin/implementation script
{
echo "#!/bin/sh"
echo "${scheme_cmd}"
} > "${scheme_path}"
chmod +x "${scheme_path}"
## bin/scheme-script ## bin/scheme-script
{ {
echo "#!/bin/sh" echo "#!/bin/sh"
echo "if [ \"\${1}\" = \"\" ]; then echo 'scheme-venv (${implementation} ${rnrs}) Give script file as argument' && exit 1; fi" echo "if [ \"\${1}\" = \"\" ]; then echo 'scheme-venv (${implementation} ${rnrs}) Give script file as argument' && exit 1; fi"
echo "if [ \"\${1}\" = \"--help\" ]; then echo 'scheme-venv (${implementation} ${rnrs}) Give script file as argument' && exit 1; fi" echo "if [ \"\${1}\" = \"--help\" ]; then echo 'scheme-venv (${implementation} ${rnrs}) Give script file as argument' && exit 1; fi"
echo "${scheme_script_cmd}" echo "${scheme_cmd}"
} > "${venvpath}/bin/scheme-script" } > "${venvpath}/bin/scheme-script"
chmod +x "${venvpath}/bin/scheme-script" chmod +x "${venvpath}/bin/scheme-script"
## bin/compile-r7rs ## bin/scheme-compile
{ if [ "${scheme_type}" = "interpreter" ]; then
{
echo "#!/bin/sh" echo "#!/bin/sh"
echo "printf \"\n#|\nexec ${venvpath}/bin/scheme-script \\\"\\\${0}\\\" \\\"\\\$@\\\"\n|#\n\" > \"\${1%.scm}\""
echo "cat \"\${1}\" >> \"\${1%.scm}\""
echo "chmod +x \"\${1%.scm}\""
} > "${venvpath}/bin/scheme-compile"
chmod +x "${venvpath}/bin/scheme-compile"
else
{
echo "#!/bin/sh"
echo "IF=\$(realpath \"\${1}\")"
echo "OF=\${IF%.scm}"
echo "cd ${venvpath}/lib"
echo "${scheme_compile_cmd}" echo "${scheme_compile_cmd}"
} > "${venvpath}/bin/compile-r7rs" } > "${venvpath}/bin/scheme-compile"
chmod +x "${venvpath}/bin/compile-r7rs" chmod +x "${venvpath}/bin/scheme-compile"
fi