#! /bin/csh -f
# $Header: RCS/Make,v 1.82 91/11/03 01:10:44 hong Exp $

if (! $?DEVELOPMENT) setenv DEVELOPMENT f
if (! $?STRIPOBJS) setenv STRIPOBJS f
if (! $?POSTGRESHOME) setenv POSTGRESHOME /usr/postgres

#
# CHANGE ME WHEN MAKING RELEASES !!!!!!!!!!!!!
#

set ship=1

if ($?SPRITE_OS) then
	setenv SHELL /bin/sh
	set MAKEF = "/postdev/choi/make -f -"
	set MAKE = "/postdev/choi/make -f -"
else if (`hostname` == "hermes.Berkeley.EDU") then
	set MAKE = "/u/hong/hermes/bin/sun.make -f -"
else
	set MAKE = "make -f -"
endif

set accessdeps = 
set commanddeps = 
set executordeps =
set libdeps =
set maindeps =
set parserdeps =
set plannerdeps =
set portdeps =
set rewritedeps =
set rulesdeps =
set storagedeps =
set tcopdeps =
set utilsdeps =

set defaultrules = "defaults.mk"
set ext = "o"

set targs =
set defs =
set opts =

set ALL = (inh postgres support postmaster )
set DFLAGS =
set SFLAG =
set PFLAG =

# parse arg list
foreach i ( $argv )
	switch ($i)
	case "-s":		# use dependencies
		set accessdeps = DEPS/ACCESS.d
		set commanddeps = DEPS/COMMANDS.d
		set executordeps = DEPS/EXECUTOR.d
		set libdeps = DEPS/LIB.d
		set maindeps = DEPS/MAIN.d
		set parserdeps = DEPS/PARSER.d
		set plannerdeps = DEPS/PLANNER.d
		set portdeps = DEPS/PORT.d
		set rewritedeps = DEPS/REWRITE.d
		set rulesdeps = DEPS/RULES.d
		set storagedeps = DEPS/STORAGE.d
		set tcopdeps = DEPS/TCOP.d
		set utilsdeps = DEPS/UTIL.d
		set SFLAG = "-s"
		breaksw
	case "-depend":		# generate dependencies for targets
		set defaultrules = "depends.mk"
		set ext = "d"
		breaksw
	case "-development":	# set development environ variable
		setenv DEVELOPMENT t
		breaksw
	case "-strip":		# set strip objects environ variable
		setenv STRIPOBJS t
		breaksw
	case "-print":		# print the makefile instead of executing it
		set MAKE = $cwd/debug
		breaksw
	case "-debug":		# walk thru makefile, printing out the targets
		set MAKE = ( $MAKE -n )
		breaksw
	case "-silent":		# simulate the "@" construct
		set MAKE = ( $MAKE -s )
		breaksw
	case "-touch":		# touch targets instead of making them
		set MAKE = ( $MAKE -t )
		breaksw
	case "-parallel":
		set PARALLELMAKE
		set PFLAG = "-parallel"
		breaksw
	case "-d*":
		set  defs = ( $defs `echo $i | sed -e s/-d//` )
#	        set DFLAGS = ( $DFLAGS $i )
		set MAKE = ( $MAKE `echo $i | sed -e s/-d//` )
                breaksw
        case "-*":
                set opts = ( $opts $i )
		set MAKE = ( $MAKE $i )
                breaksw
	default:
		set targs = ( $targs $i )
		breaksw
	endsw
end

