95 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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
 |