#! /bin/sh
if [ $# -eq 0 ]; then
printf "%s\n" "neatcc -- neatas/ncc/nld wrapper" >&2
exit 1
fi
if [ "$NAS" = "" ]; then NAS="neatas"; fi
if [ "$NCC" = "" ]; then NCC="ncc"; fi
if [ "$NLD" = "" ]; then NLD="nld"; fi
if [ "$NHD" = "" ]; then NHD="."; fi
if [ "$NLC" = "" ]; then NLC="."; fi
if [ "$1" = "-v" ]; then
printf "%s\n" "neatcc -- neatas/ncc/nld wrapper"
printf "assembler: %s\n" "$NAS"
printf "compiler: %s\n" "$NCC"
printf "linker: %s\n" "$NLD"
printf "headers: %s\n" "$NHD"
printf "libc: %s\n" "$NLC"
exit 0
fi
nccargs=" -I$NHD"
nldargs=""
asm_sources=""
c_sources=""
objects=""
link="yes"
run="no"
waiting_arg="neither"
for arg in "$@"; do
case $waiting_arg in
neither)
if [ ${arg#-} != $arg ]; then # $arg starts with slash
case ${arg#-} in
I*|D*|O*|W*)
nccargs="$nccargs $arg"
if [ ${#arg} -eq 2 ]; then
waiting_arg="ncc"
fi
;;
c)
link="no"
;;
E)
nccargs="$nccargs $arg"
link="no"
;;
l*|L*|m*|e*|o*)
nldargs="$nldargs $arg"
if [ ${#arg} -eq 2 ]; then
waiting_arg="nld"
fi
;;
s|g|p)
nldargs="$nldargs $arg"
;;
r)
run="yes"
;;
R)
run="yes"
waiting_arg="run"
;;
*)
printf "unknown option: %s\n" $arg >&2
exit 2
esac
else
case "$arg" in
*.s)
asm_sources="$asm_sources $arg"
object=${arg%.s}.o
;;
*.c)
c_sources="$c_sources $arg"
object=${arg%.c}.o
;;
*.o)
object="$arg"
;;
*)
printf "invalid argument: %s\n" $arg >&2
exit 2
esac
objects="$objects $object"
fi
;;
ncc)
nccargs="$nccargs$arg"
waiting_arg="neither"
;;
nld)
nldargs="$nldargs $arg"
waiting_arg="neither"
;;
run)
rargs="$arg"
waiting_arg="neither"
esac
done
if [ -n "$asm_sources" ]; then
$NAS $asm_sources || exit
fi
if [ -n "$c_sources" ]; then
$NCC$nccargs $c_sources || exit
fi
if [ $link = "yes" ]; then
for obj in start.o libc.a; do
if [ ! -f "$NLC/$obj" ]; then
printf "$obj not found in '%s'\n" "$NLC" >&2
printf "make sure to set \$NLC to neatlibc location\n" >&2
exit 2
fi
done
nldargs="$nldargs $objects $NLC/start.o $NLC/libc.a"
if [ $run = "yes" ]; then
tmpbin="/tmp/tmp.out"
nldargs="$nldargs -o$tmpbin"
fi
$NLD$nldargs || exit
if [ -n "$asm_sources$c_sources" ]; then
rm -f $objects
fi
if [ $run = "yes" ]; then
$tmpbin $rargs
stt=$?
rm -f $tmpbin
exit $stt
fi
fi