rsalz@bbn.com (Rich Salz) (10/15/88)
Submitted-by: lwall@jpl-devvax.jpl.nasa.gov (Larry Wall) Posting-number: Volume 16, Issue 34 Archive-name: dist2/part01 #! /bin/sh # Make a new directory for the dist sources, cd to it, and run kits 1 # thru 7 through sh. When all 7 kits have been run, read README. echo "This is dist 2.0 kit 1 (of 7). If kit 1 is complete, the line" echo '"'"End of kit 1 (of 7)"'" will echo at the end.' echo "" export PATH || (echo "You didn't use sh, you clunch." ; kill $$) mkdir kit mcon mcon/U pat 2>/dev/null echo Extracting mcon/README sed >mcon/README <<'!STUFFY!FUNK!' -e 's/X//' XHow to create a Configuration script: X X 1) Consult the Glossary and write your shell scripts and C programs X in terms of the symbols that metaconfig knows how to define. If X your Glossary is out of date you can rebuild it by saying make gloss. X X 2) Copy any .U files that you want to modify to your private U directory X in the current directory. Any .U files in your private U directory X will be used in preference to the standard one. One way to force X inclusion of any unit is to copy the End.U file to your .U directory X and add the name of the unit you want as a dependency on the end X of the ?MAKE: line. Certain units can ONLY be forced in this way, X namely those of the form Warn_*.U and Chk_*.U. You can also customize X certain default Configure variables by copying Myinit.U to your X package's private U directory and setting the variables in that. X For example, you can specify what types of void support your program X needs--see $defvoidused in voidflags.U. X X 3) If you have run metaconfig before in this directory, it created a X Wanted file. If you want to reuse this file, use the -w switch with X metaconfig, and it will skip the scan of your programs for symbols. X This is useful when you are developing a new unit file for metaconfig, X and the programs in question haven't really changed. If you HAVE X changed the symbols you refer to, do not use the -w switch, and X a new Wanted file will be created. Note that you can force inclusion X of a unit by adding its name to the Wanted file, but if you delete X the Wanted file you'll lose that info. X X 4) Say "metaconfig". This should eventually produce Configure. X XHow to add a new unit: X X 1) Copy a similar unit to a new .U file. The name you choose should X be the name of a variable generated by the unit. It should be 12 X or less characters to prevent filename chopping. Actually, it X should probably be 10 or less so that those who want to use RCS X can have a .U,v on the end without chopping. Metaconfig uses X the case of the first letter to determine if any variable is X actually produced by this unit, so don't Capitalize your unit X name if it is supposed to produce a shell variable variable. X X 2) Edit the new .U file to do what you want. The first ?MAKE: line X indicates the dependencies; list before the final colon all the X variables defined, and after the final colon all the variables (or X other units) on which this unit depends. It is very important that X these lists be accurate. IMPORTANT: The first symbol after ?MAKE: X *must* be the name of the file without the .U. X X 3) To the extent possible, parameterize your unit based on shell X variable defined on ?INIT: lines. This will move the variable X definitions up to the Init.U unit, where they can be overridden X by definitions in Myinit.U, which is included after Init.U. X X 4) Add the definition of any C symbols desired as ?H: lines. A line X beginning with ?H:?%1: in the .U file will be added to the eventual X config.h file if and only if metaconfig decides that the first symbol X on the ?MAKE: line is needed. The %1 stands for that first symbol, X which happens to be the name of the file too (without .U). Always put X a comment on each ?H: line in case one of the variable substitutions X earlier on the line starts a comment without finishing it. Any shell X variable starting with d_ may do this, so beware. X X 5) Add glossary definitions as ?S: lines for shell variables and ?C: X lines for C preprocessor variables. Entries are sorted by lines X that match /[a-zA-Z_]:/ (after the ?[CS]:), so start any continuation X lines with tabs (after the ?[CS]:). See a current unit for examples. X It is VERY important to start each entry with a left justified symbol X name, and end each entry with with a ?C:. or ?S:. line. The algorithm X that translates C preprocessor symbol entries for the Glossary into X comments for config.h depends on this. X X 6) Make sure the order of all your ? lines is right. The correct order is: X X ?RCS: and ?X: lines -- basically just comments X ?MAKE: lines -- metaconfig dependencies X ?C: and ?S: lines -- Glossary definitions X ?H: lines -- config.h definitions X X ?INIT: lines can go anywhere. X X 7) Rerun metaconfig. X X 8) Send unit to lwall@jpl-devvax.jpl.nasa.gov (Larry Wall) for inclusion X in the master copy, if you think it's of general interest. X XHow to add a new program to be located: X X 1) Edit Loc.U, and add the name of the program both to the ?MAKE: line X (between the two colons) and to either loclist or trylist (depending X on whether the program is mandatory or not). X X 2) Rerun metaconfig. X X 8) Send unit to lwall@jpl-devvax.jpl.nasa.gov (Larry Wall) for inclusion X in the master copy, if you think it's of general interest. X XNotes for writing .U files: X X Always use "rm -f" because there are systems where rm is interactive by X default. Files which need to be removed at the end of Configure X should be added to the rmlist variable. (rmlist="$rmlist tmpfile") X X Always use echo " " (with a space) because of Eunice systems. X X Use only programs that came with V7, so that you know everyone has X them. X X Use $contains when you want to grep conditionally, since not all X greps return a reasonable status. X X Use "if test" rather than "if [...]" since not every sh knows the X latter construct. X X Use the myread script for inputs so that they can do shell escapes X and default evaluation. The general form is X X case "$grimble" in X '') dflt=452;; X *) dflt="$grimble";; X esac X rp="How many grimbles do you have? [$dflt]" X echo $n "$rp $c" X . myread X grimble="$ans" X X Always try to determine whether a feature is present in the most X specific way--don't say "if bsd" when you can grep libc. There X are many hybrid systems out there, and each feature should stand X or fall by itself. X X When in doubt, set a default and ask. Don't assume anything. X X If you think the user is wrong, allow for the fact that he may be right. X For instance, he could be running Configure on a different system than X he is going to use the final product on. X XMetaconfig reserves the following names in your directory, and if you use such Xa name it may get clobbered or have other unforeseen effects: X X .MT/* X Configure X Wanted X UU/* X XAdditionally, Configure may clobber these names in the directory it is run in: X X UU/* X config.sh X config.h !STUFFY!FUNK! echo Extracting README sed >README <<'!STUFFY!FUNK!' -e 's/X//' X Dist Kit, Version 2.0 X X Copyright (c) 1988, Larry Wall X XYou may copy the dist kit in whole or in part as long as you don't try to Xmake money off it, or pretend that you wrote it. X-------------------------------------------------------------------------- X XPlease read all the directions below before you proceed any further, and Xthen follow them carefully. Failure to do so may void your warranty. :-) X XAfter you have unpacked your kit, you should have all the files listed Xin MANIFEST. Be sure to put everything in a place that is visible to Xeveryone who will be using this package, since there are files in various Xsubdirectories that are referenced. Somewhere in /usr/lib might be Xappropriate. X XInstallation X X1) Run Configure. This will figure out various things about your system. X Some things Configure will figure out for itself, other things it will X ask you about. It will then proceed to make config.h, config.sh, and X Makefile. X X You might possibly have to trim # comments from the front of Configure X if your sh doesn't handle them, but all other # comments will be taken X care of. X X3) make X X This will attempt to make various things. X X4) make install X X This will put several executables into a public directory. It will X also try to put the man pages in a reasonable place. X X5) Read the manual entries before running. X X6) IMPORTANT! Help save the world! Communicate any problems and X suggested patches to me, lwall@jpl-devvax.jpl.nasa.gov (Larry Wall), X so we can keep the world in sync. If you have a problem, there's X someone else out there who either has had or will have the same problem. X X If possible, send in patches such that the patch program will apply them. X Context diffs are the best, then normal diffs. Don't send ed scripts-- X I've probably changed my copy since the version you have. X X Watch for dist patches in comp.sources.bugs. If you are just now bringing X up dist and aren't sure how many patches there are, write to me and I'll X send any you don't have. In fact, I have an automatic patch sender--if X you read a current patch it will tell you how to get any old ones. X X------------------------------------------------------------------------ X XThe dist package consists of three parts: X X 1) The Configure generator (metaconfig) and its supporting files. X 2) The distribution kit maker (makedist) and its supporting files. X 3) The patch distribution system (pat*) and its supporting files. X XEach of these can be used separately from the others. Before you can use Xany of them, however, the directory containing your package (not this Xpackage) must be initialized by putting a .package file into it. This Xcan be done by running packinit in that directory. X X XNotes: X X If you are running on a system with <= 14 char filenames, don't X distribute any files with filenames longer than 11 chars (with the X exception of patchlevel.h), so that there will be room for a X 2-digit extension indicating patch number in your bugs direcory. X This includes .SH files, so any shell script built by a .SH file X should be 8 or less characters. On systems with flexfilenames you X don't have to worry about it. !STUFFY!FUNK! echo Extracting pat/README sed >pat/README <<'!STUFFY!FUNK!' -e 's/X//' XThis directory contains an automatic patch generator. You must have RCS Xto use this. You must also have run packinit in the top level directory Xof your package to create a .package file. X XWhen you've modified a file in your package, the pat program is used to Xcontrol the whole process. The other programs can be called by hand, but Xusually needn't be. Run pat from the top level directory of your package. X XThere is also program called mailagent that will read your incoming mail and Xmail patches to people automatically. You'll have to customize mailpatch Xfor yourself. X XThe pat, patcil, patdiff, and patbase programs take a list of filenames as Xarguments. Alternately, a -a means all files listed in MANIFEST.new. X XPatcil will create an RCS directory if necessary. However, it may not check in Xthings which require special initializaton properly. For example, if you Xwant to check in a shell script, you'd better make your RCS directory yourself Xand then say X X rcs -i -c'# ' blurfl.xsh X Xbefore running pat or patcil. Otherwise the RCS log may not be commented Xproperly. X XPatdiff will create a bugs directory in your top level directory, and will want Xto find a patchlevel.h file in that same directory. Everything is done from Xthat top level directory--don't put any patchlevel.h or bugs directories in Xyour subdirectories. Each subdirectory has its own RCS directory though. X XPatpost, patsend and patftp may be used to post to Usenet, mail to someone, Xor copy patches to your ftp directory. They take a destination and a list Xof patches to process. !STUFFY!FUNK! echo Extracting kit/README sed >kit/README <<'!STUFFY!FUNK!' -e 's/X//' XThis directory contains a rudimentary kit maker. Depending on where you Xare going to send your kits you might prefer to use Rich $alz's kit maker Xinstead--it makes more robust kits but assumes more about the target Xsystem. X XYou run makedist in the top level directory of your package and it uses Xthe MANIFEST.new file to generate shar scripts of about 50000 bytes each. X XMakedist takes no arguments (except a -v for verbose). Just make sure XMANIFEST.new contains everything you want, including any Configure, Xconfig.h.SH, or patchlevel.h files. A prototype patchlevel.h may be Xfound in ../pat/patchlevel.h !STUFFY!FUNK! echo Extracting Configure sed >Configure <<'!STUFFY!FUNK!' -e 's/X//' X#! /bin/sh X# X# If these # comments don't work, trim them. Don't worry about any other X# shell scripts, Configure will trim # comments from them for you. X# X# (If you are trying to port this package to a machine without sh, I would X# suggest you cut out the prototypical config.h from the end of Configure X# and edit it to reflect your system. Some packages may include samples X# of config.h for certain machines, so you might look for one of those.) X# X# $Header: Configure,v 2.0 88/06/28 23:11:40 lwall Locked $ X# X# Yes, you may rip this off to use in other distribution packages. X# (Note: this Configure script was generated automatically. Rather than X# working with this copy of Configure, you may wish to get metaconfig.) X X: sanity checks XPATH='.:/bin:/usr/bin:/usr/local/bin:/usr/ucb:/usr/local:/usr/lbin:/etc:/usr/new:/usr/new/bin:/usr/nbin' Xexport PATH || (echo "OOPS, this isn't sh. Desperation time. I will feed myself to sh."; sh $0; kill $$) X Xif test ! -t 0; then X echo "Say 'sh Configure', not 'sh <Configure'" X exit 1 Xfi X X(alias) >/dev/null 2>&1 && \ X echo "(I see you are using the Korn shell. Some ksh's blow up on Configure," && \ X echo "especially on exotic machines. If yours does, try the Bourne shell instead.)" X Xif test ! -d ../UU; then X if test ! -d UU; then X mkdir UU X fi X cd UU Xfi X Xcase "$1" in X-d) shift; fastread='yes';; Xesac X Xd_eunice='' Xeunicefix='' Xdefine='' Xloclist='' Xexpr='' Xsed='' Xecho='' Xcat='' Xrm='' Xmv='' Xcp='' Xtail='' Xtr='' Xmkdir='' Xsort='' Xuniq='' Xgrep='' Xtrylist='' Xtest='' Xinews='' Xegrep='' Xmore='' Xpg='' XMcc='' Xvi='' Xmailx='' Xmail='' Xcpp='' XLog='' XHeader='' Xbin='' Xcontains='' Xdefeditor='' Xhostname='' Xphostname='' Xmydomain='' Xlibc='' Xmansrc='' Xmanext='' Xn='' Xc='' Xnametype='' Xd_passnames='' Xd_berknames='' Xd_usgnames='' Xpasscat='' Xorgname='' Xpackage='' Xspitshell='' Xshsharp='' Xsharpbang='' Xstartsh='' XCONFIG='' X: set package name Xpackage=dist X Xecho " " Xecho "Beginning of configuration questions for $package kit." X: Eunice requires " " instead of "", can you believe it Xecho " " X Xdefine='define' Xundef='undef' Xlibpth='/usr/lib /usr/local/lib /lib' Xsmallmach='pdp11 i8086 z8000 i80286 iAPX286' Xrmlist='kit[1-9]isdone kit[1-9][0-9]isdone' Xtrap 'echo " "; rm -f $rmlist; exit 1' 1 2 3 X X: We must find out about Eunice early Xeunicefix=':' Xif test -f /etc/unixtovms; then X eunicefix=/etc/unixtovms Xfi Xif test -f /etc/unixtovms.exe; then X eunicefix=/etc/unixtovms.exe Xfi X Xattrlist="mc68000 sun gcos unix ibm gimpel interdata tss os mert pyr" Xattrlist="$attrlist vax pdp11 i8086 z8000 u3b2 u3b5 u3b20 u3b200" Xattrlist="$attrlist ns32000 ns16000 iAPX286 mc300 mc500 mc700 sparc" Xattrlist="$attrlist nsc32000 sinix xenix venix posix ansi M_XENIX" Xattrlist="$attrlist $mc68k __STDC__" Xpth="/usr/ucb /bin /usr/bin /usr/local /usr/local/bin /usr/lbin /etc /usr/lib /lib" Xd_newshome="../../NeWS" Xdefvoidused=7 X X: some greps do not return status, grrr. Xecho "grimblepritz" >grimble Xif grep blurfldyick grimble >/dev/null 2>&1 ; then X contains=contains Xelif grep grimblepritz grimble >/dev/null 2>&1 ; then X contains=grep Xelse X contains=contains Xfi Xrm -f grimble X: the following should work in any shell Xcase "$contains" in Xcontains*) X echo " " X echo "AGH! Grep doesn't return a status. Attempting remedial action." X cat >contains <<'EOSS' Xgrep "$1" "$2" >.greptmp && cat .greptmp && test -s .greptmp XEOSS Xchmod +x contains Xesac X X: first determine how to suppress newline on echo command Xecho "Checking echo to see how to suppress newlines..." X(echo "hi there\c" ; echo " ") >.echotmp Xif $contains c .echotmp >/dev/null 2>&1 ; then X echo "...using -n." X n='-n' X c='' Xelse X cat <<'EOM' X...using \c XEOM X n='' X c='\c' Xfi Xecho $n "Type carriage return to continue. Your cursor should be here-->$c" Xread ans Xrm -f .echotmp X X: now set up to do reads with possible shell escape and default assignment Xcat <<EOSC >myread Xcase "\$fastread" in Xyes) ans=''; echo " " ;; X*) ans='!';; Xesac Xwhile expr "X\$ans" : "X!" >/dev/null; do X read ans X case "\$ans" in X !) X sh X echo " " X echo $n "\$rp $c" X ;; X !*) X set \`expr "X\$ans" : "X!\(.*\)\$"\` X sh -c "\$*" X echo " " X echo $n "\$rp $c" X ;; X esac Xdone Xrp='Your answer:' Xcase "\$ans" in X'') ans="\$dflt";; Xesac XEOSC X X: general instructions Xcat <<EOH X XThis installation shell script will examine your system and ask you questions Xto determine how the $package package should be installed. If you get stuck Xon a question, you may use a ! shell escape to start a subshell or execute Xa command. Many of the questions will have default answers in square Xbrackets--typing carriage return will give you the default. X XOn some of the questions which ask for file or directory names you are Xallowed to use the ~name construct to specify the login directory belonging Xto "name", even if you don't have a shell which knows about that. Questions Xwhere this is allowed will be marked "(~name ok)". X XEOH Xrp="[Type carriage return to continue]" Xecho $n "$rp $c" X. myread Xcat <<EOH X XMuch effort has been expended to ensure that this shell script will run Xon any Unix system. If despite that it blows up on you, your best bet is Xto edit Configure and run it again. Also, let me (lwall@jpl-devvax.jpl.nasa.gov) Xknow how I blew it. If you can't run Configure for some reason, you'll have Xto generate a config.sh file by hand. X XThis installation script affects things in two ways: 1) it may do direct Xvariable substitutions on some of the files included in this kit, and X2) it builds a config.h file for inclusion in C programs. You may edit Xany of these files as the need arises after running this script. X XIf you make a mistake on a question, there is no easy way to back up to it Xcurrently. The easiest thing to do is to edit config.sh and rerun all the XSH files. Configure will offer to let you do this before it runs the SH files. X XEOH Xrp="[Type carriage return to continue]" Xecho $n "$rp $c" X. myread X X: get old answers, if there is a config file out there Xif test -f ../config.sh; then X echo " " X dflt=y X rp="I see a config.sh file. Did Configure make it on THIS system? [$dflt]" X echo $n "$rp $c" X . myread X case "$ans" in X n*) echo "OK, I'll ignore it.";; X *) echo "Fetching default answers from your old config.sh file..." X tmp="$n" X ans="$c" X . ../config.sh X n="$tmp" X c="$ans" X ;; X esac Xfi X X: find out where common programs are Xecho " " Xecho "Locating common programs..." Xcat <<EOSC >loc X$startsh Xcase \$# in X0) exit 1;; Xesac Xthing=\$1 Xshift Xdflt=\$1 Xshift Xfor dir in \$*; do X case "\$thing" in X .) X if test -d \$dir/\$thing; then X echo \$dir X exit 0 X fi X ;; X *) X if test -f \$dir/\$thing; then X echo \$dir/\$thing X exit 0 X elif test -f \$dir/\$thing.exe; then X : on Eunice apparently X echo \$dir/\$thing X exit 0 X fi X ;; X esac Xdone Xecho \$dflt Xexit 1 XEOSC Xchmod +x loc X$eunicefix loc Xloclist=" Xexpr Xsed Xecho Xcat Xrm Xgrep X" Xtrylist=" Xtest Xinews Xvi X" Xfor file in $loclist; do X xxx=`loc $file $file $pth` X eval $file=$xxx X eval _$file=$xxx X case "$xxx" in X /*) X echo $file is in $xxx. X ;; X *) X echo "I don't know where $file is. I hope it's in everyone's PATH." X ;; X esac Xdone Xecho " " Xecho "Don't worry if any of the following aren't found..." Xans=offhand Xfor file in $trylist; do X xxx=`loc $file $file $pth` X eval $file=$xxx X eval _$file=$xxx X case "$xxx" in X /*) X echo $file is in $xxx. X ;; X *) X echo "I don't see $file out there, $ans." X ans=either X ;; X esac Xdone Xcase "$egrep" in Xegrep) X echo "Substituting grep for egrep." X egrep=$grep X ;; Xesac Xcase "$test" in Xtest) X echo "Hopefully test is built into your sh." X ;; X/bin/test) X echo " " X dflt=n X rp="Is your "'"'"test"'"'" built into sh? [$dflt] (OK to guess)" X echo $n "$rp $c" X . myread X case "$ans" in X y*) test=test ;; X esac X ;; X*) X test=test X ;; Xesac Xcase "$echo" in Xecho) X echo "Hopefully echo is built into your sh." X ;; X/bin/echo) X echo " " X echo "Checking compatibility between /bin/echo and builtin echo (if any)..." X $echo $n "hi there$c" >foo1 X echo $n "hi there$c" >foo2 X if cmp foo1 foo2 >/dev/null 2>&1; then X echo "They are compatible. In fact, they may be identical." X else X case "$n" in X '-n') n='' c='\c' ans='\c' ;; X *) n='-n' c='' ans='-n' ;; X esac X cat <<FOO XThey are not compatible! You are probably running ksh on a non-USG system. XI'll have to use /bin/echo instead of the builtin, since Bourne shell doesn't Xhave echo built in and we may have to run some Bourne shell scripts. That Xmeans I'll have to use $ans to suppress newlines now. Life is ridiculous. X XFOO X rp="Your cursor should be here-->" X $echo $n "$rp$c" X . myread X fi X $rm -f foo1 foo2 X ;; X*) X : cross your fingers X echo=echo X ;; Xesac Xrmlist="$rmlist loc" X X: get list of predefined functions in a handy place Xecho " " Xif test -f /lib/libc.a; then X echo "Your C library is in /lib/libc.a. You're normal." X libc=/lib/libc.a Xelse X ans=`loc libc.a blurfl/dyick $libpth` X if test ! -f $ans; then X ans=`loc clib blurfl/dyick $libpth` X fi X if test ! -f $ans; then X ans=`loc libc blurfl/dyick $libpth` X fi X if test -f $ans; then X echo "Your C library is in $ans, of all places." X libc=$ans X else X if test -f "$libc"; then X echo "Your C library is in $libc, like you said before." X else X cat <<EOM X XI can't seem to find your C library. I've looked in the following places: X X $libpth X XNone of these seems to contain your C library. What is the full name XEOM X dflt=None X $echo $n "of your C library? $c" X rp='C library full name?' X . myread X libc="$ans" X fi X fi Xfi Xecho " " X$echo $n "Extracting names from $libc for later perusal...$c" Xnm $libc 2>/dev/null | sed -n -e 's/^.* T _//p' -e 's/^.* T //p' > libc.list Xif $contains '^printf$' libc.list >/dev/null 2>&1; then X echo "done" Xelse X nm $libc 2>/dev/null | sed -n -e 's/^.* D _//p' -e 's/^.* D //p' > libc.list X if $contains '^printf$' libc.list >/dev/null 2>&1; then X echo "done" X else X echo " " X echo "nm didn't seem to work right." X echo "Trying ar instead..." X rmlist="$rmlist libc.tmp" X if ar t $libc > libc.tmp; then X sed -e 's/\.o$//' < libc.tmp > libc.list X echo "Ok." X else X echo "ar didn't seem to work right." X echo "Maybe this is a Cray...trying bld instead..." X if bld t $libc | sed -e 's/.*\///' -e 's/\.o:.*$//' > libc.list; then X echo "Ok." X else X echo "That didn't work either. Giving up." X exit 1 X fi X fi X fi Xfi Xrmlist="$rmlist libc.list" X X: make some quick guesses about what we are up against Xecho " " X$echo $n "Hmm... $c" Xif $contains SIGTSTP /usr/include/signal.h >/dev/null 2>&1 ; then X echo "Looks kind of like a BSD system, but we'll see..." X echo exit 0 >bsd X echo exit 1 >usg X echo exit 1 >v7 Xelif $contains '^fcntl$' libc.list >/dev/null 2>&1 ; then X echo "Looks kind of like a USG system, but we'll see..." X echo exit 1 >bsd X echo exit 0 >usg X echo exit 1 >v7 Xelse X echo "Looks kind of like a version 7 system, but we'll see..." X echo exit 1 >bsd X echo exit 1 >usg X echo exit 0 >v7 Xfi Xif $contains '^vmssystem$' libc.list >/dev/null 2>&1 ; then X cat <<'EOI' XThere is, however, a strange, musty smell in the air that reminds me of Xsomething...hmm...yes...I've got it...there's a VMS nearby, or I'm a Blit. XEOI X echo "exit 0" >eunice X eunicefix=unixtovms X d_eunice="$define" X: it so happens the Eunice I know will not run shell scripts in Unix format Xelse X echo " " X echo "Congratulations. You aren't running Eunice." X eunicefix=':' X d_eunice="$undef" X echo "exit 1" >eunice Xfi Xif test -f /xenix; then X echo "Actually, this looks more like a XENIX system..." X echo "exit 0" >xenix Xelse X echo " " X echo "It's not Xenix..." X echo "exit 1" >xenix Xfi Xchmod +x xenix X$eunicefix xenix Xif test -f /venix; then X echo "Actually, this looks more like a VENIX system..." X echo "exit 0" >venix Xelse X echo " " X if xenix; then X : null X else X echo "Nor is it Venix..." X fi X echo "exit 1" >venix Xfi Xchmod +x bsd usg v7 eunice venix X$eunicefix bsd usg v7 eunice venix Xrmlist="$rmlist bsd usg v7 eunice venix xenix" X X: see if sh knows # comments Xecho " " Xecho "Checking your sh to see if it knows about # comments..." Xif sh -c '#' >/dev/null 2>&1 ; then X echo "Your sh handles # comments correctly." X shsharp=true X spitshell=cat X echo " " X echo "Okay, let's see if #! works on this system..." X echo "#!/bin/echo hi" > try X $eunicefix try X chmod +x try X try > today X if $contains hi today >/dev/null 2>&1; then X echo "It does." X sharpbang='#!' X else X echo "#! /bin/echo hi" > try X $eunicefix try X chmod +x try X try > today X if test -s today; then X echo "It does." X sharpbang='#! ' X else X echo "It doesn't." X sharpbang=': use ' X fi X fi Xelse X echo "Your sh doesn't grok # comments--I will strip them later on." X shsharp=false X echo "exec grep -v '^#'" >spitshell X chmod +x spitshell X $eunicefix spitshell X spitshell=`pwd`/spitshell X echo "I presume that if # doesn't work, #! won't work either!" X sharpbang=': use ' Xfi X X: figure out how to guarantee sh startup Xecho " " Xecho "Checking out how to guarantee sh startup..." Xstartsh=$sharpbang'/bin/sh' Xecho "Let's see if '$startsh' works..." Xcat >try <<EOSS X$startsh Xset abc Xtest "$?abc" != 1 XEOSS X Xchmod +x try X$eunicefix try Xif try; then X echo "Yup, it does." Xelse X echo "Nope. You may have to fix up the shell scripts to make sure sh runs them." Xfi Xrm -f try today X X: preserve RCS keywords in files with variable substitution, grrr XLog='$Log' XHeader='$Header' X X: set up shell script to do ~ expansion Xcat >filexp <<EOSS X$startsh X: expand filename Xcase "\$1" in X ~/*|~) X echo \$1 | $sed "s|~|\${HOME-\$LOGDIR}|" X ;; X ~*) X if $test -f /bin/csh; then X /bin/csh -f -c "glob \$1" X echo "" X else X name=\`$expr x\$1 : '..\([^/]*\)'\` X dir=\`$sed -n -e "/^\${name}:/{s/^[^:]*:[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\).*"'\$'"/\1/" -e p -e q -e '}' </etc/passwd\` X if $test ! -d "\$dir"; then X me=\`basename \$0\` X echo "\$me: can't locate home directory for: \$name" >&2 X exit 1 X fi X case "\$1" in X */*) X echo \$dir/\`$expr x\$1 : '..[^/]*/\(.*\)'\` X ;; X *) X echo \$dir X ;; X esac X fi X ;; X*) X echo \$1 X ;; Xesac XEOSS Xchmod +x filexp X$eunicefix filexp X X: determine where public executables go Xcase "$bin" in X'') X dflt=`loc . /bin /usr/local/bin /usr/lbin /usr/local /usr/bin` X ;; X*) dflt="$bin" X ;; Xesac Xcont=true Xwhile $test "$cont" ; do X echo " " X rp="Where do you want to put the public executables? [$dflt]" X $echo $n "$rp $c" X . myread X bin="$ans" X bin=`filexp $bin` X if test -d $bin; then X cont='' X else X dflt=n X rp="Directory $bin doesn't exist. Use that name anyway? [$dflt]" X $echo $n "$rp $c" X . myread X dflt='' X case "$ans" in X y*) cont='';; X esac X fi Xdone X X: determine default editor Xcase "$defeditor" in X'') X case "$_vi" in X */*) dflt="$_vi";; X *) dflt=/usr/ucb/vi;; X esac X ;; X*) dflt="$defeditor" X ;; Xesac Xcont=true Xwhile $test "$cont" ; do X echo " " X rp="What is the default editor on your system? [$dflt]" X $echo $n "$rp $c" X . myread X defeditor="$ans" X if test -f $ans; then X cont='' X else X dflt=n X rp="File $ans doesn't exist. Use that name anyway? [$dflt]" X $echo $n "$rp $c" X . myread X dflt='' X case "$ans" in X y*) cont='';; X esac X fi Xdone X X: now get the host name Xecho " " Xecho "Figuring out host name..." Xecho 'Maybe "hostname" will work...' Xif ans=`sh -c hostname 2>&1` ; then X hostname=$ans X phostname=hostname Xelse X echo 'Oh, dear. Maybe "/etc/systemid" is the key...' X if ans=`cat /etc/systemid 2>&1` ; then X hostname=$ans X phostname='cat /etc/systemid' X if xenix; then X echo "Whadyaknow. Xenix always was a bit strange..." X else X echo "What is a non-Xenix system doing with /etc/systemid?" X fi X else X echo 'No, maybe "uuname -l" will work...' X if ans=`sh -c 'uuname -l' 2>&1` ; then X hostname=$ans X phostname='uuname -l' X else X echo 'Strange. Maybe "uname -n" will work...' X if ans=`sh -c 'uname -n' 2>&1` ; then X hostname=$ans X phostname='uname -n' X else X echo 'Oh well, maybe I can mine it out of whoami.h...' X if ans=`sh -c $contains' sysname /usr/include/whoami.h' 2>&1` ; then X hostname=`echo "$ans" | $sed 's/^.*"\(.*\)"/\1/'` X phostname="sed -n -e '"'/sysname/s/^.*\"\\(.*\\)\"/\1/{'"' -e p -e q -e '}' </usr/include/whoami.h" X else X case "$hostname" in X '') echo "Does this machine have an identity crisis or something?" X phostname='' X ;; X *) echo "Well, you said $hostname before...";; X esac X fi X fi X fi X fi Xfi X: you do not want to know about this Xset $hostname Xhostname=$1 X X: translate upper to lower if necessary Xcase "$hostname" in X *[A-Z]*) X hostname=`echo $hostname | tr '[A-Z]' '[a-z]'` X echo "(Normalizing case in your host name)" X ;; Xesac X X: verify guess Xif $test "$hostname" ; then X dflt=y X echo 'Your host name appears to be "'$hostname'".' X $echo $n "Is this correct? [$dflt] $c" X rp="Sitename is $hostname? [$dflt]" X . myread X case "$ans" in X y*) ;; X *) hostname='' ;; X esac Xfi X X: bad guess or no guess Xwhile $test "X$hostname" = X ; do X dflt='' X rp="Please type the (one word) name of your host:" X $echo $n "$rp $c" X . myread X hostname="$ans" Xdone X Xecho " " Xcase "$hostname" in X*.*) X dflt=`expr "X$hostname" : "X[^.]*\(\..*\)"` X hostname=`expr "X$hostname" : "X\([^.]*\)\."` X echo "(Trimming domain name from host name--host name is now $hostname)" X ;; X*) X dflt='.uucp' X ;; Xesac Xrp="What is your domain name? [$dflt]" X$echo $n "$rp $c" X. myread Xcase "$ans" in X'') ;; X.*) ;; X*) ans=".$ans";; Xesac Xmydomain="$ans" X X: a little sanity check here Xcase "$phostname" in X'') ;; X*) case `$phostname` in X $hostname$mydomain|$hostname) ;; X *) X case "$phostname" in X sed*) X echo "(That doesn't agree with your whoami.h file, by the way.)" X ;; X *) X echo "(That doesn't agree with your $phostname command, by the way.)" X ;; X esac X phostname='' X ;; X esac X ;; Xesac X X: determine where manual pages go Xcase "$mansrc" in X'') X dflt=`loc . /usr/man/man1 /usr/man/mann /usr/man/local/man1 /usr/man/u_man/man1 /usr/man/man1` X ;; X*) dflt="$mansrc" X ;; Xesac Xcont=true Xwhile $test "$cont" ; do X echo " " X rp="Where do the manual pages (source) go? [$dflt]" X $echo $n "$rp $c" X . myread X mansrc=`filexp "$ans"` X if test -d $mansrc; then X cont='' X else X dflt=n X rp="Directory $mansrc doesn't exist. Use that name anyway? [$dflt]" X $echo $n "$rp $c" X . myread X dflt='' X case "$ans" in X y*) cont='';; X esac X fi Xdone Xcase "$mansrc" in X*l) X manext=l X ;; X*n) X manext=n X ;; X*C) X manext=C X ;; X*) X manext=1 X ;; Xesac X X: find out how to find out full name Xecho " " Xcase "$d_berknames" in X"$define") X dflt=y;; X"$undef") X dflt=n;; X*) X if bsd; then X dflt=y X else X dflt=n X fi X ;; Xesac Xecho "Does your /etc/passwd file keep full names in Berkeley/V7 format (name first" X$echo $n "thing after ':' in GCOS field)? [$dflt] $c" Xrp="Berkeley/V7 format full name? [$dflt]" X. myread Xcase "$ans" in X y*) X d_passnames="$define" X d_berknames="$define" X d_usgnames="$undef" X nametype=bsd X ;; X *) X echo " " X case "$d_usgnames" in X "$define") X dflt=y;; X "$undef") X dflt=n;; X *) X if usg; then X dflt=y X else X dflt=n X fi X ;; X esac X echo "Does your passwd file keep full names in USG format (name sandwiched" X $echo $n "between a '-' and a '(')? [$dflt] $c" X rp="USG format full name? [$dflt]" X . myread X case "$ans" in X n*) X echo "Full name will be taken from ~/.fullname" X d_passnames="$undef" X d_berknames="$undef" X d_usgnames="$undef" X nametype=other X ;; X *) X d_passnames="$define" X d_berknames="$undef" X d_usgnames="$define" X nametype=usg X ;; X esac X ;; Xesac X X: see if we have to deal with yellow pages Xif $test -d /usr/etc/yp; then X if $contains '^\+:' /etc/passwd; then X dflt=y X else X dflt=n X fi X rp="Are you getting the passwd file via yellow pages? [$dflt]" X $echo $n "$rp $c" X . myread X case "$ans" in X y*) passcat='ypcat passwd';; X *) passcat='cat /etc/passwd';; X esac Xelse X passcat='cat /etc/passwd' Xfi X X: get organizaton name Xlongshots='/usr/src/new /usr/src/local /usr/local/src' Xcase "$orgname" in X'') if xxx=`loc news/src/defs.h x $longshots`; then X dflt=`$sed -n 's/^.*MYORG[ ]*"\(.*\)".*$/\1/p' $xxx` X else X dflt='no default' X fi X ;; X*) dflt="$orgname";; Xesac X$cat << 'EOH' X XPlease type the name of your organization as you want it to appear on the XOrganization line of outgoing articles. (It's nice if this also specifies Xyour location. Your city name is probably sufficient if well known.) XFor example: X X University of Southern North Dakota, Hoople X XYou may also put the name of a file, as long as it begins with a slash. XFor example: X X /etc/organization X XEOH Xorgname="no default" Xwhile test "X$orgname" = "Xno default"; do X rp="Organization: [$dflt]" X $echo $n "$rp $c" X . myread X orgname="$ans" Xdone X Xecho " " Xecho "End of configuration questions." Xecho " " X X: create config.sh file Xecho " " Xif test -d ../UU; then X cd .. Xfi Xecho "Creating config.sh..." X$spitshell <<EOT >config.sh X$startsh X# config.sh X# This file was produced by running the Configure script. X Xd_eunice='$d_eunice' Xeunicefix='$eunicefix' Xdefine='$define' Xloclist='$loclist' Xexpr='$expr' Xsed='$sed' Xecho='$echo' Xcat='$cat' Xrm='$rm' Xmv='$mv' Xcp='$cp' Xtail='$tail' Xtr='$tr' Xmkdir='$mkdir' Xsort='$sort' Xuniq='$uniq' Xgrep='$grep' Xtrylist='$trylist' Xtest='$test' Xinews='$inews' Xegrep='$egrep' Xmore='$more' Xpg='$pg' XMcc='$Mcc' Xvi='$vi' Xmailx='$mailx' Xmail='$mail' Xcpp='$cpp' XLog='$Log' XHeader='$Header' Xbin='$bin' Xcontains='$contains' Xdefeditor='$defeditor' Xhostname='$hostname' Xphostname='$phostname' Xmydomain='$mydomain' Xlibc='$libc' Xmansrc='$mansrc' Xmanext='$manext' Xn='$n' Xc='$c' Xnametype='$nametype' Xd_passnames='$d_passnames' Xd_berknames='$d_berknames' Xd_usgnames='$d_usgnames' Xpasscat='$passcat' Xorgname='$orgname' Xpackage='$package' Xspitshell='$spitshell' Xshsharp='$shsharp' Xsharpbang='$sharpbang' Xstartsh='$startsh' XCONFIG=true XEOT X XCONFIG=true X Xecho " " Xdflt='' Xfastread='' Xecho "If you didn't make any mistakes, then just type a carriage return here." Xrp="If you need to edit config.sh, do it as a shell escape here:" X$echo $n "$rp $c" X. UU/myread Xcase "$ans" in X'') ;; X*) : in case they cannot read X eval $ans;; Xesac X. ./config.sh X Xecho " " Xecho "Doing variable substitutions on .SH files..." Xset x `awk '{print $1}' <MANIFEST | $grep '\.SH'` Xshift Xcase $# in X0) set x *.SH; shift;; Xesac Xif test ! -f $1; then X shift Xfi Xfor file in $*; do X case "$file" in X */*) X dir=`$expr X$file : 'X\(.*\)/'` X file=`$expr X$file : 'X.*/\(.*\)'` X (cd $dir && . $file) X ;; X *) X . $file X ;; X esac Xdone Xif test -f config.h.SH; then X if test ! -f config.h; then X : oops, they left it out of MANIFEST, probably, so do it anyway. X . config.h.SH X fi Xfi X Xif $contains '^depend:' Makefile >/dev/null 2>&1; then X dflt=n X $cat <<EOM X XNow you need to generate make dependencies by running "make depend". XYou might prefer to run it in background: "make depend > makedepend.out &" XIt can take a while, so you might not want to run it right now. X XEOM X rp="Run make depend now? [$dflt]" X $echo $n "$rp $c" X . UU/myread X case "$ans" in X y*) make depend X echo "Now you must run a make." X ;; X *) echo "You must run 'make depend' then 'make'." X ;; X esac Xelif test -f Makefile; then X echo " " X echo "Now you must run a make." Xelse X echo "Done." Xfi X X$rm -f kit*isdone X: the following is currently useless Xcd UU && $rm -f $rmlist X: since this removes it all anyway Xcd .. && $rm -rf UU X: end of Configure !STUFFY!FUNK! echo Extracting mcon/metaconfig.SH sed >mcon/metaconfig.SH <<'!STUFFY!FUNK!' -e 's/X//' Xcase $CONFIG in X'') X if test ! -f config.sh; then X ln ../config.sh . || \ X ln ../../config.sh . || \ X ln ../../../config.sh . || \ X (echo "Can't find config.sh."; exit 1) X echo "Using config.sh from above..." X fi X . ./config.sh X ;; Xesac X: This forces SH files to create target in same directory as SH file. X: This is so that make depend always knows where to find SH derivatives. Xcase "$0" in X*/*) cd `expr X$0 : 'X\(.*\)/'` ;; Xesac Xecho "Extracting metaconfig (with variable substitutions)" Xcat >metaconfig <<!GROK!THIS! X#!/usr/bin/perl X eval "exec /usr/bin/perl -S \$0 \$*" X if \$running_under_some_shell; X X# $Header: metaconfig.SH,v 2.0 88/06/28 23:18:46 lwall Locked $ X# X# $Log: metaconfig.SH,v $ X# Revision 2.0 88/06/28 23:18:46 lwall X# Baseline. X# X X\$MC='`pwd`'; X!GROK!THIS! X X: in the following dollars and backticks do not need the extra backslash X$spitshell >>metaconfig <<'!NO!SUBS!' X$ENV{'MC'} = $MC; Xchop($WD=`pwd`); X$ENV{'WD'} = $WD; X Xdo 'getopt.pl'; Xdo Getopt(""); X X++$opt_v if $opt_V; X Xunlink 'Wanted' unless $opt_w; X X$NEWMANI = 'MANIFEST.new'; X$MANI = 'MANIFEST'; X Xdo readpackage(); X X$ENV{'package'} = $package; X X`mkdir .MT 2>&1` unless -d '.MT'; X Xprint "Locating units...\n" if $opt_v; Xif (-d 'U') { X chdir 'U'; X foreach $file (<*.U>) { X push(@myUlist,"$WD/U/$file"); X $myUseen{$file} = 1; X } X chdir '..'; X} X Xchdir "$MC/U" || die "Can't find $MC/U.\n"; Xforeach $file (<*.U>) { X if ($myUseen{$file}) { X print " Your private U/$file overrides the public one.\n" if $opt_v; X } X else { X push(@ARGV,$file); X } X} Xpush(@ARGV,@myUlist); X Xif ($opt_V) { X print "\t"; X $, = "\n\t"; X print @ARGV; X $, = ''; X print "\n"; X} X Xprint "Extracting dependency lists from units...\n" if $opt_v; X$dependencies = ' ' x 10000; # pre-extend X$dependencies = ''; Xopen(INIT,">$WD/.MT/.Init.U") || die "Can't create $WD/.MT/.Init.U\n"; Xopen(CONF_H,">$WD/.MT/.Config_h.U") || die "Can't create $WD/.MT/.Config_h.U\n"; Xline: while (<>) { X if (/^\?MAKE:[\w ]*:/) { X s|^\?MAKE:\s*||; X $dependencies .= $_; X chop; X s/:.*//; X @ary = split(' '); X $hold = join(' ',@ary); X $unit = $ary[0]; X foreach $sym (@ary) { X if ($sym =~ /^([a-z]|Mcc|Log|Header)/) { X $shmaster{"\$$sym"} = '#'; X push(@Master,"?$unit:$sym=''\n"); X } X } X next line; X } X if (/^\?C:/) { X s|^\?C:([A-Za-z_])|?H:?%1:/* $1|; X s|^\?C:\.\s*$|?H:?%1: */\n|; X s|^\?C:(.*)|?H:?%1: *$1|; X } X s/%\*/$hold/; X s/%1/$unit/; X $dependencies .= $_ if s|^\?MAKE:||; X print INIT if s|^\?INIT:||; X print CONF_H if s|^\?H:||; X} Xprint $dependencies if $opt_V; Xprint CONF_H "!GROK!THIS!\n"; Xclose DEP; Xclose INIT; Xclose CONF_H; Xclose MASTER; X Xchdir $WD; X Xunless (-f 'Wanted') { X print "Building a Wanted file...\n" if $opt_v; X open(WANTED,"| sort | uniq >Wanted") || die "Can't create Wanted.\n"; X unless (-f $NEWMANI) { X do manifake(); X die "No $NEWMANI--can't build a Wanted file.\n" unless -f $NEWMANI; X } X X print " Extracting filenames (*.[chy] and *.SH) from $NEWMANI...\n" X if $opt_v; X open(NEWMANI,$NEWMANI) || die "Can't open $NEWMANI"; X while (<NEWMANI>) { X ($file) = split(' '); X next if $file eq 'config.h.SH'; X push(@SHlist,$file) if $file =~ /\.SH$/; X push(@clist,$file) if $file =~ /\.[chy]$/; X } X X print " Extracting symbols from Config_h.U...\n" if $opt_v; X if (-f 'U/Config_h.U') { X @ARGV = ('U/Config_h.U', '.MT/.Config_h.U'); X } X else { X @ARGV = ("$MC/U/Config_h.U", '.MT/.Config_h.U'); X } X while (<>) { X next unless /^\?\w*:#.*\$/; X s|^[^#]*#||; X if (s|^\$(\w+)\s*(\w+).*\$(\w+).*$|$2 $1\n$2 $3|) { X $cmaster{$2} = '#'; X $cwanted{$2} = "$1\n$3"; X } X elsif (s|^\$(\w+)\s*(\w+).*$|$2 $1|) { X $cmaster{$2} = '#'; X $cwanted{$2} = $1; X } X elsif (s|^define\s*(\w+).*\$(\w+).*$|$1 $2|) { X $cmaster{$1} = '#'; X $cwanted{$1} = $2; X } X } X X # Now we are a little clever, and build a loop to eval so that we don't X # have to recompile our patterns on every file. We also use "study" since X # we are searching the same string for many different things. Hauls! X X unless ($#clist < 0) { X print " Scanning .c and .h files for symbols...\n" if $opt_v; X $search = "while (<>) {study;\n"; # init loop over ARGV X foreach $key (keys(cmaster)) { X $search .= "\$cmaster{'$key'}++ if /\\b$key\\b/;\n"; X } X $search .= "}\n"; # terminate loop X @ARGV = @clist; X $/ = "\001"; # swallow each file whole (delete if memory is limited) X eval $search; X $/ = "\n"; X while (($key,$value) = each(cmaster)) { X if ($value ne '#') { X print WANTED $cwanted{$key}, "\n"; X } X } X } X X print " Scanning .SH files for symbols...\n" if $opt_v; X close WANTED; X open(WANTED,"| sort | uniq >>Wanted") || die "Can't create Wanted.\n"; X $search = "while (<>) {study;\n"; X foreach $key (keys(shmaster)) { X $search .= "\$shmaster{'$key'}++ if /\\$key\\b/;\n"; X } X $search .= "}\n"; X @ARGV = @SHlist; X $/ = "\001"; # (delete if memory is limited) X eval $search; X $/ = "\n"; X# while (<>) { X# @ary = split(/[^\w\$]+/); X# for (@ary) { X# $shmaster{$_}++ if $shmaster{$_}; # assuming most don't match X# } X# } X while (($key,$value) = each(shmaster)) { X if ($value ne '#') { X $key =~ s/^\$//; X print WANTED $key, "\n"; X } X } X} Xclose WANTED; X Xdie "No desirable symbols found--aborting.\n" unless -s 'Wanted'; X Xprint "Building private make file...\n" if $opt_v; X$/ = "\001"; # change record separtor to nonexistent char Xopen(WANTED,"Wanted") || die "Can't reopen Wanted.\n"; X$_ = <WANTED>; # slurp whole file; X$/ = "\n"; Xy/\n/ /; Xopen(MAKEFILE,">.MT/.Makefile") || die "Can't create .MT/.Makefile.\n"; Xprint MAKEFILE "W = $_\n"; Xprint MAKEFILE $dependencies; Xclose MAKEFILE; X Xprint "Determining the correct order for the units...\n" if $opt_v; Xchdir '.MT' || die "Can't chdir to .MT"; Xopen(MAKE, "make -n -f .Makefile|") || die "Can't run make"; Xwhile (<MAKE>) { X print "\t$_" if $opt_V; X if (/^pick/) { X ($pick,$cmd,$symbol,$unit) = split(' '); X $symwanted{$symbol}++; X unless ($unitseen{$unit}++) { X push(@cmdwanted,"$cmd $unit"); X $symwanted{$unit}++; X } X } X else { X chop; X system; X } X} Xclose MAKE; X Xprint "Creating Configure...\n" if $opt_v; Xopen(CONFIGURE,">$WD/Configure") || die "Can't create Configure.\n"; Xopen(CONF_H,">$WD/config.h.SH") || die "Can't create config.h.SH.\n"; Xfor (@cmdwanted) { X ($cmd,$unit) = split; X $dir = ($myUseen{$unit} ? $WD : $MC); X $unit .= '.U'; X if (m|/|) { X $file = $unit; # they must know what they're doing X } X elsif ($myUseen{$unit}) { X $file = "$WD/U/$unit"; # they MIGHT know what they're doing X } X else { X $file = "$MC/U/$unit"; # normal case X } X die "Can't open $file" unless open(UNIT,$file); X print "\t$cmd $file\n" if $opt_V; X if ($cmd eq 'add') { X while (<UNIT>) { X print CONFIGURE unless /^\?/; X } X } X elsif ($cmd eq 'weed') { X while (<UNIT>) { X if (/^\?(\w+):/) { X s/^\?\w+:// if $symwanted{$1}; X } X print CONFIGURE unless /^\?/; X } X } X elsif ($cmd eq 'add.package') { X while (<UNIT>) { X s/PACKAGENAME/$package/g; X print CONFIGURE unless /^\?/; X } X } X elsif ($cmd eq 'add.Null') { X for (@Master) { X if (/^\?(\w+):/) { X s/^\?\w+:// if $symwanted{$1}; X } X print CONFIGURE unless /^\?/; X } X while (<UNIT>) { X print CONFIGURE unless /^\?/; X } X print CONFIGURE "CONFIG=''\n"; X } X elsif ($cmd eq 'add.Config_sh') { X while (<UNIT>) { X print CONFIGURE unless /^\?/; X } X for (@Master) { X if (/^\?(\w+):/) { X s/^\?\w+:// if $symwanted{$1}; X } X s/^(\w+)=''/$1='\$$1'/; X print CONFIGURE unless /^\?/; X } X print CONFIGURE "CONFIG=true\nEOT\n\n"; X } X elsif ($cmd eq 'c_h_weed') { X while (<UNIT>) { X if (/^\?(\w+):/) { X s/^\?\w+:// if $symwanted{$1}; X } X print CONF_H unless /^\?/; X } X } X else { X die "Unrecognized command from .Makefile: $cmd\n"; X } X close UNIT; X} Xclose CONFIGURE; Xclose CONF_H; X Xchdir $WD || die "Can't cd back to $WD\n"; X`chmod +x Configure`; X Xif (-f 'config.h.SH') { X open(NEWMANI,$NEWMANI); X $/ = "\001"; X $_ = <NEWMANI>; X $/ = "\n"; X close NEWMANI; X unless (/config\.h\.SH/) { X print "Adding config.h.SH to your $NEWMANI file...\n" if $opt_v; X `echo "config.h.SH Produces config.h." >>$NEWMANI`; X } X} Xif ($opt_V) { X print "Leaving subdirectory .MT unremoved so you can peruse it.\n"; X} Xelse { X `rm -rf .MT 2>&1`; X} Xprint "Done.\n" if $opt_v; X Xsub readpackage { X if (! -f '.package') { X if (-f '../.package' || -f '../../.package') { X die "Run in top level directory only.\n"; X } X else { X die "No .package file! Run packinit.\n"; X } X } X open(package,'.package'); X while (<package>) { X next if /^:/; X next if /^#/; X if (($var,$val) = /^\s*(\w+)=(.*)/) { X $val = "\"$val\"" unless $val =~ /^['"]/; X eval "\$$var = $val;"; X } X } X close package; X} X Xsub manifake { X # make MANIFEST and MANIFEST.new say the same thing X if (! -f $NEWMANI) { X if (-f $MANI) { X open(IN,$MANI) || die "Can't open $MANI"; X open(OUT,">$NEWMANI") || die "Can't create $NEWMANI"; X while (<IN>) { X next if 1 .. /---/; X s/(\s+)[0-9]*\s*/$1/; X } X close IN; close OUT; X } X else { Xdie "You need to make a MANIFEST.new file, with names and descriptions.\n"; X } X } X} X!NO!SUBS! Xchmod +x metaconfig X$eunicefix metaconfig !STUFFY!FUNK! echo Extracting mcon/U/mailfile.U sed >mcon/U/mailfile.U <<'!STUFFY!FUNK!' -e 's/X//' X?RCS:$Header: mailfile.U,v 2.0 88/06/28 23:17:09 lwall Locked $ X?RCS: $Log: mailfile.U,v $ X?RCS: Revision 2.0 88/06/28 23:17:09 lwall X?RCS: Baseline. X?RCS: X?MAKE:mailfile: test echo n c Myread Loc Filexp Oldconfig X?MAKE: -pick add $@ %* X?S:mailfile: X?S: This variable contains the eventual value of the MAILFILE symbol, X?S: which contains an interpretable name of the mail spool file for the X?S: current user. X?S:. X?C:MAILFILE: X?C: This symbol contains the interpretable name of the mail spool file X?C: for the current user. The program must be prepared to substitute X?C: the HOME directory for %~, and the login id for %L. X?C:. X?H:?%1:#define MAILFILE "$mailfile" /**/ X?H:?%1: X: determine where mail is spooled Xcase "$mailfile" in X'') X dflt=`loc . XXX /usr/spool/mail /usr/mail` X case "$dflt" in X XXX) dflt='%~/mailbox';; X *) dflt="$dflt/%L";; X esac X ;; X*) dflt="$mailfile" X ;; Xesac Xcat <<'EOM' X XIn the following question, you may use %~ to represent the user's home Xdirectory, and %L to represent a users name. X XEOM Xrp="Where is yet-to-be-read mail spooled? [$dflt]" X$echo $n "$rp $c" X. myread Xmailfile=`filexp "$ans"` X !STUFFY!FUNK! echo "" echo "End of kit 1 (of 7)" cat /dev/null >kit1isdone run='' config='' for iskit in 1 2 3 4 5 6 7; do if test -f kit${iskit}isdone; then run="$run $iskit" else todo="$todo $iskit" fi done case $todo in '') echo "You have run all your kits. Please read README and then type Configure." chmod 755 Configure ;; *) echo "You have run$run." echo "You still need to run$todo." ;; esac : Someone might mail this, so... exit -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.