#!/bin/csh -f
# Helps create a buildfile
echo "This script helps you create a buildfile"
echo " "

while ( $#argv > 0 ) 
    switch( $argv[1] )
        case "-d":
		set DefaultAnswer
		breaksw
	default:
		echo "Unknown argument: $argv[1]"
		echo "usage: makebuildfile [ -d ]"
		breaksw
     endsw
     shift
end
		
		
FileName:
echo -n 'Enter the name of the buildfile (default: buildfile): '
if ( $?DefaultAnswer ) then
    echo buildfile
    set answer = "" 
else
    set answer = $<
endif
if ( $answer == "" ) set answer = buildfile
if ( -e $answer ) then
    echo -n "$answer already exists overwrite [y or n]? "
FileExist:
    switch( $< )
        case "y":
		rm -f $answer
		if ( $status ) exit
		breaksw
	case "n":
		goto FileName
		breaksw
	default:
		echo -n "overwrite [y or n]? "
		goto FileExist
		breaksw
    endsw
endif

set Buildfile = ( $answer )

echo " "
echo  "For the following enter a list or <cr> for default in parenthesis"
Compile:
echo -n "Compiler ( cc68 ): "
if ( $?DefaultAnswer ) then
    echo cc68
    set answer = "" 
else
    set answer = $<
endif
if ( "$answer" == "" ) set answer = "cc68"
set Compiler = ( $answer )
if ( $#Compiler != 1 ) goto Compile
echo -n "Compiler options ( -O -v"\$"(Xx)V ): "
if ( $?DefaultAnswer ) then
    echo -O -v\$(Xx)V
    set answer = "" 
else
    set answer = $<
endif
if ( "$answer" == "" ) set answer = "-O -v"\$"(Xx)V"
set CompOpts = ( $answer )
echo -n "Include directories ( ../../libc/include/mi ): "
if ( $?DefaultAnswer ) then
    echo ../../libc/include
    set answer = "" 
else
    set answer = $<
endif
if ( "$answer" == "" ) set answer = "../../libc/include/mi"
set Includes = ( $answer )
Load:
echo -n "Loader ( $Compiler ): "
if ( $?DefaultAnswer ) then
    echo $Compiler
    set answer = "" 
else
    set answer = $<
endif
if ( "$answer" == "" ) set answer = $Compiler
set Loader = ( $answer )
if ( $#Loader != 1 ) goto Load
echo -n "Loader options ( -r ): "
if ( $?DefaultAnswer ) then
    echo "-r"
    set answer = "" 
else
    set answer = $<
endif
if ( "$answer" == "" ) set answer = "-r"
set LoadOpts = ( $answer )
echo -n "Libraries [use '-l' where applicable] ( ): "
if ( $?DefaultAnswer ) then
    echo "( )"
    set answer = "" 
else
    set answer = $<
endif
set Libraries = ( $answer )
Src:
echo -n "Sources ( ): "
set answer = $<
set Sources = ( $answer )
if ( $#Sources < 1 ) goto Src
echo -n "Headers ( ): "
set answer = $<
set Headers = ( $answer )
Run:
echo -n "Runnable file name ( $Sources[1]:r ): "
if ( $?DefaultAnswer ) then
    echo $Sources[1]:r
    set answer = "" 
else
    set answer = $<
endif
if ( "$answer" == "" ) set answer = $Sources[1]:r 
set RunName = ( $answer )
if ( $#RunName != 1 ) goto Run
echo "Chugging away..."


switch ( $Compiler )
    case "pc68":
    case "cc68":
	set SysInclude = /usr/sun/include
	set Suffix = b
	breaksw
    case "cc":
    case "pc":
	set SysInclude = ( /usr/include /usr/include/sys )
	set Suffix = o
	breaksw

    default:
Suff:
	echo "Unknown compiler '$Compiler'"
        echo -n "Please enter object file suffix: "
	set answer = $<
	set Suffix = ( $answer )
	if ( $#Suffix != 1 ) goto Suff
	echo "Warning: this program probably won't work\!"
	breaksw
endsw

# Make the buildfile
echo "#Buildfile for $RunName" >> $Buildfile
echo " " >> $Buildfile
echo "#include ../../buildprefix" >> $Buildfile
echo "SOURCES = $Sources" >> $Buildfile
echo "HEADERS = $Headers" >> $Buildfile
echo -n "OBJECTS = " >> $Buildfile
set SS
foreach file ( $Sources )
    echo -n " $file:r.$Suffix" >> $Buildfile
end
     
echo " " >> $Buildfile
echo "C68FLAGS = $CompOpts" >> $Buildfile

echo -n "INCLUDES =" >> $Buildfile
foreach inc ( $Includes )
    echo -n " -I$inc" >> $Buildfile
end

echo " " >> $Buildfile

echo -n "LIBRARIES = $Libraries" >> $Buildfile

echo " " >> $Buildfile

switch ( $Compiler )
    case "pc68":
	cat << 'EOF' >> $Buildfile
.SUFFIXES: .b .ls .s .p

# normal compile of a module
.p.b:
	pc68 $(C68FLAGS) $(INCLUDES) -c $*.p 

# how to build an assembly file (Not deleting it or assembling it)
.p.s:
	pc68 $(C68FLAGS) $(INCLUDES) -S $*.p

# how to build an assembly listing
.p.ls:
	pc68 $(C68FLAGS) $(INCLUDES) -c -L $*.p

'EOF'
	breaksw
    case "cc68":
	cat << 'EOF' >> $Buildfile
.SUFFIXES: .b .ls .s .c
# normal compile of a module
.c.b:
	cc68 $(C68FLAGS) $(INCLUDES) -c $*.c 

# how to build an assembly file (Not deleting it or assembling it)
.c.s:
	cc68 $(C68FLAGS) $(INCLUDES) -S $*.c

# how to build an assembly listing
.c.ls:
	cc68 $(C68FLAGS) $(INCLUDES) -c -L $*.c

'EOF'
	breaksw
    case "cc":
	cat << 'EOF' >> $Buildfile
.SUFFIXES: .o .s .c
# normal compile of a module
.c.o:
	cc $(C68FLAGS) $(INCLUDES) -c $*.c 

# how to build an assembly file (Not deleting it or assembling it)
.c.s:
	cc $(C68FLAGS) $(INCLUDES) -S $*.c

'EOF'
	breaksw
    case "pc":
	cat << 'EOF' >> $Buildfile
.SUFFIXES: .o .s .p
# normal compile of a module
.p.o:
	pc $(C68FLAGS) $(INCLUDES) -c $*.p

# how to build an assembly file (Not deleting it or assembling it)
.p.s:
	pc $(C68FLAGS) $(INCLUDES) -S $*.p

'EOF'
	breaksw

    default:
	echo ".SUFFIXES: .$Suffix .$Sources[1]:x"
    	echo ".$Suffix.$Sources[1]:x"":" >> $Buildfile
    	echo "	$Compiler"' $(C68FLAGS) $(INCLUDES) -c $*.'"$Suffix" >> $Buildfile
    	echo " " >> $Buildfile
	breaksw
endsw

echo "$RunName"': $(OBJECTS)' >> $Buildfile
echo "	$Loader $LoadOpts "'$(C68FLAGS)'" -o $RunName "'$(OBJECTS) $(LIBRARIES)' >> $Buildfile
echo " " >> $Buildfile


echo " "
echo -n "Do all the sources depend upon all the header files [y or n]? "
Dep:
switch( "$<" )
    case "y":
	echo '$(OBJECTS): $(HEADERS)' >> $Buildfile
	echo " " >> $Buildfile 
	breaksw
    case "n":
	breaksw
    default:
	echo -n "[y or n]? "
	goto Dep
	breaksw
endsw

	
echo " "
echo -n "Do you want an automatic dependency check [y or n]? "
Dep1:
switch ( "$<" )
    case "y":
    # check the dependencies
cat >! /tmp/XYXX$$ << 'EOF'
#
set line =  $< 
set line =  ( $line )
while ( "$line" != "" )
    echo -n "$line[1]"
    set curfile = $line[1]
    shift line
    while ( "$line" != "" )
	unset found
	if ( "$line[1]" == "." && -e "$line[2]" ) then
	    echo -n " $line[2]"
	    shift line
	    shift line
	    continue
	endif
	foreach inc ( $argv )
	    if ( -e $inc/$line[2] ) then
	    	echo -n " $inc/$line[2]"
		set found
		break
	    endif
	end
	if ( $?found == 0 ) \
	     echo $curfile include file $line[2] not found. >> /dev/tty
	shift line
	shift line
    end	
    echo " " 	    

    echo "	touch $curfile" | sed '/:/s/://'

    set line = $<
    set line = ( $line )
end
'EOF'
		grep '^#[ 	]*include' /dev/null $Headers $Sources \
		| sed -e 's/#[ 	]*include[ 	]//' -e 's/"/ . /' \
		  -e 's/</ < /' -e 's/[">]//'	\
		| awk 'BEGIN{ cur = "" } \
		       { if ( cur != $1 ) { \
		       		          if ( cur != "" ) print " " \
				          cur = $1; printf( "%s", $1 ) \
			                  } \
		         printf( " %s %s", $2, $3 ) }'  \
		| csh -f /tmp/XYXX$$ $Includes $SysInclude >> $Buildfile
		rm /tmp/XYXX$$		  
	        breaksw

    case "n":
	echo "Specify the dependencies for the following:"
	foreach file ( $Sources )
    	    echo -n "$file:r.$Suffix"': ' >> $Buildfile
    	    echo -n "$file:r.$Suffix"': '
       	    echo $< >> $Buildfile
        end
        breaksw
    default:
        echo -n "[y or n]? "
        goto Dep1
        breaksw    
endsw
echo " " >> $Buildfile

echo "install: $RunName" >> $Buildfile
echo "	"\$"(NETINSTALL) $RunName /usr/sun/"\$"(Xx)Vboot" >> $Buildfile
echo " " >> $Buildfile

echo "clean:" >> $Buildfile
echo '	rm -f *.BAK *.CKP .*emacs_* $(OBJECTS)'" $RunName" >> $Buildfile
echo " " >> $Buildfile

echo "cleanbak:" >> $Buildfile
echo '	rm -f *.BAK *.CKP .*emacs_*' >> $Buildfile
echo " " >> $Buildfile


echo 'tags: $(HEADERS) $(SOURCES)' >> $Buildfile
echo '	ctags -tw $(HEADERS) $(SOURCES)' >> $Buildfile
echo " " >> $Buildfile

echo 'lint:' >> $Buildfile
echo '	lint -hbxac $(HEADERS) $(SOURCES)' >> $Buildfile
echo " " >> $Buildfile

echo " " 
echo "$Buildfile has been created."
