WIDEPRINT =     rsh pequod enscript -rGf Courier5
#
#  This makefile is intended to help the build process.
#  Because of the changing nature of ph updates, it may not be
#  perfect, and may require tweaking from time to time
#
# Your raw materials should be:
#       s.tape.raw      the raw student tape
#       f.tape.raw      the raw staff tape
#       s.all.raw       list of all student id's
#       old.dir         the old .dir file
#       old.dov         the old .dov file
#
# Your finished products should be:
#       prod.{dir,dov,idx,iov,seq,bdx}  the new database!
#       sf.kill         the people who were deleted from the database
#
# Many intermediaries are used.
#
# IMPORTANT WARNING: Few UNIX utilities can adequately deal with large files
# of long lines.  I have had trouble with sort, awk, and grep in this regard.
# I suggest you stick to perl wherever possible.

# What sort program to use.
SORT=brute

# Directory binaries are stored in.  Only fill this in if the binaries are
# not in the search path.
B=

# Build the .bdx and .seq files from the nameserver index
prod.bdx: prod.idx
       ${B}build -s prod

# Build the inverted index.  This takes a long time, and needs a fast disk.
# It first creates an empty database, so it has empty indices to start with.
# Size should be a prime number > 6*#entries.
prod.idx: prod.dir scratch idx-size
       cd scratch; ${B}credb `cat ../idx-size` prod; mv prod.idx prod.iov ..; rm prod.*; cd ..
       ${B}makei prod

# Create a directory to make blank databases in
scratch:
       mkdir scratch

# Calculate the size of the needed index files
idx-size:       sf.new other.old
       sizedb prod.cnf sf.new other.old > idx-size

# Calculate the size of the needed database
db-size:        sf.new other.old
       echo `cat sf.new other.old | wc -l` " 5 * p" | dc | primes | head -1 > db-size

# This produces the main database, using maked on the concatenation of
# sf.new (the merged student, staff, and old data) and other.old (non-people
# data from the old database).  Size should be a prime =~ 5*number of entries.
prod.dir: sf.new other.old rejects.old db-size
       rm -rf prod.dir prod.dov
       ${B}credb `cat db-size` prod
       rm prod.idx prod.iov
       cat sf.new other.old | ${B}maked prod

# Pull non-people out of the old database, for reinsertion.
# The timetable is done separately, so we can filter out unwanted semesters.
# "pg" is grep rewritten in perl.
other.old: old.dir old.dov
       ${B}mdump other old > other.old
       ${B}mdump time old | pg -v "\t4:timetable       " | pg -v "\t4:timetable summer" >> other.old

# Entries not marked "other" or "person"
rejects.old: old.dir old.dov
       ${B}mdump rejects old > rejects.old

# Build sf.new, which is sf.prefrosh + freshman logins
sf.new: sf.prefrosh
       ${B}froshlog prod.cnf sf.new frosh.logins sf.prefrosh > frosh.problems

# Build sf.prefrosh, which is the data for all people in the database.
# This step runs phoneaddr to copy either the work or home phone & address
# into the default phone & address fields, and also makes sure the FERPA
# people get suppressed.
sf.prefrosh: sf.prephone s.suppress
       ${B}phoneaddr sf.prephone | perl s.suppress | ${B}addnickname prod.cnf > sf.prefrosh

# Build sf.prephone, which is data for all the people, but without the
# phone and address fields.
# This step uses aliasprepare and aliasassign to assign aliases to those
# people who don't have them.  aliasassign also needs to know about any
# aliases in other.old but only prints entries with type person.
sf.prephone:    sf.comb other.old
       ${B}aliasprepare prod.cnf < sf.comb |${SORT} > lop
       ${B}aliasprepare prod.cnf < other.old | pg -v '6:~~~~' |${SORT} > loper
       ${B}aliasassign prod.cnf loper lop > sf.prephone
       rm -f lop loper

# Build sf.comb, which is merged student, staff, and old data.
# This uses merge3, and takes quite some time.
# This step can remove old entries from the database, or not, as you wish.
sf.comb sf.kill: s.merge f.tape sf.old
       ${B}merge3 prod.cnf sf.old s.merge f.tape sf.comb sf.kill
#       if you don't want deletions, uncomment the following line
#       and comment out the one after
       cat sf.kill >> sf.comb
#       ${B}age prod.cnf sf.kill sf.kill.dead >> sf.comb

# Produce sf.old, the data about people from the old database.
sf.old: old.dir old.dov
       ${B}mdump people old | perl -p -e 's/\t11:incoming//;' | ${SORT} > sf.old

# s.suppress.raw is a list of the SSN's of the FERPA people.  The FERPA
# people are not in s.tape.raw, but their id's appear in s.tape.all, so
# we can generate the FERPA list by comparing the two files.
s.suppress.raw: s.tape.raw s.all.raw
       cat s.tape.raw s.all.raw | colrm 10 | sort | uniq -u > s.suppress.raw

# generate a perl script (s.suppress) to do the suppression of FERPA people.
# the script either adds or removes the suppress field, depending on whether
# or not the id is a FERPA id.
s.suppress: s.suppress.raw
       perl -p -e 's/.*/5:$$&\t/;' s.suppress.raw | \
       perl -e 'print "while(<>){\nif (0) {}\n";while(<>){chop;print "elsif (/^$$_/) {if (!/\t43:/){s/\$$/\t43:y/;}}\n";} print "print;\n}\n";' > s.suppress

# Unblock the raw student tape into maked format
s.tape: s.tape.raw
       ${B}s.unblock prod.cnf s.tape.raw | ${SORT} > s.tape

# Unblock frosh tape into maked format
h.tape: h.tape.raw
       ${B}h.unblock prod.cnf h.tape.raw > h.tape

# merge students and incoming frosh
s.merge: s.tape h.tape
       ${B}merge3 prod.cnf s.tape h.tape /dev/null s.frosh s.notfrosh
       cat s.frosh s.notfrosh | ${SORT} > s.merge

# Unblock the raw staff tape into maked format
f.tape: f.tape.raw
       ${B}f.unblock prod.cnf f.tape.raw | ${SORT} > f.tape

# copy over the old database, and fix byte order.  This is usually used only
# for testing; I normally do this by hand for real updates.
old.dov old.dir:
       echo "read testing, five minutes" |\
       rsh garcon cat \>/nameserv/db/prod.sta
       rcp garcon:/nameserv/db/prod.dir old.dir
       rcp garcon:/nameserv/db/prod.dov old.dov
       rsh garcon rm /nameserv/db/prod.sta
       ${B}border -dir -dov old