#!/bin/sh BDIR="$HOME/abc" objs="$BDIR/brt.o $BDIR/lib.o" BC="$BDIR/b" # compile in.b [out.s] compile() { if [ "${1##*.}" != "b" ]; then echo "Error: can only compile b files" >&2 exit 1 fi cout=$2 [ "$cout" != "" ] || cout=${1%b}s tmp1=`mktemp`; tmp2=`mktemp` $BC $1 $tmp2 $tmp1 retval=$? cat $tmp1 $tmp2 > $cout rm $tmp1 $tmp2 [ $retval -eq 0 ] || rm $cout && return $retval echo $cout return $retval } # assemble in.{sb} [out.o] assemble() { atmp="" ain=$1 aout=$2; if [ "${1##*.}" = "b" ]; then [ "$aout" != "" ] || aout=${ain%b}o ain=`mktemp --suffix=.s` compile $1 $ain >/dev/null || return 1 atmp="foo" elif [ "${1##*.}" = "s" ]; then [ "$aout" != "" ] || aout=${ain%s}o else echo "Error: can only compile b and s files" >&2 exit 1 fi as --32 -g $ain -o $aout [ "$atmp" != "" ] && rm $ain echo $aout } out="" action="link" while getopts "o:Sc" o do case "$o" in o) out="$OPTARG";; S) action=compile;; c) action=assemble;; esac done shift $(($OPTIND - 1)) # ignore -o option if more than one file given and not linking objs if [ $# -gt 1 ]; then if [ "$action" != "link" ]; then out="" fi fi [ $# -ne 1 ] && havelist=yes tmpobjs="" for i in $@; do if [ "$action" != "link" ]; then [ "$havelist" = "yes" ] && echo $i: $action $i $out >/dev/null [ $? -eq 0 ] || break=1 else if [ "${i##*.}" = "o" ]; then objs="$objs $i" else [ "$havelist" = "yes" ] && echo $i: ltmp=`mktemp --suffix=.o` tmpobjs="$tmpobjs $ltmp" assemble $i $ltmp >/dev/null [ $? -eq 0 ] || break=1 fi fi done if [ $break ]; then [ "$tmpobjs" = "" ] || rm $tmpobjs echo "Error" >&2 exit 1 fi if [ "$action" = "link" ]; then if [ "$out" = "" ]; then out="-o a.out" else out="-o $out" fi ld -m elf_i386 -T $BDIR/link.ld $out $objs $tmpobjs rm $tmpobjs fi