#
# build the targets the user asked for
# organized according to the most frequently used targets,
# modules (parser,planner, etc. ) are listed alphabetically in part 2
#
foreach i ( $targs )
	#
	# part 1 - everybody's favorite targets
	#
	switch ( $i )
	case "quick-link":	# assume all big .o's are up to date
	cat config.mk postgres.mk $defaultrules \
	| ( cd .. ; $MAKE POSTGRES.$ext )
	breaksw
	case "postgres":  	# the postgres binary in the obj dir
		if ($?PARALLELMAKE) then
		    foreach i (access command executor lib main parser planner \
			       port rewrite rules storage tcop utils)
			echo Make $i in parallel;
			Make -parallel $i &
		    end
		    wait
		    echo parallel phase done
		else
		endif
		cat config.mk \
		FILES/{main,commands,executor,parser}.mkf \
		FILES/{planner,rewrite,rules,tcop,inh}.mkf \
		FILES/{access,libraries,storage,utilities}.mkf \
		FILES/bootstrap.mkf \
		port.mk postgres.mk \
		$defaultrules \
		$accessdeps $commanddeps $executordeps $libdeps \
		$maindeps $parserdeps $plannerdeps $rewritedeps $portdeps \
		$rulesdeps $storagedeps $tcopdeps $utilsdeps \
		| (cd ..; $MAKE POSTGRES.$ext)
		breaksw
	case "inh":		# the nodes stuff, use before postgres
		cat config.mk FILES/inh.mkf inh.mk $defaultrules \
		| (cd ..; $MAKE allobjs)
		breaksw
	#
	# part 2 - modules within postgres
	#
	case "access":		# the access methods module
		cat config.mk \
		FILES/access.mkf postgres.mk $defaultrules $accessdeps \
		| (cd ..; $MAKE ACCESS.$ext)
		breaksw
	case "command":		# the various utilities commands
		cat config.mk \
		FILES/commands.mkf postgres.mk $defaultrules $commanddeps \
		| (cd ..; $MAKE COMMANDS.$ext)
		breaksw
	case "executor":	# the executor module
		cat config.mk \
		FILES/executor.mkf postgres.mk $defaultrules $executordeps \
		| (cd ..; $MAKE EXECUTOR.$ext)
		breaksw
	case "lib":		# various lowlevel libraries
		cat config.mk \
		FILES/libraries.mkf postgres.mk $defaultrules $libdeps \
		| (cd ..; $MAKE LIB.$ext)
		breaksw
	case "main":		# main()
		cat config.mk \
		FILES/main.mkf postgres.mk $defaultrules $maindeps \
		| (cd ..; $MAKE MAIN.$ext)
		breaksw
	case "parser":		# the parser module
		cat config.mk \
		FILES/parser.mkf postgres.mk $defaultrules $parserdeps \
		| (cd ..; $MAKE PARSER.$ext)
		breaksw
	case "planner":		# the planner module
		cat config.mk \
		FILES/planner.mkf postgres.mk $defaultrules $plannerdeps \
		| (cd ..; $MAKE PLANNER.$ext)
		breaksw
	case "port":		# the port specific module
		cat config.mk \
		port.mk postgres.mk $defaultrules $portdeps \
		| (cd ..; $MAKE PORT.$ext)
		breaksw
	case "rewrite":		# the rewrite rules module
		cat config.mk FILES/rewrite.mkf \
		postgres.mk $defaultrules $rewritedeps \
		| (cd ..; $MAKE REWRITE.$ext)
		breaksw
	case "rules":		# the tuple level rules module
		cat config.mk FILES/rules.mkf \
		postgres.mk $defaultrules $rulesdeps \
		| (cd ..; $MAKE RULES.$ext)
		breaksw
	case "storage":		# the storage manager module
		cat config.mk FILES/storage.mkf \
		postgres.mk $defaultrules $storagedeps \
		| (cd ..; $MAKE STORAGE.$ext)
		breaksw
	case "tcop":		# the traffic cop
		cat config.mk FILES/tcop.mkf \
		postgres.mk $defaultrules $tcopdeps \
		| (cd ..; $MAKE TCOP.$ext)
		breaksw
	case "utils":		# misc utility code
		cat config.mk \
		FILES/utilities.mkf postgres.mk $defaultrules $utilsdeps \
		| (cd ..; $MAKE UTIL.$ext)
		breaksw
	#"
	#" Part 3 - utility type targets (not actually for compile/link cycle
	#"
	case "help":
		egrep '(case \")' Make 
		breaksw
	case "links":		# links from obj to src directory
		cat config.mk misc.mk | $MAKE links
		breaksw
	case "missing":		
		cat config.mk \
		support.mk $defaultrules | $MAKE missing
		breaksw
	case "newfiles":	# files that you haven't checked out
		cat config.mk misc.mk | $MAKE newfiles
		breaksw
	case "getfiles":
		cat config.mk misc.mk | $MAKE newfiles_co
		breaksw
	case "newfiles_co":	# Make newfiles + check out
		cat config.mk misc.mk | $MAKE newfiles_co
		breaksw
	case "obsfiles":	# files you have that I don't believe exist
		cat config.mk misc.mk | $MAKE obsfiles
		breaksw
	#"
	#" Part 4a - support programs (not often recompiled )
	#"
	case "bkifiles":	# local.bki and dbdb.bki, needed by createdb
		cat config.mk FILES/support.mkf support.mk $defaultrules \
		| (cd ..; $MAKE bkifiles)
		breaksw
	case "rmbkifiles":	# removes local.bki and dbdb.bki
		cat config.mk FILES/support.mkf support.mk $defaultrules \
		| (cd ..; $MAKE rmbkifiles)
		breaksw
	case "cinterface":	# library against which to link support targets
		cat config.mk \
		FILES/{access,libraries,storage,utilities,inh}.mkf \
		port.mk support.mk cinterface.mk $defaultrules \
		| (cd ..; $MAKE cinterface)
		breaksw
	case "pg_version":	# database creation utility
		cat config.mk \
		FILES/support.mkf support.mk $defaultrules \
		| (cd ..; $MAKE pg_version)
		breaksw
	case "createdb":
		cat config.mk \
		FILES/support.mkf support.mk $defaultrules \
		| (cd ..; $MAKE createdb)
		breaksw
		breaksw
	case "destroydb":
		cat config.mk \
		FILES/support.mkf support.mk $defaultrules \
		| (cd ..; $MAKE destroydb)
		breaksw
	case "libpq":
		cat config.mk \
		FILES/support.mkf support.mk $defaultrules \
		| (cd ..; $MAKE libpq)
		breaksw
	case "monitor":		# the terminal monitor
		cat config.mk \
		FILES/support.mkf support.mk $defaultrules \
		| (cd .. ; $MAKE monitor)
		breaksw
	case "xexemon":		# the X executor monitor
		cat config.mk \
		FILES/support.mkf support.mk $defaultrules \
		| (cd .. ; $MAKE xexemon)
		breaksw
	case "postmaster":	# make me if you want multi-user
		cat config.mk \
		FILES/{access,libraries,storage,utilities,inh}.mkf \
		port.mk support.mk cinterface.mk postmaster.mk $defaultrules \
		| (cd ..; $MAKE postmasterlinks)
		cat config.mk \
		FILES/{access,libraries,storage,utilities,inh}.mkf \
		port.mk support.mk cinterface.mk postmaster.mk $defaultrules \
		| (cd ..; $MAKE postmaster)
		breaksw
	case "support":		# all the support targets 
		cat config.mk FILES/support.mkf support.mk cinterface.mk \
		$defaultrules \
		| (cd ..; $MAKE support POSTGRESBIN=$POSTGRESHOME/bin )
		breaksw
	case "vacuum":
		cat config.mk \
		FILES/support.mkf support.mk cinterface.mk $defaultrules \
		| (cd ..; $MAKE support POSTGRESBIN=$POSTGRESHOME/bin)
		breaksw
	case "pg_id":
		cat config.mk \
		FILES/support.mkf support.mk cinterface.mk $defaultrules \
		| (cd ..; $MAKE pg_id)
		break;
	case "everything":
		foreach i ($ALL)
			csh Make $PFLAG $DFLAGS $SFLAG $opts $i
		end
		touch everything.stat
		breaksw
	case "install":
		if ($ship == 1) then
			if (! -e ./newport.stat) then
				./newport
			endif
		endif
		cp config.mk install$$.mk
		chmod 777 install$$.mk
		echo 'install:' >> install$$.mk
		echo '	@ sh install.sh $(TREE) $(OD) $(PORTNAME) ' $ship "$MAKE" >>install$$.mk
		if ($?SPRITE_OS) then
			$MAKEF install < install$$.mk
		else
			$MAKE install < install$$.mk
		endif
		/bin/rm -f install$$.mk
		breaksw
	#"
	#" Part 4b - support programs (not often recompiled )
	#"
	case "sample":
		cat config.mk ../sample/Makefile.raw >! ../sample/Makefile
		breaksw
	#
	# Part 5 : people's personal stuff 
	# 	   it might be argued that this should not be here
	#
        case "test":
                cat config.mk \
                FILES/{commands,executor,parser}.mkf \
                FILES/{planner,rules,inh}.mkf \
                FILES/{access,libraries,storage,utilities}.mkf \
		FILES/{tcop,test}.mkf \
                port.mk test.mk $defaultrules \
                | (cd ..; $MAKE test)
                breaksw
        case "dumpbpages":
                cat FILES/test.mkf config.mk $defaultrules test.mk \
                | (cd ..; $MAKE dumpbpages)
                breaksw
        case "rtdump":
                cat FILES/test.mkf config.mk $defaultrules test.mk \
                | (cd ..; $MAKE rtdump)
                breaksw
        case "testbtree":
                cat FILES/test.mkf config.mk $defaultrules test.mk \
                | (cd ..; $MAKE testbtree)
                breaksw
	case "ifiles":		# intermediate .i files (for debugging)
		cat config.mk FILES/inh.mkf inh.mk \
		| (cd ..; $MAKE genifiles)
		breaksw
	case "rmifiles":	# remove .i files (for debugging)
		cat config.mk FILES/inh.mkf inh.mk \
		| (cd ..; $MAKE rmifiles)
		breaksw
	case "checkout/*":	# checkout files from checkout script
		set script=$i:t 
		set rmscript=0
		if (! -e $script) then
		    if (-e RCS/$script,v) then
			echo using RCS/$script,v ...
			co $script >& /dev/null
			set rmscript=1
		    else
			echo neither $script or RCS/$script,v exists
			exit 1
		    endif
		endif
		cat config.mk $script | (cd ..; $MAKE checkout)
		if ($rmscript == 1) then
		    rm -f $script
		endif
		breaksw
	#
	# Part 5a : cim's stuff.  
	#	    ignore this if you are not cim.
	#
	case "cim-*":		# do cim's stuff
		cat config.mk $HOME/conf/cim.mk | (cd ..; $MAKE $i)
		breaksw
	case "hdep/*":		# find header file dependencies
		setenv HFILE `echo $i | sed -e 's/^[a-zA-Z]*\///'`
		cat config.mk $HOME/conf/cim.mk | (cd ..; $MAKE hdep)
		breaksw
	case "execnodes-ah":	# execnodes.a.h file
		cat config.mk FILES/inh.mkf inh.mk \
		| (cd ..; $MAKE execnodes-ah)
		breaksw
	# 5b. Adam's support stuff
	#     someone besides adam might find this useful
	case "TAGS":
		echo Making TAGS file
		(cd ../src; etags */*.[ch] */*/*.[ch])
		breaksw
	case "usefulstuff":
		echo Making file list + other useful stuff
		(cd ../src; find . -name "*.[ch]" -print > file.list; \
		grep -n elog `cat file.list` > elog.hit; \
		grep -n \#define `cat file.list` > macro.def; \
		etags `cat file.list` )
		breaksw
	#
	# Part 6 : default target
	#
	default:		# makes a specific pathname
		cat config.mk \
		FILES/{commands,executor,parser}.mkf \
		FILES/{planner,rules,tcop,inh}.mkf \
		FILES/{access,libraries,storage,utilities}.mkf \
		port.mk postgres.mk $defaultrules \
		$accessdeps $commanddeps $executordeps $libdeps $maindeps \
		$parserdeps $plannerdeps $portdeps $rulesdeps $storagedeps \
		$tcopdeps $utilsdeps \
		| (cd ..; $MAKE $i)
		breaksw	
	endsw
end

if (! $?PARALLELMAKE) echo "done"
