home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume16 / dist2 / part02 < prev    next >
Text File  |  1988-10-13  |  55KB  |  1,850 lines

  1. Subject:  v16i035:  Larry Wall's Configure generator, etc., Part02/07
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: lwall@jpl-devvax.jpl.nasa.gov (Larry Wall)
  7. Posting-number: Volume 16, Issue 35
  8. Archive-name: dist/part02
  9.  
  10. #! /bin/sh
  11.  
  12. # Make a new directory for the dist sources, cd to it, and run kits 1
  13. # thru 7 through sh.  When all 7 kits have been run, read README.
  14.  
  15. echo "This is dist 2.0 kit 2 (of 7).  If kit 2 is complete, the line"
  16. echo '"'"End of kit 2 (of 7)"'" will echo at the end.'
  17. echo ""
  18. export PATH || (echo "You didn't use sh, you clunch." ; kill $$)
  19. mkdir mcon mcon/U pat pl 2>/dev/null
  20. echo Extracting pat/patcil.SH
  21. sed >pat/patcil.SH <<'!STUFFY!FUNK!' -e 's/X//'
  22. Xcase $CONFIG in 
  23. X'') if test ! -f config.sh; then
  24. X    ln ../config.sh . || \
  25. X    ln ../../config.sh . || \
  26. X    ln ../../../config.sh . || \
  27. X    (echo "Can't find config.sh."; exit 1)
  28. X    fi
  29. X    . ./config.sh
  30. X    ;;
  31. Xesac
  32. X: This forces SH files to create target in same directory as SH file.
  33. X: This is so that make depend always knows where to find SH derivatives.
  34. Xcase "$0" in
  35. X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
  36. Xesac
  37. Xecho "Extracting patcil (with variable substitutions)"
  38. X$cat >patcil <<!GROK!THIS!
  39. X#!/usr/bin/perl -i~
  40. X        eval "exec /usr/bin/perl -S \$0 \$*"
  41. X                if \$running_under_some_shell;
  42. X
  43. X# $Header: patcil.SH,v 2.0 88/06/29 00:21:39 lwall Locked $
  44. X#
  45. X# $Log:    patcil.SH,v $
  46. X# Revision 2.0  88/06/29  00:21:39  lwall
  47. X# Baseline.
  48. X# 
  49. X# 
  50. X
  51. X\$defeditor = '$defeditor';
  52. X!GROK!THIS!
  53. X
  54. X: In the following dollars and backticks do not need the extra backslash.
  55. Xcat >>patcil <<'!NO!SUBS!'
  56. Xdie "patcil [files]\n" unless $#ARGV >= 0;
  57. X
  58. X$RCSEXT = ',v' unless $RCSEXT;
  59. X
  60. Xsystem 'mkdir', 'RCS' unless -d 'RCS';
  61. X
  62. Xchop($pwd = `pwd`) unless -f '.package';
  63. Xuntil (-f '.package') {
  64. X    die "No .package file!  Run packinit.\n" unless $pwd;
  65. X    chdir '..' || die "Can't cd ..";
  66. X    $pwd =~ s|(.*)/(.*)|$1|;
  67. X    $prefix = $2 . '/' . $prefix;
  68. X}
  69. Xif ($prefix) {
  70. X    for (@ARGV) {
  71. X    s/^/$prefix/ unless m|^[-/]|;
  72. X    }
  73. X}
  74. Xdo readpackage();
  75. X
  76. Xif (-f 'patchlevel.h') {
  77. X    open(PL,"patchlevel.h") || die "Can't open patchlevel.h\n";
  78. X    while (<PL>) {
  79. X        $bnum = $1 if /^#define\s+PATCHLEVEL\s+(\d+)/;
  80. X    }
  81. X    die "Malformed patchlevel.h file.\n" if $bnum eq '';
  82. X    ++$bnum;
  83. X}
  84. Xelse {
  85. X    $bnum=1;
  86. X}
  87. X
  88. Xopen(LOGS,">>bugs/.logs$bnum");        # remember logs for patmake
  89. X
  90. Xwhile ($ARGV[0] =~ /^-/) {
  91. X    $_ = shift;
  92. X    last if /--/;
  93. X    if ($_ eq '-p') {
  94. X    $patching++;
  95. X    }
  96. X    elsif ($_ eq '-q') {
  97. X    push(@sw,$_);
  98. X    }
  99. X    elsif ($_ eq '-f') {
  100. X    push(@sw,$_);
  101. X    }
  102. X    elsif ($_ eq '-b') {
  103. X    $batch++;
  104. X    }
  105. X    elsif ($_ eq '-a') {
  106. X    $all++;
  107. X    }
  108. X    elsif ($_ eq '-s') {
  109. X    $strip++;
  110. X    }
  111. X    else {
  112. X    die "Unrecognized switch: $_\n";
  113. X    }
  114. X}
  115. X
  116. Xif ($all) {
  117. X    open(MANI,"MANIFEST.new") || die "No MANIFEST.new found.\n";
  118. X    @ARGV = ();
  119. X    while (<MANI>) {
  120. X        chop;
  121. X    ($_) = split(' ');
  122. X        push(@ARGV,$_);
  123. X    }
  124. X    close MANI;
  125. X}
  126. X
  127. X@filelist = @ARGV;
  128. X
  129. Xsub CLEANUP {
  130. X    print "Warning: restore $ARGV\n";
  131. X    exit 1;
  132. X}
  133. X
  134. Xif ($strip) {
  135. X    open(TTY,">/dev/tty");
  136. X    select(TTY);
  137. X    $| = 1;
  138. X    select(stdout);
  139. X    $SIG{'INT'} = 'CLEANUP';
  140. X    while (<>) {
  141. X    if (/^(.*)\$Log[:\$]/) {
  142. X        $comment = $1;
  143. X        $len = length($comment);
  144. X        print;
  145. X        $lastnl = 1;
  146. X        logline: while (<>) {
  147. X        $c = substr($_,0,$len);
  148. X        last logline unless $c eq $comment;
  149. X        $_ = substr($_,$len,999);
  150. X        if ($lastnl) {
  151. X            unless (/^Revision\s+\d/) {
  152. X            $_ = $comment . $_;
  153. X            last logline;
  154. X            }
  155. X            $lastnl = 0;
  156. X        }
  157. X        else {
  158. X            if ($_ eq "\n") {
  159. X            $lastnl = 1;
  160. X            }
  161. X        }
  162. X        }
  163. X    }
  164. X    }
  165. X    continue {
  166. X    print;
  167. X    if ($ARGV ne $oldargv) {
  168. X        print TTY "Stripping $ARGV...\n";
  169. X        $oldargv = $ARGV;
  170. X    }
  171. X    }
  172. X    $SIG{'INT'} = 'DEFAULT';
  173. X    close TTY;
  174. X}
  175. X
  176. Xif ($batch) {
  177. X    $flist=do rcsargs(@filelist);
  178. X    @flist=split(' ',$flist);
  179. X    system 'rcs', '-u', @flist;
  180. X    system 'rcs', "-l$revbranch", @flist;
  181. X    system 'ci', '-l', "-r$revbranch", @sw, @flist;
  182. X    exit 0;
  183. X}
  184. X
  185. Xopen(MANI,"MANIFEST.new") || die "Can't open MANIFEST.new.\n";
  186. Xwhile (<MANI>) {
  187. X    ($file) = split(' ');
  188. X    $inmani{$file} = 1;
  189. X}
  190. Xclose MANI;
  191. X
  192. Xfile: foreach $file (@filelist) {
  193. X    $files = do rcsargs($file);
  194. X    @files = split(' ',$files);
  195. X    $file = $files[1] if $file =~ /\.$RCSEXT$/;
  196. X    unless ($inmani{$file}) {
  197. X    print "$file does not appear to be in your MANIFEST.new--add? [y] ";
  198. X    $ans = <stdin>;
  199. X    if ($ans !~ /^n/i) {
  200. X        print "MANIFEST.new comment? ";
  201. X        $ans = <stdin>;
  202. X        `echo '$file    $ans' >>MANIFEST.new`;
  203. X    }
  204. X    }
  205. X    $revs=0;
  206. X    $rlog = `rlog -r$baserev -r$revbranch $files 2>&1`;
  207. X    ($total) = ($rlog =~ /total revisions: (\d+)/);
  208. X    ($revs) = ($rlog =~ /selected revisions: (\d+)/);
  209. X    $comment = do rcscomment($file);
  210. X    if (!$revs) {
  211. X    if ($total) {                # new trunk revision
  212. X        if ($rlog !~ /locks:\s*;/) {
  213. X        system 'rcs', '-u', @files;    # unlock branch
  214. X        }
  215. X        system 'rcs', '-l', @files;        # lock trunk
  216. X    }
  217. X    else {
  218. X        system 'rcs', '-i', "-c$comment", @files if $comment ne '';
  219. X    }
  220. X    if ($patching && !$total) {    # check in null as trunk revision
  221. X        rename($file, "$file.xxx");
  222. X        `cp /dev/null $file` unless -f "$file.xxx";
  223. X        if (system 'ci', "-l$baserev", @sw, @files) {
  224. X        print "Trying again...\n";
  225. X        system 'ci', "-r$baserev", @sw, @files;
  226. X        system 'rcs', '-u', @files unless $?;
  227. X        system 'co', "-l$baserev", @files unless $?;
  228. X        }
  229. X        system 'rcs', "-Nlastpat:$baserev", @files;
  230. X        rename("$file.xxx", $file);
  231. X        $mess = do getlog($file);
  232. X        next file if $mess eq 'nope';
  233. X        if (system 'ci', "-l$revbranch", @sw, @files) {
  234. X        print "Unlocking and trying again...\n";
  235. X        system 'rcs', '-u', @files;
  236. X        system 'ci', "-l$revbranch", @sw, @files unless $?;
  237. X        }
  238. X    }
  239. X    else {
  240. X        $mess = do getlog($file);
  241. X        next file if $mess eq 'nope';
  242. X        if (do feed($mess, 'ci', "-l$baserev", @sw, @files)) {
  243. X        print "Trying again...\n";
  244. X        do feed($mess, 'ci', "-r$baserev", @sw, @files);
  245. X        system 'rcs', '-u', @files unless $?;
  246. X        system 'co', "-l$baserev", @files unless $?;
  247. X        }
  248. X        system 'rcs', "-Nlastpat:$baserev", @files;
  249. X    }
  250. X    }
  251. X    elsif ($revs == 1) {
  252. X    $mess = do getlog($file);
  253. X    next file if $mess eq 'nope';
  254. X    if (do feed($mess, 'ci', @sw, "-l$revbranch", @files)) {
  255. X        print "Unlocking and trying again...\n";
  256. X        system 'rcs', '-u', @files;
  257. X        do feed($mess, 'ci', @sw, "-l$revbranch", @files) unless $?;
  258. X    }
  259. X    }
  260. X    else {
  261. X    $mess = do getlog($file);
  262. X    next file if $mess eq 'nope';
  263. X    if (do feed($mess, 'ci', @sw, "-l$revbranch", @files)) {
  264. X        print "Trying again with separate checkout...\n";
  265. X        do feed($mess, 'ci', @sw, "-r$revbranch", @files);
  266. X        system 'rcs', "-l$revbranch", @files unless $?;
  267. X        system 'co', "-l$revbranch", @files unless $?;
  268. X    }
  269. X    }
  270. X}
  271. Xunlink ".rlog$$";
  272. X
  273. Xsub feed {
  274. X    local($mess) = shift(@_);
  275. X    open(FORK,"|-") || exec @_;
  276. X    print FORK $mess;
  277. X    close FORK;
  278. X    $?;
  279. X}
  280. X
  281. Xsub getlog {
  282. X    local($file) = @_;
  283. X    local($mess) = '';
  284. X    local($prefix) = "patch$bnum: ";
  285. X    local($prompt) = $comment;
  286. X    $prompt = '>> ' unless $prompt;
  287. X    $prefix = '' unless $revs;
  288. X    print "Type log message for $file (finish with ., CR for previous):\n";
  289. X    try: for (;;) {
  290. X    line: for (print "$prompt$prefix";;print "$prompt$prefix") {
  291. X        if ($always) {
  292. X        print "\n";
  293. X        $line = '';
  294. X        }
  295. X        else {
  296. X        $line = <stdin>;
  297. X        }
  298. X        if ($line =~ /^\.?$/) {
  299. X        if ($mess) {
  300. X            last line;
  301. X        }
  302. X        else {
  303. X            $line = 'p';
  304. X        }
  305. X        }
  306. X        if ($line =~ /^[h?]$/) {
  307. X        print "
  308. XCR or .    Terminate log message.
  309. Xp    Append previous message.
  310. Xl    List what I have so far.
  311. Xv or e    Call editor.
  312. XV or E    Call editor with a diff listing.
  313. Xx    Toggle patch# prefix.
  314. Xn    Forget this file.
  315. Xa    Always use this message.
  316. Xr    Print out the rlog for this file.
  317. Xh or ?    This help message.
  318. X
  319. X";
  320. X        next line;
  321. X        }
  322. X        if ($line =~ /^[VE]$/) {
  323. X        $mess .= "\n" . `rcsdiff -c -rlastpat $files`;
  324. X        }
  325. X        if ($line =~ /^[VEve]$/) {
  326. X        $mess = do edit($mess);
  327. X        next line;
  328. X        }
  329. X        if ($line =~ /^r$/) {
  330. X        system "rlog $files";
  331. X        next line;
  332. X        }
  333. X        if ($line =~ /^a$/) {
  334. X        $always++ if $mess || $prevmess;
  335. X        next line;
  336. X        }
  337. X        if ($line =~ /^n$/) {
  338. X        $mess = 'nope';
  339. X        last line;
  340. X        }
  341. X        if ($line =~ /^l$/) {
  342. X        foreach $line (split(/\n/,$mess)) {
  343. X            print $prompt,$line,"\n";
  344. X        }
  345. X        next line;
  346. X        }
  347. X        if ($line =~ /^p$/) {
  348. X        $mess .= $prevmess;
  349. X        foreach $line (split(/\n/,$prevmess)) {
  350. X            print $prompt,$line,"\n";
  351. X        }
  352. X        next line;
  353. X        }
  354. X        if ($line =~ /^x$/) {
  355. X        $prefix = $prefix ? '' : "patch$bnum: ";
  356. X        next line;
  357. X        }
  358. X        $mess .= $prefix . $line;
  359. X        if (length($mess) > 511) {
  360. X        print "You'll have to trim to less than 512 chars...\n";
  361. X        sleep(3);
  362. X        $mess = do edit($mess);
  363. X        }
  364. X    }
  365. X    $mess = $prevmess if $mess eq '';
  366. X    if (!$mess) {
  367. X        print "No previous message, try again.\n";
  368. X        next try;
  369. X    }
  370. X    if (length($mess) > 511) {
  371. X        print "Sorry, that's too long; rcs won't take it.  Try again...\n";
  372. X        next try;
  373. X    }
  374. X    last try;
  375. X    }
  376. X    print LOGS $mess unless $mess eq 'nope';
  377. X    $prevmess = $mess unless $mess eq 'nope';
  378. X}
  379. X
  380. Xsub geteditor {
  381. X    local($editor) = $ENV{'VISUAL'};
  382. X    $editor = $ENV{'EDITOR'} unless $editor;
  383. X    $editor = $defeditor unless $editor;
  384. X    $editor = 'vi' unless $editor;
  385. X    $editor;
  386. X}
  387. X
  388. Xsub edit {
  389. X    $editor = do geteditor() unless $editor;
  390. X    local($text) = join("\n", @_);
  391. X    open(TMP,">/tmp/cil$$") || die "Can't create /tmp/cil$$";
  392. X    print TMP $text;
  393. X    close TMP;
  394. X    system $editor, "/tmp/cil$$";
  395. X    $text = `cat /tmp/cil$$`;
  396. X    unlink "/tmp/cil$$";
  397. X    $text;
  398. X}
  399. X
  400. X!NO!SUBS!
  401. Xcat ../pl/package.pl >>patcil
  402. Xcat ../pl/rcsargs.pl >>patcil
  403. Xcat ../pl/comment.pl >>patcil
  404. Xchmod +x patcil
  405. X$eunicefix patcil
  406. !STUFFY!FUNK!
  407. echo Extracting mcon/metaconfig.man
  408. sed >mcon/metaconfig.man <<'!STUFFY!FUNK!' -e 's/X//'
  409. X.rn '' }`
  410. X''' $Header: metaconfig.man,v 2.0 88/06/28 23:18:51 lwall Locked $
  411. X''' 
  412. X''' $Log:    metaconfig.man,v $
  413. X''' Revision 2.0  88/06/28  23:18:51  lwall
  414. X''' Baseline.
  415. X''' 
  416. X''' 
  417. X.de Sh
  418. X.br
  419. X.ne 5
  420. X.PP
  421. X\fB\\$1\fR
  422. X.PP
  423. X..
  424. X.de Sp
  425. X.if t .sp .5v
  426. X.if n .sp
  427. X..
  428. X'''
  429. X'''     Set up \*(-- to give an unbreakable dash;
  430. X'''     string Tr holds user defined translation string.
  431. X'''     Bell System Logo is used as a dummy character.
  432. X'''
  433. X.ie n \{\
  434. X.tr \(*W-\*(Tr
  435. X.ds -- \(*W-
  436. X.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
  437. X.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
  438. X.ds L" ""
  439. X.ds R" ""
  440. X.ds L' '
  441. X.ds R' '
  442. X'br\}
  443. X.el\{\
  444. X.ds -- \(em\|
  445. X.tr \*(Tr
  446. X.ds L" ``
  447. X.ds R" ''
  448. X.ds L' `
  449. X.ds R' '
  450. X'br\}
  451. X.de Sh
  452. X.br
  453. X.ne 5
  454. X.PP
  455. X\fB\\$1\fR
  456. X.PP
  457. X..
  458. X.de Sp
  459. X.if t .sp .5v
  460. X.if n .sp
  461. X..
  462. X.de Ip
  463. X.br
  464. X.ie \\n.$>=3 .ne \\$3
  465. X.el .ne 3
  466. X.IP "\\$1" \\$2
  467. X..
  468. X.TH METACONFIG 1 LOCAL
  469. X.SH NAME
  470. Xmetaconfig - a Configure script generator
  471. X.SH SYNOPSIS
  472. X.B metaconfig
  473. X[options] 
  474. X.SH DESCRIPTION
  475. X.I Metaconfig
  476. Xis a program that writes Configure scripts.
  477. XIf you don't know what a Configure script is, you probably aren't
  478. Xinterested in
  479. X.IR metaconfig .
  480. X.PP
  481. X.I Metaconfig
  482. Xoperates from set of
  483. X.I units
  484. Xwhich define everything that metaconfig knows about portability.
  485. XEach unit is self-contained, and does not have to be registered anywhere
  486. Xother than by inclusion in either the public U directory or your private
  487. XU directory.
  488. XIf the dist package (of which metaconfig is a part) is installed in LIB,
  489. Xthen the public U directory is LIB/dist/mcon/U.
  490. XYour private U directory, if you have one,
  491. Xis in the top level directory of your package.
  492. XBefore you can run metaconfig you must do a several things:
  493. X.Ip 1) 4 4
  494. XCreate a .package file in the package's top level directory by running packinit.
  495. XThis program will ask you about your package and remember what you tell
  496. Xit so that all the dist programs can be smart.
  497. X.Ip 2) 4 4
  498. XConsult the Glossary (in LIB/dist/mcon) and write your shell scripts and
  499. XC programs in terms of the symbols that metaconfig knows how to define.
  500. XYou don't need to tell metaconfig which symbols you used, since metaconfig
  501. Xwill figure that out for you.
  502. X.Ip 3) 4 4
  503. XGenerate any .SH scripts needed to write Makefiles or shell scripts that
  504. Xwill depend on values defined by Configure.
  505. XThere is a program called makeSH that will help you do this.
  506. X.Ip 4) 4 4
  507. XCreate a MANIFEST.new file in your top level directory that lists all the
  508. Xfiles in your package.
  509. XThe filename should be the first field on each line.
  510. XAfter some whitespace you can add a comment which will end up in MANIFEST.
  511. X.Ip 5) 4 4
  512. XCopy any .U files that you want to modify to your private U directory.
  513. XAny .U files in your private U directory will be used in preference to
  514. Xthe one in the public U directory.
  515. XFor example, one way to force inclusion of any unit is to copy the End.U
  516. Xfile to your .U directory and add the name of the unit you want as
  517. Xa dependency on the end of the ?MAKE: line.
  518. XCertain units can ONLY be forced in this way, namely those of the form
  519. XWarn_*.U and Chk_*.U.
  520. XYou can also customize certain default Configure variables by copying
  521. XMyinit.U to your package's private U directory and setting the variables in
  522. Xthat unit.
  523. X.PP
  524. XNow you are ready to run metaconfig.
  525. X.PP
  526. XIf you are testing a new unit, and your source files haven't changed,
  527. Xyou may use the
  528. X.B \-w
  529. Xswitch to suppress the scan of your programs.
  530. XIn this case, metaconfig uses the Wanted file from the previous run
  531. Xof metaconfig.
  532. X.PP
  533. XThe
  534. X.B \-v
  535. Xswitch makes metaconfig a little more verbose.
  536. XThe
  537. X.B \-V
  538. Xswitch makes metaconfig a LOT more verbose.
  539. X.PP
  540. XIn order to create new units, do the following:
  541. X.Ip 1) 4 4
  542. XCopy a similar unit to a new .U file.
  543. XThe name you choose should be the name of a variable generated by the unit.
  544. XIt should be 12 or less characters to prevent filename chopping.
  545. XActually, it should probably be 10 or less so that those who want to use RCS
  546. Xcan have a .U,v on the end without chopping.
  547. XMetaconfig uses the case of the first letter to determine if any variable is
  548. Xactually produced by this unit, so don't Capitalize your unit
  549. Xname if it is supposed to produce a shell variable.
  550. X.Ip 2) 4 4
  551. XEdit the new .U file to do what you want.
  552. XThe first ?MAKE: line indicates the dependencies; before the final list
  553. Xcolon all the variables this unit defines, and after the final colon
  554. Xall the variables (or other units) on which this unit depends.
  555. XIt is very important that these lists be accurate.
  556. XIMPORTANT: The first symbol after ?MAKE: *must* be the name of the file
  557. X(without the .U).
  558. X.Ip 3) 4 4
  559. XTo the extent possible, parameterize your unit based on shell
  560. Xvariable defined on ?INIT: lines.
  561. XThis will move the variable definitions up to the Init.U unit,
  562. Xwhere they can be overridden by definitions in Myinit.U, which is
  563. Xincluded after Init.U.
  564. X.Ip 4) 4 4
  565. XAdd the definition of any C symbols desired as ?H: lines.
  566. XA line beginning with ?H:?%1: in the .U file will be added to the eventual
  567. Xconfig.h file if and only if metaconfig decides that the first symbol
  568. Xon the ?MAKE: line is needed.
  569. XThe %1 stands for that first symbol, which happens to be the name of
  570. Xthe file too (without .U).
  571. XAlways put a comment on each ?H: line in case one of the variable
  572. Xsubstitutions earlier on the line starts a comment without finishing it.
  573. XAny shell variable starting with d_ may do this, so beware.
  574. X.Ip 5) 4 4
  575. XAdd glossary definitions as ?S: lines for shell variables and ?C:
  576. Xlines for C preprocessor variables.
  577. XSee a current unit for examples.
  578. XIt is VERY important to start each entry with a left justified symbol
  579. Xname, and end each entry with with a ?C:. or ?S:. line.  The algorithm
  580. Xthat translates C preprocessor symbol entries for the Glossary into
  581. Xcomments for config.h depends on this.
  582. X.Ip 6) 4 4
  583. XMake sure the order of all your ? lines is right.  The correct order is:
  584. X.nf
  585. X
  586. X    ?RCS: and ?X: lines        -- basically just comments
  587. X    ?MAKE: lines            -- metaconfig dependencies
  588. X    ?C: and ?S: lines        -- Glossary definitions
  589. X    ?H: lines            -- config.h definitions
  590. X
  591. X    ?INIT: lines can go anywhere.
  592. X
  593. X.fi
  594. X.Ip 7) 4 4
  595. XPut the unit into the public or private U directory as appropriate.
  596. X.Ip 8) 4 4
  597. XRerun metaconfig.
  598. X.Ip 9) 4 4
  599. XSend unit to lwall@jpl-devvax.jpl.nasa.gov (Larry Wall) for inclusion
  600. Xin the master copy, if you think it's of general interest.
  601. X.PP
  602. XIn order to add a new program to be located:
  603. X.Ip 1) 4 4
  604. XEdit Loc.U, and add the name of the program both to the ?MAKE: line
  605. X(between the two colons) and to either loclist or trylist (depending
  606. Xon whether the program is mandatory or not).
  607. X.Ip 2) 4 4
  608. XRerun metaconfig.
  609. X.Ip 3) 4 4
  610. XSend Loc.U to me for inclusion in the master copy, if you think it's
  611. Xof general interest.
  612. X.PP
  613. XNotes for writing .U files:
  614. X.Ip * 4 4
  615. XAlways use "rm -f" because there are systems where rm is interactive by
  616. Xdefault.
  617. X.Ip * 4 4
  618. XAlways use echo " " (with a space) because of Eunice systems.
  619. X.Ip * 4 4
  620. XUse only programs that came with V7, so that you know everyone has them.
  621. X.Ip * 4 4
  622. XUse $contains when you want to grep conditionally, since not all
  623. Xgreps return a reasonable status.
  624. XBe sure to redirect the output to /dev/null.
  625. X.Ip * 4 4
  626. XUse "if test" rather than "if [...]" since not every sh knows the
  627. Xlatter construct.
  628. X.Ip * 4 4
  629. XUse the myread script for inputs so that they can do shell escapes
  630. Xand default evaluation.  The general form is
  631. X.nf
  632. X
  633. X    case "$grimble" in
  634. X    '') dflt=452;;
  635. X    *) dflt="$grimble";;
  636. X    esac
  637. X    rp="How many grimbles do you have? [$dflt]"
  638. X    echo $n "$rp $c"
  639. X    . myread
  640. X    grimble="$ans"
  641. X.fi
  642. X.Ip * 4 4
  643. XAlways try to determine whether a feature is present in the most
  644. Xspecific way--don't say "if bsd" when you can grep libc.  There
  645. Xare many hybrid systems out there, and each feature should stand
  646. Xor fall by itself.
  647. X.Ip * 4 4
  648. XAlways try to determine whether a feature is present in the most
  649. Xgeneral way, so that other packages can use your unit.
  650. X.Ip * 4 4
  651. XWhen in doubt, set a default and ask.  Don't assume anything.
  652. X.Ip * 4 4
  653. XIf you think the user is wrong, allow for the fact that he may be right.
  654. XFor instance, he could be running Configure on a different system than
  655. Xhe is going to use the final product on.
  656. X.PP
  657. XMetaconfig reserves the following names in your directory, and if you use such
  658. Xa name it may get clobbered or have other unforeseen effects:
  659. X.nf
  660. X
  661. X    .MT/*
  662. X    Configure
  663. X    Wanted
  664. X    UU/*
  665. X
  666. X.fi
  667. XAdditionally, Configure may clobber these names in the directory it is run in:
  668. X.nf
  669. X
  670. X    UU/*
  671. X    config.sh
  672. X    config.h
  673. X.fi
  674. X.SH AUTHOR
  675. XLarry Wall <lwall@jpl-devvax.jpl.nasa.gov>
  676. X.SH ENVIRONMENT
  677. XNo environment variables are used by
  678. X.IR metaconfig .
  679. X.SH FILES
  680. XLIB/dist/mcon/U/*.U
  681. X.br
  682. XLIB/dist/mcon/Glossary
  683. X.br
  684. X    where LIB is something like /usr/lib or /usr/local/lib.
  685. X.SH SEE ALSO
  686. Xpat(1)
  687. X.br
  688. XmakeSH(1)
  689. X.br
  690. Xmakedist(1)
  691. X.SH DIAGNOSTICS
  692. X.SH BUGS
  693. XUnits are sometimes included unnecessarily if one of its symbols is
  694. Xaccidentally mentioned, e.g. in a comment.
  695. XBetter too many units than too few, however.
  696. X.rn }` ''
  697. !STUFFY!FUNK!
  698. echo Extracting MANIFEST
  699. sed >MANIFEST <<'!STUFFY!FUNK!' -e 's/X//'
  700. XAfter all the dist kits are run you should have the following files:
  701. X
  702. XFilename        Kit Description
  703. X--------        --- -----------
  704. XConfigure                1 Portability tool.
  705. XMANIFEST                 2 This list of files.
  706. XMakefile                 4 A makefile to run subsidiary makefiles.
  707. XREADME                   1 Basic instructions.
  708. Xconfig.h.SH              3 Produces config.h.
  709. Xkit/Makefile.SH          4 Builds kit builder.
  710. Xkit/README               1 Instructions on makedist.
  711. Xkit/makeSH               5 Does most of turning a script into an SH file.
  712. Xkit/makeSH.man           5 Manual page for same.
  713. Xkit/makedist.SH          3 Makes a set of kits in the current directory.
  714. Xkit/makedist.man         4 Manual page for same.
  715. Xmcon/Makefile.SH         5 Builds metaconfig.
  716. Xmcon/README              1 Instructions on using metaconfig.
  717. Xmcon/U/AAAAA.U           7 Does magic before Head.U.
  718. Xmcon/U/Chk_whoami.U      7 A unit which checks for conflicts.
  719. Xmcon/U/Config_h.U        5 Makes config.h.SH--bizarrity here.
  720. Xmcon/U/Config_sh.U       6 Makes config.sh.
  721. Xmcon/U/Cppsym.U          4 Makes program to test for cpp symbols.
  722. Xmcon/U/End.U             6 "End of configuration questions"
  723. Xmcon/U/Filexp.U          5 Makes program to do tilde expansion.
  724. Xmcon/U/Finish.U          4 A unit which always goes last.
  725. Xmcon/U/Guess.U           3 Hazard guesses as to overall philosophy.
  726. Xmcon/U/Head.U            5 First unit, does "#!/bin/sh" et al.
  727. Xmcon/U/Init.U            6 Magically gathers ?Init: lines from other units.
  728. Xmcon/U/Instruct.U        4 Prints instructions.
  729. Xmcon/U/Loc.U             2 Look for common programs.
  730. Xmcon/U/Log.U             5 Some stupid redefinitions to keep RCS happy.
  731. Xmcon/U/Myinit.U          7 For copying to private U directories.
  732. Xmcon/U/Myread.U          6 Makes program to do read with shell escape.
  733. Xmcon/U/Null.U            7 Zeroes out variables.  Probably unnecessary.
  734. Xmcon/U/Oldconfig.U       6 Looks for old config.sh file.
  735. Xmcon/U/Warn_v7EXT.U      6 V7 has some ideosyncracies.
  736. Xmcon/U/Warn_v7ND.U       6 V7 has no O_NDELAY read.
  737. Xmcon/U/active.U          5 Find the news active file.
  738. Xmcon/U/bin.U             6 Find where to install public executables.
  739. Xmcon/U/cc.U              5 Find special compilers and options.
  740. Xmcon/U/contains.U        6 Makes status-returning grep.
  741. Xmcon/U/cppstdin.U          0
  742. Xmcon/U/d_bcopy.U         6 Do we have bcopy() or memcpy()?
  743. Xmcon/U/d_charsprf.U      5 How is sprintf() defined?
  744. Xmcon/U/d_crypt.U         6 Does crypt() exist?
  745. Xmcon/U/d_dosuid.U        4 Do they want setuid emulation?
  746. Xmcon/U/d_fchmod.U        6 Do we have fchmod()?
  747. Xmcon/U/d_fchown.U        6 Do we have fchown()?
  748. Xmcon/U/d_fcntl.U         6 Do we have fcntl()?
  749. Xmcon/U/d_flexfnam.U      5 Long filenames?
  750. Xmcon/U/d_ftime.U         6 Do we have ftime()?
  751. Xmcon/U/d_getgrps.U       6 Do we have getgroups()?
  752. Xmcon/U/d_gethname.U      3 What is the C function to get host name?
  753. Xmcon/U/d_getpwent.U      6 How is passwd info gotten?
  754. Xmcon/U/d_havetlib.U      4 Where is termlib?
  755. Xmcon/U/d_hidnet.U        4 Do hiddennet stuff?
  756. Xmcon/U/d_index.U         5 index() vs strchr().
  757. Xmcon/U/d_internet.U      5 Use internet addresses?
  758. Xmcon/U/d_ioctl.U         6 Does sys/ioctl.h exist?
  759. Xmcon/U/d_killpg.U        6 Do we have killpg()?
  760. Xmcon/U/d_memcpy.U        6 Do we have memcpy()?
  761. Xmcon/U/d_news.U          4 What kind of NeWS is here?
  762. Xmcon/U/d_newsadm.U       5 Who is news administrator?
  763. Xmcon/U/d_nolnbuf.U       4 Is stdout line buffered?
  764. Xmcon/U/d_normsig.U       5 signal() vs sigset().
  765. Xmcon/U/d_portable.U      5 How portable do we want to be?
  766. Xmcon/U/d_raster.U        6 Is this a Raster Tech machine?
  767. Xmcon/U/d_rdchk.U         6 Is rdchk() there to check for input?
  768. Xmcon/U/d_rename.U        6 Do we have rename()?
  769. Xmcon/U/d_scorfl.U        5 Keep scoreboards by full name?
  770. Xmcon/U/d_setegid.U       6 Do we have setegid()?
  771. Xmcon/U/d_seteuid.U       6 Do we have seteuid()?
  772. Xmcon/U/d_setrgid.U       6 Do we have setrgid()?
  773. Xmcon/U/d_setruid.U       6 Do we have setruid()?
  774. Xmcon/U/d_sgndchr.U       6 Are chars signed?
  775. Xmcon/U/d_speedopt.U      5 Optimize speed vs memory?
  776. Xmcon/U/d_statblks.U      6 Does stat know about blksize and blocks?
  777. Xmcon/U/d_stdstdio.U      6 How standard is stdio?
  778. Xmcon/U/d_strcspn.U       6 Do we have strcspn()?
  779. Xmcon/U/d_strctcpy.U      6 Do we do struct copies?
  780. Xmcon/U/d_symlink.U       6 Does symlink() exist?
  781. Xmcon/U/d_termio.U        5 Termio vs sgtty.
  782. Xmcon/U/d_tminsys.U       6 Is struct tm in <sys/time.h>?
  783. Xmcon/U/d_usendir.U       4 Use our own ndir routines?
  784. Xmcon/U/d_vfork.U         6 vfork() vs fork().
  785. Xmcon/U/d_voidsig.U       6 How is signal() declared?
  786. Xmcon/U/d_whoami.U        6 Is there a whoami.h file?
  787. Xmcon/U/defeditor.U       6 Find default editor.
  788. Xmcon/U/filexp.U          6 Finds location of filexp made by Filexp.U.
  789. Xmcon/U/fpu.U             5 What kind of Sun fpu is in use?
  790. Xmcon/U/gidtype.U         5 What is the type of gids?
  791. Xmcon/U/hostname.U        3 How to determine hostname from shell.
  792. Xmcon/U/libc.U            4 Where is libc?
  793. Xmcon/U/libnm.U           6 New math library?
  794. Xmcon/U/locdist.U         3 Find distribution names for news.
  795. Xmcon/U/maildir.U         6 Where is mail spooled.
  796. Xmcon/U/mailer.U          5 What delivers mail?
  797. Xmcon/U/mailfile.U        1 What filename in maildir?
  798. Xmcon/U/mallocsrc.U       5 Use malloc included in kit?
  799. Xmcon/U/mansrc.U          5 Where to put manual pages source.
  800. Xmcon/U/mboxchar.U        5 How to determine if file is mailbox.
  801. Xmcon/U/models.U          2 Large vs small, split I&D, etc.
  802. Xmcon/U/n.U               6 How to suppress newline with echo.
  803. Xmcon/U/nametype.U        3 How to get user's fullname.
  804. Xmcon/U/newslevel.U       5 What version of news are we running?
  805. Xmcon/U/newslib.U         4 Where is the news library?
  806. Xmcon/U/newsspool.U       5 Where is news spooled?
  807. Xmcon/U/orgname.U         5 What is the organizaton name?
  808. Xmcon/U/package.U         7 Gets package name from .package magically.
  809. Xmcon/U/pager.U           5 What's the pager, more or less?
  810. Xmcon/U/prefshell.U       5 Preferred user shell.
  811. Xmcon/U/privlib.U         5 Where is the private library?
  812. Xmcon/U/randbits.U        5 How many bits in rand()?
  813. Xmcon/U/registers.U       4 How many register declarations to use.
  814. Xmcon/U/rootid.U          6 Root user id.
  815. Xmcon/U/spitshell.U       5 Shell comment stripper, maybe.
  816. Xmcon/U/startsh.U         6 How to guarantee sh startup.
  817. Xmcon/U/stdchar.U         6 Are chars unsigned in stdio?
  818. Xmcon/U/sunscanf.U        6 Is this Sun's version of scanf()?
  819. Xmcon/U/uidtype.U         6 What is the type of uids?
  820. Xmcon/U/voidflags.U       3 How supported is void?
  821. Xmcon/makegloss           3 Extracts Glossary from Unit files.
  822. Xmcon/metaconfig.SH       1 Writes Configure scripts for you.
  823. Xmcon/metaconfig.man      2 Manual page for same.
  824. Xpackinit.SH              2 Creates a .package file describing your package.
  825. Xpat/Makefile.SH          4 Builds patch generator.
  826. Xpat/README               1 Directions for patch generator.
  827. Xpat/mailagent            4 A sample mail agent.
  828. Xpat/mailpatch            4 A sample automatic patch mailer.
  829. Xpat/pat.SH               4 Check in, do diffs, make patch, send it.
  830. Xpat/pat.man              2 Manual page for same.
  831. Xpat/patbase.SH           4 To set the base for future differences.
  832. Xpat/patchlevel.h         7 A prototype patchlevel.h file.
  833. Xpat/patcil.SH            2 Check in the latest changes.
  834. Xpat/patdiff.SH           3 Find the differences since patbase.
  835. Xpat/patftp.SH            4 Puts patches in ftp pub directory.
  836. Xpat/patindex             7 Generate an index of patches sent out.
  837. Xpat/patmake.SH           3 Put together a patch file.
  838. Xpat/patpost.SH           3 Sends patches via news.
  839. Xpat/patsend.SH           4 Sends patches via mail.
  840. Xpatchlevel.h             3 The current patchlevel for dist.
  841. Xpl/comment.pl            6 Perl library to find comment in front of $Log.
  842. Xpl/fullname.pl           6 Perl library to get full name.
  843. Xpl/logname.pl            2 Perl library to get login name.
  844. Xpl/package.pl            6 Perl library to read .package.
  845. Xpl/rangeargs.pl          6 Perl library to expand number lists.
  846. Xpl/rcsargs.pl            6 Perl library to expand rcs filename lists.
  847. !STUFFY!FUNK!
  848. echo Extracting packinit.SH
  849. sed >packinit.SH <<'!STUFFY!FUNK!' -e 's/X//'
  850. Xcase $CONFIG in
  851. X'')
  852. X    if test ! -f config.sh; then
  853. X    ln ../config.sh . || \
  854. X    ln ../../config.sh . || \
  855. X    ln ../../../config.sh . || \
  856. X    (echo "Can't find config.sh."; exit 1)
  857. X    fi
  858. X    . ./config.sh
  859. X    ;;
  860. Xesac
  861. X: This forces SH files to create target in same directory as SH file.
  862. X: This is so that make depend always knows where to find SH derivatives.
  863. Xcase "$0" in
  864. X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
  865. Xesac
  866. Xecho "Extracting packinit (with variable substitutions)"
  867. Xcat >packinit <<!GROK!THIS!
  868. X#!/usr/bin/perl
  869. X    eval "exec /usr/bin/perl -S \$0 \$*"
  870. X        if \$running_under_some_shell;
  871. X
  872. X# $Header: packinit.SH,v 2.0 88/06/28 23:18:55 lwall Locked $
  873. X#
  874. X# $Log:    packinit.SH,v $
  875. X# Revision 2.0  88/06/28  23:18:55  lwall
  876. X# Baseline.
  877. X# 
  878. X
  879. X\$orgname='$orgname';
  880. X\$hostname='$hostname';
  881. X\$mydomain='$mydomain';
  882. X\$nametype='$nametype';
  883. X!GROK!THIS!
  884. X
  885. X: In the following dollars and backticks do not need the extra backslash.
  886. Xcat >>packinit <<'!NO!SUBS!'
  887. X
  888. Xprint '
  889. XThis program designates the current directory as the top level directory
  890. Xof a package on which you want to use the programs metaconfig, makedist,
  891. Xor the patch generation programs.  It will not damage the current directory
  892. Xin any way except to create a .package file.
  893. X
  894. X';
  895. X
  896. X$mypackver=1;
  897. Xif (-f '.package') {
  898. X    do readpackage();
  899. X    if ($packver > $mypackver) {
  900. X    die "This .package file was produced by a newer packinit than I am.\n".
  901. X        "Please find a packinit of version $packver or greater.\n";
  902. X    }
  903. X}
  904. X
  905. X# Now set up to do reads with possible shell escape.
  906. Xsub myread {
  907. X    ($rp,$dflt) = @_;
  908. X    $rp .= " [$dflt]";
  909. X    print "$rp ";
  910. X    $ans='!';
  911. X    while ($ans =~ /^!/) {
  912. X    $ans = <stdin>;
  913. X    chop($ans);
  914. X    if ($ans eq '!') {
  915. X        system '/bin/sh';
  916. X        print "\n$rp ";
  917. X    }
  918. X    elsif ($ans =~ s/^!//) {
  919. X        system '/bin/sh', '-c', $ans;
  920. X        print "\n$rp ";
  921. X    }
  922. X    }
  923. X    $ans = $dflt if $ans eq '';
  924. X    $ans;
  925. X}
  926. X
  927. X$dflt = $package;
  928. X($dflt) = (`pwd` =~ m|.*/(.*)|) unless $package;
  929. X
  930. Xprint " 
  931. XYour package will be known by some name, which should be a single word.
  932. XGenerally it is the name of the chief executable program.
  933. X
  934. X";
  935. X$package = do myread("What is the name of your package? ",$dflt);
  936. X
  937. Xif ($baserev ne '') {
  938. X    $dflt=$baserev;
  939. X}
  940. Xelse {
  941. X    print "\n";
  942. X    $dflt='';
  943. X    print "Checking RCS files for current version...";
  944. X    @rcs = <RCS/*,v *,v>;
  945. X    $rcs = shift(@rcs);
  946. X    if (! -f $rcs) {
  947. X    $rcs = shift(@rcs);
  948. X    if (! -f $1) {
  949. X        print "I don't see any RCS files there (yet).";
  950. X        $dflt='1.1';
  951. X    }
  952. X    }
  953. X    $revs=0;
  954. X    if ($dflt eq '') {
  955. X    $rlog = `rlog $rcs`;
  956. X    ($dflt) = ($rlog =~ /\nhead:\s*(\d+\.\d+)/);
  957. X    $rlog = `rlog -r$dflt.1- -r$dflt.2- -r$dflt.3- -r$dflt.4- $rcs`;
  958. X    ($revs) = ($rlog =~ /selected revisions:\s*([\d.]+)/);
  959. X    $dflt='1.1' if $dflt eq '';
  960. X    }
  961. X
  962. X    print "
  963. XTo use the patch generating portion of the system, you must have RCS.  You
  964. Xmust begin with a freshly checked-in trunk revision (n.n) and choose a branch
  965. Xnumber for patches.  The trunk revision upon which the patch branch is based
  966. Xis called the base revision.
  967. X
  968. X";
  969. X
  970. X    if ($revs > 1) {
  971. X    print
  972. X"(The current revision ($dflt) has branches--you may have to check in a new
  973. Xtrunk revision, or use patbase to mark the base revisions.)\n";
  974. X    ($first,$second) = split(/\./,$dflt);
  975. X    ++$second;
  976. X    $dflt="$first.$second";
  977. X    }
  978. X}
  979. X
  980. Xprint "\n";
  981. X$foo = do myread("What is or will be the base revision number? ", $dflt);
  982. Xif ($baserev ne $foo) {
  983. X    $baserev = $foo;
  984. X    $ftpdir = '';        # invalidate ftp directory on version change
  985. X}
  986. X
  987. Xprint "\n";
  988. X
  989. X$dflt = ($patchbranch ne '' ? $patchbranch : 1);
  990. X$patchbranch =
  991. X    do myread("What branch number do you want to use for patches? ", $dflt);
  992. X
  993. Xprint "\n";
  994. X$dflt = ($mydiff eq '' ? 'n' : 'y');
  995. X$ans = do myread(
  996. X    "Do you want to use your own diff (rather than rcsdiff -c) for patches? ",
  997. X    $dflt);
  998. Xif ($ans =~ /^n/i) {
  999. X    $mydiff='';
  1000. X}
  1001. Xelse {
  1002. X    $dflt = $mydiff || 'diff -c';
  1003. X    $mydiff = do myread("What diff command do you want to use? ", $dflt);
  1004. X}
  1005. X
  1006. Xprint "
  1007. XOver the lifetime of the $package package, people will want to request
  1008. Xdistribution kits and patches.  In particular, automatically generated
  1009. Xpatches will say where to get previous patches from.
  1010. X
  1011. X";
  1012. X$logname = do getlogname();
  1013. X$dflt = $maintname || do getfullname($logname);
  1014. X$maintname = do myread("Who should requests be sent to (full name)? ", $dflt);
  1015. X
  1016. Xprint "
  1017. XNow you need to give a one-line network mailing address for $maintname.
  1018. XIt does not need to be parseable by machine, but can be of the form:
  1019. X
  1020. X    {name1,name2,name3}!myhost!myname
  1021. X
  1022. X    or
  1023. X
  1024. X    myname@myhost.domain
  1025. X
  1026. X";
  1027. X$dflt = $maintloc || "$logname@$hostname$mydomain";
  1028. X$maintloc = do myread("What is the network mailing address? ", $dflt);
  1029. X
  1030. Xprint "\n";
  1031. X$dflt = ($ftpsite ? 'y' : 'n');
  1032. X$ans = do myread(
  1033. X    "Will you put patches where they can be acquired by anonymous FTP? ",$dflt);
  1034. Xif ($ans =~ /^n/i) {
  1035. X    $ftpsite='';
  1036. X}
  1037. Xelse {
  1038. X    print "\n";
  1039. X    $dflt = $ftpsite;
  1040. X    ($dflt = $maintloc) =~ s/.*@([^\s,()]*).*/$1/ unless $dflt;
  1041. X    $ftpsite = do myread("What is the Internet sitename for that? ",$dflt);
  1042. X}
  1043. X
  1044. Xprint "\n";
  1045. X$dflt = $orgname || $ENV{'ORGANIZATION'};
  1046. X$orgname = do myread("Organization: ",$dflt);
  1047. X
  1048. Xprint "\n";
  1049. X$dflt = $newsgroups || 'comp.sources.bugs';
  1050. X$newsgroups = do myread("Newsgroup(s) to post patches to: ", $dflt);
  1051. X
  1052. Xprint "\n";
  1053. X$dflt = $recipients || 'source-archives@mirror.TMC.COM';
  1054. X$recipients = do myread("Recipient(s) to send patches to: ",$dflt);
  1055. X
  1056. Xprint "\n";
  1057. Xif ($ftpsite) {
  1058. X    $dflt = $ftpdir || "/usr/spool/ftp/pub/$package.$baserev/patches";
  1059. X    $ftpdir = do myread("FTP directory to copy patches to: ",$dflt);
  1060. X}
  1061. Xelse {
  1062. X    $ftpdir = '';
  1063. X}
  1064. X
  1065. Xprint "\nCreating .package...\n";
  1066. Xopen(PACKAGE, '>.package') || die "Can't create .package";
  1067. Xprint PACKAGE
  1068. X": basic variables
  1069. Xpackage=$package
  1070. Xbaserev=$baserev
  1071. Xpatchbranch=$patchbranch
  1072. Xmydiff='$mydiff'
  1073. Xmaintname='$maintname'
  1074. Xmaintloc='$maintloc'
  1075. Xftpsite='$ftpsite'
  1076. Xorgname='$orgname'
  1077. Xnewsgroups='$newsgroups'
  1078. Xrecipients='$recipients'
  1079. Xftpdir='$ftpdir'
  1080. X
  1081. X: derivative variables--do not change
  1082. Xrevbranch=\"\$baserev.\$patchbranch\"
  1083. Xpackver='$mypackver'
  1084. X";
  1085. X
  1086. X!NO!SUBS!
  1087. Xcat pl/package.pl >>packinit
  1088. Xcat pl/logname.pl >>packinit
  1089. Xcat pl/fullname.pl >>packinit
  1090. Xchmod 755 packinit
  1091. X$eunicefix packinit
  1092. !STUFFY!FUNK!
  1093. echo Extracting pat/pat.man
  1094. sed >pat/pat.man <<'!STUFFY!FUNK!' -e 's/X//'
  1095. X.rn '' }`
  1096. X''' $Header: pat.man,v 2.0 88/06/28 23:19:20 lwall Locked $
  1097. X''' 
  1098. X''' $Log:    pat.man,v $
  1099. X''' Revision 2.0  88/06/28  23:19:20  lwall
  1100. X''' Baseline.
  1101. X''' 
  1102. X''' 
  1103. X.de Sh
  1104. X.br
  1105. X.ne 5
  1106. X.PP
  1107. X\fB\\$1\fR
  1108. X.PP
  1109. X..
  1110. X.de Sp
  1111. X.if t .sp .5v
  1112. X.if n .sp
  1113. X..
  1114. X'''
  1115. X'''     Set up \*(-- to give an unbreakable dash;
  1116. X'''     string Tr holds user defined translation string.
  1117. X'''
  1118. X.ie n \{\
  1119. X.tr \(*W-\*(Tr
  1120. X.ds -- \(*W-
  1121. X.if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
  1122. X.if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
  1123. X.ds L" ""
  1124. X.ds R" ""
  1125. X.ds L' '
  1126. X.ds R' '
  1127. X'br\}
  1128. X.el\{\
  1129. X.ds -- \(em\|
  1130. X.tr \*(Tr
  1131. X.ds L" ``
  1132. X.ds R" ''
  1133. X.ds L' `
  1134. X.ds R' '
  1135. X'br\}
  1136. X.TH PAT 1 LOCAL
  1137. X.SH NAME
  1138. Xpat,patcil,patdiff,patbase,patmake,patsend,patpost,patftp - patch generator
  1139. X.SH SYNOPSIS
  1140. X.B pat
  1141. X[options] [filelist]
  1142. X.br
  1143. X.B patcil
  1144. X[options] [filelist]
  1145. X.br
  1146. X.B patdiff
  1147. X[options] [filelist]
  1148. X.br
  1149. X.B patbase
  1150. X[options] [filelist]
  1151. X.br
  1152. X.B patmake
  1153. X[patch#]
  1154. X.br
  1155. X.B patsend
  1156. X[patchlist] [recipients]
  1157. X.br
  1158. X.B patpost
  1159. X[patchlist] [newsgroups]
  1160. X.br
  1161. X.B patftp
  1162. X[patchlist]
  1163. X.SH DESCRIPTION
  1164. X.I Pat
  1165. Xand its associated programs generate patches for any package that has been
  1166. Xstored under RCS.
  1167. XThese programs hide many of the details of RCS that get in your way when
  1168. Xconstructing and maintaining a package.
  1169. XAll you need to do to create a new patch is to edit your files, run pat,
  1170. Xand furnish some descriptions to RCS and in the generated patch file.
  1171. XDetails such as how to initialize a new RCS file, what the comment string should
  1172. Xbe, how create a new branch,
  1173. Xhow to deal with subdirectories, how to do diffs and how to
  1174. Xorganize the patch file are handled automatically.
  1175. X.PP
  1176. XBefore using any of the pat programs you must initialize your package by
  1177. Xrunning packinit in the top-level directory of your package.
  1178. XThis produces a .package file that all of the dist programs make use of.
  1179. X.PP
  1180. XIn any of the programs that want a filelist, if you specify
  1181. X.B \-a
  1182. Xinstead,
  1183. Xall files in MANIFEST.new will be processed.
  1184. XIn any of the programs that want a patchlist, a null patchlist means the
  1185. Xcurrent patch.
  1186. XYou may use hyphens, commas and spaces to delimit patch numbers.
  1187. XIf the right side of a hyphen is the null string, the current patchlevel
  1188. Xis assumed as the maximum value.
  1189. X.PP
  1190. XPat itself is a wrapper program that calls patcil, patdiff, and patmake.
  1191. XUsually you can just invoke pat and ignore all the others.
  1192. XIf you specify
  1193. X.B \-n
  1194. Xinstead of a filelist, pat will find all files that are
  1195. Xnewer than patchlevel.h, put you into an editor to trim down the list,
  1196. Xthen use that file list.
  1197. X.PP
  1198. XPatcil is used to do a ci -l on any listed files.
  1199. X(It is assumed that you always want to keep your files checked out.)
  1200. XIn addition to the
  1201. X.B \-a
  1202. Xswitch, there is a
  1203. X.B \-b
  1204. Xswitch which does a quick checkin of
  1205. Xa set of files.
  1206. XInstead of calling rcs on each file, it calls rcs on the whole list of
  1207. Xfiles.
  1208. XThis is useful for checking in a trunk revision.
  1209. XWhen you are checking in a new trunk revision you might also want to use
  1210. Xthe
  1211. X.B \-s
  1212. Xflag which will strip out old RCS Log entries from the previous revision
  1213. Xso that you can start over fresh.
  1214. XYou probably should also use a
  1215. X.B \-f
  1216. Xwhich is passed through to the ci to force unchanged files to be checked in.
  1217. XTo check in a new trunk revision, I say
  1218. X.nf
  1219. X
  1220. X    patcil -s -f -a
  1221. X
  1222. X.fi
  1223. X.PP
  1224. XPatcil will ask for the log entry instead of letting ci do it, and has a little
  1225. Xprompter built in that lets you manipulate the message in various ways.
  1226. XType h for a listing of what you can do.
  1227. XOne of the nicest things is that you can pop up into an editor, optionally
  1228. Xwith a diff listing of the changes since the last patch, in case you've
  1229. Xforgotten what you changed.
  1230. XIf you type a CR as the first thing, it includes the
  1231. Xprevious log message.
  1232. XExit the prompter with a CR.
  1233. X.PP
  1234. XThere are two different ways to use patcil.
  1235. XYou can either call patcil yourself, or let pat call it for you.
  1236. XIt doesn't matter how many times you call patcil before running pat, since
  1237. Xpatdiff knows what the last patch base is to compare with.
  1238. XPatcil can be called in any of your directories; the other programs must
  1239. Xbe called in your top-level directory (or in bugs, when meaningful).
  1240. X.PP
  1241. XPatbase can be used to reset the patch base to the current version when
  1242. Xyou've scrapped the previous patch sequence and are making a new distribution
  1243. Xkit.
  1244. XWhat it really does is an rcs -Nlastpat:REV, where REV is the current
  1245. Xrevision.
  1246. XIf patdiff blows up and you want to set the patch base back to some previous
  1247. Xversion, you have to call rcs -Nlastpat:REV yourself.
  1248. X.PP
  1249. XPatdiff actually does the diffs that go into the patch, comparing whatever
  1250. Xversion -Nlastpat points to with the most recently checked in version.
  1251. XIt then updates -Nlastpat to point to the current version.
  1252. XIt leaves the diff sitting in the bugs subdirectory for patmake to pick up.
  1253. XIt can either use rcsdiff, or a diff command of your choice specified when
  1254. Xyou run packinit, in case your diff is better than rcsdiff.
  1255. X.PP
  1256. XPatmake combines all the pieces of the patch into one file and invokes
  1257. Xan editor so you can add the subject and description.
  1258. XIt throws all your log messages in as Subjects and as Description, under
  1259. Xthe assumption
  1260. Xthat it's easier to delete what you don't want than to remember everything
  1261. Xyou did.
  1262. XYou'll also want to expand each item in the Description so they don't just
  1263. Xrepeat the Subject lines.
  1264. X.PP
  1265. XPatsend, patpost and patftp are used to distribute your patches to the world.
  1266. XPatsend mails a set of patches to a set of recipients.
  1267. XPatpost posts a set of patches to a set of newsgroups.
  1268. XPatftp merely copies the patch into your public ftp directory.
  1269. X.SH ENVIRONMENT
  1270. XNo environment variables are used by
  1271. X.IR metaconfig .
  1272. X.SH FILES
  1273. Xbugs/*
  1274. X.SH SEE ALSO
  1275. Xmetaconfig(1)
  1276. X.br
  1277. Xmakedist(1)
  1278. X.SH DIAGNOSTICS
  1279. X.SH CAVEATS
  1280. X.SH BUGS
  1281. XMost of this should be built into RCS.
  1282. X.rn }` ''
  1283. !STUFFY!FUNK!
  1284. echo Extracting mcon/U/models.U
  1285. sed >mcon/U/models.U <<'!STUFFY!FUNK!' -e 's/X//'
  1286. X?RCS:$Header: models.U,v 2.0 88/06/28 23:17:24 lwall Locked $
  1287. X?RCS: $Log:    models.U,v $
  1288. X?RCS: Revision 2.0  88/06/28  23:17:24  lwall
  1289. X?RCS: Baseline.
  1290. X?RCS: 
  1291. X?MAKE:models split small medium large huge ccflags ldflags: test cat echo n c Myread Cppsym
  1292. X?MAKE:    -pick add $@ %*
  1293. X?S:models:
  1294. X?S:    This variable contains the list of memory models supported by this
  1295. X?S:    system.  Possible component values are none, split, unsplit, small,
  1296. X?S:    medium, large, and huge.  The component values are space separated.
  1297. X?S:.
  1298. X?S:split:
  1299. X?S:    This variable contains a flag which will tell the C compiler and loader
  1300. X?S:    to produce a program that will run in separate I and D space, for those
  1301. X?S:    machines that support separation of instruction and data space.  It is
  1302. X?S:    up to the Makefile to use this.
  1303. X?S:.
  1304. X?S:small:
  1305. X?S:    This variable contains a flag which will tell the C compiler and loader
  1306. X?S:    to produce a program running with a small memory model.  It is up to
  1307. X?S:    the Makefile to use this.
  1308. X?S:.
  1309. X?S:medium:
  1310. X?S:    This variable contains a flag which will tell the C compiler and loader
  1311. X?S:    to produce a program running with a medium memory model.  If the
  1312. X?S:    medium model is not supported, contains the flag to produce large
  1313. X?S:    model programs.  It is up to the Makefile to use this.
  1314. X?S:.
  1315. X?S:large:
  1316. X?S:    This variable contains a flag which will tell the C compiler and loader
  1317. X?S:    to produce a program running with a large memory model.  It is up to
  1318. X?S:    the Makefile to use this.
  1319. X?S:.
  1320. X?S:huge:
  1321. X?S:    This variable contains a flag which will tell the C compiler and loader
  1322. X?S:    to produce a program running with a huge memory model.  If the
  1323. X?S:    huge model is not supported, contains the flag to produce large
  1324. X?S:    model programs.  It is up to the Makefile to use this.
  1325. X?S:.
  1326. X?S:ccflags:
  1327. X?S:    This variable contains any additional C compiler flags desired by
  1328. X?S:    the user.  It is up to the Makefile to use this.
  1329. X?S:.
  1330. X?S:ldflags:
  1331. X?S:    This variable contains any additional C loader flags desired by
  1332. X?S:    the user.  It is up to the Makefile to use this.
  1333. X?S:.
  1334. X: see what memory models we can support
  1335. Xcase "$models" in
  1336. X'')
  1337. X    if Cppsym pdp11; then
  1338. X    dflt='unsplit split'
  1339. X    else
  1340. X    ans=`loc . X /lib/small /lib/large /usr/lib/small /usr/lib/large /lib/medium /usr/lib/medium /lib/huge`
  1341. X    case "$ans" in
  1342. X    X) dflt='none';;
  1343. X    *)  if $test -d /lib/small || $test -d /usr/lib/small; then
  1344. X        dflt='small'
  1345. X        else
  1346. X        dflt=''
  1347. X        fi
  1348. X        if $test -d /lib/medium || $test -d /usr/lib/medium; then
  1349. X        dflt="$dflt medium"
  1350. X        fi
  1351. X        if $test -d /lib/large || $test -d /usr/lib/large; then
  1352. X        dflt="$dflt large"
  1353. X        fi
  1354. X        if $test -d /lib/huge || $test -d /usr/lib/huge; then
  1355. X        dflt="$dflt huge"
  1356. X        fi
  1357. X    esac
  1358. X    fi
  1359. X    ;;
  1360. X*)  dflt="$models" ;;
  1361. Xesac
  1362. X$cat <<EOM
  1363. XSome systems have different model sizes.  On most systems they are called
  1364. Xsmall, medium, large, and huge.  On the PDP11 they are called unsplit and
  1365. Xsplit.  If your system doesn't support different memory models, say "none".
  1366. XIf you wish to force everything to one memory model, say "none" here and
  1367. Xput the appropriate flags later when it asks you for other cc and ld flags.
  1368. XVenix systems may wish to put "none" and let the compiler figure things out.
  1369. X(In the following question multiple model names should be space separated.)
  1370. X
  1371. XEOM
  1372. Xrp="Which models are supported? [$dflt]"
  1373. X$echo $n "$rp $c"
  1374. X. myread
  1375. Xmodels="$ans"
  1376. X
  1377. Xcase "$models" in
  1378. Xnone)
  1379. X    small=''
  1380. X    medium=''
  1381. X    large=''
  1382. X    huge=''
  1383. X    unsplit=''
  1384. X    split=''
  1385. X    ;;
  1386. X*split)
  1387. X    case "$split" in
  1388. X    '') 
  1389. X    if $contains '\-i' $mansrc/ld.1 >/dev/null 2>&1 || \
  1390. X       $contains '\-i' $mansrc/cc.1 >/dev/null 2>&1; then
  1391. X        dflt='-i'
  1392. X    else
  1393. X        dflt='none'
  1394. X    fi
  1395. X    ;;
  1396. X    *) dflt="$split";;
  1397. X    esac
  1398. X    rp="What flag indicates separate I and D space? [$dflt]"
  1399. X    $echo $n "$rp $c"
  1400. X    . myread
  1401. X    case "$ans" in
  1402. X    none) ans='';;
  1403. X    esac
  1404. X    split="$ans"
  1405. X    unsplit=''
  1406. X    ;;
  1407. X*large*|*small*|*medium*|*huge*)
  1408. X    case "$model" in
  1409. X    *large*)
  1410. X    case "$large" in
  1411. X    '') dflt='-Ml';;
  1412. X    *) dflt="$large";;
  1413. X    esac
  1414. X    rp="What flag indicates large model? [$dflt]"
  1415. X    $echo $n "$rp $c"
  1416. X    . myread
  1417. X    case "$ans" in
  1418. X    none) ans='';
  1419. X    esac
  1420. X    large="$ans"
  1421. X    ;;
  1422. X    *) large='';;
  1423. X    esac
  1424. X    case "$model" in
  1425. X    *huge*)
  1426. X    case "$huge" in
  1427. X    '') dflt='-Mh';;
  1428. X    *) dflt="$huge";;
  1429. X    esac
  1430. X    rp="What flag indicates huge model? [$dflt]"
  1431. X    $echo $n "$rp $c"
  1432. X    . myread
  1433. X    case "$ans" in
  1434. X    none) ans='';
  1435. X    esac
  1436. X    huge="$ans"
  1437. X    ;;
  1438. X    *) huge="$large";;
  1439. X    esac
  1440. X    case "$model" in
  1441. X    *medium*)
  1442. X    case "$medium" in
  1443. X    '') dflt='-Mm';;
  1444. X    *) dflt="$medium";;
  1445. X    esac
  1446. X    rp="What flag indicates medium model? [$dflt]"
  1447. X    $echo $n "$rp $c"
  1448. X    . myread
  1449. X    case "$ans" in
  1450. X    none) ans='';
  1451. X    esac
  1452. X    medium="$ans"
  1453. X    ;;
  1454. X    *) medium="$large";;
  1455. X    esac
  1456. X    case "$model" in
  1457. X    *small*)
  1458. X    case "$small" in
  1459. X    '') dflt='none';;
  1460. X    *) dflt="$small";;
  1461. X    esac
  1462. X    rp="What flag indicates small model? [$dflt]"
  1463. X    $echo $n "$rp $c"
  1464. X    . myread
  1465. X    case "$ans" in
  1466. X    none) ans='';
  1467. X    esac
  1468. X    small="$ans"
  1469. X    ;;
  1470. X    *) small='';;
  1471. X    esac
  1472. X    ;;
  1473. X*)
  1474. X    echo "Unrecognized memory models--you may have to edit Makefile.SH"
  1475. X    ;;
  1476. Xesac
  1477. X
  1478. Xcase "$ccflags" in
  1479. X'') dflt='none';;
  1480. X*) dflt="$ccflags";;
  1481. Xesac
  1482. Xecho " "
  1483. Xrp="Any additional cc flags? [$dflt]"
  1484. X$echo $n "$rp $c"
  1485. X. myread
  1486. Xcase "$ans" in
  1487. Xnone) ans='';
  1488. Xesac
  1489. Xccflags="$ans"
  1490. X
  1491. Xcase "$ldflags" in
  1492. X'') if venix; then
  1493. X    dflt='-i -z'
  1494. X    else
  1495. X    dflt='none'
  1496. X    fi
  1497. X    ;;
  1498. X*) dflt="$ldflags";;
  1499. Xesac
  1500. Xecho " "
  1501. Xrp="Any additional ld flags? [$dflt]"
  1502. X$echo $n "$rp $c"
  1503. X. myread
  1504. Xcase "$ans" in
  1505. Xnone) ans='';
  1506. Xesac
  1507. Xldflags="$ans"
  1508. X
  1509. !STUFFY!FUNK!
  1510. echo Extracting mcon/U/Loc.U
  1511. sed >mcon/U/Loc.U <<'!STUFFY!FUNK!' -e 's/X//'
  1512. X?RCS:$Header: Loc.U,v 2.0 88/06/28 23:13:25 lwall Locked $
  1513. X?X: 
  1514. X?X: This unit produces a shell script "loc" which can be used to find out
  1515. X?X: where in a list of directories something is.  It then uses loc to
  1516. X?X: determine the location of commonly used programs.  It leaves loc sitting
  1517. X?X: around for other Configure units to use, but arranges for its demise
  1518. X?X: at the end of Configure.
  1519. X?X: 
  1520. X?X: To add a new program to find, add it both to the ?MAKE: line and to either
  1521. X?X: the loclist or trylist variable.
  1522. X?X: 
  1523. X?RCS: $Log:    Loc.U,v $
  1524. X?RCS: Revision 2.0  88/06/28  23:13:25  lwall
  1525. X?RCS: Baseline.
  1526. X?RCS: 
  1527. X?MAKE:Loc loclist expr sed echo cat rm mv cp tail tr mkdir sort uniq grep trylist test inews egrep more pg Mcc vi mailx mail cpp: startsh eunicefix n c Myread Oldconfig
  1528. X?MAKE:    -pick weed $@ %*
  1529. X?INIT:pth="/usr/ucb /bin /usr/bin /usr/local /usr/local/bin /usr/lbin /etc /usr/lib /lib"
  1530. X: find out where common programs are
  1531. Xecho " "
  1532. Xecho "Locating common programs..."
  1533. Xcat <<EOSC >loc
  1534. X$startsh
  1535. Xcase \$# in
  1536. X0) exit 1;;
  1537. Xesac
  1538. Xthing=\$1
  1539. Xshift
  1540. Xdflt=\$1
  1541. Xshift
  1542. Xfor dir in \$*; do
  1543. X    case "\$thing" in
  1544. X    .)
  1545. X    if test -d \$dir/\$thing; then
  1546. X        echo \$dir
  1547. X        exit 0
  1548. X    fi
  1549. X    ;;
  1550. X    *)
  1551. X    if test -f \$dir/\$thing; then
  1552. X        echo \$dir/\$thing
  1553. X        exit 0
  1554. X    elif test -f \$dir/\$thing.exe; then
  1555. X        : on Eunice apparently
  1556. X        echo \$dir/\$thing
  1557. X        exit 0
  1558. X    fi
  1559. X    ;;
  1560. X    esac
  1561. Xdone
  1562. Xecho \$dflt
  1563. Xexit 1
  1564. XEOSC
  1565. Xchmod +x loc
  1566. X$eunicefix loc
  1567. Xloclist="
  1568. X?expr:expr
  1569. X?sed:sed
  1570. X?echo:echo
  1571. X?cat:cat
  1572. X?rm:rm
  1573. X?mv:mv
  1574. X?cp:cp
  1575. X?tail:tail
  1576. X?tr:tr
  1577. X?mkdir:mkdir
  1578. X?sort:sort
  1579. X?uniq:uniq
  1580. X?grep:grep
  1581. X"
  1582. Xtrylist="
  1583. X?test:test
  1584. X?inews:inews
  1585. X?egrep:egrep
  1586. X?more:more
  1587. X?pg:pg
  1588. X?Mcc:Mcc
  1589. X?vi:vi
  1590. X?mailx:mailx
  1591. X?mail:mail
  1592. X?cpp:cpp
  1593. X"
  1594. Xfor file in $loclist; do
  1595. X    xxx=`loc $file $file $pth`
  1596. X    eval $file=$xxx
  1597. X    eval _$file=$xxx
  1598. X    case "$xxx" in
  1599. X    /*)
  1600. X    echo $file is in $xxx.
  1601. X    ;;
  1602. X    *)
  1603. X    echo "I don't know where $file is.  I hope it's in everyone's PATH."
  1604. X    ;;
  1605. X    esac
  1606. Xdone
  1607. Xecho " "
  1608. Xecho "Don't worry if any of the following aren't found..."
  1609. Xans=offhand
  1610. Xfor file in $trylist; do
  1611. X    xxx=`loc $file $file $pth`
  1612. X    eval $file=$xxx
  1613. X    eval _$file=$xxx
  1614. X    case "$xxx" in
  1615. X    /*)
  1616. X    echo $file is in $xxx.
  1617. X    ;;
  1618. X    *)
  1619. X    echo "I don't see $file out there, $ans."
  1620. X    ans=either
  1621. X    ;;
  1622. X    esac
  1623. Xdone
  1624. Xcase "$egrep" in
  1625. Xegrep)
  1626. X    echo "Substituting grep for egrep."
  1627. X    egrep=$grep
  1628. X    ;;
  1629. Xesac
  1630. Xcase "$test" in
  1631. Xtest)
  1632. X    echo "Hopefully test is built into your sh."
  1633. X    ;;
  1634. X/bin/test)
  1635. X    echo " "
  1636. X    dflt=n
  1637. X    rp="Is your "'"'"test"'"'" built into sh? [$dflt] (OK to guess)"
  1638. X?X: we don't know how $echo treats $n and $c yet, so use builtin
  1639. X    echo $n "$rp $c"
  1640. X    . myread
  1641. X    case "$ans" in
  1642. X    y*) test=test ;;
  1643. X    esac
  1644. X    ;;
  1645. X*)
  1646. X    test=test
  1647. X    ;;
  1648. Xesac
  1649. Xcase "$echo" in
  1650. Xecho)
  1651. X    echo "Hopefully echo is built into your sh."
  1652. X    ;;
  1653. X/bin/echo)
  1654. X    echo " "
  1655. X    echo "Checking compatibility between /bin/echo and builtin echo (if any)..."
  1656. X    $echo $n "hi there$c" >foo1
  1657. X    echo $n "hi there$c" >foo2
  1658. X    if cmp foo1 foo2 >/dev/null 2>&1; then
  1659. X    echo "They are compatible.  In fact, they may be identical."
  1660. X    else
  1661. X    case "$n" in
  1662. X    '-n') n='' c='\c' ans='\c' ;;
  1663. X    *) n='-n' c='' ans='-n' ;;
  1664. X    esac
  1665. X    cat <<FOO
  1666. XThey are not compatible!  You are probably running ksh on a non-USG system.
  1667. XI'll have to use /bin/echo instead of the builtin, since Bourne shell doesn't
  1668. Xhave echo built in and we may have to run some Bourne shell scripts.  That
  1669. Xmeans I'll have to use $ans to suppress newlines now.  Life is ridiculous.
  1670. X
  1671. XFOO
  1672. X    rp="Your cursor should be here-->"
  1673. X    $echo $n "$rp$c"
  1674. X    . myread
  1675. X    fi
  1676. X    $rm -f foo1 foo2
  1677. X    ;;
  1678. X*)
  1679. X    : cross your fingers
  1680. X    echo=echo
  1681. X    ;;
  1682. Xesac
  1683. Xrmlist="$rmlist loc"
  1684. X
  1685. !STUFFY!FUNK!
  1686. echo Extracting pl/logname.pl
  1687. sed >pl/logname.pl <<'!STUFFY!FUNK!' -e 's/X//'
  1688. Xsub getlogname {
  1689. X    local($logname) = $ENV{'USER'};
  1690. X    $logname = $ENV{'LOGNAME'} unless $logname;
  1691. X    chop($logname = `who am i`) unless $logname;
  1692. X    $logname =~ s/\s.*//;
  1693. X    $logname =~ s/.*!//;
  1694. X    $logname;
  1695. X}
  1696. X
  1697. !STUFFY!FUNK!
  1698. echo Extracting mcon/U/cppstdin.U
  1699. sed >mcon/U/cppstdin.U <<'!STUFFY!FUNK!' -e 's/X//'
  1700. X?RCS:$Header: cppstdin.U,v 1.0.1.1 88/01/21 22:53:18 lwall Exp $
  1701. X?RCS: $Log:    cppstdin.U,v $
  1702. X?RCS: Revision 1.0.1.1  88/01/21  22:53:18  lwall
  1703. X?RCS: Now assumes input to cpp will be via stdin.  cppminus is '-' if necessary.
  1704. X?RCS: 
  1705. X?RCS: Revision 1.0  87/05/22  12:30:23  lwall
  1706. X?RCS: Initial revision
  1707. X?RCS: 
  1708. X?MAKE:cppstdin cppminus: contains echo n c Myread Oldconfig Loc cpp
  1709. X?MAKE:    -pick add $@ %*
  1710. X?S:cppstdin:
  1711. X?S:    This variable contains the command which will invoke the C
  1712. X?S:    preprocessor on standard input and put the output to stdout.
  1713. X?S:    It is primarily used by other Configure units that ask about
  1714. X?S:    preprocessor symbols.
  1715. X?S:.
  1716. X?S:cppminus:
  1717. X?S:    This variable contains the second part of the string which will invoke
  1718. X?S:    the C preprocessor on the standard input and produce to standard
  1719. X?S:    output.  This variable will have the value "-" if cppstdin needs a minus
  1720. X?S:    to specify standard input, otherwise the value is "".
  1721. X?S:.
  1722. X?C:CPPSTDIN:
  1723. X?C:    This symbol contains the first part of the string which will invoke
  1724. X?C:    the C preprocessor on the standard input and produce to standard
  1725. X?C:    output.     Typical value of "cc -E" or "/lib/cpp".
  1726. X?C:.
  1727. X?C:CPPMINUS:
  1728. X?C:    This symbol contains the second part of the string which will invoke
  1729. X?C:    the C preprocessor on the standard input and produce to standard
  1730. X?C:    output.  This symbol will have the value "-" if CPPSTDIN needs a minus
  1731. X?C:    to specify standard input, otherwise the value is "".
  1732. X?C:.
  1733. X?H:?%1:#define CPPSTDIN "$cppstdin"
  1734. X?H:?%1:#define CPPMINUS "$cppminus"
  1735. X?H:?%1:
  1736. X: see how we invoke the C preprocessor
  1737. Xecho " "
  1738. Xecho "Now, how can we feed standard input to your C preprocessor..."
  1739. Xcat <<'EOT' >testcpp.c
  1740. X#define ABC abc
  1741. X#define XYZ xyz
  1742. XABC.XYZ
  1743. XEOT
  1744. Xecho 'Maybe "'$cpp'" will work...'
  1745. X$cpp <testcpp.c >testcpp.out 2>&1
  1746. Xif $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1747. X    echo "Yup, it does."
  1748. X    cppstdin="$cpp"
  1749. X    cppminus='';
  1750. Xelse
  1751. X    echo 'Nope, maybe "'$cpp' -" will work...'
  1752. X    $cpp - <testcpp.c >testcpp.out 2>&1
  1753. X    if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1754. X    echo "Yup, it does."
  1755. X    cppstdin="$cpp"
  1756. X    cppminus='-';
  1757. X    else
  1758. X    echo 'No such luck...maybe "cc -E" will work...'
  1759. X    cc -E <testcpp.c >testcpp.out 2>&1
  1760. X    if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1761. X        echo "It works!"
  1762. X        cppstdin='cc -E'
  1763. X        cppminus='';
  1764. X    else
  1765. X        echo 'Nixed again...maybe "cc -E -" will work...'
  1766. X        cc -E - <testcpp.c >testcpp.out 2>&1
  1767. X        if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1768. X        echo "Hooray, it works!  I was beginning to wonder."
  1769. X        cppstdin='cc -E'
  1770. X        cppminus='-';
  1771. X        else
  1772. X        echo 'Nope...maybe "cc -P" will work...'
  1773. X        cc -P <testcpp.c >testcpp.out 2>&1
  1774. X        if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1775. X            echo "Yup, that does."
  1776. X            cppstdin='cc -P'
  1777. X            cppminus='';
  1778. X        else
  1779. X            echo 'Nope...maybe "cc -P -" will work...'
  1780. X            cc -P - <testcpp.c >testcpp.out 2>&1
  1781. X            if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1782. X            echo "Yup, that does."
  1783. X            cppstdin='cc -P'
  1784. X            cppminus='-';
  1785. X            else
  1786. X            echo 'Hmm...perhaps you already told me...'
  1787. X            case "$cppstdin" in
  1788. X            '') ;;
  1789. X            *) $cppstdin $cppminus <testcpp.c >testcpp.out 2>&1;;
  1790. X            esac
  1791. X            if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1792. X                echo "Hooray, you did!  I was beginning to wonder."
  1793. X            else
  1794. X                echo 'Uh-uh.  Time to get fancy...'
  1795. X                echo 'Trying (cat >/tmp/$$.c; cc -E /tmp/$$.c; rm /tmp/$$.c)'
  1796. X                cppstdin='(cat >/tmp/$$.c; cc -E /tmp/$$.c; rm /tmp/$$.c)'
  1797. X                cppminus='';
  1798. X                $cppstdin <testcpp.c >testcpp.out 2>&1
  1799. X                if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1800. X                echo "Eureka!."
  1801. X                else
  1802. X                dflt=blurfl
  1803. X                $echo $n "No dice.  I can't find a C preprocessor.  Name one: $c"
  1804. X                rp='Name a C preprocessor:'
  1805. X                . myread
  1806. X                cppstdin="$ans"
  1807. X                $cppstdin <testcpp.c >testcpp.out 2>&1
  1808. X                if $contains 'abc.*xyz' testcpp.out >/dev/null 2>&1 ; then
  1809. X                    echo "OK, that will do."
  1810. X                else
  1811. X                    echo "Sorry, I can't get that to work.  Go find one."
  1812. X                    exit 1
  1813. X                fi
  1814. X                fi
  1815. X            fi
  1816. X            fi
  1817. X        fi
  1818. X        fi
  1819. X    fi
  1820. X    fi
  1821. Xfi
  1822. Xrm -f testcpp.c testcpp.out
  1823. X
  1824. !STUFFY!FUNK!
  1825. echo ""
  1826. echo "End of kit 2 (of 7)"
  1827. cat /dev/null >kit2isdone
  1828. run=''
  1829. config=''
  1830. for iskit in 1 2 3 4 5 6 7; do
  1831.     if test -f kit${iskit}isdone; then
  1832.     run="$run $iskit"
  1833.     else
  1834.     todo="$todo $iskit"
  1835.     fi
  1836. done
  1837. case $todo in
  1838.     '')
  1839.     echo "You have run all your kits.  Please read README and then type Configure."
  1840.     chmod 755 Configure
  1841.     ;;
  1842.     *)  echo "You have run$run."
  1843.     echo "You still need to run$todo."
  1844.     ;;
  1845. esac
  1846. : Someone might mail this, so...
  1847. exit
  1848.  
  1849.