summaryrefslogtreecommitdiff
path: root/bin/package
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
committerIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
commit3950ffe2a485479f6561c27364d3d7df5a21d124 (patch)
tree468c6e14449d1b1e279222ec32f676b0311917d2 /bin/package
downloadksh-3950ffe2a485479f6561c27364d3d7df5a21d124.tar.gz
Imported Upstream version 93u+upstream
Diffstat (limited to 'bin/package')
-rwxr-xr-xbin/package7284
1 files changed, 7284 insertions, 0 deletions
diff --git a/bin/package b/bin/package
new file mode 100755
index 0000000..f7f4c86
--- /dev/null
+++ b/bin/package
@@ -0,0 +1,7284 @@
+USAGE_LICENSE="[-author?Glenn Fowler <gsf@research.att.com>][-copyright?Copyright (c) 1994-2012 AT&T Intellectual Property][-license?http://www.eclipse.org/org/documents/epl-v10.html][--catalog?INIT]"
+### this script contains archaic constructs that work with all sh variants ###
+# package - source and binary package control
+# Glenn Fowler <gsf@research.att.com>
+
+command=package
+
+case $-:$BASH_VERSION in
+*x*:[0123456789]*) : bash set -x is broken :; set +ex ;;
+esac
+
+# ksh checks -- ksh between 2007-11-05 and 2011-11-11 conflict with new -lcmd -- wea culpa
+checksh()
+{
+ egrep 'Version.*(88|1993)' $1 >/dev/null 2>&1 ||
+ $1 -c '(( .sh.version >= 20111111 ))' >/dev/null 2>&1
+}
+
+case $_AST_BIN_PACKAGE_:$SHELL:$0 in
+1:*|*:/bin/sh:*)
+ ;;
+*:*/*:*/*)
+ _AST_BIN_PACKAGE_=1 # prevent non-interactive sh .rc referencing bin/package recursion #
+ export _AST_BIN_PACKAGE_
+ if checksh $SHELL
+ then : no -lcmd conflict :
+ else case " $* " in
+ *" debug "*|*" DEBUG "*|*" show "*)
+ echo $command: $SHELL: warning: possible -lcmd conflict -- falling back to /bin/sh >&2
+ ;;
+ esac
+ SHELL=/bin/sh
+ export SHELL
+ exec $SHELL "$0" "$@"
+ fi
+ ;;
+esac
+
+LC_ALL=C
+export LC_ALL
+
+src="cmd contrib etc lib"
+use="/usr/common /exp /usr/local /usr/add-on /usr/addon /usr/tools /usr /opt"
+usr="/home"
+lib="" # nee /usr/local/lib /usr/local/shlib
+ccs="/usr/kvm /usr/ccs/bin"
+org="gnu GNU"
+makefiles="Mamfile Nmakefile nmakefile Makefile makefile"
+env="HOSTTYPE NPROC PACKAGEROOT INSTALLROOT PATH"
+checksum=md5sum
+checksum_commands="$checksum md5"
+checksum_empty="d41d8cd98f00b204e9800998ecf8427e"
+
+package_use='=$HOSTTYPE=$PACKAGEROOT=$INSTALLROOT=$EXECROOT=$CC='
+
+PACKAGE_admin_tail_timeout=${PACKAGE_admin_tail_timeout:-"1m"}
+
+CROSS=0
+
+admin_db=admin.db
+admin_env=admin.env
+admin_ditto="ditto --checksum --delete --verbose"
+admin_ditto_update=--update
+admin_ditto_skip="OFFICIAL|core|old|*.core|*.tmp|.nfs*"
+admin_list='PACKAGE.$type.lst'
+admin_ping="ping -c 1 -w 5"
+
+default_url=default.url
+MAKESKIP=${MAKESKIP:-"*[-.]*"}
+RATZ=ratz
+SED=
+TAR=tar
+TARFLAGS=xv
+TARPROBE=B
+TR=
+
+all_types='*.*|sun4' # all but sun4 match *.*
+
+case `(getopts '[-][123:xyz]' opt --xyz; echo 0$opt) 2>/dev/null` in
+0123) USAGE=$'
+[-?
+@(#)$Id: package (AT&T Research) 2012-02-29 $
+]'$USAGE_LICENSE$'
+[+NAME?package - source and binary package control]
+[+DESCRIPTION?The \bpackage\b command controls source and binary
+ packages. It is a \bsh\b(1) script coded for maximal portability. All
+ package files are in the \b$PACKAGEROOT\b directory tree.
+ \b$PACKAGEROOT\b must at minumum contain a \bbin/package\b command or a
+ \blib/package\b directory. Binary package files are in the
+ \b$INSTALLROOT\b (\b$PACKAGEROOT/arch/\b\ahosttype\a) tree, where
+ \ahosttpe\a=`\bpackage\b`. All \aactions\a but \bhost\b and \buse\b
+ require the current directory to be under \b$PACKAGEROOT\b. See
+ \bDETAILS\b for more information.]
+[+?Note that no environment variables need be set by the user;
+ \bpackage\b determines the environment based on the current working
+ directory. The \buse\b action starts a \bsh\b(1) with the environment
+ initialized. \bCC\b, \bCCFLAGS\b, \bHOSTTYPE\b and \bSHELL\b may be set
+ by explicit command argument assignments to override the defaults.]
+[+?Packages are composed of components. Each component is built and
+ installed by an \bast\b \bnmake\b(1) makefile. Each package is also
+ described by an \bnmake\b makefile that lists its components and
+ provides a content description. The package makefile and component
+ makefiles provide all the information required to read, write, build
+ and install packages.]
+[+?Package recipients only need \bsh\b(1) and \bcc\b(1) to build and
+ install source packages, and \bsh\b to install binary packages.
+ \bnmake\b and \bksh93\b are required to write new packages. An
+ \b$INSTALLROOT/bin/cc\b script may be supplied for some architectures.
+ This script supplies a reasonable set of default options for compilers
+ that accept multiple dialects or generate multiple object/executable
+ formats.]
+[+?The command arguments are composed of a sequence of words: zero or
+ more \aqualifiers\a, one \aaction\a, and zero or more action-specific
+ \aarguments\a, and zero or more \aname=value\a definitions. \apackage\a
+ names a particular package. The naming scheme is a \b-\b separated
+ hierarchy; the leftmost parts describe ownership, e.g.,
+ \bgnu-fileutils\b, \bast-base\b. If no packages are specified then all
+ packages are operated on. \boptget\b(3) documentation options are also
+ supported. The default with no arguments is \bhost type\b.]
+[+?The qualifiers are:]
+ {
+ [+authorize \aname\a?Remote authorization user name or license
+ acceptance phrase.]
+ [+debug|environment?Show environment and actions but do not
+ execute.]
+ [+flat?Collapse \b$INSTALLROOT\b { bin fun include lib } onto
+ \b$PACKAGEROOT\b.]
+ [+force?Force the action to override saved state.]
+ [+never?Run make -N and show other actions.]
+ [+only?Only operate on the specified packages.]
+ [+password \apassword\a?Remote authorization or license
+ acceptance password.]
+ [+quiet?Do not list captured action output.]
+ [+show?Run make -n and show other actions.]
+ [+verbose?Provide detailed action output.]
+ [+DEBUG?Trace the package script actions in detail.]
+ }
+[+?The actions are:]
+ {
+ [+admin\b [\ball\b]] [\bdb\b \afile\a]] [\bon\b \apattern\a]][\aaction\a ...]]?Apply
+ \aaction\a ... to the hosts listed in \afile\a. If \afile\a is
+ omitted then \badmin.db\b is assumed. The caller must have
+ \brcp\b(1) and \brsh\b(1) or \bscp\b(1) and \bssh\b(1) access
+ to the hosts. Output for \aaction\a is saved per-host in the
+ file \aaction\a\b.log/\b\ahost\a. Logs can be viewed by
+ \bpackage admin\b [\bon\b \ahost\a]] \bresults\b [\aaction\a]].
+ By default only local PACKAGEROOT hosts are selected from
+ \afile\a; \ball\b selects all hosts. \bon\b \apattern\a selects
+ only hosts matching the \b|\b separated \apattern\a. \afile\a
+ contains four types of lines. Blank lines and lines beginning
+ with \b#\b are ignored. Lines starting with \aid\a=\avalue\a
+ are variable assignments. Set admin_ping to local conventions
+ if \"'$admin_ping$'\" fails. If a package list is not specified
+ on the command line the \aaction\a applies to all packages; a
+ variable assigment \bpackage\b=\"\alist\a\" applies \aaction\a
+ to the packages in \alist\a for subsequent hosts in \afile\a.
+ The remaining line type is a host description consisting of 6
+ tab separated fields. The first 3 are mandatory; the remaining
+ 3 are updated by the \badmin\b action. \afile\a is saved in
+ \afile\a\b.old\b before update. The fields are:]
+ {
+ [+hosttype?The host type as reported by
+ \"\bpackage\b\".]
+ [+[user@]]host?The host name and optionally user name
+ for \brcp\b(1) and \brsh\b(1) access.]
+ [+[remote::[[master]]::]]]]PACKAGEROOT?The absolute remote package
+ root directory and optionally the remote protocol (rsh
+ or ssh) if the directory is on a different server than
+ the master package root directory. If
+ \blib/package/admin/'$admin_env$'\b exists under this
+ directory then it is sourced by \bsh\b(1) before
+ \aaction\a is done. If this field begins with \b-\b
+ then the host is ignored. If this field contains \b:\b
+ then \bditto\b(1) is used to sync the remote \bsrc\b
+ directory hierarchy to the local one. If [\amaster\a]]:
+ is specified then the sync is deferred to the \amaster\a
+ host. If \amaster\a is omitted (two :) then the sync is
+ disabled. These directories must exist on the remote side:
+ \blib/package\b, \bsrc/cmd\b, \bsrc/lib\b.]
+ [+date?\aYYMMDD\a of the last action.]
+ [+time?Elapsed wall time for the last action.]
+ [+M T W?The \badmin\b action \bmake\b, \btest\b and
+ \bwrite\b action error counts. A non-numeric value in
+ any of these fields disables the corresponding action.]
+ }
+ [+clean | clobber?Delete the \barch/\b\aHOSTTYPE\a hierarchy; this
+ deletes all generated files and directories for \aHOSTTYPE\a.
+ The heirarchy can be rebuilt by \bpackage make\b.]
+ [+contents\b [ \apackage\a ... ]]?List description and
+ components for \apackage\a on the standard output.]
+ [+copyright\b [ \apackage\a ... ]]?List the general copyright
+ notice(s) for \apackage\a on the standard output. Note that
+ individual components in \apackage\a may contain additional or
+ replacement notices.]
+ [+export\b [ \avariable\a ...]]?List \aname\a=\avalue\a for
+ \avariable\a, one per line. If the \bonly\b attribute is
+ specified then only the variable values are listed. If no
+ variables are specified then \b'$env$'\b are assumed.]
+ [+help\b [ \aaction\a ]]?Display help text on the standard
+ error (standard output for \aaction\a).]
+ [+host\b [ \aattribute\a ... ]]?List
+ architecture/implementation dependent host information on the
+ standard output. \btype\b is listed if no attributes are
+ specified. Information is listed on a single line in
+ \aattribute\a order. The attributes are:]
+ {
+ [+canon \aname\a?An external host type name to be
+ converted to \bpackage\b syntax.]
+ [+cpu?The number of cpus; 1 if the host is not a
+ multiprocessor.]
+ [+name?The host name.]
+ [+rating?The cpu rating in pseudo mips; the value is
+ useful useful only in comparisons with rating values of
+ other hosts. Other than a vax rating (mercifully) fixed
+ at 1, ratings can vary wildly but consistently from
+ vendor mips ratings. \bcc\b(1) may be required to
+ determine the rating.]
+ [+type?The host type, usually in the form
+ \avendor\a.\aarchitecture\a, with an optional trailing
+ -\aversion\a. The main theme is that type names within
+ a family of architectures are named in a similar,
+ predictable style. OS point release information is
+ avoided as much as possible, but vendor resistance to
+ release incompatibilities has for the most part been
+ futile.]
+ }
+ [+html\b [ \aaction\a ]]?Display html help text on the standard
+ error (standard output for \aaction\a).]
+ [+install\b [ \aarchitecture\a ... ]] \adirectory\a [ \apackage\a ... ]]?Copy
+ the package binary hierarchy to \adirectory\a. If
+ \aarchitecture\a is omitted then all architectures are
+ installed. If \bflat\b is specified then exactly one
+ \aarchitecture\a must be specified; this architecture will be
+ installed in \adirectory\a without the \barch/\b\aHOSTTYPE\a
+ directory prefixes. Otherwise each architecture will be
+ installed in a separate \barch/\b\aHOSTTYPE\a subdirectory of
+ \adirectory\a. The \aarchitecture\a \b-\b names the current
+ architecture. \adirectory\a must be an existing directory. If
+ \apackage\a is omitted then all binary packages are installed.
+ This action requires \bnmake\b.]
+ [+license\b [ \apackage\a ... ]]?List the source license(s) for
+ \apackage\a on the standard output. Note that individual
+ components in \apackage\a may contain additional or replacement
+ licenses.]
+ [+list\b [ \apackage\a ... ]]?List the name, version and
+ prerequisites for \apackage\a on the standard output.]
+ [+make\b [ \apackage\a ]] [ \aoption\a ... ]] [ \atarget\a ... ]]?Build
+ and install. The default \atarget\a is \binstall\b, which makes
+ and installs \apackage\a. If the standard output is a terminal
+ then the output is also captured in
+ \b$INSTALLROOT/lib/package/gen/make.out\b. The build is done in
+ the \b$INSTALLROOT\b directory tree viewpathed on top of the
+ \b$PACKAGEROOT\b directory tree. If \bflat\b is specified then
+ the \b$INSTALLROOT\b { bin fun include lib } directories are
+ linked to the same directories in the package root. Only one
+ architecture may be \bflat\b. Leaf directory names matching the
+ \b|\b-separated shell pattern \b$MAKESKIP\b are ignored. The
+ \bview\b action is done before making. \aoption\a operands are
+ passed to the underlying make command.]
+ [+read\b [ \apackage\a ... | \aarchive\a ... ]]?Read the named
+ package or archive(s). Must be run from the package root
+ directory. Archives are searched for in \b.\b and
+ \blib/package/tgz\b. Each package archive is read only once.
+ The file \blib/package/tgz/\b\apackage\a[.\atype\a]]\b.tim\b
+ tracks the read time. See the \bwrite\b action for archive
+ naming conventions. Text file archive member are assumed to be
+ ASCII or UTF-8 encoded.]
+ [+regress?\bdiff\b(1) the current and previous \bpackage test\b
+ results.]
+ [+release\b [ [\aCC\a]]\aYY-MM-DD\a [ [\acc\a]]\ayy-mm-dd\a ]]]] [ \apackage\a ]]?Display
+ recent changes for the date range [\aCC\a]]\aYY-MM-DD\a (up to
+ [\acc\a]]\ayy-mm-dd\a.), where \b-\b means lowest (or highest.)
+ If no dates are specified then changes for the last 4 months
+ are listed. \apackage\a may be a package or component name.]
+ [+remove\b [ \apackage\a ]]?Remove files installed for
+ \apackage\a.]
+ [+results\b [ \bfailed\b ]] [ \bpath\b ]] [ \bold\b ]] [\bmake\b | \btest\b | \bwrite\b ]]?List
+ results and interesting messages captured by the most recent
+ \bmake\b (default), \btest\b or \bwrite\b action. \bold\b
+ specifies the previous results, if any (current and previous
+ results are retained.) \b$HOME/.pkgresults\b, if it exists,
+ must contain an \begrep\b(1) expression of result lines to be
+ ignored. \bfailed\b lists failures only and \bpath\b lists the
+ results file path name only.]
+ [+setup\b [ beta ]] [ binary ]] [ source ]] [ \aarchitecture\a ... ]] [ \aurl\a ]] [ \apackage\a ... ]]?This
+ action initializes the current directory as a package root, runs the
+ \bupdate\b action to download new or out of date packages, and runs the
+ \bread\b action on those packages. If \bflat\b is specified then the
+ \b$INSTALLROOT\b { bin fun include lib } directories are linked to the
+ same directories in the package root. Only one architecture may be
+ \bflat\b. See the \bupdate\b and \bread\b action descriptions for
+ argument details.]
+ [+test\b [ \apackage\a ]]?Run the regression tests for
+ \apackage\a. If the standard output is a terminal then the
+ output is also captured in
+ \b$INSTALLROOT/lib/package/gen/test.out\b. In general a package
+ must be made before it can be tested. Components tested with
+ the \bregress\b(1) command require \bksh93\b. If \bonly\b is
+ also specified then only the listed package components are
+ tested, otherwise the closure of the components is tested.]
+ [+update\b [ beta ]] [ binary ]] [ source ]] [\aarchitecture\a ... ]] [ \aurl\a ]] [ \apackage\a ... ]]?Download
+ the latest release of the selected and required packages from \aurl\a
+ (e.g., \bhttp://www.research.att.com/sw/download\b) into the directory
+ \b$PACKAGEROOT/lib/package/tgz\b. \bbeta\b acesses beta packages;
+ download these at your own risk. If \aarchitecture\a is omitted then
+ only architectures already present in the \btgz\b directory will be
+ downloaded. If \aarchitecture\a is \b-\b then all posted architectures
+ will be downloaded. If \aurl\a matches \b*.url\b then it is interpreted
+ as a file containing shell variable assignments for \burl\b,
+ \bauthorize\b and \bpassword\b. If \aurl\a is omitted then the
+ definitions for \burl\b, \bauthorize\b and \bpassword\b in
+ \b$PACKAGEROOT/lib/package/tgz/default.url\b, if it exists, are used.
+ If \b$PACKAGEROOT/lib/package/tgz/default.url\b does not exist then it
+ is initialized with the current \burl\b, \bauthorize\b and \bpassword\b
+ values and read permission for the current user only. If \apackage\a is
+ omitted then only packages already present in the tgz directory will be
+ downloaded. If \apackage\a is \b-\b then all posted packages will be
+ downloaded. If \bsource\b and \bbinary\b are omitted then both source
+ and binary packages will be downloaded. If \bonly\b is specified then
+ only the named packages are updated; otherwise the closure of required
+ packages is updated. This action requires \bwget\b(1), \blynx\b(1),
+ \bcurl\b(1) or a shell that supports io to
+ \b/dev/tcp/\b\ahost\a/\aport\a.]
+ [+use\b [ \auid\a | \apackage\a | . [ 32 | 64 ]] | 32 | 64 | - ]] [ command ...]]?Run
+ \acommand\a, or an interactive shell if \acommand\a is omitted,
+ with the environment initialized for using the package (can you
+ say \ashared\a \alibrary\a or \adll\a without cussing?) If
+ \auid\a or \apackage\a or \a.\a is specified then it is used
+ to determine a \b$PACKAGEROOT\b, possibly different from
+ the current directory. For example, to try out bozo`s package:
+ \bpackage use bozo\b. The \buse\b action may be run from any
+ directory. If the file \b$INSTALLROOT/lib/package/profile\b is
+ readable then it is sourced to initialize the environment. 32 or 64
+ implies \b$PACKAGEROOT\b of . and specifies the target architecture
+ word size (which may be silently ignored.)]
+ [+verify\b [ \apackage\a ]]?Verify installed binary files
+ against the checksum files in
+ \b$INSTALLROOT/lib/\b\apackage\a\b/gen/*.sum\b. The checksum
+ files contain mode, user and group information. If the checksum
+ matches for a given file then the mode, user and group are
+ changed as necessary to match the checksum entry. A warning is
+ printed on the standard error for each mismatch. Requires the
+ \bast\b package \bcksum\b(1) command.]
+ [+view\b?Initialize the architecture specific viewpath
+ hierarchy. If \bflat\b is specified then the \b$INSTALLROOT\b {
+ bin fun include lib } directories are linked to the same
+ directories in the package root. Only one architecture may be
+ \bflat\b. The \bmake\b action implicitly calls this action.]
+ [+write\b [\aformat\a]] \atype\a ... [ \apackage\a ...]]?Write
+ a package archive for \apackage\a. All work is done in the
+ \b$PACKAGEROOT/lib/package\b directory. \aformat\a-specific
+ files are placed in the \aformat\a subdirectory. A
+ \apackage\a[.\atype\a]]\b.tim\b file in this directory tracks
+ the write time and prevents a package from being read in the
+ same root it was written. If more than one file is generated
+ for a particular \aformat\a then those files are placed in the
+ \aformat\a/\apackage\a subdirectory. File names in the
+ \aformat\a subdirectory will contain the package name, a
+ \ayyyy-mm-dd\a date, and for binary packages, \aHOSTTYPE\a. If
+ \apackage\a is omitted then an ordered list of previously
+ written packages is generated. If \bonly\b is specified then
+ only the named packages will be written; otherwise prerequisite
+ packages are written first. Package components must be listed
+ in \apackage\a\b.pkg\b. \aformat\a may be one of:]
+ {
+ [+cyg?Generate a \bcygwin\b package.]
+ [+exp?Generate an \bexptools\b maintainer source
+ archive and \aNPD\a file, suitable for \bexpmake\b(1)]
+ [+lcl?Generate a package archive suitable for
+ restoration into the local source tree (i.e., the
+ source is not annotated for licencing.)]
+ [+pkg?Generate a \bpkgmk\b(1) package suitable for
+ \bpkgadd\b(1).]
+ [+rpm?Generate an \brpm\b(1) package.]
+ [+tgz?Generate a \bgzip\b(1) \btar\b(1) package
+ archive. This is the default.]
+ [+tst?Generate a \btgz\b format package archive in the
+ \btst\b subdirectory. Version state files are not updated.]
+ }
+ [+?\btype\b specifies the package type which must be one of
+ \bsource\b, \bbinary\b or \bruntime\b. A source package
+ contains the source needed to build the corresponding binary
+ package. A binary package includes the libraries and headers
+ needed for compiling and linking against the public interfaces.
+ A runtime package contains the commands and required dynamic
+ libraries.]
+ [+?A package may be either a \bbase\b or \bdelta\b. A base
+ package contains a complete copy of all components. A delta
+ package contains only changes from a previous base package.
+ Delta recipients must have the \bast\b \bpax\b(1) command (in
+ the \bast-base\b package.) If neither \bbase\b nor \bdelta\b is
+ specified, then the current base is overwritten if there are no
+ deltas referring to the current base. Only the \btgz\b and
+ \blcl\b formats support \bdelta\b. If \bbase\b is specified
+ then a new base and two delta archives are generated: one delta
+ to generate the new base from the old, and one delta to
+ generate the old base from the new; the old base is then
+ removed. If \bdelta\b is specified then a new delta referring
+ to the current base is written.]
+ [+?\apackage\a\b.pkg\b may reference other packages. By default
+ a pointer to those packages is written. The recipient \bpackage
+ read\b will then check that all required packages have been
+ downloaded. If \bclosure\b is specified then the components for
+ all package references are included in the generated package.
+ This may be useful for \blcl\b and versioning.]
+ [+?All formats but \blcl\b annotate each \bsource\b file (not
+ already annotated) with a license comment as it is written to
+ the package archive using \bproto\b(1).]
+ }
+[+DETAILS?The package directory hierarchy is rooted at
+ \b$PACKAGEROOT\b. All source and binaries reside under this tree. A two
+ level viewpath is used to separate source and binaries. The top view is
+ architecture specific, the bottom view is shared source. All building
+ is done in the architecture specific view; no source view files are
+ intentionally changed. This means that many different binary
+ architectures can be made from a single copy of the source.]
+[+?Independent \b$PACKAGEROOT\b hierarchies can be combined by
+ appending \b$INSTALLROOT:$PACKAGEROOT\b pairs to \bVPATH\b. The
+ \bVPATH\b viewing order is from left to right. Each \b$PACKAGEROOT\b
+ must have a \b$PACKAGEROOT/lib/package\b directory.]
+[+?Each package contains one or more components. Component source for
+ the \afoo\a command is in \b$PACKAGEROOT/src/cmd/\b\afoo\a, and source
+ for the \abar\a library is in \b$PACKAGEROOT/src/lib/lib\b\abar\a. This
+ naming is for convenience only; the underlying makefiles handle
+ inter-component build order. The \bINIT\b component, which contains
+ generic package support files, is always made first, then the
+ components named \bINIT\b*, then the component order determined by the
+ closure of component makefile dependencies.]
+[+?\b$PACKAGEROOT/lib/package\b contains package specific files. The
+ package naming convention is \agroup\a[-\apart\a]]; e.g., \bast-base\b,
+ \bgnu-fileutils\b. The *\b.pkg\b files are ast \bnmake\b(1) makefiles
+ that contain the package name, package components, references to other
+ packages, and a short package description. *\b.pkg\b files are used by
+ \bpackage write\b to generate new source and binary packages.]
+[+?\b$PACKAGEROOT/lib/package/\b\agroup\a\b.lic\b files contain license
+ information that is used by the \bast\b \bproto\b(1) and \bnmake\b(1)
+ commands to generate source and binary license strings. \agroup\a is
+ determined by the first \b:PACKAGE:\b operator name listed in the
+ component \bnmake\b makefile. \agroup\a\b.lic\b files are part of the
+ licensing documentation. Each component may have its own \bLICENSE\b file
+ that overrides the \agroup\a\b.lic\b file. The full text of the licenses
+ are in the \b$PACKAGEROOT/lib/package/LICENSES\b and
+ \b$INSTALLROOT/lib/package/LICENSES\b directories.]
+[+?A few files are generated in \b$PACKAGEROOT/lib/package/gen\b and
+ \b$INSTALLROOT/lib/package/gen\b. \apackage\a\b.ver\b contains one line
+ consisting of \apackage version release\a \b1\b for the most recent
+ instance of \apackage\a read into \b$PACKAGEROOT\b, where \apackage\a
+ is the package name, \aversion\a is the \aYYYY-MM-DD\a base version,
+ and \arelease\a is \aversion\a for the base release or \aYYYY-MM-DD\a
+ for delta releases. \apackage\a\b.req\b contains *\b.ver\b entries for
+ the packages required by \apackage\a, except that the fourth field is
+ \b0\b instead of \b1\b. All packages except \bINIT\b require the
+ \bINIT\b package. A simple sort of \apackage\a\b.pkg\b and *\b.ver\b
+ determines if the required package have been read in. Finally,
+ \apackage\a\b.README\b and \apackage\a\a.html\b contain the README text
+ for \apackage\a and all its components. Included are all changes added
+ to the component \bRELEASE\b, \bCHANGES\b or \bChangeLog\b files dated
+ since the two most recent base releases. Component \bRELEASE\b files
+ contain tag lines of the form [\aYY\a]]\aYY-MM-DD\a [ \atext\a ]] (or
+ \bdate\b(1) format dates) followed by README text, in reverse
+ chronological order (newer entries at the top of the file.) \bpackage
+ release\b lists this information, and \bpackage contents ...\b lists
+ the descriptions and components.]
+[+?\b$HOSTYPE\b names the current binary architecture and is determined
+ by the output of \bpackage\b (no arguments.) The \b$HOSTTYPE\b naming
+ scheme is used to separate incompatible executable and object formats.
+ All architecture specific binaries are placed under \b$INSTALLROOT\b
+ (\b$PACKAGEROOT/arch/$HOSTTYPE\b.) There are a few places that match
+ against \b$HOSTTYPE\b when making binaries; these are limited to
+ makefile compiler workarounds, e.g., if \b$HOSTTYPE\b matches \bhp.*\b
+ then turn off the optimizer for these objects. All other architecture
+ dependent logic is handled either by the \bast\b \biffe\b(1) command or
+ by component specific configure scripts. Explicit \b$HOSTYPE\b
+ values matching *,*cc*[,-*,...]] optionally set the default \bCC\b and
+ \bCCFLAGS\b. This is handy for build farms that support different
+ compilers on the same architecture.]
+[+?Each component contains an \bast\b \bnmake\b(1) makefile (either
+ \bNmakefile\b or \bMakefile\b) and a \bMAM\b (make abstract machine)
+ file (\bMamfile\b.) A Mamfile contains a portable makefile description
+ that is used by \bmamake\b(1) to simulate \bnmake\b. Currently there is
+ no support for old-make/gnu-make makefiles; if the binaries are just
+ being built then \bmamake\b will suffice; if source or makefile
+ modifications are anticipated then \bnmake\b (in the \bast-base\b
+ package) should be used. Mamfiles are automatically generated by
+ \bpackage write\b.]
+[+?Most component C source is prototyped. If \b$CC\b (default value
+ \bcc\b) is not a prototyping C compiler then \bpackage make\b runs
+ \bproto\b(1) on portions of the \b$PACKAGEROOT/src\b tree and places
+ the converted output files in the \b$PACKAGEROOT/proto/src\b tree.
+ Converted files are then viewpathed over the original source.
+ \bproto\b(1) converts an ANSI C subset to code that is compatible with
+ K&R, ANSI, and C++ dialects.]
+[+?All scripts and commands under \b$PACKAGEROOT\b use \b$PATH\b
+ relative pathnames (via the \bast\b \bpathpath\b(3) function); there
+ are no imbedded absolute pathnames. This means that binaries generated
+ under \b$PACKAGEROOT\b may be copied to a different root; users need
+ only change their \b$PATH\b variable to reference the new installation
+ root \bbin\b directory. \bpackage install\b installs binary packages in
+ a new \b$INSTALLROOT\b.]
+
+[ qualifier ... ] [ action ] [ arg ... ] [ n=v ... ]
+
+[+SEE ALSO?\bautoconfig\b(1), \bcksum\b(1), \bexecrate\b(1), \bexpmake\b(1),
+ \bgzip\b(1), \bmake\b(1), \bmamake\b(1), \bnmake\b(1), \bpax\b(1),
+ \bpkgadd\b(1), \bpkgmk\b(1), \bproto\b(1), \bratz\b(1), \brpm\b(1),
+ \bsh\b(1), \btar\b(1), \boptget\b(3)]
+'
+ case $* in
+ help) set -- --man ;;
+ esac
+ while getopts -a $command "$USAGE" OPT
+ do :
+ done
+ shift $OPTIND-1
+ ;;
+esac
+
+# check the args
+
+case $AR in
+'') AR=ar ;;
+esac
+case $CC in
+'') CC=cc ;;
+esac
+case $LD in
+'') LD=ld ;;
+esac
+case $NM in
+'') NM=nm ;;
+esac
+
+action=
+admin_all=1
+admin_on=
+authorize=
+bit=
+exec=
+flat=0
+force=0
+global=
+hi=
+html=0
+ifs=${IFS-'
+ '}
+lo=
+make=
+makeflags='-k -K'
+nmakeflags=
+nmakesep=
+nl="
+"
+noexec=
+only=0
+output=
+package_src=
+password=
+quiet=0
+show=:
+tab=" "
+verbose=0
+AUTHORIZE=
+DEBUG=
+HURL=
+PROTOROOT=-
+SHELLMAGIC=-
+
+unset FIGNORE BINDIR DLLDIR ETCDIR FUNDIR INCLUDEDIR LIBDIR LOCALEDIR MANDIR SHAREDIR 2>/dev/null || true
+
+while :
+do case $# in
+ 0) set host type ;;
+ esac
+ case $1 in
+ admin|clean|clobber|contents|copyright|export|host|install|license|list|make|read|regress|release|remove|results|setup|test|update|use|verify|view|write|TEST)
+ action=$1
+ shift
+ break
+ ;;
+ authorize)
+ case $# in
+ 1) echo $command: $1: authorization user name argument expected >&2; exit 1 ;;
+ esac
+ shift
+ authorize=$1
+ shift
+ continue
+ ;;
+ debug|environment)
+ exec=echo make=echo show=echo
+ ;;
+ flat) flat=1
+ ;;
+ force) force=1
+ ;;
+ never) exec=echo noexec=-N
+ ;;
+ only) only=1
+ ;;
+ password)
+ case $# in
+ 1) echo $command: $1: authorization password argument expected >&2; exit 1 ;;
+ esac
+ shift
+ password=$1
+ shift
+ continue
+ ;;
+ quiet) quiet=1
+ ;;
+ show) exec=echo noexec=-n
+ ;;
+ verbose)verbose=1
+ ;;
+ DEBUG) DEBUG=1
+ PS4='+$LINENO:$SECONDS+ '
+ set -x
+ ;;
+ help|HELP|html|man|--[?m]*)
+ case $1 in
+ help) code=0
+ case $2 in
+ '') exec 1>&2 ;;
+ esac
+ ;;
+ html) code=0 html=1
+ ;;
+ *) code=2
+ exec 1>&2
+ ;;
+ esac
+ case $html in
+ 1) bO="<HTML>
+<HEAD>
+<TITLE>$2 package installation instructions</TITLE>
+<HEAD>
+<BODY bgcolor=white link=teal vlink=dimgray>"
+ eO='</BODY>
+</HTML>'
+ bH="<CENTER><H3><FONT face=courier color=red>"
+ eH='</FONT></H3></CENTER>'
+ bP='<P>'
+ bL='<P><TABLE cellpadding=0 cellspacing=2>'
+ bL2='<P><TABLE border=0 cellpadding=0 cellspacing=2>'
+ eL='</TABLE><P>'
+ bT='<TR><TD align=right valign=top><B>'
+ bD='</B></TD><TD align=left>' eD='</TD></TR>'
+ bB='<B>' eB='</B>'
+ bI='<I>' eI='</I>'
+ bX='<PRE>' eX='</PRE>'
+ bF='<TT>' eF='</TT>'
+ Camp='&amp;'
+ Mcurl='<A href=../../man/man1/curl.html>curl</A>(1)'
+ Mdate='<A href=../../man/man1/date.html>date</A>(1)'
+ Mfile='<A href=../../man/man1/file.html>file</A>(1)'
+ Mgunzip='<A href=../../man/man1/gzip.html>gunzip</A>(1)'
+ Mhurl='<A href=../../man/man1/hurl.html>hurl</A>(1)'
+ Mlynx='<A href=../../man/man1/lynx.html>lynx</A>(1)'
+ Mnmake='<A href=../../man/man1/nmake.html>nmake</A>(1)'
+ Mpackage='<A href=../../man/man1/package.html>package</A>(1)'
+ Mproto='<A href=../../man/man1/proto.html>proto</A>(1)'
+ Mratz='<A href=../../man/man1/ratz.html>ratz</A>'
+ Mtar='<A href=../../man/man1/tar.html>tar</A>(1)'
+ Mwget='<A href=../../man/man1/wget.html>wget</A>(1)'
+ ;;
+ *) bO='' eO=''
+ bH='' eH=':'
+ bP=''
+ bL='' eL=''
+ bL2=''
+ bT=' '
+ bD=' ' eD=''
+ bB='' eB=''
+ bI='' eI=''
+ bX='' eX=''
+ bF='"' eF='"'
+ Camp='&'
+ Mcurl='curl(1)'
+ Mdate='date(1)'
+ Mfile='file(1)'
+ Mgunzip='gunzip(1)'
+ Mhurl='hurl(1)'
+ Mlynx='lynx(1)'
+ Mnmake='nmake(1)'
+ Mpackage='package(1)'
+ Mproto='proto(1)'
+ Mratz='ratz'
+ Mtar='tar(1)'
+ Mwget='wget(1)'
+ ;;
+ esac
+ case $2 in
+ binary) echo "${bO}
+${bH}Binary Package Installation Instructions${eH}
+${bL}
+${bT}(1)${bD}Do not install packages as ${bI}root/super-user${eI}. Although some components may
+ have setuid executables, few must be owned by ${bI}root${eI}. These are best
+ changed manually when the security implications are understood.${eD}
+${bT}(2)${bD}Choose a package root directory and cd to it. This will be a local work
+ area for all packages.${eD}
+${bT}(3)${bD}These instructions bypass the ${bI}click to download${eI} package links on the
+ download site. If you already clicked, or if your system does not have
+ ${Mcurl}, ${Mhurl}, ${Mlynx} or ${Mwget} then use the alternate instructions
+ for (3),(4),(5) in plan ${bB}B${eB} below. Plan ${bB}B${eB} installs the ${Mhurl}
+ script which works with ksh and modern bash. The top level URL is:${bX}
+ URL=http://www.research.att.com/sw/download${eX}${eD}
+${bT}(4)${bD}If the ${bB}bin/package${eB} script does not exist then run:${bX}
+ test -d bin || mkdir bin
+ url=\$URL/package
+ (wget -O bin/package \$url||curl -L \$url||hurl \$url) > bin/package
+ chmod +x bin/package${eX}${eD}
+${bT}(5)${bD}Determine the list of package names you want from the download site, then
+ use the ${Mpackage} command to do the actual download:${bX}
+ bin/package authorize \"${bI}NAME${eI}\" password \"${bI}PASSWORD${eI}\" \\
+ setup binary \$URL ${bI}PACKAGE${eI} ...${eX}
+ (Refer to the ${bB}AUTHORIZATION${eB} paragraph on the main download page for
+ ${bI}NAME${eI}/${bI}PASSWORD${eI} details.) This downloads the closure of the latest
+ binary package(s); covered and up-to-date packages are not downloaded again unless
+ ${bB}package force ...${eB} is specified. Package content is verified using ${bB}${checksum}${eB}.
+ If the package root will contain only one architecture then you can install in ${bB}bin${eB} and
+ ${bB}lib${eB} instead of ${bB}arch/${eB}${bI}HOSTTYPE${eI}${bB}/bin${eB} and ${bB}arch/${eB}${bI}HOSTTYPE${eI}${bB}/lib${eB} by running this
+ instead:${bX}
+ bin/package authorize \"${bI}NAME${eI}\" password \"${bI}PASSWORD${eI}\" \\
+ flat setup binary \$URL ${bB}PACKAGE${eB} ...${eX}
+ To update the same packages from the same URL run:${bX}
+ bin/package setup binary${eX}${eD}
+${bT}(6)${bD}The packaged binaries are position independent, i.e., they do not
+ contain hard-coded paths. However, commands with related files, like
+ ${Mfile} and ${Mnmake}, require the path of the bin directory to be
+ exported in ${bB}PATH${eb}.${eD}
+${bT}(7)${bD}You can run the binaries directly from the package root, or you can
+ install them in a public root (requires the ${bI}AT${Camp}T${eI} ${Mnmake} command):${bX}
+ bin/package flat install ${bI}DIRECTORY PACKAGE${eI}${eX}
+ This will install in ${bI}DIRECTORY${eI}${bB}/bin${eB} and ${bI}DIRECTORY${eI}${bB}/lib${eB}. If you want to
+ preserve the ${bB}arch/${eB}${bI}HOSTTYPE${eI} hierarchy under ${bI}DIRECTORY${eI} then omit the
+ ${bB}flat${eB} argument. If you don't have ${Mnmake} then the following will do a
+ flat install:${bX}
+ cd \$INSTALLROOT
+ cp -p -r bin lib include ${bI}DIRECTORY${eI}${eX}${eD}
+${bT}(8)${bD}To summarize, after the first time, the download cycle for the latest
+ binary release is:${bX}
+ bin/package setup binary${eX}${eD}${eL}
+
+${bH}Binary Package Installation Instructions -- Plan B${eH}
+${bL}
+${bT}(3)${bD}Create the subdirectory ${bB}lib/package/tgz${eB} and download all package archives
+ into that directory.${eD}
+${bT}(4)${bD}If the ${bB}bin/package${eB} script does not exist then manually read the ${bB}INIT${eB}
+ binary package:${bX}
+ gunzip < lib/package/tgz/INIT.${bI}YYYY-MM-DD.HOSTTYPE${eI}.tgz |
+ ${TAR} ${TARFLAGS}f -${eX}
+ Note that some browsers automatically unzip downloaded without warning.
+ If the gunzip fails try:
+ ${TAR} ${TARFLAGS}f -${eX} lib/package/tgz/INIT.${bI}YYYY-MM-DD.HOSTTYPE${eI}.tgz
+ If your system does not have ${Mtar} or ${Mgunzip} then download the ${Mratz}
+ binary package:${bX}
+ mkdir bin
+ cp lib/package/tgz/ratz.${bI}YYYY-MM-DD.HOSTTYPE${eI}.exe bin/ratz
+ chmod +x bin/ratz
+ bin/ratz -lm < lib/package/tgz/INIT.${bI}YYYY-MM-DD/HOSTTYPE${eI}.tgz
+${bT}(5)${bD}Read all unread package archive(s):${bX}
+ bin/package read${eX}
+ Both source and binary packages will be read by this step.${eD}${eL}${eO}"
+ ;;
+ intro) echo "${bO}
+${bH}Package Hierarchy Details${eH}
+${bP}
+The package directory hierarchy is rooted at ${bB}\$PACKAGEROOT${eB}. All source and
+binaries reside under this tree. A two level viewpath is used to separate
+source and binaries. The top view is architecture specific, the bottom view
+is shared source. All building is done in the architecture specific view;
+no source view files are intentionally changed. This means that many
+different binary architectures can be made from a single copy of the source.
+${bP}
+Each package contains one or more components. Component source for the ${bI}FOO${eI}
+command is in ${bB}\$PACKAGEROOT/src/cmd/${eB}${bI}FOO${eI}, and source for the ${bI}BAR${eI} library is
+in ${bB}\$PACKAGEROOT/src/lib/lib${eB}${bI}BAR${eI}. This naming is for convenience only; the
+underlying makefiles handle inter-component build order. The ${bB}INIT${eB} component,
+which contains generic package support files, is always made first, then the
+components named ${bB}INIT${eB}*, then the order determined by the closure of component
+makefile dependencies.
+${bP}
+${bB}\$PACKAGEROOT/lib/package${eB} contains package specific files. The package naming
+convention is ${bI}GROUP${eI}[${bI}-PART${eI}]; e.g., ${bB}ast-base${eB}, ${bB}gnu-fileutils${eB}. The *${bB}.pkg${eB} files
+are ${bB}ast${eB} ${Mnmake} makefiles that contain the package name, package components,
+references to other packages, and a short package description. *${bB}.pkg${eB} files
+are used by ${bF}package write${eF} to generate new source and binary packages.
+${bP}
+${bB}\$PACKAGEROOT/lib/package/${eB}${bI}GROUP${eI}${bB}.lic${eB} files contain license information that
+is used by the ${bB}ast${eB} ${Mproto} and ${Mnmake} commands to generate source and
+binary license strings. ${bI}GROUP${eI} is determined by the first ${bB}:PACKAGE:${eB} operator
+name listed in the component ${bB}nmake${eB} makefile. ${bI}GROUP${eI}${bB}.lic${eB} files are part of the
+licensing documentation. Each component may have its own ${bB}LICENSE${eB} file that
+overrides the ${bI}GROUP${eI}${bB}.lic${eB} file. The full text of the licenses are in the
+${bB}\$PACKAGEROOT/lib/package/LICENSES${eB} and ${bB}\$INSTALLROOT/lib/package/LICENSES${eB}
+directories.
+${bP}
+A few files are generated in ${bB}\$PACKAGEROOT/lib/package/gen${eB} and
+${bB}\$INSTALLROOT/lib/package/gen${eB}. ${bI}PACKAGE${eI}${bB}.ver${eB} contains one line consisting of${bX}
+ ${bI}PACKAGE VERSION RELEASE${eI} 1${eX}
+for the most recent instance of ${bI}PACKAGE${eI} read into ${bB}\$PACKAGEROOT${eB}, where
+${bI}PACKAGE${eI} is the package name, ${bI}VERSION${eI} is the ${bI}YYYY-MM-DD${eI} base version,
+and ${bI}RELEASE${eI} is ${bI}VERSION${eI} for the base release or ${bI}YYYY-MM-DD${eI} for delta releases.
+${bI}PACKAGE${eI}${bB}.req${eB} contains *${bB}.ver${eB} entries for the packages required by
+${bI}PACKAGE${eI}, except that the fourth field is 0 instead of 1. All packages
+except ${bB}INIT${eB} and ${Mratz} require the ${bB}INIT${eB} package. A simple sort of ${bI}PACKAGE${eI}${bB}.pkg${eB}
+and *${bB}.ver${eB} determines if the required package have been read in. Finally,
+${bI}PACKAGE${eI}${bB}.README${eB} contains the ${bB}README${eB} text for ${bI}PACKAGE${eI} and all its
+components. Included are all changes added to the component ${bB}RELEASE${eB},
+${bB}CHANGES${eB} or ${bB}ChangeLog${eB} files dated since the two most recent base
+releases. Component ${bB}RELEASE${eB} files contain tag lines of the form
+[${bI}CC${eI}]${bI}YY-MM-DD${eI} [ ${bI}TEXT${eI} ] (or ${Mdate} format dates) followed by README
+text, in reverse chronological order (newer entries at the top of the
+file.) ${bF}package release${eF} generates this information, and
+${bF}package contents ...${eF} lists the descriptions and components.
+${bP}
+${bB}\$HOSTYPE${eB} names the current binary architecture and is determined by the
+output of ${bF}package${eF} (no arguments.) The ${bB}\$HOSTTYPE${eB} naming scheme is used
+to separate incompatible executable and object formats. All architecture
+specific binaries are placed under ${bB}\$INSTALLROOT${eB} (${bB}\$PACKAGEROOT/arch/\$HOSTTYPE${eB}.)
+There are a few places that match against ${bB}\$HOSTTYPE${eB} when making binaries; these
+are limited to makefile compiler workarounds, e.g., if ${bB}\$HOSTTYPE${eB} matches
+'hp.*' then turn off the optimizer for these objects. All other architecture
+dependent logic is handled either by ${bB}\$INSTALLROOT/bin/iffe${eB} or by component
+specific configure scripts. Explicit ${bB}\$HOSTYPE${eB} values matching *,*cc*[,-*,...]
+optionally set the default ${bB}CC${eB} and ${bB}CCFLAGS${eB}. This is handy for build
+farms that support different compilers on the same architecture.
+${bP}
+Each component contains an ${bB}ast${eB} ${Mnmake} makefile (either ${bB}Nmakefile${eB} or ${bB}Makefile${eB})
+and a ${bI}MAM${eI} (make abstract machine) file (${bB}Mamfile${eB}.) A Mamfile contains a portable
+makefile description that is used by ${bB}\$INSTALLROOT/bin/mamake${eB} to simulate
+${bB}nmake${eB}. Currently there is no support for old-make/gnu-make makefiles; if
+the binaries are just being built then ${bB}mamake${eB} will suffice; if source or
+makefile modifications are anticipated then ${bB}nmake${eB} (from the ${bB}ast-open${eB} or
+${bB}ast-base${eB} package) should be used. Mamfiles are automatically generated by
+${bF}package write${eF}.
+${bP}
+Most component C source is prototyped. If ${bB}\$CC${eB} (default value ${bB}cc${eB}) is not a
+prototyping C compiler then ${bF}package make${eF} runs ${Mproto} on portions of the
+${bB}\$PACKAGEROOT/src${eB} tree and places the converted output files in the
+${bB}\$PACKAGEROOT/proto/src${eB} tree. Converted files are then viewpathed over the
+original source. The ${bB}ast${eB} ${Mproto} command converts an ANSI C subset to code
+that is compatible with K&R, ANSI, and C++ dialects.
+${bP}
+All scripts and commands under ${bB}\$PACKAGEROOT${eB} use ${bB}\$PATH${eB} relative pathnames;
+there are no imbedded absolute pathnames. This means that binaries generated
+under ${bB}\$PACKAGEROOT${eB} may be copied to a different root; users need only change
+their ${bB}\$PATH${eB} variable to reference the new instalation root bin directory.
+${bF}package install${eF} installs binary packages in a new ${bB}\$INSTALLROOT${eB}.
+${eO}"
+ ;;
+ source) echo "${bO}
+${bH}Source Package Installation Instructions${eH}
+${bL}
+${bT}(1)${bD}Do not install packages as ${bI}root/super-user${eI}. Although some components may
+ have setuid executables, few must be owned by ${bI}root${eI}. These are best
+ changed manually when the security implications are understood.${eD}
+${bT}(2)${bD}Choose a package root directory and cd to it. This will be a local work
+ area for all packages.
+${bT}(3)${bD}These instructions bypass the ${bI}click to download${eI} package links on the
+ download site. If you already clicked, or if your system does not have
+ ${Mcurl}, ${Mhurl}, ${Mlynx} or ${Mwget} then use the alternate instructions
+ for (3),(4),(5) in plan ${bB}B${eB} below. Plan ${bB}B${eB} installs the ${Mhurl}
+ script which works with ksh and modern bash. The top level URL is:${bX}
+ URL=http://www.research.att.com/sw/download${eX}${eD}
+${bT}(4)${bD}If the ${bB}bin/package${eB} script does not exist then run:${bX}
+ test -d bin || mkdir bin
+ url=\$URL/package
+ (wget -O bin/package \$url||curl -L \$url||hurl \$url) > bin/package
+ chmod +x bin/package${eX}${eD}
+${bT}(5)${bD}Determine the list of package names you want from the download site, then
+ use the ${Mpackage} command to do the actual download:${bX}
+ bin/package authorize \"${bI}NAME${eI}\" password \"${bI}PASSWORD${eI}\" \\
+ setup source \$URL ${bB}PACKAGE${eB} ...${eX}
+ (Refer to the ${bB}AUTHORIZATION${eB} paragraph on the main download page for
+ ${bI}NAME${eI}/${bI}PASSWORD${eI} details.) This downloads the closure of the latest
+ source package(s); covered and up-to-date packages are not downloaded again unless
+ ${bB}package force ...${eB} is specified. Package content is verified using ${bB}${checksum}${eB}.
+ If the package root will contain only one architecture then you can install in ${bB}bin${eB} and
+ ${bB}lib${eB} instead of ${bB}arch/${eB}${bI}HOSTTYPE${eI}${bB}/bin${eB} and ${bB}arch/${eB}${bI}HOSTTYPE${eI}${bB}/lib${eB} by running this
+ instead:${bX}
+ bin/package authorize \"${bI}NAME${eI}\" password \"${bI}PASSWORD${eI}\" \\
+ flat setup source \$URL ${bB}PACKAGE${eB} ...${eX}
+ To update the same packages from the same URL run:${bX}
+ bin/package setup source${eX}${eD}
+${bT}(6)${bD}Build and install; all generated files are placed under ${bB}arch/${eB}${bI}HOSTTYPE${eI}
+ (${bB}\$INSTALLROOT${eB}), where ${bI}HOSTTYPE${eI} is the output of ${bB}bin/package${eB} (with no
+ arguments.) ${bI}name=value${eI} arguments are supported; ${bB}CC${eB} and ${bB}debug=1${eB} (compile
+ with -g instead of -O) are likely candidates. The output is written to
+ the terminal and captured in ${bB}\$INSTALLROOT/lib/package/gen/make.out${eB}:${bX}
+ bin/package make${eX}${eD}
+${bT}(7)${bD}List make results and interesting errors:${bX}
+ bin/package results${eX}
+ Run the regression tests:${bX}
+ bin/package test${eX}
+ List test results and errors:${bX}
+ bin/package results test${eX}${eD}
+${bT}(8)${bD}The generated binaries are position independent, i.e., they do not
+ contain hard-coded paths. However, commands with related files, like
+ ${Mfile} and ${Mnmake}, require the path of the bin directory to be
+ exported in ${bB}PATH${eb}.${eD}
+${bT}(9)${bD}You can run the binaries directly from the package root, or you can
+ install them in a public root after you are satisfied with the make and
+ test actions (requires the ${bI}AT${Camp}T${eI} ${Mnmake} command):${bX}
+ bin/package flat install ${bI}DIRECTORY PACKAGE${eI}${eX}
+ This will install in ${bI}DIRECTORY${eI}${bB}/bin${eB} and ${bI}DIRECTORY${eI}${bB}/lib${eB}. If you want to
+ preserve the ${bB}arch/${eB}${bI}HOSTTYPE${eI} hierarchy under ${bI}DIRECTORY${eI} then omit the
+ ${bB}flat${eB} argument. If you don't have ${Mnmake} then the following will do a
+ flat install:${bX}
+ cd \$INSTALLROOT
+ cp -p -r bin lib include ${bI}DIRECTORY${eI}${eX}${eD}
+${bT}(10)${bD}To summarize, after the first time the download, build, and test cycle
+ for the latest source release is:${bX}
+ bin/package setup source
+ bin/package make
+ bin/package test${eX}${eD}${eL}
+
+${bH}Source Package Installation Instructions -- Plan B${eH}
+${bL}
+${bT}(3)${bD}Create the subdirectory ${bB}lib/package/tgz${eB} and download all package archives
+ into that directory.${eD}
+${bT}(4)${bD}If the ${bB}bin/package${eB} script does not exist then manually read the ${bB}INIT${eB}
+ source package:${bX}
+ gunzip < lib/package/tgz/INIT.${bI}YYYY-MM-DD${eI}.tgz | ${TAR} ${TARFLAGS}f -${eX}
+ Note that some browsers automatically unzip downloaded without warning.
+ If the gunzip fails try:
+ ${TAR} ${TARFLAGS}f -${eX} lib/package/tgz/INIT.${bI}YYYY-MM-DD${eI}.tgz
+ If your system does not have ${Mtar} or ${Mgunzip} then download the ${Mratz}
+ source package, compile it, and manually read the ${bB}INIT${eB}
+ source package:${bX}
+ mkdir bin
+ cp lib/package/tgz/ratz.${bI}YYYY-MM-DD${eI}.c lib/package/tgz/ratz.c
+ cc -o bin/ratz lib/package/tgz/ratz.c
+ bin/ratz -lm < lib/package/tgz/INIT.${bI}YYYY-MM-DD${eI}.tgz
+${bT}(5)${bD}Read all unread package archive(s):${bX}
+ bin/package read${eX}
+ Both source and binary packages will be read by this step.${eD}${eL}${eO}"
+ ;;
+ *) echo "Usage: $command [ qualifier ... ] [ action ] [ arg ... ] [ n=v ... ]
+
+ The $command command controls source and binary packages. It must be run
+ within the package root directory tree. See \"$command help intro\" for
+ details. In the following, PACKAGE names either a package or a component
+ within a package; if omitted, all packages are operated on. The default
+ action is \"host type\".
+
+ qualifier:
+ authorize NAME Remote authorization name or license acceptance phrase.
+ debug|environment Show environment and actions; do not execute.
+ flat Collapse \$INSTALLROOT { bin fun include lib } onto \$PACKAGEROOT.
+ force Force the action to override saved state.
+ never Run make -N; otherwise show other actions.
+ only Only operate on the specified packages.
+ password PASSWORD Remote authorization or license acceptance password.
+ quiet Do not list captured make and test action output.
+ show Run make -n; otherwise show other actions.
+ DEBUG Trace the package script actions in detail for debugging.
+ action:
+ admin [ all ] [ db FILE ] [ on PATTERN ] [ action ... ]
+ Apply ACTION ... to the hosts listed in FILE. If FILE is
+ omitted then "admin.db" is assumed. The caller must have rcp(1)
+ and rsh(1) or scp(1) and ssh(1) access to the hosts. Output
+ for the action is saved per-host in ACTION.log/HOST. Logs
+ can be viewed by \"package admin [on HOST] results [ACTION]\".
+ By default only local PACKAGEROOT hosts are selected from FILE;
+ \"all\" selects all hosts. \"on PATTERN\" selects only
+ hosts matching the | separated PATTERN. FILE contains four
+ types of lines. Blank lines and lines beginning with # are
+ ignored. Lines starting with id=value are variable assignments.
+ Set admin_ping to local conventions if \"$admin_ping\" fails.
+ If a package list is not specified on the command line the
+ action applies to all packages; a variable assigment
+ package=list applies action to the packages in list for
+ subsequent hosts in FILE. The remaining line type is a host
+ description consisting of 6 tab separated fields. The first 3
+ are mandatory; the remaining 3 are updated by the admin action:
+ hosttype
+ The host type as reported by package.
+ [user@]host
+ The host name and optionally user name for rcp(1)
+ and rsh(1) access.
+ [remote:[[master]:]]PACKAGEROOT
+ The absolute remote package root directory and
+ optionally the remote prorocol (rsh or ssh) if
+ the directory is on a different server than the
+ master package root directory. If
+ lib/package/admin/$admin_env exists under
+ this directory then it is sourced by sh(1)
+ before ACTION is done. If this field begins with -
+ then the host is ignored. If this field contains
+ : then ditto(1) is used to sync the remote src
+ directory hierarchy to the local one. If [master]:
+ is specified then the sync is deferred to the
+ master host. If master is omitted (two :) then
+ the sync is disabled. These directories must exist
+ on the remote side: lib/package, src/cmd, src/lib.
+ date YYMMDD of the last action.
+ date Elapsed wall time of the last action.
+ M T W The admin action make, test and write action error
+ counts. A non-numeric value in any of these fields
+ disables the corresponding action.
+ clean | clobber
+ Delete the arch/HOSTTYPE hierarchy; this deletes all generated
+ files and directories for HOSTTYPE. The heirarchy can be rebuilt
+ by package make.]
+ contents [ package ... ]
+ List description and components for PACKAGE on the standard
+ output.
+ copyright [ package ... ]
+ List the general copyright notice(s) for PACKAGE on the
+ standard output. Note that individual components in PACKAGE
+ may contain additional or replacement notices.
+ export [ VARIABLE ... ]
+ List NAME=VALUE for each VARIABLE, one per line. If the
+ \"only\" attribute is specified then only the variable
+ values are listed. If no variables are specified then
+ $env are assumed.
+ help [ ACTION ]
+ Display help text on the standard error [ standard output
+ for ACTION ].
+ host [ canon cpu name rating type ... ]
+ List architecture/implementation dependent host information
+ on the standard output. type is listed if no attributes are
+ specified. Information is listed on a single line in attributes
+ order. The attributes are:
+ canon The next argument is a host type name to be
+ converted to package syntax.
+ cpu The number of cpus; 1 if the host is not a
+ multiprocessor.
+ name The host name.
+ rating The cpu rating in pseudo mips; the value is useful
+ useful only in comparisons with rating values of
+ other hosts. Other than a vax rating fixed at 1,
+ ratings can vary wildly but consistently from
+ vendor mips ratings. cc(1) may be required to
+ determine the rating.
+ type The host type, usually of the form
+ vendor.architecture, with an optional trailing
+ -version. The main theme is that type names within
+ a family of architectures are named in a similar,
+ predictable style. Os point release information is
+ avoided as much as possible, but vendor resistance
+ to release incompatibilities has for the most part
+ been futile.
+ html [ ACTION ]
+ Display html help text on the standard error [ standard output
+ for ACTION ].
+ install [ ARCHITECTURE ... ] DIR [ PACKAGE ... ]
+ Copy the package binary hierarchy to DIR. If ARCHITECTURE is
+ omitted then all architectures are installed. If the \"flat\"
+ attribute is specified then exactly one ARCHITECTURE must be
+ specified; this architecture will be installed in DIR without
+ the \"arch/HOSTTYPE\" directory prefixes. Otherwise each
+ architecture will be installed in a separate \"arch/HOSTTYPE\"
+ subdirectory of DIR. The ARCHITECTURE - names the current
+ architecture. DIR must be an existing directory. If PACKAGE
+ is omitted then all binary packages are installed. This action
+ requires nmake.
+ license [ package ... ]
+ List the source license(s) for PACKAGE on the standard output.
+ Note that individual components in PACKAGE may contain
+ additional or replacement licenses.
+ list [ PACKAGE ... ]
+ List the name, version and prerequisites for PACKAGE on the
+ standard output.
+ make [ PACKAGE ] [ OPTION ... ] [ TARGET ... ]
+ Build and install. The default TARGET is install, which
+ makes and installs all packages. If the standard output
+ is a terminal then the output is also captured in
+ \$INSTALLROOT/lib/package/gen/make.out. The build is done
+ in the \$INSTALLROOT directory tree viewpathed on top of
+ the \$PACKAGEROOT directory tree. If \"flat\" is specified then
+ the \$INSTALLROOT { bin fun include lib } directories are
+ linked to the same directories in the package root. Only
+ one architecture may be flat. Leaf directory names matching
+ the |-separated shell pattern \$MAKESKIP are ignored. The
+ view action is done before making. OPTION operands are
+ passed to the underlying make command.
+ read [ package ... | archive ... ]
+ Read the named package archive(s). Must be run from the
+ package root directory. Archives are searched for in .
+ and lib/package/tgz. Each package is read only once. The
+ file lib/package/tgz/package[.type].tim tracks the read time.
+ See the write action for archive naming conventions. Text
+ file archive member are assumed to be ASCII or UTF-8 encoded.
+ regress diff(1) the current and previous package test results.
+ release [ [CC]YY-MM-DD [ [cc]yy-mm-dd ] ] [ package ]
+ Display recent changes since [CC]YY-MM-DD (up to [cc]yy-mm-dd),
+ where - means lowest (or highest.) If no dates are specified
+ then changes for the last 4 months are listed. PACKAGE may
+ be a package or component name.
+ remove PACKAGE
+ Remove files installed for PACKAGE.
+ results [ path ] [ old ] [ make | test ]
+ List results and interesting messages captured by the most
+ recent make (default), test or write action. old specifies the
+ previous results, if any (current and previous results are
+ retained.) $HOME/.pkgresults, if it exists, must contain an
+ egrep(1) expression of result lines to be ignored. failed lists
+ failures only and path lists the results file path only.
+ setup [ beta ] [ binary ] [ source ] [ ARCHITECTURE ... ] [ URL ] [ PACKAGE ... ]
+ The action initializes the current directory as a package root,
+ runs the update action to download new or out of date packages,
+ and runs the read action on those packages. If \"flat\" is
+ specified then the \$INSTALLROOT { bin fun include lib }
+ directories are linked to the same directories in the package
+ root. Only one architecture may be flat. See the update and
+ read actions for argument details.
+ test [ PACKAGE ]
+ Run the regression tests for PACKAGE. If the standard output
+ is a terminal then the output is also captured in
+ \$INSTALLROOT/lib/package/gen/test.out. In general a package
+ must be made before it can be tested. Components tested with
+ the \bregress\b(1) command require \bksh93\b. If only is
+ also specified then only the listed package components are
+ tested, otherwise the closure of the components is tested.
+ update [ beta ] [ binary ] [ source ] [ ARCHITECTURE ... ] [ URL ] [ PACKAGE ... ]
+ Download the latest release of the selected and required
+ packages from URL (e.g.,
+ http://www.research.att.com/sw/download) into the directory
+ \$PACKAGEROOT/lib/package/tgz. beta acesses beta packages;
+ download these at your own risk. If ARCHITECTURE is omitted
+ then only architectures already present in the tgz directory
+ will be downloaded. If ARCHITECTURE is - then all posted
+ architectures will be downloaded. If URL matches *.url then
+ it is interpreted as a file containing shell variable
+ assignments for url, authorize and password. If URL is
+ omitted then the definitions for url, authorize and password
+ in \$PACKAGEROOT/lib/package/tgz/$default_url, if it exists,
+ are used. If \$PACKAGEROOT/lib/package/tgz/$default_url does
+ not exist then it is initialized with the current url,
+ authorize and password values and read permission for the
+ current user only. If PACKAGE is omitted then only
+ packages already present in the tgz directory will be
+ downloaded. If PACKAGE is - then all posted packages will be
+ downloaded. If source and binary are omitted then both source
+ and binary packages will be downloaded. If \bonly\b is
+ specified then only the named packages are updated; otherwise
+ the closure of required packages is updated. This action
+ requires wget(1), lynx(1), curl(1) or a shell that supports
+ io to /dev/tcp/HOST/PORT.
+ use [ uid | PACKAGE | . [ 32 | 64 ] | 32 | 64 | - ] [ COMMAND ... ]
+ Run COMMAND or an interactive shell if COMMAND is omitted, with
+ the environment initialized for using the package (can you say
+ shared library without cussing?) If uid or PACKAGE or . is
+ specified then it is used to determine a \$PACKAGEROOT,
+ possibly different from the current directory. For example, to
+ try out bozo's package: \"package use bozo\". In this case the
+ command may be run from any directory. If the file
+ \$INSTALLROOT/lib/package/profile is readable then it is
+ sourced to initialize the environment. 32 or 64 implies
+ \$PACKAGEROOT of . and specifies the target architecture word
+ size (which may be silently ignored.)
+ verify [ PACKAGE ]
+ Verify installed binary files against the checksum files in
+ \$INSTALLROOT/lib/package/gen/*.sum. The checksum files contain
+ mode, user and group information. If the checksum matches
+ for a given file then the mode, user and group are changed
+ as necessary to match the checksum entry. A warning is printed
+ on the standard error for each mismatch. Requires the ast
+ package cksum(1) command.
+ view
+ Initialize the architecture specific viewpath hierarchy. The
+ make action implicitly calls this action. If \"flat\" is specified
+ then the \$INSTALLROOT { bin fun include lib } directories are
+ linked to the same directories in the package root. Only one
+ architecture may be flat.
+ write [closure] [cyg|exp|lcl|pkg|rpm|tgz|tst] [base|delta]
+ [binary|runtime|source] PACKAGE
+ Write a package archive for PACKAGE. All work is done in the
+ \$PACKAGEROOT/lib/package directory. FORMAT-specific files
+ are placed in the FORMAT subdirectory. A PACKAGE[.TYPE].tim
+ file in this directory tracksthe write time and prevents a
+ package from being read in the same root it was written. If
+ more than one file is generated for a particular FORMAT then
+ those files are placed in the FORMAT/PACKAGE subdirectory.
+ File names in the FORMAT subdirectory will contain the package
+ name, a YYYY-MM-DD date, and for binary packages, HOSTTYPE.
+ If PACKAGE is omitted then an ordered list of previously
+ written packages is generated. If \"only\" is specified then
+ only the named packages will be written; otherwise
+ prerequisite packages are written first. Package components
+ must be listed in PACKAGE.pkg. FORMAT may be one of:
+ cyg generate a cygwin package
+ exp generate an exptools(1) maintainer source archive
+ and NPD file in the exp subdirectory, suitable for
+ expmake(1); support files are placed in the
+ exp/PACKAGE subdirectory
+ lcl generate a package archive or delta in the lcl
+ subdirectory, suitable for restoration into the
+ primary source tree (no source licence annotation)
+ pkg generate a pkgmk(1) package, suitable for pkgadd(1)
+ rpm generate an rpm(1) package
+ tgz generate a gzip(1) tar(1) package archive; this is
+ the default
+ tst generate tgz FORMAT package archive in the tst
+ subdirectory; version state files are not updated
+ The package type must be one of source, binary or runtime.
+ A source package contains the source needed to build the
+ corresponding binary package. A binary package includes the
+ libraries and headers needed for compiling and linking
+ against the public interfaces. A runtime package contains
+ the commands and required dynamic libraries. A package may
+ be either a base or delta. A base package contains a
+ complete copy of all components. A delta package contains
+ only changes from a previous base package. Delta recipients
+ must have the ast pax(1) command (in the ast-base package.)
+ If neither base nor delta is specified, then the current
+ base is overwritten if there are no deltas referring to the
+ current base. Only the tgz and lcl formats support delta.
+ If base is specified then a new base and two delta archives
+ are generated: one delta to generate the new base from the
+ old, and one delta to generate the old base from the new;
+ the old base is then removed. If delta is specified then a
+ new delta referring to the current base is written.
+ package.pkg may reference other packages. By default a
+ pointer to those packages is written. The recipient package
+ read will then check that all required packages have been
+ downloaded. If closure is specified then the components for
+ all package references are included in the generated
+ package. This may be useful for lcl and versioning. All
+ formats but lcl annotate each source file (not already
+ annotated) with a license comment as it is written to the
+ package archive using proto(1).
+ name=value:
+ variable definition: typically CC=cc or CCFLAGS=-g."
+ ;;
+ esac
+ exit $code
+ ;;
+ *=*) set DEFAULT host type "$@"
+ ;;
+ *) echo "Usage: $command [ options ] [ qualifier ... ] [ action ] [ arg ... ] [ n=v ... ]" >&2
+ exit 2
+ ;;
+ esac
+ global="$global $1"
+ shift
+done
+
+# gather HOSTTYPE *,* options
+# ,*cc*,-*,... set CC and CCFLAGS
+
+hostopts()
+{
+ _ifs_=$IFS
+ IFS=,
+ set '' $HOSTTYPE
+ IFS=$_ifs_
+ shift
+ while :
+ do case $# in
+ 0|1) break ;;
+ esac
+ shift
+ case $1 in
+ *cc*) CC=$1
+ while :
+ do case $# in
+ 0|1) break ;;
+ esac
+ case $2 in
+ -*) case $assign_CCFLAGS in
+ ?*) assign_CCFLAGS="$assign_CCFLAGS " ;;
+ esac
+ assign_CCFLAGS="$assign_CCFLAGS$2"
+ shift
+ ;;
+ *) break
+ ;;
+ esac
+ done
+ ;;
+ esac
+ done
+}
+
+# collect command line targets and definitions
+
+case $_PACKAGE_HOSTTYPE_ in
+?*) HOSTTYPE=$_PACKAGE_HOSTTYPE_
+ KEEP_HOSTTYPE=1
+ ;;
+*) KEEP_HOSTTYPE=0
+ ;;
+esac
+KEEP_PACKAGEROOT=0
+KEEP_SHELL=0
+USER_VPATH=
+args=
+assign=
+assign_CCFLAGS=
+for i
+do case $i in
+ *:*=*) args="$args $i"
+ continue
+ ;;
+ *=*) eval `echo ' ' "$i" | sed 's,^[ ]*\([^=]*\)=\(.*\),n=\1 v='\''\2'\'','`
+ ;;
+ esac
+ case $i in
+ AR=*|LD=*|NM=*)
+ assign="$assign $n='$v'"
+ eval $n='$'v
+ ;;
+ CC=*) eval $n='$'v
+ ;;
+ CCFLAGS=*)
+ eval $n='$'v
+ assign_CCFLAGS="CCFLAGS=\"\$CCFLAGS\""
+ ;;
+ HOSTTYPE=*)
+ eval $n='$'v
+ case $HOSTTYPE in
+ ?*) KEEP_HOSTTYPE=1 ;;
+ esac
+ ;;
+ HURL=*) eval $n='$'v
+ ;;
+ PACKAGEROOT=*)
+ eval $n='$'v
+ case $PACKAGEROOT in
+ ?*) KEEP_PACKAGEROOT=1 ;;
+ esac
+ ;;
+ SHELL=*)eval $n='$'v
+ case $SHELL in
+ ?*) KEEP_SHELL=1 ;;
+ esac
+ ;;
+ TAR=*) eval $n='$'v
+ ;;
+ TARFLAGS=*)
+ eval $n='$'v
+ ;;
+ VPATH=*)eval USER_$n='$'v
+ ;;
+ 'debug=1')
+ makeflags="$makeflags --debug-symbols"
+ ;;
+ 'strip=1')
+ makeflags="$makeflags --strip-symbols"
+ ;;
+ *=*) assign="$assign $n='$v'"
+ ;;
+ *) args="$args $i"
+ ;;
+ esac
+done
+case $HOSTTYPE in
+*,*) hostopts $HOSTTYPE ;;
+esac
+case $assign_CCFLAGS in
+?*) assign="$assign $assign_CCFLAGS"
+esac
+case $CC in
+''|cc) ;;
+*) export CC ;;
+esac
+
+# grab action specific args
+
+case $action in
+admin) while :
+ do case $# in
+ 0) set list
+ break
+ ;;
+ esac
+ case $1 in
+ all) admin_all=1
+ ;;
+ db) case $# in
+ 1) echo $command: $action: $1: db file argument expected >&2
+ exit 1
+ ;;
+ esac
+ shift
+ admin_db=$1
+ ;;
+ on) case $# in
+ 1) echo $command: $action: $1: host pattern argument expected >&2
+ exit 1
+ ;;
+ esac
+ shift
+ admin_on=$1
+ ;;
+ *) break
+ ;;
+ esac
+ shift
+ done
+ admin_action=$1
+ admin_args=$*
+ for i
+ do case $i in
+ debug|environment|force|never|only|quiet|show|DEBUG)
+ ;;
+ *) admin_action=$i
+ break
+ ;;
+ esac
+ done
+ ;;
+setup) PACKAGEROOT=${PWD:-`pwd`}
+ export PACKAGEROOT
+ KEEP_PACKAGEROOT=1
+ ;;
+use) case $1 in
+ .|32|64)case $1 in
+ 32|64) bit=$1 ;;
+ esac
+ shift
+
+ # HOSTTYPE specific setup
+
+ case $HOSTTYPE in
+ win32.*)sys=uwin
+ wow=`uname -i`
+ case $bit in
+ 32) case $HOSTTYPE in
+ *-64) HOSTTYPE=${HOSTTYPE%-64} ;;
+ esac
+ case $wow in
+ */32) ;;
+ *) vpath / /$bit ;;
+ esac
+ ;;
+ 64) case $HOSTTYPE in
+ *-64) ;;
+ *) HOSTTYPE=$HOSTTYPE-64 ;;
+ esac
+ case $wow in
+ */32) echo $command: cannot build $bit-bit on $wow $sys >&2; exit 2 ;;
+ *) vpath / /$bit ;;
+ esac
+ ;;
+ esac
+ case $bit in
+ '') PS1="($sys) " ;;
+ *) PS1="($sys-$bit) " ;;
+ esac
+
+ $exec umask 002
+ $exec unset MAKESKIP
+
+ $exec export P=$PWD
+ $exec export A=$P/arch/$HOSTTYPE
+
+ $exec export CDPATH=:..:$A/src/cmd:$A/src/lib:$A/src/uwin:$P/lib/package
+ $exec export INSTALLROOT=$A
+ $exec export PACKAGEROOT=$P
+ $exec export PATH=$A/bin:$P/bin:$PATH
+ $exec export PS1="$PS1"
+ $exec export VPATH=$A:$P
+ $exec export nativepp=/usr/lib
+
+ if test '' != "$INSTALLROOT" -a -d $INSTALLROOT/include/ast
+ then $exec export PACKAGE_ast=$INSTALLROOT
+ elif test -d ${PWD%/*}/ast/arch/$HOSTTYPE
+ then $exec export PACKAGE_ast=${PWD%/*}/ast/arch/$HOSTTYPE
+ fi
+
+ # run the command
+
+ case $# in
+ 0) case $show in
+ ':') $exec exec $SHELL ;;
+ esac
+ ;;
+ *) $exec exec $SHELL -c "$@"
+ ;;
+ esac
+ exit
+ ;;
+ esac
+ PACKAGEROOT=${PWD:-`pwd`}
+ $show export PACKAGEROOT
+ esac
+ ;;
+esac
+
+# true if arg is a valid PACKAGEROOT
+
+packageroot() # dir
+{
+ test -d $1/lib/$command -o -x $1/bin/$command
+}
+
+# true if arg is executable
+
+executable() # [!] command
+{
+ case $1 in
+ '!') test ! -x "$2" -a ! -x "$2.exe"; return ;;
+ *) test -x "$1" -o -x "$1.exe"; return ;;
+ esac
+}
+
+# initialize SHELLMAGIC
+# tangible proof of cygwin's disdain for unix (well, this and execrate)
+
+shellmagic()
+{
+ case $SHELLMAGIC in
+ '') ;;
+ -) if test -f /emx/bin/sh.exe
+ then SHELLMAGIC='#!/emx/bin/sh.exe'$nl
+ elif test -f /bin/env.exe
+ then SHELLMAGIC='#!/bin/env sh'$nl
+ else SHELLMAGIC=
+ fi
+ ;;
+ esac
+}
+
+# true if arg is executable command on $PATH
+
+onpath() # command
+{
+ _onpath_b=$1
+ case $_onpath_b in
+ /*) if executable $_onpath_b
+ then _onpath_=$_onpath_b
+ return 0
+ fi
+ return 1
+ ;;
+ esac
+ IFS=':'
+ set '' $PATH
+ IFS=$ifs
+ shift
+ for _onpath_d
+ do case $_onpath_d in
+ '') _onpath_d=. ;;
+ esac
+ if executable "$_onpath_d/$_onpath_b"
+ then _onpath_=$_onpath_d/$_onpath_b
+ return 0
+ fi
+ done
+ return 1
+}
+
+# true if no nmake or nmake not from AT&T or nmake too old
+
+nonmake() # nmake
+{
+ _nonmake_version=`( $1 -n -f - 'print $(MAKEVERSION:@/.*AT&T.* //:/-//G:@/.* .*/19960101/)' . ) </dev/null 2>/dev/null || echo 19840919`
+ if test $_nonmake_version -lt 20001031
+ then return 0
+ fi
+ return 1
+}
+
+# determine local host attributes
+
+hostinfo() # attribute ...
+{
+ case $DEBUG in
+ 1) set -x ;;
+ esac
+ map=
+ something=
+ path=$PATH
+ for i in $ccs
+ do PATH=$PATH:$i
+ done
+ for i in $use
+ do for j in $org
+ do PATH=$PATH:$i/$j/bin
+ done
+ PATH=$PATH:$i/bin
+ done
+ # LD_LIBRARY_PATH may be out of sync with PATH here
+ case $SED in
+ '') SED=sed
+ $SED 1d < /dev/null > /dev/null 2>&1 ||
+ for dir in /bin /usr/bin
+ do if test -x $dir/$SED
+ then SED=$dir/$SED
+ break
+ fi
+ done
+ TR=tr
+ $TR < /dev/null > /dev/null 2>&1 ||
+ for dir in /bin /usr/bin
+ do if test -x $dir/$TR
+ then TR=$dir/$TR
+ break
+ fi
+ done
+ ;;
+ esac
+ case $PACKAGE_PATH in
+ ?*) for i in `echo $PACKAGE_PATH | $SED 's,:, ,g'`
+ do PATH=$PATH:$i/bin
+ done
+ ;;
+ esac
+
+ # validate the args
+
+ canon=
+ cc=$CC
+ for info
+ do case $canon in
+ -) canon=$info
+ ;;
+ *) case $info in
+ */*|*[cC][cC])
+ cc=$info
+ ;;
+ canon) canon=-
+ something=1
+ ;;
+ cpu|name|rating|type)
+ something=1
+ ;;
+ *) echo "$command: $action: $info: unknown attribute" >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+ done
+ case $canon in
+ -) echo "$command: $action: canon: host type name expected" >&2
+ exit 1
+ ;;
+ esac
+ case $something in
+ "") set "$@" type ;;
+ esac
+ case $DEBUG in
+ '') exec 9>&2
+ exec 2>/dev/null
+ ;;
+ esac
+
+ # compute the info
+
+ _hostinfo_=
+ for info
+ do
+ case $info in
+ cpu) case $NPROC in
+ [123456789]*)
+ _hostinfo_="$_hostinfo_ $NPROC"
+ continue
+ ;;
+ esac
+ cpu=`grep -ic '^processor[ ][ ]*:[ ]*[0123456789]' /proc/cpuinfo`
+ case $cpu in
+ [123456789]*)
+ _hostinfo_="$_hostinfo_ $cpu"
+ continue
+ ;;
+ esac
+ cpu=1
+ # exact match
+ set \
+ hinv '^Processor [0123456789]' \
+ psrinfo 'on-line' \
+ 'cat /reg/LOCAL_MACHINE/Hardware/Description/System/CentralProcessor' '.' \
+ 'cat /proc/registry/HKEY_LOCAL_MACHINE/Hardware/Description/System/CentralProcessor' '.' \
+
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ i=`$1 2>/dev/null | grep -c "$2"`
+ case $i in
+ [123456789]*)
+ cpu=$i
+ break
+ ;;
+ esac
+ shift;shift
+ done
+ case $cpu in
+ 0|1) set \
+ /bin/mpstat
+
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ if executable $1
+ then case `$1 | grep -ic '^cpu '` in
+ 1) cpu=`$1 | grep -ic '^ *[0123456789][0123456789]* '`
+ break
+ ;;
+ esac
+ fi
+ shift
+ done
+ ;;
+ esac
+ case $cpu in
+ 0|1) # token match
+ set \
+ /usr/kvm/mpstat 'cpu[0123456789]' \
+ /usr/etc/cpustatus 'enable' \
+ /usr/alliant/showsched 'CE' \
+ 'ls /config/hw/system/cpu' 'cpu' \
+ prtconf 'cpu-unit' \
+
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ i=`$1 2>/dev/null | $TR ' ' '
+
+' | grep -c "^$2"`
+ case $i in
+ [123456789]*)
+ cpu=$i
+ break
+ ;;
+ esac
+ shift;shift
+ done
+ ;;
+ esac
+ case $cpu in
+ 0|1) # special match
+ set \
+ \
+ hinv \
+ '/^[0123456789][0123456789]* .* Processors*$/' \
+ '/[ ].*//' \
+ \
+ /usr/bin/hostinfo \
+ '/^[0123456789][0123456789]* .* physically available\.*$/' \
+ '/[ ].*//' \
+
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ i=`$1 2>/dev/null | $SED -e "${2}!d" -e "s${3}"`
+ case $i in
+ [123456789]*)
+ cpu=$i
+ break
+ ;;
+ esac
+ shift;shift;shift
+ done
+ ;;
+ esac
+ case $cpu in
+ 0|1) cpu=`(
+ cd ${TMPDIR:-/tmp}
+ tmp=hi$$
+ trap 'rm -f $tmp.*' 0 1 2
+ cat > $tmp.c <<!
+#include <stdio.h>
+#include <pthread.h>
+int main()
+{
+ printf("%d\n", pthread_num_processors_np());
+ return 0;
+}
+!
+ for o in -lpthread ''
+ do if $CC $o -O -o $tmp.exe $tmp.c $o >/dev/null 2>&1 ||
+ gcc $o -O -o $tmp.exe $tmp.c $o >/dev/null 2>&1
+ then ./$tmp.exe
+ break
+ fi
+ done
+ )`
+ case $cpu in
+ [0123456789]*) ;;
+ *) cpu=1 ;;
+ esac
+ ;;
+ esac
+ _hostinfo_="$_hostinfo_ $cpu"
+ ;;
+ name) _name_=`hostname || uname -n || cat /etc/whoami || echo local`
+ _hostinfo_="$_hostinfo_ $_name_"
+ ;;
+ rating) for rating in `grep -i ^bogomips /proc/cpuinfo 2>/dev/null | $SED -e 's,.*:[ ]*,,' -e 's,\(...*\)\..*,\1,' -e 's,\(\..\).*,\1,'`
+ do case $rating in
+ [0123456789]*) break ;;
+ esac
+ done
+ case $rating in
+ [0123456789]*) ;;
+ *) cd ${TMPDIR:-/tmp}
+ tmp=hi$$
+ trap 'rm -f $tmp.*' 0 1 2
+ cat > $tmp.c <<!
+#include <stdio.h>
+#include <sys/types.h>
+#if TD || TZ
+#include <sys/time.h>
+#else
+extern time_t time();
+#endif
+int main()
+{
+ register unsigned long i;
+ register unsigned long j;
+ register unsigned long k;
+ unsigned long l;
+ unsigned long m;
+ unsigned long t;
+ int x;
+#if TD || TZ
+ struct timeval b;
+ struct timeval e;
+#if TZ
+ struct timezone z;
+#endif
+#endif
+ l = 500;
+ m = 890;
+ x = 0;
+ for (;;)
+ {
+#if TD || TZ
+#if TZ
+ gettimeofday(&b, &z);
+#else
+ gettimeofday(&b);
+#endif
+#else
+ t = (unsigned long)time((time_t*)0);
+#endif
+ k = 0;
+ for (i = 0; i < l; i++)
+ for (j = 0; j < 50000; j++)
+ k += j;
+#if TD || TZ
+#if TZ
+ gettimeofday(&e, &z);
+#else
+ gettimeofday(&e);
+#endif
+ t = (e.tv_sec - b.tv_sec) * 1000 + (e.tv_usec - b.tv_usec) / 1000;
+ if (!x++ && t < 1000)
+ {
+ t = 10000 / t;
+ l = (l * t) / 10;
+ continue;
+ }
+#else
+ t = ((unsigned long)time((time_t*)0) - t) * 1000;
+ if (!x++ && t < 20000)
+ {
+ t = 200000l / t;
+ l = (l * t) / 10;
+ continue;
+ }
+#endif
+#if PR
+ printf("[ k=%lu l=%lu m=%lu t=%lu ] ", k, l, m, t);
+#endif
+ if (t == 0)
+ t = 1;
+ break;
+ }
+ printf("%lu\n", ((l * m) / 10) / t);
+ return k == 0;
+}
+!
+ rating=
+ for o in -DTZ -DTD ''
+ do if $CC $o -O -o $tmp.exe $tmp.c >/dev/null 2>&1 ||
+ gcc $o -O -o $tmp.exe $tmp.c >/dev/null 2>&1
+ then rating=`./$tmp.exe`
+ break
+ fi
+ done
+ case $rating in
+ [0123456789]*) ;;
+ *) rating=1 ;;
+ esac
+ ;;
+ esac
+ _hostinfo_="$_hostinfo_ $rating"
+ ;;
+ type|canon)
+ case $CROSS:$canon in
+ 0:) case $cc in
+ cc) case $KEEP_HOSTTYPE:$HOSTTYPE in
+ 0:?*) if test -d ${PACKAGEROOT:-.}/arch/$HOSTTYPE
+ then KEEP_HOSTTYPE=1
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ case $KEEP_HOSTTYPE in
+ 1) _hostinfo_="$_hostinfo_ $HOSTTYPE"
+ continue
+ ;;
+ esac
+ ;;
+ esac
+ case $cc in
+ /*) a=`$cc -dumpmachine $CCFLAGS 2>/dev/null`
+ case $a in
+ '') case $CCFLAGS in
+ ?*) a=`$cc -dumpmachine 2>/dev/null` ;;
+ esac
+ ;;
+ esac
+ case $a in
+ ''|*' '*|*/*:*)
+ ;;
+ *.*-*) _hostinfo_="$_hostinfo_ $a"
+ continue
+ ;;
+ *-*-*) case $canon in
+ '') canon=$a ;;
+ esac
+ ;;
+ *) _hostinfo_="$_hostinfo_ $a"
+ continue
+ ;;
+ esac
+ ;;
+ esac
+ IFS=:
+ set /$IFS$PATH
+ IFS=$ifs
+ shift
+ f=../lib/hostinfo/typemap
+ for i
+ do case $i in
+ "") i=. ;;
+ esac
+ case $canon in
+ '') case $cc in
+ /*|cc) ;;
+ *) if executable $i/$cc
+ then a=`$i/$cc -dumpmachine $CCFLAGS 2>/dev/null`
+ case $a in
+ '') case $CCFLAGS in
+ ?*) a=`$cc -dumpmachine 2>/dev/null` ;;
+ esac
+ ;;
+ esac
+ case $a in
+ ''|*' '*|*/*:*)
+ ;;
+ *-*) canon=$a
+ ;;
+ *) _hostinfo_="$_hostinfo_ $a"
+ continue 2
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ if test -f "$i/$f"
+ then map="`grep -v '^#' $i/$f` $map"
+ fi
+ done
+
+ # inconsistent -dumpmachine filtered here
+
+ case -${canon}- in
+ --|*-powerpc-*)
+ h=`hostname || uname -n || cat /etc/whoami`
+ case $h in
+ '') h=local ;;
+ esac
+ a=`arch || uname -m || att uname -m || uname -s || att uname -s`
+ case $a in
+ *[\ \ ]*) a=`echo $a | $SED "s/[ ]/-/g"` ;;
+ esac
+ case $a in
+ '') a=unknown ;;
+ esac
+ m=`mach || machine || uname -p || att uname -p`
+ case $m in
+ *[\ \ ]*) m=`echo $m | $SED "s/[ ]/-/g"` ;;
+ esac
+ case $m in
+ '') m=unknown ;;
+ esac
+ x=`uname -a || att uname -a`
+ case $x in
+ '') x="unknown $host unknown unknown unknown unknown unknown" ;;
+ esac
+ set "" $h $a $m $x
+ expected=$1 host=$2 arch=$3 mach=$4 os=$5 sys=$6 rel=$7 ver=$8
+ ;;
+ *) case $canon in
+ *-*) IFS=-
+ set "" $canon
+ shift
+ IFS=$ifs
+ case $# in
+ 2) host= mach= arch=$1 os=$2 sys= rel= ;;
+ *) host= mach=$2 arch=$1 os=$3 sys= rel= ;;
+ esac
+ case $os in
+ [abcdefghijklmnopqrstuvwxyz]*[0123456789])
+ eval `echo $os | $SED -e 's/^\([^0123456789.]*\)\.*\(.*\)/os=\1 rel=\2/'`
+ ;;
+ esac
+ ;;
+ *) arch=$canon mach= os= sys= rel=
+ ;;
+ esac
+ ;;
+ esac
+ type=unknown
+ case $host in
+ *.*) host=`echo $host | $SED -e 's/\..*//'` ;;
+ esac
+ case $mach in
+ unknown)
+ mach=
+ ;;
+ [Rr][0123][0123456789][0123456789][0123456789])
+ mach=mips1
+ ;;
+ [Rr][4][0123456789][0123456789][0123456789])
+ mach=mips2
+ ;;
+ [Rr][56789][0123456789][0123456789][0123456789]|[Rr][123456789][0123456789][0123456789][0123456789][0123456789])
+ mach=mips4
+ ;;
+ pc) arch=i386
+ mach=
+ ;;
+ [Pp][Oo][Ww][Ee][Rr][Pp][Cc])
+ arch=ppc
+ mach=
+ ;;
+ *) case $arch in
+ 34[0123456789][0123456789])
+ os=ncr
+ arch=i386
+ ;;
+ esac
+ ;;
+ esac
+ case $canon in
+ '') set \
+ \
+ /NextDeveloper -d next - \
+ /config/hw/system/cpu -d tandem mach \
+
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ if test $2 $1
+ then os=$3
+ case $4 in
+ arch) mach=$arch ;;
+ mach) arch=$mach ;;
+ esac
+ break
+ fi
+ shift;shift;shift;shift
+ done
+ ;;
+ esac
+ case $os in
+ AIX*|aix*)
+ type=ibm.risc
+ ;;
+ HP-UX) case $arch in
+ 9000/[78]*)
+ type=hp.pa
+ ;;
+ */*) type=hp.`echo $arch | $SED 's,/,_,g'`
+ ;;
+ *) type=hp.$arch
+ ;;
+ esac
+ ;;
+ [Ii][Rr][Ii][Xx]*)
+ set xx `hinv | $SED -e '/^CPU:/!d' -e 's/CPU:[ ]*\([^ ]*\)[ ]*\([^ ]*\).*/\1 \2/' -e q | $TR ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ shift
+ type=$1
+ n=
+ case $2 in
+ r[0123][0123456789][0123456789][0123456789])
+ n=1
+ ;;
+ r[4][0123][0123456789][0123456789])
+ n=2
+ ;;
+ r[4][456789][0123456789][0123456789]|r[5][0123456789][0123456789][0123456789])
+ n=3
+ ;;
+ r[6789][0123456789][0123456789][0123456789]|r[123456789][0123456789][0123456789][0123456789][0123456789])
+ n=4
+ ;;
+ esac
+ case $rel in
+ [01234].*|5.[012]|5.[012].*)
+ case $n in
+ 1) ;;
+ *) n=2 ;;
+ esac
+ ;;
+ 5.*) case $n in
+ 2) n=3 ;;
+ esac
+ ;;
+ esac
+ if executable $cc
+ then a=$cc
+ else IFS=:
+ set /$IFS$PATH
+ IFS=$ifs
+ shift
+ for i
+ do a=$i/$cc
+ if executable $a
+ then break
+ fi
+ done
+ fi
+ split='
+'
+ a=`strings $a < /dev/null | $SED -e 's/[^abcdefghijklmnopqrstuvwxyz0123456789]/ /g' -e 's/[ ][ ]*/\'"$split"'/g' | $SED -e "/^${type}[0123456789]$/!d" -e "s/^${type}//" -e q`
+ case $a in
+ [0123456789]) n=$a ;;
+ esac
+ case $n in
+ 4) a=`$cc -${type}3 2>&1`
+ case $a in
+ *unknown*|*install*|*conflict*)
+ ;;
+ *) n=3
+ ;;
+ esac
+ ;;
+ esac
+ a=`$cc -show F0oB@r.c 2>&1`
+ case $n:$a in
+ [!2]:*mips2*) n=2 ;;
+ [!23]:*mips3*) n=3 ;;
+ [!234]:*mips4*) n=4 ;;
+ esac
+ case $n:$a in
+ [!2]:*[Oo]32*) abi=-o32 ;;
+ [!3]:*[Nn]32*) abi=-n32 ;;
+ esac
+ mach=${type}$n
+ type=sgi.$mach
+ ;;
+ OSx*|SMP*|pyramid)
+ type=pyr
+ ;;
+ OS/390) type=mvs.390
+ ;;
+ [Ss][Cc][Oo]*)
+ type=sco
+ ;;
+ [Ss]ol*)
+ v=`echo $rel | $SED -e 's/^[25]\.//' -e 's/\.[^.]*$//'`
+ case $v in
+ [6789]|[1-9][0-9])
+ ;;
+ *) v=
+ ;;
+ esac
+ case $arch in
+ '') case $mach in
+ '') arch=sun4 ;;
+ *) arch=$mach ;;
+ esac
+ ;;
+ esac
+ case $arch in
+ sparc) arch=sun4 ;;
+ esac
+ type=sol$v.$arch
+ ;;
+ [Ss]un*)type=`echo $arch | $SED -e 's/\(sun.\).*/\1/'`
+ case $type in
+ sparc) type=sun4 ;;
+ esac
+ case $rel in
+ [01234]*)
+ ;;
+ '') case $os in
+ *[Oo][Ss])
+ ;;
+ *) type=sol.$type
+ ;;
+ esac
+ ;;
+ *) case $type in
+ '') case $mach in
+ sparc*) type=sun4 ;;
+ *) type=$mach ;;
+ esac
+ ;;
+ esac
+ v=`echo $rel | $SED -e 's/^[25]\.//' -e 's/\.[^.]*$//'`
+ case $v in
+ [6789]|[1-9][0-9])
+ ;;
+ *) v=
+ ;;
+ esac
+ type=sol$v.$type
+ ;;
+ esac
+ case $type in
+ sun*|*.*)
+ ;;
+ *) type=sun.$type
+ ;;
+ esac
+ ;;
+ [Uu][Nn][Ii][Xx]_[Ss][Vv])
+ type=unixware
+ ;;
+ UTS*|uts*)
+ if test -x /bin/u370 -o -x /bin/u390
+ then type=uts.390
+ else case $arch in
+ '') arch=$mach ;;
+ esac
+ type=uts.$arch
+ fi
+ ;;
+ $host) type=$arch
+ case $type in
+ *.*|*[0123456789]*86|*68*)
+ ;;
+ *) case $mach in
+ *[0123456789]*86|*68*|mips)
+ type=$type.$mach
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ unknown)
+ case $arch in
+ ?*) case $arch in
+ sun*) mach= ;;
+ esac
+ type=$arch
+ case $mach in
+ ?*) type=$type.$mach ;;
+ esac
+ ;;
+ esac
+ ;;
+ *) case $ver in
+ FTX*|ftx*)
+ case $mach in
+ *[0123456789][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]*)
+ mach=`echo $mach | $SED -e 's/[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]*$//'`
+ ;;
+ esac
+ type=stratus.$mach
+ ;;
+ *) case $arch in
+ [Oo][Ss][-/.]2)
+ type=os2
+ arch=$rel
+ ;;
+ *) type=`echo $os | $SED -e 's/[0123456789].*//' -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789.].*//'`
+ ;;
+ esac
+ case $type in
+ [Cc][Yy][Gg][Ww][Ii][Nn]_*)
+ type=cygwin
+ ;;
+ [Uu][Ww][Ii][Nn]*|[Ww]indows_[0123456789][0123456789]|[Ww]indows_[Nn][Tt])
+ type=win32
+ arch=`echo $arch | $SED -e 's/_[^_]*$//'`
+ ;;
+ esac
+ case $arch in
+ '') case $mach in
+ ?*) type=$type.$mach ;;
+ esac
+ ;;
+ *) type=$type.$arch ;;
+ esac
+ ;;
+ esac
+ esac
+ case $type in
+ [0123456789]*)
+ case $mach in
+ ?*) type=$mach ;;
+ esac
+ case $type in
+ */MC) type=ncr.$type ;;
+ esac
+ ;;
+ *.*) ;;
+ *[0123456789]*86|*68*)
+ case $rel in
+ [34].[0123456789]*)
+ type=att.$type
+ ;;
+ esac
+ ;;
+ [abcdefghijklmnopqrstuvwxyz]*[0123456789])
+ ;;
+ [abcdefghijklmnopqrstuvwxyz]*) case $mach in
+ $type) case $ver in
+ Fault*|fault*|FAULT*)
+ type=ft.$type
+ ;;
+ esac
+ ;;
+ ?*) case $arch in
+ '') type=$type.$mach ;;
+ *) type=$type.$arch ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ case $type in
+ *[-_]32|*[-_]64|*[-_]128)
+ bits=`echo $type | $SED 's,.*[-_],,'`
+ type=`echo $type | $SED 's,[-_][0-9]*$,,'`
+ ;;
+ *) bits=
+ ;;
+ esac
+ type=`echo $type | $SED -e 's%[-+/].*%%' | $TR ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ case $type in
+ *.*) lhs=`echo $type | $SED -e 's/\..*//'`
+ rhs=`echo $type | $SED -e 's/.*\.//'`
+ case $rhs in
+ [x0123456789]*86) rhs=i$rhs ;;
+ 68*) rhs=m$rhs ;;
+ esac
+ case $rhs in
+ i[x23456789]86|i?[x23456789]86|*86pc)
+ rhs=i386 ;;
+ powerpc) rhs=ppc ;;
+ s[0123456789]*[0123456789]x)
+ rhs=`echo $rhs | $SED -e 's/x$/-64/'` ;;
+ esac
+ case $rhs in
+ arm[abcdefghijklmnopqrstuvwxyz_][0123456789]*)
+ rhs=arm ;;
+ hppa) rhs=pa ;;
+ esac
+ case $lhs in
+ ?*coff|?*dwarf|?*elf)
+ case $lhs in
+ ?*coff) x=coff ;;
+ ?*dwarf)x=coff ;;
+ ?*elf) x=elf ;;
+ esac
+ lhs=`echo ${lhs}XXX | $SED -e "s/${x}XXX//"`
+ ;;
+ esac
+ case $lhs in
+ bsdi) lhs=bsd ;;
+ darwin) case $rel in
+ [01234567].*) lhs=${lhs}7 ;;
+ esac
+ ;;
+ freebsd) case $rel in
+ [01234].*) lhs=${lhs}4 ;;
+ [123456789]*.*) lhs=${lhs}`echo $rel | $SED -e 's/\..*//'` ;;
+ esac
+ ;;
+ hpux) lhs=hp ;;
+ mvs) rhs=390 ;;
+ esac
+ case $lhs in
+ '') type=$rhs ;;
+ $rhs) type=$lhs ;;
+ *) type=$lhs.$rhs ;;
+ esac
+ ;;
+ esac
+ case $type in
+ sgi.mips*)
+ case $mach in
+ mips2) type=sgi.$mach
+ abi=-o32
+ ;;
+ mips3) type=sgi.$mach
+ abi=-n32
+ ;;
+ mips[456789])
+ type=sgi.$mach
+ case $abi in
+ *-n32) ;;
+ *) abi=-64 ;;
+ esac
+ ;;
+ *) pwd=`pwd`
+ cd ${TMPDIR:-/tmp}
+ tmp=hi$$
+ trap 'rm -f $tmp.*' 0 1 2
+ cat > $tmp.a.c <<!
+extern int b();
+int main() { return b(); }
+!
+ cat > $tmp.b.c <<!
+int b() { return 0; }
+!
+ abi=
+ if $cc -c $tmp.a.c
+ then for i in -n32 -o32 -64
+ do if $cc $i -c $tmp.b.c &&
+ $cc -o $tmp.exe $tmp.a.o $tmp.b.o
+ then abi=$i
+ for i in 2 3 4 5 6 7 8 9
+ do case $i:$abi in
+ 2:-n32|2:-64|3:-64)
+ continue
+ ;;
+ esac
+ if $cc $abi -mips$i -c $tmp.b.c &&
+ $cc -o $tmp.exe $tmp.a.o $tmp.b.o
+ then type=`echo $type | $SED -e 's/.$//'`$i
+ break
+ fi
+ done
+ break
+ fi
+ done
+ fi </dev/null >/dev/null 2>&1
+ rm -f $tmp.*
+ trap - 0 1 2
+ cd $pwd
+ ;;
+ esac
+ case $type$abi in
+ sgi.mips2-o32)
+ ;;
+ sgi.mips3)
+ type=$type-o32
+ ;;
+ sgi.mips3-n32)
+ ;;
+ sgi.mips4)
+ type=$type-o32
+ ;;
+ sgi.mips[456789]-64)
+ ;;
+ *) type=$type$abi
+ ;;
+ esac
+ ;;
+ *) case $bits in
+ '') case `file /bin/sh 2>/dev/null` in
+ *universal*64*)
+ pwd=`pwd`
+ cd ${TMPDIR:-/tmp}
+ tmp=hi$$
+ trap 'rm -f $tmp.*' 0 1 2
+ cat > $tmp.a.c <<!
+int main() { return 0; }
+!
+ if $cc -o $tmp.a.exe $tmp.a.c
+ then case `file $tmp.a.exe` in
+ *64*) bits=64 ;;
+ esac
+ fi </dev/null >/dev/null 2>&1
+ rm -f $tmp.*
+ trap - 0 1 2
+ cd $pwd
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ case $bits in
+ 32) case $type in
+ *.i386) bits= ;;
+ esac
+ ;;
+ esac
+ case $bits in
+ ?*) type=$type-$bits ;;
+ esac
+
+ # last chance mapping
+
+ set "" "" $map
+ while :
+ do case $# in
+ [012]) break ;;
+ esac
+ shift;shift
+ eval " case \$type in
+ $1) type=\$2; break ;;
+ esac"
+ done
+ _hostinfo_="$_hostinfo_ $type"
+ ;;
+ esac
+ done
+ set '' $_hostinfo_
+ shift
+ _hostinfo_=$*
+
+ # restore the global state
+
+ PATH=$path
+ case $DEBUG in
+ '') exec 2>&9
+ exec 9>&-
+ ;;
+ esac
+}
+
+# info message
+
+note() # message ...
+{
+ echo $command: "$@" >&2
+}
+
+# cc checks
+#
+# CC: compiler base name name
+# cc: full path, empty if not found
+
+checkcc()
+{
+ cc=
+ if onpath $CC
+ then cc=$_onpath_
+ else case $CC in
+ cc) if onpath gcc
+ then CC=gcc
+ cc=$_onpath_
+ fi
+ ;;
+ esac
+ fi
+ case $cc in
+ '') case $action in
+ make|test) note "$CC: not found"; exit 1 ;;
+ *) note "warning: $CC: not found" ;;
+ esac
+ ;;
+ esac
+}
+
+# some actions have their own PACKAGEROOT or kick out early
+
+case $action in
+host) eval u=$package_use
+ case $u in
+ $PACKAGE_USE)
+ ;;
+ *) if onpath $0
+ then case $_onpath_ in
+ */arch/$HOSTTYPE/bin/package)
+ KEEP_HOSTTYPE=1
+ ;;
+ *) KEEP_HOSTTYPE=0
+ ;;
+ esac
+ else KEEP_HOSTTYPE=0
+ fi
+ ;;
+ esac
+ hostinfo $args
+ echo $_hostinfo_
+ exit 0
+ ;;
+export|setup|use)
+ x=
+ ;;
+*) x=
+ eval u=$package_use
+ case $u in
+ $PACKAGE_USE)
+ case :$PATH: in
+ *:$INSTALLROOT/bin:*)
+ case $LIBPATH: in
+ $INSTALLROOT/bin:$INSTALLROOT/lib:*)
+ case $SHLIB_PATH: in
+ $INSTALLROOT/lib:*)
+ x=1
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+esac
+run=-
+case $x in
+1) : accept the current package use environment
+
+ OK=ok
+ KSH=$EXECROOT/bin/ksh
+ MAKE=nmake
+ NMAKE=$EXECROOT/bin/$MAKE
+ SUM=$EXECROOT/bin/sum
+ TEE=$EXECROOT/bin/tee
+ INITROOT=$PACKAGEROOT/src/cmd/INIT
+ checkcc
+ ;;
+*) hosttype=
+ case $KEEP_PACKAGEROOT in
+ 0) case $action in
+ use) PACKAGEROOT=
+ case $show in
+ echo) exec=echo make=echo show=echo ;;
+ esac
+ set '' $args
+ shift
+ case $# in
+ 0) ;;
+ *) case $1 in
+ -|.) ;;
+ /*) PACKAGEROOT=$1
+ ;;
+ *) i=`echo ~$1`
+ if packageroot $i
+ then PACKAGEROOT=$i
+ else for i in `echo $HOME | sed -e 's,/[^/]*$,,'` $usr $use
+ do if packageroot $i/$1
+ then PACKAGEROOT=$i/$1
+ break
+ fi
+ done
+ case $PACKAGEROOT in
+ '') hosttype=$1 ;;
+ esac
+ fi
+ ;;
+ esac
+ shift
+ ;;
+ esac
+ run="$@"
+ ;;
+ esac
+ case $PACKAGEROOT in
+ '') PACKAGEROOT=${PWD:-`pwd`} ;;
+ esac
+
+ # . must be within the PACKAGEROOT tree
+
+ i=X$PACKAGEROOT
+ IFS=/
+ set $i
+ IFS=$ifs
+ while :
+ do i=$1
+ shift
+ case $i in
+ X) break ;;
+ esac
+ done
+ case $PACKAGEROOT in
+ //*) d=/ ;;
+ *) d= ;;
+ esac
+ case $1 in
+ home) k=1 ;;
+ *) k=0 ;;
+ esac
+ for i
+ do case $i in
+ '') continue ;;
+ esac
+ d=$d/$i
+ case $k in
+ 2) k=1
+ ;;
+ 1) k=0
+ ;;
+ 0) case $i in
+ arch) k=2
+ ;;
+ *) if packageroot $d
+ then PACKAGEROOT=$d
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ done
+ ;;
+ esac
+ INITROOT=$PACKAGEROOT/src/cmd/INIT
+ $show PACKAGEROOT=$PACKAGEROOT
+ $show export PACKAGEROOT
+ export PACKAGEROOT
+
+ # initialize the architecture environment
+
+ case $KEEP_HOSTTYPE in
+ 0) hostinfo type
+ HOSTTYPE=$_hostinfo_
+ ;;
+ 1) _PACKAGE_HOSTTYPE_=$HOSTTYPE
+ export _PACKAGE_HOSTTYPE_
+ ;;
+ esac
+ $show HOSTTYPE=$HOSTTYPE
+ $show export HOSTTYPE
+ export HOSTTYPE
+ INSTALLROOT=$PACKAGEROOT/arch/$HOSTTYPE
+ case $action in
+ admin|install|make|read|remove|test|verify|view|write)
+ ;;
+ *) if test ! -d $INSTALLROOT
+ then INSTALLROOT=$PACKAGEROOT
+ fi
+ ;;
+ esac
+ $show INSTALLROOT=$INSTALLROOT
+ $show export INSTALLROOT
+ export INSTALLROOT
+
+ # HOSTTYPE specific package profile
+
+ if test -r $INSTALLROOT/lib/package/profile
+ then . $INSTALLROOT/lib/package/profile
+ fi
+
+ # check the basic package hierarchy
+
+ case $action in
+ export|use)
+ packageroot $PACKAGEROOT || {
+ echo "$command: $PACKAGEROOT: invalid package root directory" >&2
+ exit 1
+ }
+ case $KEEP_HOSTTYPE:$hosttype in
+ 0:?*) if test -d ${PACKAGEROOT:-.}/arch/$hosttype
+ then KEEP_HOSTTYPE=1
+ HOSTTYPE=$hosttype
+ else echo "$command: $hosttype: package root not found" >&2
+ exit 1
+ fi
+ ;;
+ esac
+ ;;
+ *) packageroot $PACKAGEROOT || {
+ case $KEEP_PACKAGEROOT in
+ 1) ;;
+ *) echo "$command: $PACKAGEROOT: must be in the package root directory tree" >&2
+ exit 1
+ ;;
+ esac
+ }
+
+ case $action in
+ admin) ;;
+ *) for i in arch arch/$HOSTTYPE
+ do test -d $PACKAGEROOT/$i || $exec mkdir $PACKAGEROOT/$i || exit
+ done
+ for i in lib
+ do test -d $INSTALLROOT/$i || $exec mkdir $INSTALLROOT/$i || exit
+ done
+ ;;
+ esac
+
+ # no $INITROOT means INIT already installed elsewhere
+
+ if test -d $INITROOT
+ then
+ # update the basic package commands
+
+ for i in execrate ignore mamprobe silent
+ do test -h $PACKAGEROOT/bin/$i 2>/dev/null ||
+ case `ls -t $INITROOT/$i.sh $PACKAGEROOT/bin/$i 2>/dev/null` in
+ "$INITROOT/$i.sh"*)
+ note update $PACKAGEROOT/bin/$i
+ shellmagic
+ case $SHELLMAGIC in
+ '') $exec cp $INITROOT/$i.sh $PACKAGEROOT/bin/$i || exit
+ ;;
+ *) case $exec in
+ '') {
+ echo "$SHELLMAGIC"
+ cat $INITROOT/$i.sh
+ } > $PACKAGEROOT/bin/$i || exit
+ ;;
+ *) echo "{
+echo \"$SHELLMAGIC\"
+cat $INITROOT/$i.sh
+} > $PACKAGEROOT/bin/$i"
+ ;;
+ esac
+ ;;
+ esac
+ $exec chmod +x $PACKAGEROOT/bin/$i || exit
+ ;;
+ esac
+ done
+ fi
+ ;;
+ esac
+ path=$PATH
+ PATH=$INSTALLROOT/bin:$PACKAGEROOT/bin:$PATH
+ checkcc
+ PATH=$path
+ case $cc in
+ ?*) if test -f $INITROOT/hello.c
+ then
+ # check if $CC (full path $cc) is a cross compiler
+
+ (
+ cd /tmp || exit 3
+ cp $INITROOT/hello.c pkg$$.c || exit 3
+ $cc -o pkg$$.exe pkg$$.c > pkg$$.e 2>&1 || {
+ if $cc -Dnew=old -o pkg$$.exe pkg$$.c > /dev/null 2>&1
+ then echo "$command: ${warn}$CC: must be a C compiler (not C++)" >&2
+ else cat pkg$$.e
+ echo "$command: ${warn}$CC: failed to compile and link $INITROOT/hello.c -- is it a C compiler?" >&2
+ fi
+ exit 2
+ }
+ if ./pkg$$.exe >/dev/null 2>&1
+ then code=0
+ else code=1
+ fi
+ rm -f pkg$$.*
+ exit $code
+ )
+ code=$?
+ case $code in
+ 1) CROSS=1 ;;
+ esac
+ fi
+ ;;
+ esac
+ EXECTYPE=$HOSTTYPE
+ EXECROOT=$INSTALLROOT
+ case $CROSS in
+ 0) # dll hackery -- why is this so complicated?
+
+ abi=
+ case $HOSTTYPE in
+ sgi.mips[0123456789]*)
+ x=rld
+ if executable /lib32/$x || executable /lib64/$x
+ then case $INSTALLROOT in
+ */sgi.mips[0123456789]*)
+ u=`echo $INSTALLROOT | sed -e 's,-[^-/]*$,,' -e 's,.$,,'`
+ ;;
+ *) u=
+ ;;
+ esac
+ for a in "n=2 v= l=" "n=3 v=N32 l=lib32" "n=4-n32 v=N32 l=lib32" "n=4 v=64 l=lib64"
+ do eval $a
+ case $v in
+ N32) case $n:$HOSTTYPE in
+ *-n32:*-n32) ;;
+ *-n32:*) continue ;;
+ *:*-n32) continue ;;
+ esac
+ ;;
+ esac
+ case $l in
+ ?*) if executable ! /$l/$x
+ then continue
+ fi
+ ;;
+ esac
+ case $u in
+ '') case $HOSTTYPE in
+ sgi.mips$n|sgi.mips$n-*)
+ abi="$abi 'd=$INSTALLROOT v=$v'"
+ ;;
+ *) continue
+ ;;
+ esac
+ ;;
+ *) if test -d $u$n
+ then abi="$abi 'd=$u$n v=$v'"
+ fi
+ ;;
+ esac
+ done
+ fi
+ ;;
+ esac
+ case $abi in
+ '') abi="'d=$INSTALLROOT v='" ;;
+ esac
+ p=0
+ eval "
+ for a in $abi
+ do eval \$a
+ eval \"
+ case \\\$LD_LIBRARY\${v}_PATH: in
+ \\\$d/lib:*)
+ ;;
+ *) x=\\\$LD_LIBRARY\${v}_PATH
+ case \\\$x in
+ ''|:*) ;;
+ *) x=:\\\$x ;;
+ esac
+ LD_LIBRARY\${v}_PATH=\$d/lib\\\$x
+ export LD_LIBRARY\${v}_PATH
+ p=1
+ ;;
+ esac
+ \"
+ done
+ "
+ case $LD_LIBRARY_PATH in
+ '') ;;
+ *) for d in $lib
+ do case $HOSTTYPE in
+ *64) if test -d ${d}64
+ then d=${d}64
+ fi
+ ;;
+ esac
+ case :$LD_LIBRARY_PATH: in
+ *:$d:*) ;;
+ *) if test -d $d
+ then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$d
+ p=1
+ fi
+ ;;
+ esac
+ done
+ ;;
+ esac
+ case $p in
+ 1) $show LD_LIBRARY_PATH=$LD_LIBRARY_PATH
+ $show export LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH
+ ;;
+ esac
+ case $LIBPATH: in
+ $INSTALLROOT/bin:$INSTALLROOT/lib:*)
+ ;;
+ *) case $LIBPATH in
+ '') LIBPATH=/usr/lib:/lib ;;
+ esac
+ LIBPATH=$INSTALLROOT/bin:$INSTALLROOT/lib:$LIBPATH
+ $show LIBPATH=$LIBPATH
+ $show export LIBPATH
+ export LIBPATH
+ ;;
+ esac
+ case $SHLIB_PATH: in
+ $INSTALLROOT/lib:*)
+ ;;
+ *) SHLIB_PATH=$INSTALLROOT/lib${SHLIB_PATH:+:$SHLIB_PATH}
+ $show SHLIB_PATH=$SHLIB_PATH
+ $show export SHLIB_PATH
+ export SHLIB_PATH
+ ;;
+ esac
+ case $DYLD_LIBRARY_PATH: in
+ $INSTALLROOT/lib:*)
+ ;;
+ *) DYLD_LIBRARY_PATH=$INSTALLROOT/lib${DYLD_LIBRARY_PATH:+:$DYLD_LIBRARY_PATH}
+ $show DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH
+ $show export DYLD_LIBRARY_PATH
+ export DYLD_LIBRARY_PATH
+ ;;
+ esac
+ case $_RLD_ROOT in
+ $INSTALLROOT/arch*) ;;
+ ':') _RLD_ROOT=$INSTALLROOT/arch:/ ;;
+ /|*:/) _RLD_ROOT=$INSTALLROOT/arch:$_RLD_ROOT ;;
+ *) _RLD_ROOT=$INSTALLROOT/arch:$_RLD_ROOT:/ ;;
+ esac
+ $show _RLD_ROOT=$_RLD_ROOT
+ $show export _RLD_ROOT
+ export _RLD_ROOT
+
+ # now set up PATH
+ #
+ # NOTE: PACKAGEROOT==INSTALLROOT is possible for binary installations
+
+ case $PATH: in
+ $PACKAGEROOT/bin:*)
+ ;;
+ *) PATH=$PACKAGEROOT/bin:$PATH
+ ;;
+ esac
+ case $PATH: in
+ $INSTALLROOT/bin:*)
+ ;;
+ *) PATH=$INSTALLROOT/bin:$PATH
+ ;;
+ esac
+ $show PATH=$PATH
+ $show export PATH
+ export PATH
+ ;;
+ *) for i in package proto nmake
+ do if onpath $i
+ then EXECROOT=`echo $_onpath_ | sed -e 's,//*[^/]*//*[^/]*$,,'`
+ EXECTYPE=`echo $EXECROOT | sed -e 's,.*/,,'`
+ break
+ fi
+ done
+ case $HOSTTYPE in
+ $EXECTYPE)
+ OCC=$CC
+ CC=cc
+ hostinfo type
+ EXECTYPE=$_hostinfo_
+ case $HOSTTYPE in
+ $EXECTYPE)
+ echo "$command: $CC: seems to be a cross-compiler" >&2
+ echo "$command: set HOSTTYPE to something other than the native $EXECTYPE" >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+ $show EXECTYPE=$EXECTYPE
+ $show export EXECTYPE
+ export EXECTYPE
+ ;;
+ esac
+ $show EXECROOT=$EXECROOT
+ $show export EXECROOT
+ export EXECROOT
+
+ # use these if possible
+
+ OK=ok
+ KSH=$EXECROOT/bin/ksh
+ MAKE=nmake
+ NMAKE=$EXECROOT/bin/$MAKE
+ SUM=$EXECROOT/bin/sum
+ TEE=$EXECROOT/bin/tee
+
+ # grab a decent default shell
+
+ case $KEEP_SHELL in
+ 0) executable "$SHELL" || SHELL=
+ case $SHELL in
+ ?*) checksh $SHELL || SHELL= ;;
+ esac
+ case $SHELL in
+ ''|/bin/*|/usr/bin/*)
+ case $SHELL in
+ '') SHELL=/bin/sh ;;
+ esac
+ for i in ksh sh bash
+ do if onpath $i && checksh $_onpath_
+ then SHELL=$_onpath_
+ break
+ fi
+ done
+ ;;
+ */*ksh) if executable $KSH
+ then SHELL=$KSH
+ fi
+ ;;
+ esac
+ ;;
+ esac
+
+ # $SHELL must be /bin/sh compatible
+
+ case $SHELL in
+ /bin/sh);;
+ '') SHELL=/bin/sh
+ ;;
+ *) $SHELL -c 'trap "exit 0" 0; exit 1' 2>/dev/null
+ case $? in
+ 1) SHELL=/bin/sh
+ ;;
+ *) # catch (our own) pipe/socket configuration mismatches
+ $SHELL -c "date | $SHELL -c 'read x'"
+ case $? in
+ 0) ;;
+ *) SHELL=/bin/sh ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ export SHELL
+ $show SHELL=$SHELL
+ $show export SHELL
+ COSHELL=$SHELL
+ export COSHELL
+ $show COSHELL=$COSHELL
+ $show export COSHELL
+
+ # tame the environment
+
+ case $action in
+ use) ;;
+ *) ENV=
+ ERROR_OPTIONS=
+ export ENV ERROR_OPTIONS
+ ;;
+ esac
+
+ # finalize the views
+
+ case $USER_VPATH in
+ '') case $VPATH in
+ ?*) IFS=':'
+ set '' $VPATH
+ shift
+ IFS=$ifs
+ USER_VPATH=
+ for i
+ do case $i in
+ */arch/$HOSTTYPE) ;;
+ */arch/*/*) ;;
+ */arch/*) continue ;;
+ esac
+ if packageroot $i
+ then case $USER_VPATH in
+ '') USER_VPATH=$i ;;
+ ?*) USER_VPATH=$USER_VPATH:$i ;;
+ esac
+ fi
+ done
+ esac
+ ;;
+ esac
+ case $USER_VPATH in
+ ?*) IFS=':'
+ set '' $USER_VPATH
+ shift
+ IFS=$ifs
+ USER_VPATH=
+ USER_VPATH_CHAIN=
+ p=$PACKAGEROOT
+ for i
+ do case $i in
+ ''|$PACKAGEROOT|$INSTALLROOT)
+ ;;
+ ?*) USER_VPATH=$USER_VPATH:$i
+ USER_VPATH_CHAIN="$USER_VPATH_CHAIN $p $i"
+ p=$i
+ case $PROTOROOT in
+ -) executable $i/bin/mamake && PROTOROOT= ;;
+ esac
+ ;;
+ esac
+ done
+ ;;
+ esac
+ ;;
+esac
+PACKAGESRC=$PACKAGEROOT/lib/package
+PACKAGEBIN=$INSTALLROOT/lib/package
+case $action:$run in
+use:-) set '' $args
+ shift
+ case $# in
+ 0) ;;
+ *) shift ;;
+ esac
+ run="$@"
+ ;;
+esac
+
+# more cygwin hassles
+
+case $HOSTTYPE in
+cygwin.*)
+ lose=
+ case $CYGWIN in
+ *nontsec*)
+ lose=ntsec
+ ;;
+ *ntsec*);;
+ *) exe=/tmp/pkg$$.exe
+ rm -f $exe
+ : > $exe
+ if test -x $exe
+ then lose=ntsec
+ fi
+ ;;
+ esac
+ case $CYGWIN in
+ *nobinmode*)
+ case $lose in
+ '') lose=binmode ;;
+ *) lose="$lose binmode" ;;
+ esac
+ ;;
+ esac
+ case $lose in
+ ?*) echo "$command: $HOSTTYPE: export '$lose' in CYGWIN or languish in windows" >&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# set up the view state
+
+VIEW_bin=$INSTALLROOT VIEW_src=$PACKAGEROOT VIEW_all="$INSTALLROOT $PACKAGEROOT"
+if (vpath $INSTALLROOT $PACKAGEROOT $USER_VPATH_CHAIN) >/dev/null 2>&1 &&
+ vpath $INSTALLROOT $PACKAGEROOT $USER_VPATH_CHAIN
+then $show vpath $INSTALLROOT $PACKAGEROOT $USER_VPATH_CHAIN
+else VPATH=$INSTALLROOT:$PACKAGEROOT$USER_VPATH
+ $show VPATH=$VPATH
+ $show export VPATH
+ export VPATH
+ IFS=':'
+ set '' $VPATH
+ shift
+ IFS=$ifs
+ for i
+ do case $i in
+ */arch/*/*)
+ VIEW_src="$VIEW_src $i"
+ ;;
+ */arch/*)
+ VIEW_bin="$VIEW_bin $i"
+ ;;
+ *)
+ VIEW_src="$VIEW_src $i"
+ ;;
+ esac
+ VIEW_all="$VIEW_all $i"
+ done
+fi
+
+# return 0 if arg in src|bin|all view
+
+view() # [test] [-|type] [src|bin|all] file
+{
+ case $1 in
+ -[dfsx])_view_T_=$1; shift ;;
+ *) _view_T_=-f ;;
+ esac
+ case $1 in
+ -) _view_t_= ;;
+ *) _view_t_=$1 ;;
+ esac
+ shift
+ case $1 in
+ all) shift; _view_v_=$VIEW_all ;;
+ bin) shift; _view_v_=$VIEW_bin ;;
+ src) shift; _view_v_=$VIEW_src ;;
+ *) _view_v_=$VIEW_all ;;
+ esac
+ case $1 in
+ /*) if test $_view_T_ $1
+ then _view_=$1
+ return 0
+ fi
+ ;;
+ *) for _view_d_ in $_view_v_
+ do if test $_view_T_ $_view_d_/$1
+ then _view_=$_view_d_/$1
+ return 0
+ fi
+ done
+ ;;
+ esac
+ _view_=
+ case $_view_t_ in
+ ?*) echo $command: $1: $_view_t_ not found >&2 ;;
+ esac
+ return 1
+}
+
+# determine the package and targets
+
+case $action in
+admin) case $admin_action in
+ results)action=$admin_action
+ set '' $admin_args
+ shift;shift
+ admin_args="admin $*"
+ case $admin_on in
+ '') target=$admin_args ;;
+ *) target="on $admin_on $admin_args" ;;
+ esac
+ ;;
+ esac
+ ;;
+release)set '' $args
+ target=
+ while :
+ do shift
+ case $1 in
+ -|[0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]|[0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789])
+ target="$target $1"
+ ;;
+ *) break
+ ;;
+ esac
+ done
+ package=$*
+ ;;
+setup) # { update read } with optional (bin|fun|include|lib) symlinks
+ # flat option sets up { bin fun include lib } symlinks from
+ # $INSTALLROOT to $PACKAGEROOT
+
+ # . is the package root
+
+ set '' $args
+ shift
+ types=
+ url=
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ --) shift
+ break
+ ;;
+ flat) flat=1 # backwards compatibility -- documentation dropped
+ ;;
+ *://*|*.url)
+ url=$1
+ shift
+ break
+ ;;
+ *) types="$types $1"
+ ;;
+ esac
+ shift
+ done
+ if test ! -d $PACKAGEROOT/lib/package/tgz
+ then $exec mkdir -p $PACKAGEROOT/lib/package/tgz || exit
+ fi
+ case " $types " in
+ *" source "*)
+ case " $* " in
+ ' ') ;;
+ *" INIT "*)
+ ;;
+ *) view - all src/cmd/INIT ||
+ set INIT "$@"
+ ;;
+ esac
+ ;;
+ esac
+ packages=`$0 $global authorize "$authorize" password "$password" update setup $types $url "$@" PACKAGEROOT=$PACKAGEROOT`
+ case $packages in
+ ?*) $0 $global read $packages PACKAGEROOT=$PACKAGEROOT
+ esac
+ exit
+ ;;
+*) package=
+ target=
+ set '' $args
+ while :
+ do shift
+ case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ ''|-) target="$target $package"
+ package=
+ ;;
+ *) if view - src "lib/package/$1.pkg"
+ then package="$package $1"
+ else target="$target $package $1"
+ package=
+ fi
+ ;;
+ esac
+ done
+ ;;
+esac
+
+# flatten -- assumes symlink support
+
+case $flat in
+1) case $action in
+ make|read|setup|update|use|view)
+ if test ! -d $INSTALLROOT
+ then $exec mkdir -p $INSTALLROOT || exit
+ fi
+ for i in bin include lib fun man share
+ do if test ! -d $INSTALLROOT/../../$i
+ then $exec mkdir $INSTALLROOT/../../$i
+ fi
+ if test ! -d $INSTALLROOT/$i
+ then if test ! -h $INSTALLROOT/$i
+ then $exec ln -s ../../$i $INSTALLROOT/$i
+ fi
+ elif test ! -h $INSTALLROOT/$i
+ then for x in $INSTALLROOT/$i/.[a-z]* $INSTALLROOT/$i/*
+ do if test -f $x -o -d $x
+ then if test ! -d $INSTALLROOT/$i/$x || test ! -d $INSTALLROOT/../../$i/$x
+ then $exec mv $x $INSTALLROOT/../../$i
+ fi
+ fi
+ done
+ $exec rm -rf $INSTALLROOT/$i
+ $exec ln -s ../../$i $INSTALLROOT/$i
+ fi
+ done
+ ;;
+ esac
+ ;;
+esac
+
+# check that cmd args are up to date a.out's
+
+checkaout() # cmd ...
+{
+ case $PROTOROOT in
+ -) PROTOROOT=
+ case $* in
+ ratz) if test -f $INITROOT/ratz.c -a -w $PACKAGEROOT
+ then test -f $INITROOT/hello.c || {
+ cat > $INITROOT/hello.c <<'!'
+#ifndef printf
+#include <stdio.h>
+#endif
+int main() { int new = 0; printf("hello world\n"); return new;}
+!
+ }
+ test -f $INITROOT/p.c || {
+ cat > $INITROOT/p.c <<'!'
+/*
+ * small test for prototyping cc
+ */
+
+int main(int argc, char** argv) { return argc || argv; }
+!
+ }
+ fi
+ ;;
+ esac
+ test -f $INITROOT/hello.c -a -f $INITROOT/p.c -a -w $PACKAGEROOT || {
+ for i
+ do onpath $i || {
+ echo "$command: $i: command not found" >&2
+ return 1
+ }
+ done
+ return 0
+ }
+ case $cc in
+ '') _PACKAGE_cc=0
+ ;;
+ *) _PACKAGE_cc=1
+ test -f $INITROOT/hello.c -a -f $INITROOT/p.c || {
+ echo "$command: $INITROOT: INIT package source not found" >&2
+ return 1
+ }
+ executable $INSTALLROOT/bin/nmake || {
+ # check for prototyping cc
+ # NOTE: proto.c must be K&R compatible
+
+ $CC -c $INITROOT/p.c >/dev/null 2>&1
+ c=$?
+ rm -f p.*
+ test 0 != "$c" && {
+ checkaout proto || return
+ PROTOROOT=$PACKAGEROOT/proto
+ $show PROTOROOT=$PACKAGEROOT/proto
+ export PROTOROOT
+ INITPROTO=$PROTOROOT/src/cmd/INIT
+ note proto convert $PACKAGEROOT/src into $PROTOROOT/src
+ if test -d $PACKAGEROOT/src/cmd/nmake
+ then dirs="src/cmd/INIT src/lib/libast src/lib/libardir src/lib/libcoshell src/lib/libpp src/cmd/probe src/cmd/cpp src/cmd/nmake"
+ else dirs="src"
+ fi
+ (
+ if test -f $PROTOROOT/UPDATE
+ then newer="-newer $PROTOROOT/UPDATE"
+ else newer=""
+ fi
+ case $exec in
+ '') cd $PACKAGEROOT
+ find $dirs -name '*.[CcHh]' $newer -print | proto -v -L - -C proto
+ ;;
+ *) $exec cd $PACKAGEROOT
+ $exec "find $dirs -name '*.[CcHh]' $newer -print | proto -L - -C proto"
+ ;;
+ esac
+ $exec touch $PROTOROOT/UPDATE
+ )
+ if (vpath $INSTALLROOT - $INSTALLROOT $PROTOROOT $PROTOROOT $PACKAGEROOT) >/dev/null 2>&1 &&
+ vpath $INSTALLROOT - $INSTALLROOT $PROTOROOT $PROTOROOT $PACKAGEROOT
+ then $show vpath $INSTALLROOT $PROTOROOT $PROTOROOT $PACKAGEROOT $USER_VPATH_CHAIN
+ else VPATH=$INSTALLROOT:$PROTOROOT:$PACKAGEROOT$USER_VPATH
+ $show VPATH=$VPATH
+ export VPATH
+ fi
+ }
+ }
+ for i in arch arch/$HOSTTYPE arch/$HOSTTYPE/bin
+ do test -d $PACKAGEROOT/$i || $exec mkdir $PACKAGEROOT/$i || return
+ done
+ ;;
+ esac
+ ;;
+ esac
+ case $_PACKAGE_cc in
+ '') case $cc in
+ '') _PACKAGE_cc=0 ;;
+ *) _PACKAGE_cc=1 ;;
+ esac
+ ;;
+ esac
+ for i
+ do eval j=\$_PACKAGE_AOUT_$i
+ case $j in
+ '') eval _PACKAGE_AOUT_$i=1 ;;
+ *) continue ;;
+ esac
+ k=$_PACKAGE_cc
+ if test -f $INITROOT/$i.c
+ then k=${k}1
+ else k=${k}0
+ fi
+ if executable $EXECROOT/bin/$i
+ then k=${k}1
+ else k=${k}0
+ fi
+ : $k : compiler : source : binary :
+ case $k in
+ *00) view - bin/$i && continue ;;
+ esac
+ case $k in
+ 000) echo "$command: $i: not found: download the INIT package $HOSTTYPE binary to continue" >&2
+ return 1
+ ;;
+ 010) echo "$command: $i: not found: set CC=C-compiler or download the INIT package $HOSTTYPE binary to continue" >&2
+ return 1
+ ;;
+ 100) echo "$command: $i: not found: download the INIT package source or $HOSTTYPE binary to continue" >&2
+ return 1
+ ;;
+ 110) case $CROSS in
+ 1) echo "$command: $i: not found: make the local $EXECTYPE binary package before $HOSTTYPE" >&2
+ return 1
+ ;;
+ esac
+ ;;
+ ?01) : accept binary
+ continue
+ ;;
+ 011) : accept binary
+ continue
+ ;;
+ ??1) case $CROSS in
+ 1) continue ;;
+ esac
+ ;;
+ esac
+ case `ls -t $INITROOT/$i.c $INSTALLROOT/bin/$i 2>/dev/null` in
+ "$INITROOT/$i.c"*)
+ note update $INSTALLROOT/bin/$i
+ if test proto != "$i" && executable $INSTALLROOT/bin/proto
+ then case $exec in
+ '') $INSTALLROOT/bin/proto -p $INITROOT/$i.c > $i.c || return ;;
+ *) $exec "$INSTALLROOT/bin/proto -p $INITROOT/$i.c > $i.c" ;;
+ esac
+ $exec $CC $CCFLAGS -o $INSTALLROOT/bin/$i $i.c || return
+ $exec rm -f $i.c
+ else if test ! -d $INSTALLROOT/bin
+ then for j in arch arch/$HOSTTYPE arch/$HOSTTYPE/bin
+ do test -d $PACKAGEROOT/$j || $exec mkdir $PACKAGEROOT/$j || return
+ done
+ fi
+ if test '' != "$PROTOROOT" -a -f $INITPROTO/$i.c
+ then $exec $CC $CCFLAGS -o $INSTALLROOT/bin/$i $INITPROTO/$i.c || return
+ else $exec $CC $CCFLAGS -o $INSTALLROOT/bin/$i $INITROOT/$i.c || return
+ fi
+ case $i:$exec in
+ proto:) test -d $INSTALLROOT/include || mkdir $INSTALLROOT/include
+ $INSTALLROOT/bin/proto -f /dev/null > $i.c
+ cmp -s $i.c $INSTALLROOT/include/prototyped.h 2>/dev/null || cp $i.c $INSTALLROOT/include/prototyped.h
+ rm $i.c
+ ;;
+ esac
+ fi
+ test -f $i.o && $exec rm -f $i.o
+ i=$PATH
+ PATH=/bin
+ PATH=$i
+ ;;
+ esac
+ done
+ return 0
+}
+
+# check package requirements against received packages
+
+requirements() # source|binary [ package ]
+{
+ case $1 in
+ binary) r=$VIEW_BIN ;;
+ source) r=$VIEW_SRC ;;
+ *) r=$VIEW_ALL ;;
+ esac
+ shift
+ case $1 in
+ '') x= ;;
+ *) x=$* ;;
+ esac
+ set ''
+ for d in $r
+ do set "$@" $d/gen/*.ver
+ case $x in
+ '') set "$@" $d/gen/*.req
+ ;;
+ *) for p in $x
+ do set "$@" $d/gen/$p.req
+ done
+ ;;
+ esac
+ done
+ shift
+ e=0
+ x=$*
+ y=
+ n=
+ set ''
+ for i in $x
+ do p=`echo $i | sed -e 's,.*/,,' -e 's,\....$,,'`
+ if test -f $i
+ then set "$@" $i
+ y="$y $p"
+ else case $p in
+ '*') ;;
+ *) n="$n $p" ;;
+ esac
+ fi
+ done
+ for i in $n
+ do case " $y " in
+ *" $i "*)
+ ;;
+ *) echo "$command: $i: must read or write package" >&2
+ e=1
+ ;;
+ esac
+ done
+ case $e in
+ 1) exit 1 ;;
+ esac
+ shift
+ test 0 != "$#" && release=`sort -r "$@" | {
+ q=
+ e=0
+ o=
+ while read p v r s
+ do q="$q
+$v $r"
+ case $p in
+ $o) continue ;;
+ esac
+ case $s in
+ 0) e=1
+ case $r in
+ base) echo "$command: base package $p.$v or newer required" >&2 ;;
+ *) echo "$command: delta package $p.$v.$r or newer required" >&2 ;;
+ esac
+ ;;
+ esac
+ o=$p
+ done
+ case $e in
+ 0) echo "$q" | sort | { read v r; read v r; echo $v; } ;;
+ 1) echo ERROR ;;
+ esac
+ }`
+ case $release in
+ ERROR) case $force in
+ 0) exit 1 ;;
+ esac
+ ;;
+ ?*) eval `echo $release | sed -e 's,\(.*\)-\(.*\)-\(.*\),yy=\1 mm=\2 dd=\3,'`
+ # slide back 4 months
+ case $mm in
+ 01) mm=09 dd=1 ;;
+ 02) mm=10 dd=1 ;;
+ 03) mm=11 dd=1 ;;
+ 04) mm=12 dd=1 ;;
+ 05) mm=01 dd=0 ;;
+ 06) mm=02 dd=0 ;;
+ 07) mm=03 dd=0 ;;
+ 08) mm=04 dd=0 ;;
+ 09) mm=05 dd=0 ;;
+ 10) mm=06 dd=0 ;;
+ 11) mm=07 dd=0 ;;
+ 12) mm=08 dd=0 ;;
+ esac
+ case $dd in
+ 1) yy=`expr $yy - 1` ;;
+ esac
+ release=$yy-$mm-01
+ count=1
+ lo=$release
+ release="-f $release -r $count"
+ ;;
+ esac
+}
+
+# write ordered package prerequisite list to the standard output
+
+order() # [ package ]
+{
+ _order_t_=lib/package/tgz
+ case $action in
+ binary) _order_a_=.$HOSTTYPE ;;
+ *) _order_a_= ;;
+ esac
+ _order_n_=$#
+ case $_order_n_ in
+ 0) _order_p_=
+ for _order_v_ in $VIEW_all
+ do for _order_f_ in $_order_v_/lib/package/*.pkg
+ do if test -f $_order_f_
+ then _order_p_="$_order_p_ $_order_f_"
+ fi
+ done
+ done
+ set '' $_order_p_
+ shift
+ esac
+ {
+ if test ratz != "$*"
+ then for _order_f_ in ratz INIT
+ do if view -s - src $_order_t_/$_order_f_$_order_a_.tim
+ then echo $_order_f_ $_order_f_
+ fi
+ done
+ fi
+ for _order_f_
+ do while :
+ do view - src $_order_f_ && break
+ case $_order_f_ in
+ *.pkg) ;;
+ *) _order_f_=$_order_f_.pkg; view - src $_order_f_ && break ;;
+ esac
+ case $_order_f_ in
+ */*) ;;
+ *) _order_f_=lib/package/$_order_f_; view - src $_order_f_ && break ;;
+ esac
+ echo "$command: $_order_f_: not a package" >&2
+ continue 2
+ done
+ _order_f_=$_view_
+ _order_p_=`echo $_order_f_ | sed -e 's,.*/,,' -e 's,\.pkg$,,'`
+ case $_order_n_ in
+ 0) view -s - src $_order_t_/$_order_p_$_order_a_.tim || continue ;;
+ esac
+ echo $_order_p_ $_order_p_
+ case $_order_p_ in
+ INIT|ratz)
+ ;;
+ *) echo INIT $_order_p_
+ ;;
+ esac
+ {
+ req= req_sep=
+ op=::
+ while read line
+ do IFS=' \\'
+ set '' $line
+ IFS=$ifs
+ while :
+ do shift
+ case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ :*:) op=$1
+ ;;
+ INIT|'$('*|*')')
+ ;;
+ *) case $op in
+ :REQUIRES:)
+ req="$req$req_sep$1"
+ req_sep=" "
+ ;;
+ esac
+ ;;
+ esac
+ done
+ done
+ for _order_i_ in $req
+ do if view - src lib/package/$_order_i_.pkg
+ then case $_order_u_ in
+ 0) view -s - src $_order_t_/$_order_i_$_order_a_.tim || continue ;;
+ esac
+ echo $_order_i_ $_order_i_; echo INIT $_order_i_; echo $_order_i_ $_order_p_
+ fi
+ done
+ } < $_order_f_
+ done
+ } | tsort
+}
+
+# generate the package component list in _components_
+
+components() # [ package ]
+{
+ _components_=
+ for p
+ do case $p in
+ '') ;;
+ INIT) case " $_components_ " in
+ *" $p "*) ;;
+ *) _components_="$_components_ $p" ;;
+ esac
+ ;;
+ *) if view - src lib/package/$p.pkg
+ then p=$_view_
+ op=::
+ exec < $p
+ while read line
+ do IFS=' \\'
+ set '' $line
+ IFS=$ifs
+ while :
+ do shift
+ case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ :*:) op=$1
+ ;;
+ INIT|'$('*|*')')
+ ;;
+ *) case $op in
+ :PACKAGE:)
+ case " $_components_ " in
+ *" $1 "*) ;;
+ *) _components_="$_components_ $1" ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ done
+ exec < /dev/null
+ elif test -d $PACKAGEROOT/src/cmd/$p -o -d $PACKAGEROOT/src/lib/$p
+ then _components_="$_components_ $p"
+ else echo "$command: $p: package or component not found" >&2
+ exit 1
+ fi
+ ;;
+ esac
+ done
+}
+
+# list main environment values
+
+showenv()
+{
+ case $1 in
+ ''|make)for __i__ in CC SHELL $env
+ do eval echo $__i__='$'$__i__
+ done
+ ;;
+ esac
+}
+
+# capture command output
+
+capture() # file command ...
+{
+ case $make:$noexec in
+ :) case $action in
+ install|make|view)
+ o=$action
+ ;;
+ *) case $package in
+ ''|*' '*)
+ o=$action
+ ;;
+ *) o=$package
+ ;;
+ esac
+ ;;
+ esac
+ case $action in
+ write) d=$PACKAGESRC/gen ;;
+ *) d=$PACKAGEBIN/gen ;;
+ esac
+ test -d $d || $exec mkdir $d
+ o=$d/$o
+ case $o in
+ $output)o=$o.out
+ s=
+ ;;
+ *) output=$o
+ if test -f $o.old
+ then mv $o.old $o.out.1
+ if test -f $o.out
+ then mv $o.out $o.out.2
+ fi
+ elif test -f $o.out
+ then for i in `ls -t $o.out.? 2>/dev/null`
+ do break
+ done
+ case $i in
+ *.1) i=2 ;;
+ *.2) i=3 ;;
+ *.3) i=4 ;;
+ *.4) i=5 ;;
+ *.5) i=6 ;;
+ *.6) i=7 ;;
+ *.7) i=8 ;;
+ *.8) i=9 ;;
+ *) i=1 ;;
+ esac
+ mv $o.out $o.out.$i
+ fi
+ o=$o.out
+ : > $o
+ note $action output captured in $o
+ s="$command: $action start at `date` in $INSTALLROOT"
+ case $quiet in
+ 0) trap "echo \"$command: $action done at \`date\`\" in $INSTALLROOT 2>&1 | \$TEE -a $o" 0 1 2 ;;
+ *) trap "echo \"$command: $action done at \`date\`\" in $INSTALLROOT >> $o" 0 1 2 ;;
+ esac
+ ;;
+ esac
+ case $quiet in
+ 0) if executable ! $TEE
+ then TEE=tee
+ fi
+ {
+ case $s in
+ ?*) echo "$s" ;;
+ esac
+ showenv $action
+ "$@"
+ } < /dev/null 2>&1 | $TEE -a $o
+ ;;
+ *) {
+ case $s in
+ ?*) echo "$s" ;;
+ esac
+ showenv $action
+ "$@"
+ } < /dev/null > $o 2>&1
+ ;;
+ esac
+ ;;
+ *) $make "$@"
+ ;;
+ esac
+}
+
+package_install() # dest sum
+{
+ dest=$1 sum=$2
+ ot=
+ code=0
+ sed -e '/ /!d' -e 's,[^ ]* ,,' -e 's, \(arch/[^/]*\)/, \1 ,' -e '/ arch\//!s,^[^ ]* [^ ]* [^ ]*,& .,' -e 's,/\([^ /]*\)$, \1,' $sum |
+ while read mode user group arch dir file
+ do case $flat:$arch in
+ 1:*|?:.)t=$dest/$dir ;;
+ *) t=$dest/$arch/$dir ;;
+ esac
+ case $t in
+ $ot) ;;
+ *) if test ! -d "$t"
+ then $exec mkdir -p "$t" || exit
+ fi
+ ot=$t
+ ;;
+ esac
+ case $file in
+ ?*) case $arch in
+ .) f=$dir/$file ;;
+ *) f=$arch/$dir/$file ;;
+ esac
+ if test -f "$f"
+ then t=$t/$file
+ case $quiet in
+ 0) echo "$t" ;;
+ esac
+ $exec cp -f "$f" "$t" || code=1
+ $exec chmod $mode "$t" || code=1
+ fi
+ ;;
+ esac
+ done
+ return $code
+}
+
+package_verify() # sum
+{
+ $exec $SUM -cp $1
+}
+
+make_recurse() # dir
+{
+ for _make_recurse_j in $makefiles
+ do if view - $1/$_make_recurse_j
+ then return
+ fi
+ done
+ if test -d $1
+ then case $exec in
+ '') echo :MAKE: > $1/Makefile || exit ;;
+ *) $exec "echo :MAKE: > $1/Makefile" ;;
+ esac
+ fi
+}
+
+get() # host path [ file size ]
+{
+ case $HURL in
+ '') HURL=.
+ for i in wget lynx curl
+ do if onpath $i
+ then HURL=$i
+ break;
+ fi
+ done
+ AUTHORIZE="User-Agent: package AT&T Research\\r\\n"
+ case $HURL:$authorize in
+ .:?*) AUTHORIZE="${AUTHORIZE}Authorization: Basic `print -n -r -- $authorize:$password | uuencode -h -x base64`\\r\\n" ;;
+ esac
+ ;;
+ esac
+ getfd=8
+ case $3 in
+ '') case $HURL in
+ .) host=$1
+ path=$2
+ while :
+ do eval "exec $getfd<> /dev/tcp/$host/80" || exit
+ case $path in
+ /*) ;;
+ *) path=/$path ;;
+ esac
+ print "GET $path HTTP/1.0\\r\\nHost: $host\\r\\n$AUTHORIZE\\r" >&$getfd
+ cat <&8 > get.tmp
+ got=`sed -e 1q get.tmp`
+ case $got in
+ *" "200" "*)
+ got=`sed -e '1,/^.$/d' -e '/^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ]/!d' get.tmp`
+ : > get.err
+ code=0
+ break
+ ;;
+ *" "30[123]" "*)
+ got=`sed -e '/^Location: /!d' -e 's,^Location: \(.*\)://\([^/]*\)\(/.*\),prot='\''\1'\'' host='\''\2'\'' path='\''\3'\'',' get.tmp`
+ case $got in
+ '') rm get.tmp
+ echo "$command: $action: $url: redirect error" >&2
+ exit 1
+ ;;
+ esac
+ eval $got
+ ;;
+ *) rm get.tmp
+ echo "$command: $action: $url: $got" >&2
+ echo '' "$got" > get.err
+ code=1
+ break
+ ;;
+ esac
+ done
+ ;;
+ curl) case $authorize in
+ '') curl -s -L -o get.tmp http://$1/$2 2> get.err; code=$? ;;
+ *) curl -s -L -o get.tmp -u "$authorize":"$password" http://$1/$2 2> get.err; code=$? ;;
+ esac
+ got=`grep '^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ]' get.tmp 2>/dev/null`
+ case $code in
+ 0) if grep '^<H1>Authorization Required</H1>' get.tmp > get.err
+ then code=1
+ fi
+ ;;
+ esac
+ ;;
+ hurl) case $authorize in
+ '') hurl http://$1/$2 > get.tmp 2> get.err; code=$? ;;
+ *) hurl -a "$authorize":"$password" http://$1/$2 > get.tmp 2> get.err; code=$? ;;
+ esac
+ got=`grep '^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ]' get.tmp`
+ ;;
+ lynx) case $authorize in
+ '') lynx -source http://$1/$2 > get.tmp 2> get.err; code=$? ;;
+ *) lynx -source -auth "$authorize":"$password" http://$1/$2 > get.tmp 2> get.err; code=$? ;;
+ esac
+ got=`grep '^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ]' get.tmp`
+ ;;
+ wget) wget -nv -O get.tmp ${authorize:+--http-user="$authorize"} ${password:+--http-passwd="$password"} http://$1/$2 2> get.err
+ code=$?
+ got=`grep '^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ]' get.tmp 2>/dev/null`
+ ;;
+ *) echo $command: $action: $HURL: url get command not found >&2
+ exit 1
+ ;;
+ esac
+ if test 0 != "$code"
+ then case `cat get.err get.tmp 2>/dev/null` in
+ *[Aa][Uu][Tt][Hh][Oo][Rr][Ii][SsZz]*|*[Dd][Ee][Nn][Ii][Ee][Dd]*)
+ echo $command: $action: authorization required -- see $url for license acceptance authorization name and password >&2
+ ;;
+ *) cat get.err
+ ;;
+ esac
+ rm -f get.tmp get.err
+ echo $command: $action: $2: download failed >&2
+ exit 1
+ fi
+ rm -f get.tmp get.err
+ ;;
+ *) case $exec in
+ '') echo "$3 ($4 bytes):" >&2
+ case $HURL in
+ .) eval "exec $getfd<> /dev/tcp/$1/80" || exit
+ path=$2/$3
+ case $path in
+ /*) ;;
+ *) path=/$path ;;
+ esac
+ print "GET $path HTTP/1.0\\r\\nHost: $host\\r\\n$AUTHORIZE\\r" >&$getfd
+ read got <&$getfd
+ case $got in
+ *" 200 "*)
+ code=0
+ : > get.err
+ ;;
+ *) echo '' "$got" > get.err
+ code=1
+ ;;
+ esac
+ while read got <&$getfd
+ do case $got in
+ ''|?) break ;;
+ esac
+ done
+ cat <&$getfd > get.tmp
+ ;;
+ curl) case $authorize in
+ '') curl -s -L -o get.tmp http://$1/$2/$3 2> get.err; code=$? ;;
+ *) curl -s -L -o get.tmp -u "$authorize":"$password" http://$1/$2/$3 2> get.err; code=$?
+ esac
+ case $code in
+ 0) if grep '^<H1>Authorization Required</H1>' get.tmp > get.err
+ then code=1
+ fi
+ ;;
+ esac
+ ;;
+ hurl) case $authorize in
+ '') ksh -x hurl http://$1/$2/$3 > get.tmp 2> get.err; code=$? ;;
+ *) ksh -x hurl -a "$authorize":"$password" http://$1/$2/$3 > get.tmp 2> get.err; code=$? ;;
+ esac
+ ;;
+ lynx) case $authorize in
+ '') lynx -source http://$1/$2/$3 > get.tmp 2> get.err; code=$? ;;
+ *) lynx -source -auth "$authorize":"$password" http://$1/$2/$3 > get.tmp 2> get.err; code=$? ;;
+ esac
+ ;;
+ wget) wget -nv -O get.tmp ${authorize:+--http-user="$authorize"} ${password:+--http-passwd="$password"} http://$1/$2/$3 2> get.err
+ code=$?
+ ;;
+ *) echo $command: $action: $HURL: url get command not found >&2
+ exit 1
+ ;;
+ esac
+ if test 0 != "$code"
+ then case `cat get.err get.tmp` in
+ *[Aa][Uu][Tt][Hh][Oo][Rr][Ii][SsZz]*|*[Dd][Ee][Nn][Ii][Ee][Dd]*)
+ echo $command: $action: authorization required -- see $url for license acceptance authorization name and password >&2
+ ;;
+ *) cat get.err
+ ;;
+ esac
+ rm get.tmp get.err
+ echo $command: $action: $3: download failed >&2
+ exit 1
+ fi
+ rm get.err
+ case $checksum:$5 in
+ :*|*:-) z=`wc -c < get.tmp`
+ case " $z " in
+ *" $4 "*)
+ ;;
+ *) rm -f get.tmp
+ echo $command: $3: download error: expected $4 bytes, got $z >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ *) z=`$checksum < get.tmp | sed -e 's,^[ ][ ]*,,' -e 's,[ ].*,,'`
+ case " $z " in
+ *" $5 "*)
+ ;;
+ *) rm -f get.tmp
+ echo $command: $3: download $checksum error: expected $5, got $z >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+ mv get.tmp $3 || exit
+ ;;
+ *) echo "$3 ($4 bytes)" >&2
+ ;;
+ esac
+ esac
+}
+
+# generate copyright notice
+
+copyright()
+{
+ if test -f $1.lic
+ then echo $1 package general copyright notice
+ echo
+ proto -c'#' -p -s -l $1.lic -o type=verbose,author='*' /dev/null
+ return 0
+ fi
+ case $1 in
+ *-*) eval `echo '' $1 | sed 's/\([^-]*\)-\(.*\)/__j__="\1" __i__="\2"/'`
+ if copyright $__i__ || copyright $__j__
+ then return 0
+ fi
+ ;;
+ esac
+ return 1
+}
+
+# run remote make on host
+
+remote() # host no-exec-background
+{
+ host=$1
+ background=$2
+ eval name=\$${host}_name user=\$${host}_user snarf=\$${host}_snarf type=\$${host}_type rsh=\$${host}_rsh root=\$${host}_root keep=\$${host}_keep log=\$${host}_log
+ case $keep in
+ 1*) ;;
+ *) return ;;
+ esac
+ case $host in
+ $main) ;;
+ *) case $exec in
+ '') exec > $admin_log/$log 2>&1 ;;
+ *) echo "exec > $admin_log/$log 2>&1" ;;
+ esac
+ ;;
+ esac
+ if $admin_ping $name >/dev/null 2>&1 || $admin_ping $name >/dev/null 2>&1
+ then cmd=". ./.profile"
+ case $root in
+ .) root=
+ ;;
+ *) cmd="$cmd && cd $root"
+ root=$root/
+ ;;
+ esac
+ cmd="$cmd && { test -f lib/package/admin/$admin_env && . ./lib/package/admin/$admin_env || true ;} && PATH=\${PWD:-\`pwd\`}/bin:\$PATH \${SHELL:-/bin/sh} -c 'package $admin_args PACKAGEROOT=\${PWD:-\`pwd\`} HOSTTYPE=$type VPATH='"
+ case $admin_binary in
+ '') snarf= ;;
+ esac
+ case $snarf in
+ '') $exec $rsh $user$name "$cmd" $background
+ ;;
+ *?) rcp=`echo $rsh | sed 's/\(.\).*/\1/'`cp
+ case $background in
+ ?*) $exec "{" ;;
+ esac
+ $exec $rsh $user$name "$cmd"
+ eval lst=$admin_list
+ case $admin_pkgs in
+ '') filter=cat ;;
+ *) filter="egrep lib/package/tgz/($admin_pkgs)\\." ;;
+ esac
+ if $exec $rcp $user$name:${root}lib/package/tgz/$lst $PACKAGESRC/tgz
+ then $exec $rcp `$filter $PACKAGESRC/tgz/$lst | sed "s,^,$user$name:,"` $PACKAGESRC/tgz
+ else echo "$command: $user$name:${root}lib/package/tgz/$lst: not found" >&2
+ fi
+ case $background in
+ ?*) $exec "} $background" ;;
+ esac
+ ;;
+ esac
+ else echo "$command: $name: down" >&2
+ fi
+}
+
+# update package_src
+
+checksrc()
+{
+ case $package_src in
+ '') package_src=$src
+ for _i_ in `cd $PACKAGESRC; ls *.def *.lic *.pkg 2>/dev/null | sed 's/[-.].*//'`
+ do case " $package_src " in
+ *" $_i_ "*)
+ ;;
+ *) package_src="$package_src $_i_"
+ ;;
+ esac
+ done
+ ;;
+ esac
+}
+
+# check for native ascii 0:yes 1:no
+
+__isascii__=
+
+isascii()
+{
+ case $__isascii__ in
+ '') case `echo A | od -o | sed -e 's/[ ]*$//' -e '/[ ]/!d' -e 's/.*[ ]//'` in
+ 005101|040412) __isascii__=0 ;;
+ *) __isascii__=1 ;;
+ esac
+ esac
+ return $__isascii__
+}
+
+case $action in
+
+admin) while test ! -f $admin_db
+ do case $admin_db in
+ /*) echo $command: $action: $admin_db: data file not found >&2
+ exit 1
+ ;;
+ esac
+ view file src lib/package/admin/$admin_db || exit 1
+ admin_db=$_view_
+ done
+ admin_components=
+ case $admin_action in
+ list) cat $admin_db
+ exit
+ ;;
+ test) set $admin_args
+ while :
+ do case $# in
+ 1) break ;;
+ esac
+ shift
+ case $1 in
+ *=*) ;;
+ *) admin_components=-$1
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+ : all work done in $PACKAGESRC/admin
+ cd $PACKAGESRC/admin || exit
+ checksrc
+ packages=
+ admin_log=${admin_action}${admin_components}.log
+ exec < $admin_db || exit
+ test -d $admin_log || $exec mkdir $admin_log || exit
+ case $admin_on in
+ '') admin_on="*" ;;
+ esac
+ hostname=
+ hosts=
+ logs=
+ local_hosts=
+ local_types=
+ pids=
+ remote_hosts=
+ sync_hosts=
+ admin_host=_admin_host_
+ admin_out=
+ case " $admin_args " in
+ *" write binary "*|*" write "*" binary "*)
+ admin_binary=1
+ ;;
+ *) admin_binary=
+ ;;
+ esac
+ case $only in
+ 1) admin_args="only $admin_args" ;;
+ esac
+ trap 'kill $pids >/dev/null 2>&1' 1 2 3 15
+ index=0
+ while read type host root date time make test write comment
+ do case $type in
+ ''|'#'*);;
+ *=*) eval "$type $host $root $date $time $make $test $write $comment"
+ ;;
+ *) case $admin_action in
+ make|test|write)
+ eval f='$'$admin_action
+ case $f in
+ *[!0123456789]*) continue ;;
+ esac
+ ;;
+ esac
+ rsh=rsh
+ case $host in
+ *@*) IFS=@
+ set '' $host
+ IFS=$ifs
+ user=${2}@
+ host=$3
+ ;;
+ *) user=
+ ;;
+ esac
+ : type=$type host=$host root=$root date=$date time=$time make=$make test=$test write=$write :
+ name=$host
+ host=`echo $name | sed 's,[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789],__,g'`
+ eval x='$'${host}_index
+ eval ${host}_index=1
+ case $x in
+ 1) i=0
+ while :
+ do case $i in
+ $index) h=''
+ break
+ ;;
+ esac
+ i=`expr $i + 1`
+ eval h='$'${admin_host}${i}_name
+ case $h in
+ $host) host=${admin_host}${i}
+ eval user='$'${host}_user root='$'${host}_rsh:$host:'$'${host}_root
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+ case $root in
+ *:$name:*)root=`echo '' $root | sed 's,:.*,:,'` ;;
+ esac
+ case $root in
+ *:*:*) index=`expr $index + 1`
+ host=${admin_host}$index
+ ;;
+ *:*) case " $sync_hosts " in
+ *" $name ${admin_host}"*)
+ set '' '' $sync_hosts
+ while :
+ do shift
+ shift
+ case $1 in
+ $name) host=$2
+ break
+ ;;
+ esac
+ done
+ ;;
+ *) index=`expr $index + 1`
+ host=${admin_host}$index
+ sync_hosts="$sync_hosts $name $host"
+ ;;
+ esac
+ ;;
+ *) index=`expr $index + 1`
+ host=${admin_host}$index
+ ;;
+ esac
+ case $root in
+ -*) continue
+ ;;
+ *:*) case $admin_all in
+ 0) continue ;;
+ esac
+ case $root in
+ *:) root=${root}. ;;
+ esac
+ IFS=:
+ set '' $root
+ IFS=$ifs
+ sync=$host
+ case $hostname in
+ '') hostinfo name
+ hostname=$_hostinfo_
+ ;;
+ esac
+ shift
+ case $# in
+ 0) ;;
+ 1) root=$1
+ ;;
+ 2) rsh=$1 root=$2
+ ;;
+ *) rsh=$1 sync=$2 root=$3
+ case $sync in
+ ${admin_host}*)
+ ;;
+ ?*) case " $sync_hosts " in
+ *" $sync ${admin_host}"*)
+ set '' '' $sync_hosts
+ while :
+ do shift
+ shift
+ case $1 in
+ $sync) sync=$2
+ break
+ ;;
+ esac
+ done
+ ;;
+ *) index=`expr $index + 1`
+ x=${admin_host}$index
+ sync_hosts="$sync_hosts $sync $x"
+ sync=$x
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *) sync=
+ ;;
+ esac
+ case $name in
+ $admin_on)
+ keep=1
+ ;;
+ *) case " $admin_on " in
+ *" $name "*) keep=1 ;;
+ *) keep=0 ;;
+ esac
+ ;;
+ esac
+ case " $admin_out " in
+ *" $name "*)
+ log=$name.$type
+ ;;
+ *) admin_out="$admin_out $name"
+ log=$name
+ ;;
+ esac
+ case $sync in
+ '') local_types="$local_types $type" ;;
+ esac
+ case $sync in
+ $host) remote_hosts="$remote_hosts $host"
+ ;;
+ ?*) eval ${sync}_share=\"\$${sync}_share $host\"
+ ;;
+ '') local_hosts="$local_hosts $host"
+ ;;
+ esac
+ eval ${host}_name='$'name ${host}_type='$'type ${host}_user='$'user ${host}_sync='$'sync ${host}_snarf='$'sync ${host}_rsh='$'rsh ${host}_root='$'root ${host}_keep='$'keep ${host}_log='$'log
+ ;;
+ esac
+ done
+ p=
+ for i in $admin_args
+ do p="$i $p"
+ done
+ admin_pkgs=
+ for i in $p
+ do if view - src "lib/package/$i.pkg"
+ then case $admin_pkgs in
+ '') admin_pkgs="$i" ;;
+ *) admin_pkgs="$admin_pkgs|$i" ;;
+ esac
+ fi
+ done
+ : "admin_binary :" $admin_binary
+ : "admin_args :" $admin_args
+ : "admin_pkgs :" $admin_pkgs
+ : "admin_on :" "$admin_on"
+ : "local_hosts :" $local_hosts
+ : "local_types :" $local_types
+ : "remote_hosts :" $remote_hosts
+ : "sync_hosts :" $sync_hosts
+ : "sync_share :" $sync_share
+ case $admin_binary in
+ 1) admin_bin_types=
+ admin_bin_main=
+ for main in $local_hosts $remote_hosts
+ do eval share=\$${main}_share keep=\$${main}_keep
+ case $keep in
+ 0*) continue ;;
+ esac
+ for host in $main $share
+ do case " $admin_bin_hosts " in
+ *" $host "*)
+ continue
+ ;;
+ esac
+ eval type=\$${host}_type
+ case " $admin_bin_types " in
+ *" $type "*)
+ continue
+ ;;
+ esac
+ case " $types " in
+ " ") ;;
+ *" $type "*)
+ ;;
+ *) continue
+ ;;
+ esac
+ admin_bin_hosts="$admin_bin_hosts $host"
+ admin_bin_types="$admin_bin_types $type"
+ case " $admin_bin_hosts " in
+ *" $main "*)
+ ;;
+ *) case " $admin_bin_main " in
+ *" $main "*)
+ ;;
+ *) admin_bin_main="$admin_bin_main $main"
+ ;;
+ esac
+ ;;
+ esac
+ done
+ done
+ local=
+ remote=
+ for host in $admin_bin_main $admin_bin_hosts
+ do case " $local_hosts " in
+ *" $host "*)
+ local="$local $host"
+ ;;
+ *) case " $remote_hosts " in
+ *" $host "*)
+ remote="$remote $host"
+ ;;
+ esac
+ ;;
+ esac
+ done
+ local_hosts=$local
+ remote_hosts=$remote
+ ;;
+ esac
+ for host in $remote_hosts $local_hosts
+ do eval share=\$${host}_share
+ case $share in
+ ?*) while :
+ do oshare=$share
+ for s in $share
+ do eval r='$'${s}_share
+ case $r in
+ ?*) case " $share " in
+ *" $r "*) ;;
+ *) share="$share $r" ;;
+ esac
+ ;;
+ esac
+ done
+ case $share in
+ $oshare) eval ${host}_share="'$share'"
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+ done
+ for host in $remote_hosts
+ do eval type=\$${host}_type
+ case " $local_types " in
+ *" $type "*)
+ eval ${host}_snarf=
+ ;;
+ esac
+ eval name=\$${host}_name keep=\$${host}_keep share=\$${host}_share
+ for share in $share
+ do eval type=\$${share}_type keep=\$keep\$${share}_keep
+ case " $local_types " in
+ *" $type "*)
+ eval ${share}_snarf=
+ ;;
+ esac
+ done
+ case $keep in
+ 0*1*) keep=2$keep ;;
+ *1*) ;;
+ *) keep=0 ;;
+ esac
+ eval ${host}_keep=$keep
+ done
+ for host in $remote_hosts $local_hosts
+ do eval name=\$${host}_name user=\$${host}_user type=\$${host}_type sync=\$${host}_sync snarf=\$${host}_snarf share=\$${host}_share rsh=\$${host}_rsh root=\$${host}_root keep=\$${host}_keep
+ case $keep in
+ 0*) continue ;;
+ esac
+ case $sync in
+ '') case $admin_action in
+ ditto) continue ;;
+ esac
+ case $admin_binary in
+ 1) case $keep in
+ 1*|?*1*);;
+ *) continue ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ eval main_log='$'${host}_log
+ main=
+ share_keep=
+ for i in $host $share
+ do eval n='$'${i}_name t='$'${i}_type q='$'${i}_sync s='$'${i}_snarf l='$'${i}_log k='$'${i}_keep
+ case $main:$k in
+ :*) ;;
+ *:0) continue ;;
+ esac
+ case $admin_binary in
+ 1) case $s:$q in
+ :?*) continue ;;
+ esac
+ case " $admin_bin_hosts " in
+ *" $i "*)
+ ;;
+ *) continue
+ ;;
+ esac
+ ;;
+ esac
+ case $main in
+ '') main=$i ;;
+ *) share_keep="$share_keep $i" ;;
+ esac
+ echo package "$admin_args" "[ $n $t ]"
+ case $exec in
+ '') : > $admin_log/$l ;;
+ *) $exec ": > $admin_log/$l" ;;
+ esac
+ done
+ host=$main
+ share=$share_keep
+ case $force in
+ 0) admin_ditto_update=--update ;;
+ *) admin_ditto_update= ;;
+ esac
+ case $exec in
+ '') {
+ case $admin_binary:$sync in
+ :?*) eval syncname='$'${sync}_name
+ test -x $PACKAGEROOT/bin/package && $admin_ditto $admin_ditto_update --remote=$rsh --expr="name=='package'" $PACKAGEROOT/bin $user$syncname:$root/bin
+ test -d $PACKAGESRC && $admin_ditto $admin_ditto_update --remote=$rsh --expr="if(level>1&&path!='LICENSES/*')status=SKIP;path=='LICENSES*|*.(pkg|lic|def)'" $PACKAGESRC $user$syncname:$root/lib/package
+ for dir in $package_src
+ do case $MAKESKIP in
+ '') expr="--expr=if(name=='$admin_ditto_skip')status=SKIP" ;;
+ *) expr="--expr=if(name=='$admin_ditto_skip'||level==1&&name=='$MAKESKIP')status=SKIP" ;;
+ esac
+ test -d $PACKAGEROOT/src/$dir && $admin_ditto $admin_ditto_update --remote=$rsh "$expr" $PACKAGEROOT/src/$dir $user$syncname:$root/src/$dir
+ done
+ ;;
+ esac
+ case $admin_action in
+ ditto) ;;
+ ?*) pids=
+ set '' $host $share
+ while :
+ do shift
+ case $# in
+ 0) break
+ ;;
+ 1) remote $1
+ ;;
+ *) remote $1 &
+ pids="$pids $!"
+ ;;
+ esac
+ done
+ case $pids in
+ ?*) wait $pids ;;
+ esac
+ ;;
+ esac
+ } < /dev/null > $admin_log/$main_log 2>&1 &
+ pids="$pids $!"
+ ;;
+ *) echo "{"
+ case $admin_binary:$sync in
+ :?*) eval syncname='$'${sync}_name
+ test -d $PACKAGESRC && echo $admin_ditto $admin_ditto_update --remote=$rsh --expr="if(level>1)status=SKIP;name=='*.(pkg|lic|def)'" $PACKAGESRC $user$syncname:$root/lib/package
+ for dir in $package_src
+ do case $MAKESKIP in
+ '') expr="--expr=if(name=='$admin_ditto_skip')status=SKIP" ;;
+ *) expr="--expr=if(name=='$admin_ditto_skip'||level==1&&name=='$MAKESKIP')status=SKIP" ;;
+ esac
+ test -d $PACKAGEROOT/src/$dir && echo $admin_ditto $admin_ditto_update --remote=$rsh "$expr" $PACKAGEROOT/src/$dir $user$syncname:$root/src/$dir
+ done
+ ;;
+ esac
+ case $admin_action in
+ ditto) ;;
+ ?*) pids=
+ set '' $host $share
+ while :
+ do shift
+ case $# in
+ 0) break
+ ;;
+ 1) remote $1
+ ;;
+ *) remote $1 "&"
+ pids=1
+ ;;
+ esac
+ done
+ case $pids in
+ 1) echo wait ;;
+ esac
+ ;;
+ esac
+ echo "} < /dev/null > $admin_log/$main_log 2>&1 &"
+ ;;
+ esac
+ eval name='$'${main}_name
+ hosts="$hosts $name"
+ logs="$logs $main_log"
+ for share in $share
+ do eval keep=\$${share}_keep
+ case $keep in
+ 1) eval name='$'${share}_name log='$'${share}_log
+ hosts="$hosts $name"
+ logs="$logs $log"
+ ;;
+ esac
+ done
+ done
+ case $exec in
+ '') # track the progress
+ case $quiet in
+ 0) cd $admin_log
+ tail -t $PACKAGE_admin_tail_timeout -f $logs
+ cd ..
+ ;;
+ esac
+ # wait for the remote actions to complete
+ wait
+ trap - 1 2 3 15
+ # update the db
+ exec < $admin_db || exit
+ exec 9>&1
+ D=`date +%y%m%d`
+ while read line
+ do set -- $line
+ case $1 in
+ ''|'#'*|*=*)
+ ;;
+ *) case " $hosts " in
+ *" $2 "*)
+ : ast date command assumed :
+ E=`eval date -E \`egrep '[ ](start|done)[ ][ ]*at[ ]' $admin_log/$2 | sed -e 's/.*[ ][ ]*at[ ][ ]*//' -e 's/[ ][ ]*in[ ].*$//' -e 's/.*/"&"/'\``
+ M=$6 T=$7 W=$8
+ case $admin_action in
+ make|view)
+ M=`egrep -c ']:.* (\*\*\*.* code|don'\''t know) | \*\*\* termination code ' $admin_log/$2` ;;
+ test) T=`grep -ci 'fail[es]' $admin_log/$2` ;;
+ *) W=`grep '^[abcdefghijklmnopqrstuvwxyz][abcdefghijklmnopqrstuvwxyz]*:.' $admin_log/$2 | egrep -cv 'start at|done at|output captured|warning:|: package not found|whence: command not found'` ;;
+ esac
+ case $1 in
+ ?|??|???|????|?????|??????|???????)
+ t1=' '
+ ;;
+ ????????|?????????|??????????|???????????|????????????|?????????????|??????????????|???????????????)
+ t1=' '
+ ;;
+ *) t1=''
+ ;;
+ esac
+ case $2 in
+ ?|??|???|????|?????|??????|???????)
+ t2=' '
+ ;;
+ *) t2=''
+ ;;
+ esac
+ case $3 in
+ ?|??|???|????|?????|??????|???????)
+ t3=' '
+ ;;
+ *) t3=''
+ ;;
+ esac
+ case $E in
+ ?????) E=" $E" ;;
+ ????) E=" $E" ;;
+ ???) E=" $E" ;;
+ ??) E=" $E" ;;
+ ?) E=" $E" ;;
+ esac
+ case $M in
+ ???) M="$M" ;;
+ ??) M=" $M" ;;
+ ?) M=" $M" ;;
+ '') M=" 0" ;;
+ esac
+ case $T in
+ ???) T="$T" ;;
+ ??) T=" $T" ;;
+ ?) T=" $T" ;;
+ '') T=" 0" ;;
+ esac
+ case $W in
+ ???) W="$W" ;;
+ ??) W=" $W" ;;
+ ?) W=" $W" ;;
+ '') W=" 0" ;;
+ esac
+ A=$1$t1
+ H=$2$t2
+ R=$3$t3
+ case $# in
+ [0-8]) C=
+ ;;
+ *) shift 8
+ C=" $*"
+ ;;
+ esac
+ echo "$A $H $R $D $E $M $T $W$C"
+ echo "$A $H $R $D $E $M $T $W$C" >&9
+ continue
+ ;;
+ esac
+ ;;
+ esac
+ echo "$line"
+ done > $admin_db.new
+ mv $admin_db $admin_db.old
+ mv $admin_db.new $admin_db
+ ;;
+ esac
+ ;;
+
+clean|clobber)
+ cd $PACKAGEROOT
+ $exec rm -rf $INSTALLROOT
+ exit
+ ;;
+
+contents|list)
+ # all work in $PACKAGESRC
+
+ cd $PACKAGESRC
+
+ # generate the package list
+
+ set '' $target $package
+ shift
+ argc=$#
+ case $# in
+ 0) set '' *.pkg
+ case $2 in
+ '*.pkg')
+ echo $command: $action: no packages >&2
+ exit 1
+ ;;
+ esac
+ set '' `echo $* | sed 's,\.pkg,,g'`
+ shift
+ ;;
+ esac
+ sep="$nl "
+ echo packages in $PACKAGEROOT
+ case $action in
+ list) echo
+ echo "NAME${nl}VERSION${nl}RELEASE${nl}TYPE${nl}STATUS${nl}REQUIRES${nl}----${nl}-------${nl}-------${nl}----${nl}------${nl}--------" | pr -6 -a -o4 -t
+ ;;
+ esac
+ {
+ omit=:
+ for pkg
+ do if test ! -f $pkg.pkg
+ then echo $command: $action: $pkg: not a package >&2
+ else if test -f gen/$pkg.ver
+ then set '' `cat gen/$pkg.ver`
+ case $3 in
+ $2) ver=base ;;
+ *) ver=$3 ;;
+ esac
+ if test -s tgz/$pkg.tim
+ then sts=local
+ else sts=
+ fi
+ else ver=
+ sts=unwritten
+ fi
+ typ=
+ txt=
+ cmp= cmp_sep=
+ req= req_sep=
+ op=::
+ exec < $pkg.pkg
+ while read line
+ do IFS=' \\'
+ set '' $line
+ IFS=$ifs
+ while :
+ do shift
+ case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ :*:) op=$1
+ ;;
+ INIT|'$('*|*')')
+ ;;
+ *) case $op in
+ :DESCRIPTION:)
+ txt="$txt$sep$line"
+ break
+ ;;
+ :PACKAGE:)
+ cmp="$cmp$cmp_sep$1"
+ cmp_sep=$nl
+ ;;
+ :REQUIRES:)
+ req="$req$req_sep$1"
+ req_sep=" "
+ ;;
+ esac
+ ;;
+ esac
+ done
+ done
+ exec < /dev/null
+ case $txt in
+ ?*) txt="$nl$txt" ;;
+ esac
+ case :$ver: in
+ *::*) ;;
+ *) case $action in
+ list) case $sts in
+ '') case `ls -t "tgz/$pkg.$ver.base" "tgz/$pkg.tim" 2>/dev/null` in
+ "tgz/$pkg.tim"*)
+ sts=read
+ ;;
+ *) sts=unread
+ ;;
+ esac
+ ;;
+ esac
+ echo "$pkg${nl}$ver${nl}base${nl}$typ${nl}$sts${nl}$req"
+ case $typ in
+ '') omit=$omit$pkg.$ver.base: ;;
+ esac
+ ;;
+ *) case $req in
+ ?*) req=": $req" ;;
+ esac
+ echo
+ echo $pkg $ver $req "$txt"
+ case $cmp in
+ ?*) echo "${sep}Components in this package:$nl"
+ echo "$cmp" | pr -4 -o4 -t ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ case $argc:$action in
+ 0:list) if test -d tgz
+ then cd tgz
+ # f:file p:package v:version r:release t:type u:update
+ for f in `find . -name '*?[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.]*' -print | sed 's,^\./,,' | sort -r`
+ do eval `echo "$f" | sed -e 's,\.c$,,' -e 's,\.gz$,,' -e 's,\.exe$,,' -e 's,\.tgz$,,' -e 's,\([^_.]*\)[_.]\([0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]\)[_.]\([0123456789][0123456789][0123456789][0123456789][^_.]*\)[_.]*\(.*\),p=\1 v=\2 r=\3 t=\4,' -e 's,\([^_.]*\)[_.]\([0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]\)[_.]*\(.*\),p=\1 v=\2 r=base t=\3,'`
+ case $t in
+ '') case $omit in
+ *:$p.$v.$r:*) continue ;;
+ esac
+ u=$p.tim
+ ;;
+ *) u=$p.$t.tim
+ ;;
+ esac
+ if test -s "$u"
+ then s=local
+ elif test -f "$u"
+ then case `ls -t "$f" "$u" 2>/dev/null` in
+ "$u"*) s=read ;;
+ *) s=unread ;;
+ esac
+ else s=unread
+ fi
+ echo "$p$nl$v$nl$r$nl$t$nl$s$nl"
+ done
+ fi
+ ;;
+ esac
+ } |
+ case $action in
+ list) pr -6 -a -o4 -t | sort -u ;;
+ *) cat ;;
+ esac
+ case $argc in
+ 0) if test -d $PACKAGEROOT/arch
+ then echo
+ echo architectures in $PACKAGEROOT
+ echo
+ for i in `ls $PACKAGEROOT/arch`
+ do if test -f $PACKAGEROOT/arch/$i/lib/package/gen/host
+ then h=`cat $PACKAGEROOT/arch/$i/lib/package/gen/host`
+ else h=
+ fi
+ echo $i
+ echo $h
+ echo
+ echo
+ done | pr -4 -a -o4 -t
+ fi
+ ;;
+ esac
+ ;;
+
+copyright)
+ # all work in $PACKAGESRC
+
+ cd $PACKAGESRC
+
+ # generate the package list
+
+ set '' $target $package
+ shift
+ argc=$#
+ case $# in
+ 0) set '' `echo *.lic | sed 's,\.lic,,g'`
+ shift
+ case $1 in
+ '*') echo $command: $action: no packages >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+ checkaout proto || exit
+ for i
+ do copyright $i
+ done
+ ;;
+
+export) case $INSTALLROOT in
+ $PACKAGEROOT)
+ INSTALLROOT=$INSTALLROOT/arch/$HOSTTYPE
+ ;;
+ esac
+ case $only in
+ 0) v='$i=' ;;
+ *) v= ;;
+ esac
+ set '' $target $package
+ case $# in
+ 1) set '' $env ;;
+ esac
+ while :
+ do case $# in
+ 1) break ;;
+ esac
+ shift
+ i=$1
+ eval echo ${v}'$'${i}
+ done
+ ;;
+
+install)cd $PACKAGEROOT
+ set '' $package
+ shift
+ case $only in
+ 0) set '' `order "$@"`
+ shift
+ ;;
+ esac
+ case $# in
+ 0) echo "$command: at least one package name expected" >&2
+ exit 1
+ ;;
+ esac
+ package=$*
+ requirements - $package
+ set '' $target
+ shift
+ case $1 in
+ flat) flat=1 # backwards compatibility -- documentation dropped
+ shift
+ ;;
+ esac
+ case $# in
+ 0) echo "$command: $action: target directory argument expected" >&2
+ exit 1
+ ;;
+ esac
+ target=
+ while :
+ do case $# in
+ 1) directory=$1
+ break
+ ;;
+ esac
+ target="$target $1"
+ shift
+ done
+ if test ! -d $directory
+ then echo "$command: $action: $directory: target directory not found" >&2
+ exit 1
+ fi
+ case $target in
+ '') cd arch
+ set '' *
+ shift
+ target=$*
+ cd ..
+ ;;
+ esac
+ code=0
+ makecheck=1
+ for a in $target
+ do case $a in
+ -) a=$HOSTTYPE ;;
+ esac
+ case $flat:$a in
+ 1:*|?:.)dest=$directory
+ ;;
+ *) dest=$directory/arch/$a
+ if test "" = "$exec" -a ! -d $dest
+ then mkdir -p $dest || {
+ echo "$command: $dest: destination directory must exist" >&2
+ exit 1
+ }
+ fi
+ ;;
+ esac
+ for i in $package
+ do if test "ratz" = "$i"
+ then : skip
+ elif test -f arch/$a/lib/package/gen/$i.sum
+ then package_install $directory arch/$a/lib/package/gen/$i.sum || code=1
+ elif test ! -d arch/$a/bin
+ then echo "$command: $a: invalid architecture" >&2
+ elif test ! -d $dest
+ then echo "$command: $dest: destination directory must exist" >&2
+ else if test "" != "$makecheck"
+ then if onpath $MAKE
+ then MAKE=$_onpath_
+ else echo "$command: $MAKE: not found" >&2
+ exit 1
+ fi
+ makecheck=
+ fi
+ if test "" != "$exec"
+ then (
+ trap - 0 1 2 15
+ echo "=== $i installation manifest ==="
+ cd arch/$a
+ (
+ cd lib/package
+ INSTALLROOT=$PACKAGEROOT/arch/$a
+ VPATH=$INSTALLROOT:$PACKAGEROOT:$VPATH
+ export INSTALLROOT VPATH
+ $MAKE -s $makeflags -f $i.pkg $qualifier list.installed $assign
+ ) | sort -u
+ )
+ else (
+ set -
+ cd arch/$a
+ (
+ cd lib/package
+ INSTALLROOT=$PACKAGEROOT/arch/$a
+ VPATH=$INSTALLROOT:$PACKAGEROOT:$VPATH
+ export INSTALLROOT VPATH
+ echo lib/$command
+ $MAKE -s $makeflags -f $i.pkg $qualifier list.installed $assign
+ ) | sort -u | pax -drw -ps $dest
+ )
+ fi
+ fi
+ done
+ done
+ exit $code
+ ;;
+
+license)# all work in $PACKAGESRC/LICENSES
+
+ cd $PACKAGESRC/LICENSES || exit
+
+ # generate the package list
+
+ set '' $target $package
+ shift
+ argc=$#
+ case $# in
+ 0) set '' *
+ shift
+ case $1 in
+ '*') echo $command: $action: no licenses >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ *) checkaout proto || exit
+ a=
+ for i
+ do while :
+ do if test -f ../$i.lic
+ then j=`proto -df -l ../$i.lic -o query=type /dev/null 2>/dev/null`
+ case $j in
+ ?*) if test -f $j
+ then case " $a " in
+ *" $j "*) ;;
+ *) a="$a $j" ;;
+ esac
+ fi
+ break
+ ;;
+ esac
+ fi
+ case $i in
+ *-*) i=`echo $i | sed 's/-[^-]*$//'`
+ ;;
+ *) echo "$command: $i: package license not found" >&2
+ break
+ ;;
+ esac
+ done
+ done
+ set '' $a
+ shift
+ ;;
+ esac
+ for i
+ do case $exec in
+ '') echo
+ echo " --- $i source license ---"
+ echo
+ cat $i
+ ;;
+ *) echo $PACKAGESRC/LICENSES/$i
+ ;;
+ esac
+ done
+ ;;
+
+make|view)
+ cd $PACKAGEROOT
+ case $package in
+ '') lic="lib/package/*.lic"
+ ;;
+ *) for i in $package
+ do lic="$lic lib/package/$i.lic"
+ case $i in
+ *-*) lic="$lic lib/package/"`echo $i | sed 's,-.*,,'`".lic" ;;
+ esac
+ done
+ ;;
+ esac
+ checksrc
+ requirements source $package
+ components $package
+ package=$_components_
+
+ # check for some required commands
+
+ must="$AR"
+ warn="$NM yacc bison"
+ test="$must $warn"
+ have=
+ IFS=:
+ set /$IFS$PATH
+ IFS=$ifs
+ shift
+ for t in $test
+ do if executable $t
+ then have="$have $t"
+ fi
+ done
+ for d
+ do for t in $test
+ do case " $have " in
+ *" $t "*)
+ ;;
+ *) if executable $d/$t
+ then have="$have $t"
+ fi
+ ;;
+ esac
+ done
+ done
+ case " $have " in
+ *" bison "*) ;;
+ *" yacc "*) have="$have bison" ;;
+ esac
+ case " $have " in
+ *" yacc "*) ;;
+ *" bison "*) have="$have yacc" ;;
+ esac
+ for t in $test
+ do case " $have " in
+ *" $t "*)
+ ;;
+ *) case " $must " in
+ *" $t "*)
+ echo "$command: $t: not found -- must be on PATH to $action" >&2
+ exit 1
+ ;;
+ *) echo "$command: warning: $t: not found -- some $action actions may fail" >&2
+ ;;
+ esac
+ ;;
+ esac
+ done
+
+ # verify the top view
+
+ if test ! -d $PACKAGEROOT/src
+ then note no source packages to make
+ exit 0
+ elif test ! -d $INSTALLROOT/src
+ then note initialize the $INSTALLROOT view
+ fi
+ for i in arch arch/$HOSTTYPE
+ do test -d $PACKAGEROOT/$i || $exec mkdir $PACKAGEROOT/$i || exit
+ done
+ for i in bin bin/$OK bin/$OK/lib fun include lib lib/package lib/package/gen src man man/man1 man/man3 man/man8
+ do test -d $INSTALLROOT/$i || $exec mkdir $INSTALLROOT/$i || exit
+ done
+ make_recurse src
+ o= k=
+ for i in $makefiles
+ do case $o in
+ ?*) o="$o -o" k="$k|" ;;
+ esac
+ o="$o -name $i"
+ k="$k$i"
+ done
+ o="( $o ) -print"
+ for d in $package_src
+ do i=src/$d
+ if test -d $i
+ then test -d $INSTALLROOT/$i || $exec mkdir $INSTALLROOT/$i || exit
+ make_recurse $i
+ for j in `cd $i; find . $o 2>/dev/null | sed -e 's,^\./,,' -e '/\//!d' -e 's,/[^/]*$,,' | sort -u`
+ do case $j in
+ $k|$MAKESKIP) continue ;;
+ esac
+ test -d $INSTALLROOT/$i/$j ||
+ $exec mkdir -p $INSTALLROOT/$i/$j || exit
+ done
+ fi
+ done
+ def=
+ for i in $lic
+ do test -f $i || continue
+ cmp -s $i $INSTALLROOT/$i 2>/dev/null ||
+ $exec cp $PACKAGEROOT/$i $INSTALLROOT/$i
+ for j in `grep '^. .*\.def$' $i`
+ do case $j in
+ .) ;;
+ *) case " $def " in
+ *" $i "*) ;;
+ *) def="$def $i" ;;
+ esac
+ ;;
+ esac
+ done
+ done
+ for i in $def
+ do i=lib/package/$i
+ test -f $i || continue
+ cmp -s $i $INSTALLROOT/$i 2>/dev/null ||
+ $exec cp $PACKAGEROOT/$i $INSTALLROOT/$i
+ done
+
+ # check $CC and { ar cc ld ldd } intercepts
+
+ h="${HOSTTYPE} ${HOSTTYPE}.*"
+ case $HOSTTYPE in
+ *.*) t=`echo $HOSTTYPE | sed 's/[.][^.]*//'`
+ h="$h $t"
+ ;;
+ *) t=$HOSTTYPE
+ ;;
+ esac
+ case $t in
+ *[0123456789])
+ t=`echo $t | sed 's/[0123456789]*$//'`
+ h="$h $t"
+ ;;
+ esac
+ case $CC in
+ cc) c=cc
+ b=$INSTALLROOT/bin/$c
+ t=$INSTALLROOT/lib/package/gen/$c.tim
+ intercept=0
+ for k in $h
+ do for s in $INITROOT/$c.$k
+ do test -x "$s" || continue
+ if cmp -s "$s" "$b" >/dev/null 2>&1
+ then intercept=1
+ break 2
+ fi
+ case `ls -t "$t" "$b" "$s" 2>/dev/null` in
+ $t*) ;;
+ $b*) cc=$b
+ ;;
+ $s*) cd $INSTALLROOT/lib/package/gen
+ tmp=pkg$$
+ eval '$'exec echo "'int main(){return 0;}' > $tmp.c"
+ if $exec $s -o $tmp.exe $tmp.c >/dev/null 2>&1 &&
+ test -x $tmp.exe
+ then case $HOSTTYPE in
+ *.mips*)$s -version >/dev/null 2>&1 || s= ;;
+ esac
+ case $s in
+ ?*) $exec sed "s/^HOSTTYPE=.*/HOSTTYPE=$HOSTTYPE/" < "$s" > "$b" || exit
+ $exec chmod +x "$b" || exit
+ cc=$b
+ intercept=1
+ note update $b
+ ;;
+ esac
+ fi
+ $exec rm -f $tmp.*
+ $exec touch "$t"
+ cd $PACKAGEROOT
+ ;;
+ esac
+ break 2
+ done
+ done
+ case $intercept in
+ 1) c=ld
+ b=$INSTALLROOT/bin/$c
+ for k in $h
+ do for s in $INITROOT/$c.$k
+ do test -x "$s" || continue
+ case `ls -t "$b" "$s" 2>/dev/null` in
+ $b*) ;;
+ $s*) $exec cp "$s" "$b"
+ note update $b
+ ;;
+ esac
+ done
+ done
+ ;;
+ esac
+ ;;
+ esac
+ c=ldd
+ b=$INSTALLROOT/bin/$c
+ for t in $h
+ do s=$INITROOT/$c.$t
+ test -x "$s" || continue
+ onpath $c ||
+ case `ls -t "$b" "$s" 2>/dev/null` in
+ $b*) ;;
+ $s*) $exec cp "$s" "$b"
+ note update $b
+ ;;
+ esac
+ done
+# following code stubbed out just in case ar.ibm.risc is needed
+# c=ar
+# b=$INSTALLROOT/bin/$c
+# for t in $h
+# do s=$INITROOT/$c.$t
+# test -x "$s" || continue
+# onpath $c ||
+# case `ls -t "$b" "$s" 2>/dev/null` in
+# $b*) ;;
+# $s*) x=`$s -tv /foo/bar.a 2>&1 | egrep -i 'option|usage'`
+# case $x in
+# '') $exec cp "$s" "$b"
+# note update $b
+# ;;
+# esac
+# ;;
+# esac
+# done
+ case $cc in
+ /*) ;;
+ *) echo "$command: $CC: not found -- set CC=C-compiler" >&2
+ exit 1
+ ;;
+ esac
+ case $exec in
+ '') cd $INSTALLROOT/lib/package/gen
+ tmp=pkg$$
+ echo 'int main(){return 0;}' > $tmp.c
+ if $CC -o $tmp.exe $tmp.c > /dev/null 2> $tmp.err &&
+ test -x $tmp.exe
+ then : ok
+ else echo "$command: $CC: failed to compile this program:" >&2
+ cat $tmp.c >&2
+ if test -s $tmp.err
+ then cat $tmp.err >&2
+ else echo "$command: $CC: not a C compiler" >&2
+ fi
+ rm -f $tmp.*
+ exit 1
+ fi
+ rm -f $tmp.*
+ cd $PACKAGEROOT
+ ;;
+ esac
+
+ # remember the default $CC
+
+ case $CC in
+ cc) ;;
+ *) if test -x $INSTALLROOT/bin/cc
+ then case `sed 1q $INSTALLROOT/bin/cc` in
+ ": $CC :")
+ CC=cc
+ export CC
+ ;;
+ *) assign="$assign CC=\"\$CC\""
+ ;;
+ esac
+ else case $CROSS in
+ 1) assign="$assign CC=\"\$CC\""
+ ;;
+ *) case $exec in
+ '') {
+ echo ": $CC :"
+ echo "$CC \"\$@\""
+ } > $INSTALLROOT/bin/cc
+ chmod +x $INSTALLROOT/bin/cc
+ ;;
+ *) note generate a $INSTALLROOT/bin/cc wrapper for $CC
+ ;;
+ esac
+ CC=cc
+ export CC
+ ;;
+ esac
+ fi
+ ;;
+ esac
+
+ # no $INITROOT means INIT already installed elsewhere
+
+ if test -d $INITROOT
+ then
+ # update probe scripts
+
+ for i in lib/probe lib/probe/C lib/probe/C/make
+ do test -d $INSTALLROOT/$i || $exec mkdir $INSTALLROOT/$i || exit
+ done
+ i=$INSTALLROOT/lib/probe/C/make/probe
+ j=$INITROOT/C+probe
+ k=$INITROOT/make.probe
+ case `ls -t $i $j $k 2>/dev/null` in
+ $i*) ;;
+ *) if test -f $j -a -f $k
+ then note update $i
+ shellmagic
+ case $exec in
+ '') {
+ case $SHELLMAGIC in
+ ?*) echo "$SHELLMAGIC" ;;
+ esac
+ cat $j $k
+ } > $i || exit
+ ;;
+ *) echo "{
+echo $SHELLMAGIC
+cat $j $k
+} > $i"
+ ;;
+ esac
+ $exec chmod +x $i || exit
+ fi
+ ;;
+ esac
+ fi
+
+ # initialize a few mamake related commands
+
+ checkaout mamake proto ratz release || exit
+
+ # execrate if necessary
+
+ if (execrate) >/dev/null 2>&1
+ then execrate=execrate
+ $make cd $INSTALLROOT/bin
+ for i in chmod chgrp cmp cp ln mv rm
+ do if test ! -x $OK/$i -a -x /bin/$i.exe
+ then shellmagic
+ case $exec in
+ '') echo "$SHELLMAGIC"'execrate /bin/'$i' "$@"' > $OK/$i
+ chmod +x $OK/$i
+ ;;
+ *) $exec echo \'"$SHELLMAGIC"'execrate /bin/'$i' "$@"'\'' >' $OK/$i
+ $exec chmod +x $OK/$i
+ ;;
+ esac
+ fi
+ done
+ PATH=$INSTALLROOT/bin/$OK:$PATH
+ export PATH
+ else execrate=
+ fi
+ case $action in
+ view) exit 0 ;;
+ esac
+
+ # all work under $INSTALLROOT/src
+
+ $make cd $INSTALLROOT/src
+
+ # record the build host name
+
+ case $noexec in
+ '') hostinfo name
+ echo "$_hostinfo_" | sed 's,\..*,,' > $PACKAGEBIN/gen/host
+ ;;
+ esac
+
+ # make in parallel if possible
+
+ case $NPROC in
+ '') hostinfo cpu
+ case $_hostinfo_ in
+ 0|1) ;;
+ *) NPROC=$_hostinfo_
+ $show NPROC=$NPROC
+ $show export NPROC
+ export NPROC
+ ;;
+ esac
+ ;;
+ esac
+
+ # separate flags from target list
+
+ case $target in
+ *-*) a=
+ for t in $target
+ do case $t in
+ -[eiknFKNV]*|--*-symbols)
+ makeflags="$makeflags $t"
+ ;;
+ -*) nmakeflags="$nmakeflags $t"
+ ;;
+ *) a="$a $t"
+ ;;
+ esac
+ done
+ target=$a
+ ;;
+ esac
+
+ # generate nmake first if possible
+
+ if executable ! $NMAKE && test -d $PACKAGEROOT/src/cmd/nmake
+ then if nonmake $MAKE
+ then note make $NMAKE with mamake
+ c=$CC
+ a=$assign
+ case $HOSTTYPE in
+ win32*|cygwin*)
+ CC="$CC -D_BLD_STATIC"
+ accept="libast"
+ case $assign in
+ *' CC='*) ;;
+ *) assign="$assign CC=\"\$CC\"" ;;
+ esac
+ ;;
+ *) accept=nmake
+ ;;
+ esac
+ eval capture mamake \$makeflags \$nmakeflags \$noexec install nmake $assign
+ assign=$a
+ CC=$c
+ case $make$noexec in
+ '') if executable ! $NMAKE
+ then echo "$command: $action: errors making $NMAKE" >&2
+ exit 1
+ fi
+ ;;
+ *) make=echo
+ ;;
+ esac
+ if test '' != "$PROTOROOT"
+ then if (vpath $INSTALLROOT - $PROTOROOT - $INSTALLROOT $PACKAGEROOT) >/dev/null 2>&1 &&
+ vpath $INSTALLROOT - $PROTOROOT - $INSTALLROOT $PACKAGEROOT
+ then $show vpath $INSTALLROOT $PACKAGEROOT $USER_VPATH_CHAIN
+ else VPATH=$INSTALLROOT:$PACKAGEROOT$USER_VPATH
+ $show VPATH=$VPATH
+ export VPATH
+ fi
+ fi
+ note believe generated files for $accept
+ eval capture \$NMAKE \$makeflags \$nmakeflags \$noexec recurse believe \$nmakesep $accept $assign
+ $exec touch $INSTALLROOT/bin/.paths
+ note make the remaining targets with $NMAKE
+ else eval capture $MAKE \$makeflags \$nmakeflags \$noexec install nmake $assign
+ case $make$noexec in
+ '') if executable ! $NMAKE
+ then echo "$command: $action: errors making $NMAKE" >&2
+ exit 1
+ fi
+ ;;
+ *) make=echo
+ ;;
+ esac
+ fi
+ fi
+
+ # generate ksh next if possible
+
+ if nonmake $MAKE
+ then : no need to generate ksh next -- it could be the only package
+ elif test "$KEEP_SHELL" != 1 -a -d $PACKAGEROOT/src/cmd/ksh93 && executable ! $KSH
+ then eval capture nmake $nmakeflags \$makeflags \$noexec install ksh93 $assign
+ case $make$noexec in
+ '') if executable ! $KSH
+ then echo "$command: $action: errors making $KSH" >&2
+ exit 1
+ fi
+ ;;
+ *) make=echo
+ ;;
+ esac
+ fi
+
+ # mamprobe data should have been generated by this point
+
+ case $exec in
+ '') if test ! -f $INSTALLROOT/bin/.paths -o -w $INSTALLROOT/bin/.paths
+ then nl="
+"
+ o=`cat $INSTALLROOT/bin/.paths 2>/dev/null`
+ v=
+ n=
+ case $nl$o in
+ *${nl}FPATH=*|*#FPATH=*|*[Nn][Oo]FPATH=*)
+ ;;
+ *) case $n in
+ '') ;;
+ *) n="$n$nl" v="$v|" ;;
+ esac
+ n="${n}FPATH=../fun"
+ v="${v}FPATH"
+ ;;
+ esac
+ case $nl$o in
+ *${nl}BUILTIN_LIB=*|*#BUILTIN_LIB=*|*[Nn][Oo]BUILTIN_LIB=*)
+ ;;
+ *) case $n in
+ '') ;;
+ *) n="$n$nl" v="$v|" ;;
+ esac
+ if grep '^setv mam_cc_DIALECT .* EXPORT=[AD]LL' $INSTALLROOT/lib/probe/C/mam/* >/dev/null 2>&1
+ then x=
+ else x='no'
+ fi
+ n="${n}${x}BUILTIN_LIB=cmd"
+ v="${v}BUILTIN_LIB"
+ ;;
+ esac
+ case $n in
+ ?*) case $o in
+ ?*) o=`egrep -v "($v)=" $INSTALLROOT/bin/.paths`$nl ;;
+ esac
+ echo "# use { # no NO } prefix instead of XX to permanently disable #$nl$o$n" > $INSTALLROOT/bin/.paths
+ ;;
+ esac
+ fi
+ ;;
+ esac
+
+ # run from separate copies since nmake and ksh may be rebuilt
+
+ case $EXECROOT in
+ $INSTALLROOT)
+ $make cd $INSTALLROOT/bin
+ if executable /bin/cp
+ then cp=/bin/cp
+ else cp=cp
+ fi
+ if executable /bin/mv
+ then mv=/bin/mv
+ else mv=mv
+ fi
+ if executable /bin/rm
+ then rm=/bin/rm
+ else rm=rm
+ fi
+ for i in \
+ ksh nmake tee cp ln mv rm \
+ *ast*.dll *cmd*.dll *dll*.dll *shell*.dll
+ do executable $i && {
+ cmp -s $i $OK/$i 2>/dev/null || {
+ test -f $OK/$i &&
+ $exec $execrate $rm $OK/$i </dev/null
+ test -f $OK/$i &&
+ $exec $execrate $mv $OK/$i $OK/$i.old </dev/null
+ test -f $OK/$i &&
+ case $exec:$i in
+ :nmake|:ksh)
+ echo "$command: $OK/$i: cannot update [may be in use by a running process] remove manually and try again" >&2
+ exit 1
+ ;;
+ esac
+ $exec $execrate $cp $i $OK/$i
+ }
+ }
+ done
+ if test -f ../lib/make/makerules.mo
+ then cmp -s ../lib/make/makerules.mo $OK/lib/makerules.mo ||
+ $exec $execrate $cp -p ../lib/make/makerules.mo $OK/lib/makerules.mo ||
+ $exec $execrate $cp ../lib/make/makerules.mo $OK/lib/makerules.mo
+ fi
+ if executable $OK/nmake
+ then MAKE="$INSTALLROOT/bin/$OK/nmake LOCALRULESPATH=$INSTALLROOT/bin/$OK/lib"
+ fi
+ if executable $OK/tee
+ then TEE=$INSTALLROOT/bin/$OK/tee
+ fi
+ if test "$KEEP_SHELL" != 1 && executable $OK/ksh
+ then SHELL=$INSTALLROOT/bin/$OK/ksh
+ export SHELL
+ COSHELL=$SHELL
+ export COSHELL
+ fi
+ case :$PATH: in
+ *:$INSTALLROOT/bin/$OK:*)
+ ;;
+ *) PATH=$INSTALLROOT/bin/$OK:$PATH
+ export PATH
+ ;;
+ esac
+ $make cd $INSTALLROOT/src
+ ;;
+ esac
+
+ # fall back to mamake if nmake not found or too old
+
+ if nonmake $MAKE
+ then note make with mamake
+ case $target in
+ '') target="install" ;;
+ esac
+ eval capture mamake \$makeflags \$noexec \$target $assign
+ else case $target in
+ '') target="install cc-" ;;
+ esac
+ eval capture \$MAKE \$makeflags \$nmakeflags \$noexec recurse \$target \$nmakesep \$package $assign
+ fi
+ ;;
+
+read) case ${PWD:-`pwd`} in
+ $PACKAGEROOT)
+ ;;
+ *) echo "$command: must be in package root directory" >&2
+ exit 1
+ ;;
+ esac
+ PAX=
+ if onpath pax
+ then case `$_onpath_ -rw --?meter 2>&1` in
+ *--meter*) PAX=pax ;;
+ esac
+ fi
+ code=0
+ i=
+ x=
+ remove=
+ touch=
+ set '' $target
+ case $2 in
+ lcl|tgz)tgz=$2
+ shift 2
+ target=$*
+ ;;
+ *) tgz=tgz
+ ;;
+ esac
+ set '' $package $target
+ case $# in
+ 1) verbose=:
+ set '' `ls lib/package/$tgz/*?[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.]* 2>/dev/null`
+ ;;
+ *) verbose=
+ ;;
+ esac
+ shift
+ files=
+ for f
+ do if test -f "$f"
+ then : ok
+ elif test -f "lib/package/$tgz/$f"
+ then f=lib/package/$tgz/$f
+ else set '' `ls -r ${f}[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.]* 2>/dev/null`
+ if test '' != "$2" -a -f "$2"
+ then f=$2
+ else set '' `ls -r lib/package/$tgz/${f}[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.]* 2>/dev/null`
+ if test '' != "$2" -a -f "$2"
+ then f=$2
+ else echo "$command: $f: package archive not found" >&2
+ continue
+ fi
+ fi
+ fi
+ files="$files $f"
+ done
+ case $files in
+ '') echo "$command: lib/package/$tgz: no package archives" >&2
+ exit 1
+ ;;
+ esac
+ set '' `ls -r $files 2>/dev/null`
+ shift
+ f1= f2= f3= f4=
+ for f
+ do case $f in
+ ratz.*|*/ratz.*)
+ f1="$f1 $f"
+ ;;
+ INIT.*|*/INIT.*)
+ f2="$f2 $f"
+ ;;
+ INIT*|*/INIT*)
+ f3="$f3 $f"
+ ;;
+ *) f4="$f4 $f"
+ ;;
+ esac
+ done
+ gen=
+ set '' $f1 $f2 $f3 $f4
+ while :
+ do shift
+ case $# in
+ 0) break ;;
+ esac
+ f=$1
+ case $f in
+ *.gz) : standalone packages unbundled manually
+ continue
+ ;;
+ *.md5) : tarball checksum
+ continue
+ ;;
+ *?[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.]*)
+ ;;
+ *) echo "$command: $f: not a package archive" >&2
+ code=1
+ continue
+ ;;
+ esac
+ case $f in
+ */*) eval `echo "$f" | sed -e 's,\(.*/\)\(.*\),d=\1 a=\2,'` ;;
+ *) d= a=$f ;;
+ esac
+ # f:file d:dir a:base p:package v:version r:release t:type
+ eval `echo "$a" | sed -e 's,\.c$,,' -e 's,\.gz$,,' -e 's,\.exe$,,' -e 's,\.tgz$,,' -e 's,\([^_.]*\)[_.]\([0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]\)[_.]\([0123456789][0123456789][0123456789][0123456789][^_.]*\)[_.]*\(.*\),p=\1 v=\2 r=\3 t=\4,' -e 's,\([^_.]*\)[_.]\([0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]\)[_.]*\(.*\),p=\1 v=\2 r=base t=\3,'`
+ case $r in
+ base) y=$p.base ;;
+ *) y=$p.delta ;;
+ esac
+ case " $x " in
+ *" $y "*)
+ continue
+ ;;
+ esac
+ case $t in
+ '') w=$PACKAGESRC
+ q=
+ Q=
+ m=
+ ;;
+ *) w=$PACKAGEROOT/arch/$t/lib/package
+ q=".$t"
+ Q="_$t"
+ m="[_.]$t"
+ ;;
+ esac
+ u=$d$p$q.tim
+ if test -s "$u"
+ then continue
+ else case $force in
+ 0) case `ls -t "$f" "$u" 2>/dev/null` in
+ "$u"*) case $verbose in
+ 1) note $p already read ;;
+ esac
+ continue
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ case $p in
+ INIT) if test -f $PACKAGEROOT/bin/package
+ then $exec mv $PACKAGEROOT/bin/package $PACKAGEROOT/bin/package.old
+ fi
+ ;;
+ esac
+ z=
+ case $r in
+ base) # base archive
+ if test ratz = "$p"
+ then # ratz packages are not archives
+ case $t in
+ '') for i in src src/cmd src/cmd/INIT
+ do test -d $PACKAGEROOT/$i || $exec mkdir $PACKAGEROOT/$i || exit
+ done
+ $exec cp $f $PACKAGEROOT/src/cmd/INIT/$p.c
+ ;;
+ *) for i in arch arch/$t arch/$t/bin
+ do test -d $PACKAGEROOT/$i || $exec mkdir $PACKAGEROOT/$i || exit
+ done
+ $exec cp $f $PACKAGEROOT/arch/$t/bin/$p &&
+ $exec chmod +x $PACKAGEROOT/arch/$t/bin/$p
+ ;;
+ esac
+ elif test "" != "$PAX"
+ then $exec pax -L --from=ascii --local -m -ps -rvf "$f" || {
+ code=1
+ continue
+ }
+ else if onpath gunzip && onpath $TAR && isascii
+ then case $TARPROBE in
+ ?*) for i in $TARPROBE
+ do if $TAR ${i}f - /dev/null > /dev/null 2>&1
+ then TARFLAGS=$TARFLAGS$i
+ fi
+ done
+ TARPROBE=
+ ;;
+ esac
+ if gunzip -l < "$f" > /dev/null 2>&1
+ then case $exec in
+ '') $exec gunzip < "$f" | $TAR ${TARFLAGS}f - ;;
+ *) $exec "gunzip < $f | $TAR ${TARFLAGS}f -" ;;
+ esac || {
+ code=1
+ continue
+ }
+ else $exec $TAR ${TARFLAGS}f "$f" || {
+ code=1
+ continue
+ }
+ fi
+ else checkaout ratz && onpath ratz || {
+ code=1
+ continue
+ }
+ RATZ=$_onpath_
+ case $exec in
+ '') echo $f:
+ $exec $RATZ -lm < "$f"
+ ;;
+ *) $exec "$RATZ -lm < $f"
+ ;;
+ esac || {
+ code=1
+ continue
+ }
+ fi
+ if test -f $PACKAGEBIN/gen/$p.sum
+ then while read md5 mode usr grp file
+ do case $file in
+ -*) file=./$file ;;
+ esac
+ case $mode in
+ [01234567][01234567][01234567][01234567])
+ case $grp in
+ -) ;;
+ *) $exec chgrp $grp "$file" ;;
+ esac
+ case $usr in
+ -) ;;
+ *) $exec chown $usr "$file" ;;
+ esac
+ $exec chmod $mode "$file"
+ ;;
+ esac
+ done < $PACKAGEBIN/gen/$p.sum
+ fi
+ fi
+ ;;
+ *) # delta archive
+ test "" != "$PAX" || {
+ echo "$command: $f: pax required to read delta archive" >&2
+ code=1
+ continue
+ }
+ case `echo "$v:
+$r:" | sort` in
+ $r:*) y=$p.base
+ b=${d}${p}_${r}${Q}.tgz
+ test -f "$b" || b=${d}${p}.${r}${q}.tgz
+ test -f "$b" || {
+ case " $gen " in
+ *" $b "*)
+ ;;
+ *) case $# in
+ 1) echo "$command: $f: base archive $b required to read delta" >&2
+ code=1
+ ;;
+ *) shift
+ y=$1
+ shift
+ set '' $y $f "$@"
+ esac
+ continue
+ ;;
+ esac
+ }
+ # -m with delta bug fixed 2005-02-08
+ $exec pax -L --from=ascii --local -ps -rvf "$f" -z "$b" || {
+ code=1
+ continue
+ }
+ note $f: generate new base $d$p.$v$q.tgz
+ $exec pax -rf "$f" -z "$b" -wf $d$p.$v$q.tgz -x tgz || {
+ code=1
+ continue
+ }
+ case $exec in
+ '') echo $p $v $v 1 > $w/gen/$p.ver
+ ;;
+ *) z=$d${p}[_.]$v$q.tgz
+ $exec "echo $p $v $v 1 > $w/gen/$p.ver"
+ gen="$gen $d$p.$v$q.tgz"
+ ;;
+ esac
+ case " $remove " in
+ *" $f "*) ;;
+ *) remove="$remove $f" ;;
+ esac
+ ;;
+ *) b=${d}${p}_${v}${Q}.tgz
+ test -f "$b" || b=${d}${p}.${v}${q}.tgz
+ test -f "$b" || {
+ case " $gen " in
+ *" $b "*)
+ ;;
+ *) case $# in
+ 1) echo "$command: $f: base archive $b required to read delta" >&2
+ code=1
+ ;;
+ *) shift
+ y=$1
+ shift
+ set '' $y $f "$@"
+ esac
+ continue
+ ;;
+ esac
+ }
+ # -m with delta bug fixed 2005-02-08
+ $exec pax -L --from=ascii --local -ps -rvf "$f" -z "$b" || {
+ code=1
+ continue
+ }
+ ;;
+ esac
+ ;;
+ *) echo "$command: $f: unknown archive type" >&2
+ code=1
+ continue
+ ;;
+ esac
+
+ # check for ini files
+
+ if executable $w/$p.ini
+ then $exec $w/$p.ini read || {
+ code=1
+ continue
+ }
+ fi
+
+ # add to the obsolete list
+
+ k=
+ for i in `ls $d$p[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.]????$m* $z 2>/dev/null`
+ do case $i in
+ *.md5) continue
+ ;;
+ $d${p}[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789][_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]$m*)
+ ;;
+ $d${p}[_.][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]$m*)
+ continue
+ ;;
+ esac
+ case $k in
+ ?*) case " $remove " in
+ *" $k "*) ;;
+ *) remove="$remove $k" ;;
+ esac
+ ;;
+ esac
+ k=$i
+ done
+ x="$x $y"
+ case " $touch " in
+ *" $u "*) ;;
+ *) touch="$touch $u" ;;
+ esac
+ done
+ if test ! -f $PACKAGEROOT/bin/package -a -f $PACKAGEROOT/bin/package.old
+ then $exec cp $PACKAGEROOT/bin/package.old $PACKAGEROOT/bin/package
+ fi
+
+ # drop obsolete archives
+
+ case $remove in
+ ?*) $exec rm -f $remove ;;
+ esac
+
+ # mark the updated archives
+
+ case $touch in
+ ?*) sleep 1; $exec touch $touch ;;
+ esac
+
+ # check the requirements
+
+ case $code$exec in
+ 0) requirements - $x ;;
+ esac
+ exit $code
+ ;;
+
+regress)if test ! -d $PACKAGEBIN/gen
+ then echo "$command: 'package make' and 'package test' required for regression" >&2
+ exit 1
+ fi
+ dir=$PACKAGEBIN/gen
+ cd $dir
+ for s in out old
+ do case `ls -t regress.$s test.$s 2>/dev/null` in
+ regress*)
+ ;;
+ test*) if test -f regress.$s
+ then $exec mv regress.$s regress.old
+ fi
+ case $exec in
+ '') egrep -i '\*\*\*|FAIL|^TEST.* [123456789][0123456789]* error|core.*dump' test.$s |
+ sed -e '/\*\*\* [0123456789]/d' \
+ -e '/^TEST.\//s,/[^ ]*/,,' \
+ -e 's,[ ][ ]*$,,' \
+ -e 's/[0123456789][0123456789]*:* \([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 ]*([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 ]*[Cc][Oo][Rr][Ee][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 ]*)\)/\1/' \
+ -e 's/\.sh failed at .* with /.sh failed /' \
+ > regress.$s
+ ;;
+ *) $exec filter test failures from $dir/test.$s to $dir/regress.$s
+ ;;
+ esac
+ ;;
+ esac
+ done
+ if test -f regress.out -a -f regress.old
+ then $exec diff -b regress.out regress.old
+ else echo "$command: at least 2 test runs required for regression" >&2
+ exit 1
+ fi
+ ;;
+
+release)count= lo= hi=
+ checksrc
+ checkaout release || exit
+ requirements source $package
+ components $package
+ package=$_components_
+ set '' $target
+ shift
+ case $# in
+ 0) ;;
+ *) case $1 in
+ -|[0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]|[0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789])
+ case $1 in
+ -) lo= release= ;;
+ *) lo=$1 release="-f $1" ;;
+ esac
+ shift
+ case $1 in
+ -|[0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]|[0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789])
+ case $1 in
+ -) hi= ;;
+ *) hi=$1 release="$release -t $1" ;;
+ esac
+ shift
+ ;;
+ esac
+ ;;
+ [0123456789]|[0123456789][0123456789]|[0123456789][0123456789][0123456789]|[0123456789][0123456789][0123456789][0123456789]|[0123456789][0123456789][0123456789][0123456789][0123456789]*)
+ count=$1
+ release="-r $count"
+ shift
+ ;;
+ esac
+ ;;
+ esac
+ case $# in
+ 0) case $package in
+ '') package=* ;;
+ esac
+ ;;
+ *) case $package in
+ '') package=$*
+ ;;
+ *) echo $command: $*: lo-date hi-date arguments expected >&2
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+ echo
+ case $count:$lo:$hi in
+ ::) echo "All recorded changes follow." ;;
+ 1::) echo "Changes since the last release follow." ;;
+ ?*::) echo "Changes since the last $count releases follow." ;;
+ 1:?*:) echo "Changes since $lo or the last release follow." ;;
+ *:?*:*) echo "Changes since $lo follow." ;;
+ *::?*) echo "Changes before $hi follow." ;;
+ *) echo "Changes between $lo and $hi follow." ;;
+ esac
+ x=
+ for r in $INSTALLROOT $PACKAGEROOT
+ do for s in $package_src
+ do d=$r/src/$s
+ if test -d $d
+ then cd $d
+ for i in $package
+ do if test -h $i 2>/dev/null
+ then continue
+ fi
+ case " $x " in
+ *" $i "*) continue ;;
+ esac
+ for f in RELEASE CHANGES ChangeLog
+ do if test -f $i/$f
+ then $exec release $release $i/$f
+ x="$x $i"
+ for f in $i/*/$f
+ do if test -f $f
+ then $exec release $release $f
+ fi
+ done
+ break
+ fi
+ done
+ done
+ fi
+ done
+ done
+ ;;
+
+remove) echo "$command: $action: not implemented yet" >&2
+ exit 1
+ ;;
+
+results)set '' $target
+ shift
+ def=make
+ dir=$PACKAGEBIN/gen
+ case $verbose in
+ 0) filter=yes ;;
+ *) filter=cat ;;
+ esac
+ path=0
+ suf=out
+ on=
+ while :
+ do case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ --) shift
+ break
+ ;;
+ admin) dir=$PACKAGESRC/admin
+ ;;
+ error*|fail*)
+ filter=errors
+ ;;
+ make|test|view|write)
+ def=$1
+ case $filter:$1:$SHELL in
+ errors:*:*) ;;
+ *:test:*/ksh*) filter=rt ;;
+ esac
+ ;;
+ old) suf=old
+ ;;
+ on) case $# in
+ 1) echo $command: $action: $1: host pattern argument expected >&2
+ exit 1
+ ;;
+ esac
+ shift
+ case $on in
+ ?*) on="$on|" ;;
+ esac
+ on="$on$1"
+ ;;
+ path) path=1
+ ;;
+ test) def=test
+ filter=rt
+ ;;
+ *) break
+ ;;
+ esac
+ shift
+ done
+ case $dir in
+ */admin)case $on in
+ '') on="*" ;;
+ *) on="@($on)" ;;
+ esac
+ def=$def.log/$on
+ ;;
+ esac
+ case $# in
+ 0) set "$def" ;;
+ esac
+ m=
+ t=
+ for i
+ do k=0
+ eval set '""' $i - $i.$suf - $dir/$i - $dir/$i.$suf -
+ shift
+ for j
+ do case $j in
+ -) case $k in
+ 1) continue 2 ;;
+ esac
+ ;;
+ *) if test -f $j
+ then k=1
+ case /$j in
+ */test.*) t="$t $j" ;;
+ *) m="$m $j" ;;
+ esac
+ fi
+ ;;
+ esac
+ done
+ echo "$command: $i action output not found" >&2
+ exit 1
+ done
+ sep=
+ case $t in
+ ?*) case $path in
+ 0) for j in $t
+ do echo "$sep==> $j <=="
+ sep=$nl
+ case $filter in
+ cat) $exec cat $j
+ ;;
+ errors) $exec egrep -i '\*\*\*|FAIL[ES]|^TEST.* [123456789][0123456789]* error|core.*dump' $j | sed -e '/^TEST.\//s,/[^ ]*/,,'
+ ;;
+ rt) $exec rt - $j
+ ;;
+ *) $exec egrep -i '^TEST|FAIL' $j
+ ;;
+ esac
+ done
+ ;;
+ 1) echo $t
+ ;;
+ esac
+ ;;
+ esac
+ case $m in
+ ?*) case $path in
+ 0) case $filter in
+ cat) cat $m
+ ;;
+ *) if test -f $HOME/.pkgresults
+ then i="`cat $HOME/.pkgresults`"
+ case $i in
+ '|'*) ;;
+ *) i="|$i" ;;
+ esac
+ else i=
+ fi
+ for j in $m
+ do echo "$sep==> $j <=="
+ sep=$nl
+ case $filter in
+ errors) $exeg egrep '^pax:|\*\*\*' $j
+ ;;
+ *) $exec egrep -iv '^($||[\+\[]|cc[^-:]|kill |make.*(file system time|has been replaced)|so|[0123456789]+ error|uncrate |[0123456789]+ block|ar: creat|iffe: test: |conf: (check|generate|test)|[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_][abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789]*=|gsf@research|ar:.*warning|cpio:|ld:.*(duplicate symbol|to obtain more information)|[0123456789]*$|(checking|creating|touch) [/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789])| obsolete predefined symbol | is (almost always misused|dangerous|deprecated|not implemented)| trigraph| assigned to | cast .* different size| integer overflow .*<<| optimization may be attained | passed as |::__builtin|pragma.*prototyped|^creating.*\.a$|warning.*not optimized|exceeds size thresh|ld:.*preempts|is unchanged|with value >=|(-l|lib)\*|/(ast|sys)/(dir|limits|param|stropts)\.h.*redefined|usage|base registers|`\.\.\.` obsolete'"$i" $j |
+ $exec grep :
+ ;;
+ esac
+ done
+ ;;
+ esac
+ ;;
+ 1) echo $m
+ ;;
+ esac
+ esac
+ ;;
+
+test) requirements source $package
+ components $package
+ package=$_components_
+ case $only in
+ 0) only= ;;
+ 1) only=--recurse=only ;;
+ esac
+
+ # must have nmake
+
+ if nonmake $MAKE
+ then echo $command: $action: must have $MAKE to test >&2
+ exit 1
+ fi
+
+ # all work under $INSTALLROOT/src
+
+ $make cd $INSTALLROOT/src
+
+ # disable core dumps (could be disasterous over nfs)
+
+ (ulimit -c 0) > /dev/null 2>&1 && ulimit -c 0
+
+ # do the tests
+
+ eval capture \$MAKE \$makeflags \$noexec \$only recurse test \$target \$nmakesep \$package $assign
+ ;;
+
+update) # download the latest release.version for selected packages
+
+ # all work in $PACKAGEROOT/lib/package/tgz
+
+ if test ! -d $PACKAGEROOT/lib/package/tgz
+ then $exec mkdir -p $PACKAGEROOT/lib/package/tgz || exit
+ $exec cd $PACKAGEROOT/lib/package/tgz
+ else cd $PACKAGEROOT/lib/package/tgz
+ fi
+
+ # get the architectures, update query url, and packages
+
+ set '' $args
+ op=update
+ tgz=tgz
+ source=
+ binary=
+ setup=
+ types=
+ url=
+ urlfile=$default_url
+ while :
+ do shift
+ case $# in
+ 0) break ;;
+ esac
+ case $1 in
+ --) shift
+ break
+ ;;
+ beta) op=beta
+ tgz=beta
+ ;;
+ binary) binary=1
+ ;;
+ setup) setup=1
+ ;;
+ source) source=1
+ ;;
+ *://*) url=$1
+ shift
+ break
+ ;;
+ *.url) urlfile=$1
+ if test ! -s $urlfile
+ then echo $command: $urlfile: not found >&2; exit 1
+ fi
+ break
+ ;;
+ $all_types)
+ binary=1
+ types="$types $1"
+ ;;
+ *) break
+ ;;
+ esac
+ done
+ case $source:$binary in
+ :) source=1 binary=1
+ ;;
+ :1) case $types in
+ '') types=$HOSTTYPE ;;
+ esac
+ ;;
+ esac
+ case $url in
+ '') case $urlfile in
+ $default_url)
+ if test ! -s $urlfile
+ then echo $command: url argument expected >&2; exit 1
+ fi
+ ;;
+ *) default_url=
+ ;;
+ esac
+ url=
+ if grep '^url=' $urlfile >/dev/null
+ then a=$authorize
+ p=$password
+ case $urlfile in
+ */*) ;;
+ *) urlfile=./$urlfile ;;
+ esac
+ . $urlfile
+ case $a:$p in
+ $authorize:$password)
+ default_url=
+ ;;
+ *) case $a in
+ ?*) authorize=$a ;;
+ esac
+ case $p in
+ ?*) password=$p ;;
+ esac
+ ;;
+ esac
+ else url=`cat $urlfile`
+ fi
+ ;;
+ esac
+ case $exec in
+ ?*) default_url= ;;
+ esac
+
+ # get the update list
+
+ eval `echo $url | sed 's,\(.*\)://\([^/]*\)/\(.*\),prot=\"\1\" host=\"\2\" dir=\"\3\",'`
+ get $host $dir/$op.html
+
+ # get/check the package names
+
+ case " $* " in
+ *" - "*)case $source in
+ 1) source_packages=$* ;;
+ *) source_packages= ;;
+ esac
+ case $binary in
+ 1) binary_packages=$* ;;
+ *) binary_packages= ;;
+ esac
+ package_hit=$*
+ ;;
+ " ") nl="
+"
+ case $source in
+ 1) p=
+ for f in `ls *.????-??-??.* 2>/dev/null`
+ do case $f in
+ *.????-??-??.????-??-??.*.*)
+ ;;
+ *.????-??-??.????-??-??.*)
+ p=$p$nl$f
+ ;;
+ *.????-??-??.*.*)
+ ;;
+ *.????-??-??.*)
+ p=$p$nl$f
+ ;;
+ esac
+ done
+ set '' `echo "$p" | sed 's,\..*,,' | sort -u`
+ shift
+ source_packages=$*
+ ;;
+ *) source_packages=
+ ;;
+ esac
+ case $binary in
+ 1) p=
+ for f in `ls *.????-??-??.* 2>/dev/null`
+ do case $f in
+ *.????-??-??.????-??-??.*.*)
+ p=$p$nl$f
+ ;;
+ *.????-??-??.????-??-??.*)
+ ;;
+ *.????-??-??.*.*)
+ p=$p$nl$f
+ ;;
+ *.????-??-??.*)
+ ;;
+ esac
+ done
+ set '' `echo "$p" | sed 's,\..*,,' | sort -u`
+ shift
+ binary_packages=$*
+ ;;
+ *) binary_packages=
+ ;;
+ esac
+ package_hit="$source_packages $binary_packages"
+ ;;
+ *) case $source in
+ 1) source_packages=$* ;;
+ *) source_packages= ;;
+ esac
+ case $binary in
+ 1) binary_packages=$* ;;
+ *) binary_packages= ;;
+ esac
+ package_hit=
+ ;;
+ esac
+
+ # get the latest updates
+
+ types_test=
+ types_local=
+ dir=$dir/$tgz
+ case $default_url in
+ ?*) echo "url='$url' authorize='$authorize' password='$password'" > $default_url
+ case $authorize in
+ ?*) chmod go-rwx $default_url ;;
+ esac
+ ;;
+ esac
+ echo "$got" > got.tmp
+ case $only in
+ 0) exec < got.tmp
+ covered=
+ while read name suffix type base base_size delta delta_size sync sync_size requires covers base_sum delta_sum sync_sum comment
+ do case $requires in
+ ''|-*) continue ;;
+ esac
+ IFS=:
+ set '' $requires
+ IFS=$ifs
+ case $type in
+ -) case " $source_packages " in
+ *" $name "*|*" - "*)
+ for name
+ do case " $source_packages " in
+ *" $name "*)
+ ;;
+ *) source_packages="$source_packages $name"
+ covered=$covered:$covers
+ ;;
+ esac
+ done
+ ;;
+ esac
+ ;;
+ *) case " $binary_packages " in
+ *" $name "*|*" - "*)
+ for name
+ do case " $binary_packages " in
+ *" $name "*)
+ ;;
+ *) binary_packages="$binary_packages $name"
+ covered=$covered:$covers
+ ;;
+ esac
+ done
+ ;;
+ esac
+ ;;
+ esac
+ done
+ case $covered in
+ ?*) x=$source_packages
+ source_packages=
+ for name in $x
+ do case :$covered: in
+ *:$name:*) ;;
+ *) source_packages="$source_packages $name" ;;
+ esac
+ done
+ x=$binary_packages
+ binary_packages=
+ for name in $x
+ do case :$covered: in
+ *:$name:*) ;;
+ *) binary_packages="$binary_packages $name" ;;
+ esac
+ done
+ ;;
+ esac
+ ;;
+ esac
+ checksum=
+ for i in $checksum_commands
+ do case `( $i ) < /dev/null 2> /dev/null` in
+ ${checksum_empty}|${checksum_empty}[\ \ ]*)
+ checksum=$i
+ break
+ ;;
+ esac
+ done
+ case $checksum in
+ '') echo $command: warning: '{' $checksum_commands '}' command not found -- only download sizes will be checked >&2 ;;
+ esac
+ exec < got.tmp
+ while read name suffix type base base_size delta delta_size sync sync_size requires covers base_sum delta_sum sync_sum comment
+ do case $verbose in
+ 1) case $type in
+ -) i= ;;
+ *) i=.$type ;;
+ esac
+ j="$name.$base$i.$suffix"
+ case $delta in
+ -) j="$j -" ;;
+ *) j="$j $name.$base.$delta$i.$suffix" ;;
+ esac
+ case $sync in
+ -) j="$j -" ;;
+ *) j="$j $name.$base.$sync$i.$suffix" ;;
+ esac
+ echo $command: $j $base_size:$base_sum $delta_size:$delta_sum $sync_size:$sync_sum $requires >&2
+ esac
+ case " $package_hit " in
+ *" $name "*|*" - "*)
+ ;;
+ *) package_hit="$package_hit $name"
+ ;;
+ esac
+ case $type in
+ -) case " $source_packages " in
+ *" $name "*|*" - "*)
+ if test -s $name.tim
+ then continue
+ fi
+ lcl=$name.$base.$suffix
+ if test -f $lcl
+ then case $checksum:$base_sum in
+ :*|*:-) size=`wc -c < $lcl | sed 's, ,,g'` sum=$base_sum ;;
+ *) size=$base_size sum=`$checksum < $lcl | sed -e 's,^[ ][ ]*,,' -e 's,[ ].*,,'` ;;
+ esac
+ else size=X sum=X
+ fi
+ if test "0" != "$force" -a "X-" = "X$delta" -o "$base_size" != "$size" -o "$base_sum" != "$sum"
+ then rmt=
+ case $sync:$sync_size in
+ -*|*[-:])
+ ;;
+ *) lcl=$name.$base.$sync.$suffix
+ if test -f $lcl
+ then rmt=1
+ get $host $dir $lcl $sync_size $sync_sum
+ fi
+ ;;
+ esac
+ case $base:$base_size in
+ -*|*[-:])
+ ;;
+ *) case $rmt in
+ '') lcl=$name.$base.$suffix
+ get $host $dir $lcl $base_size $base_sum
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ case $delta:$delta_size in
+ -*|*[-:])
+ ;;
+ *) lcl=$name.$delta.$base.$suffix
+ if test -f $lcl
+ then case $checksum:$delta_sum in
+ :*|*:-) size=`wc -c < $lcl | sed 's, ,,g'` sum=$delta_sum ;;
+ *) size=$base_size sum=`$checksum < $lcl | sed -e 's,^[ ][ ]*,,' -e 's,[ ].*,,'` ;;
+ esac
+ else size=X sum=X
+ fi
+ if test "0" != "$force" -o "$delta_size" != "$size" -o "$delta_sum" != "$sum"
+ then get $host $dir $lcl $delta_size $delta_sum
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *) case " $binary_packages " in
+ *" $name "*|*" - "*)
+ if test -s $name.$type.tim
+ then continue
+ fi
+ case " $types " in
+ *" - "*);;
+ " ") case " $types_test " in
+ *" $type "*)
+ ;;
+ *) types_test="$types_test $type"
+ for i in *.????-??-??.$type.* *.????-??-??.????-??-??.$type.*
+ do if test -f $i
+ then types_local="$types_local $type"
+ fi
+ break
+ done
+ ;;
+ esac
+ case " $types_local " in
+ *" $type "*)
+ ;;
+ *) continue
+ ;;
+ esac
+ ;;
+ *) case " $types " in
+ *" $type "*)
+ ;;
+ *) continue
+ ;;
+ esac
+ ;;
+ esac
+ lcl=$name.$base.$type.$suffix
+ if test -f $lcl
+ then case $checksum:$base_sum in
+ :*|*:-) size=`wc -c < $lcl | sed 's, ,,g'` sum=$base_sum ;;
+ *) size=$base_size sum=`$checksum < $lcl | sed -e 's,^[ ][ ]*,,' -e 's,[ ].*,,'` ;;
+ esac
+ else size=X sum=X
+ fi
+ if test "0" != "$force" -a "X-" = "X$delta" -o "$base_size" != "$size" -o "$base_sum" != "$sum"
+ then rmt=
+ case $sync:$sync_size in
+ -*|*[-:])
+ ;;
+ *) lcl=$name.$base.$sync.$type.$suffix
+ if test -f $lcl
+ then rmt=1
+ get $host $dir $lcl $sync_size $sync_sum
+ fi
+ ;;
+ esac
+ case $base:$base_size in
+ -*|*[-:])
+ ;;
+ *) case $rmt in
+ '') lcl=$name.$base.$type.$suffix
+ get $host $dir $lcl $base_size $base_sum
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ case $delta:$delta_size in
+ -*|*[-:])
+ ;;
+ *) lcl=$name.$delta.$base.$type.$suffix
+ if test -f $lcl
+ then sum=`$checksum < $lcl | sed -e 's,^[ ][ ]*,,' -e 's,[ ].*,,'`
+ else sum=X
+ fi
+ if test -f $lcl
+ then case $checksum:$delta_sum in
+ :*|*:-) size=`wc -c < $lcl | sed 's, ,,g'` sum=$delta_sum ;;
+ *) size=$base_size sum=`$checksum < $lcl | sed -e 's,^[ ][ ]*,,' -e 's,[ ].*,,'` ;;
+ esac
+ else size=X sum=X
+ fi
+ if test "0" != "$force" -o "$delta_size" != "$size" -o "$delta_sum" != "$sum"
+ then get $host $dir $lcl $delta_size $delta_sum
+ fi
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+ done
+ closure=
+ for name in $source_packages $binary_packages
+ do case $name in
+ -) ;;
+ *) case " $package_hit " in
+ *" $name "*)
+ case $setup in
+ 1) case " $closure " in
+ *" $name "*)
+ ;;
+ *) closure="$closure $name"
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *) echo $command: $name: unknown package >&2
+ ;;
+ esac
+ ;;
+ esac
+ done
+ exec <&-
+ rm -f got.tmp
+ case $closure in
+ ?*) echo $closure ;;
+ esac
+ ;;
+
+use) # finalize the environment
+
+ x=:..
+ for d in `( cd $PACKAGEROOT; ls src/*/Makefile src/*/Nmakefile 2>/dev/null | sed 's,/[^/]*$,,' | sort -u )`
+ do x=$x:$INSTALLROOT/$d
+ done
+ x=$x:$INSTALLROOT
+ case $CDPATH: in
+ $x:*) ;;
+ *) CDPATH=$x:$CDPATH
+ $show CDPATH=$CDPATH
+ $show export CDPATH
+ export CDPATH
+ ;;
+ esac
+ P=$PACKAGEROOT
+ $show P=$P
+ $show export P
+ export P
+ A=$INSTALLROOT
+ $show A=$A
+ $show export A
+ export A
+ case $NPROC in
+ '') hostinfo cpu
+ case $_hostinfo_ in
+ 0|1) ;;
+ *) NPROC=$_hostinfo_
+ $show NPROC=$NPROC
+ $show export NPROC
+ export NPROC
+ ;;
+ esac
+ ;;
+ esac
+ eval PACKAGE_USE=$package_use
+ export PACKAGE_USE
+
+ # run the command
+
+ case $run in
+ '') case $show in
+ ':') $exec exec $SHELL ;;
+ esac
+ ;;
+ *) $exec exec $SHELL -c "$run"
+ ;;
+ esac
+ ;;
+
+verify) cd $PACKAGEROOT
+ requirements binary $package
+ if executable ! $SUM
+ then echo "$command: $action: $SUM command required" >&2
+ exit 1
+ fi
+ case $target in
+ '') cd arch
+ set '' *
+ shift
+ target=$*
+ cd ..
+ ;;
+ esac
+ code=0
+ for a in $target
+ do case $package in
+ '') set '' arch/$a/lib/package/gen/*.sum
+ shift
+ if test -f $1
+ then for i
+ do package_verify $i || code=1
+ done
+ else echo "$command: warning: $a: no binary packages" >&2
+ fi
+ ;;
+ *) for i in $package
+ do if test -f arch/$a/lib/package/gen/$i.sum
+ then package_verify arch/$a/lib/package/gen/$i.sum || code=1
+ else echo "$command: warning: $a: no binary package for $i" >&2
+ fi
+ done
+ ;;
+ esac
+ done
+ exit $code
+ ;;
+
+write) set '' $target
+ shift
+ action=
+ list=
+ qualifier=
+ while :
+ do case $1 in
+ base|closure|delta|exp|lcl|pkg|rpm|tgz)
+ qualifier="$qualifier $1"
+ ;;
+ binary) action=$1
+ type=$HOSTTYPE
+ eval list=$PACKAGESRC/tgz/$admin_list
+ ;;
+ cyg) qualifier="$qualifier $1"
+ assign="$assign closure=1"
+ only=1
+ ;;
+ runtime|source)
+ action=$1
+ ;;
+ tst) qualifier="$qualifier tgz"
+ assign="$assign copyright=0 'PACKAGEDIR=\$(PACKAGESRC)/tst'"
+ ;;
+ nocopyright)
+ assign="$assign copyright=0"
+ ;;
+ *) break
+ ;;
+ esac
+ shift
+ done
+ case $action in
+ '') echo "$command: binary or source operand expected" >&2
+ exit 1
+ ;;
+ esac
+ set '' "$@" $package
+ shift
+ case $only in
+ 0) set '' `order "$@"`
+ shift
+ ;;
+ esac
+ case $# in
+ 0) echo "$command: at least one package name expected" >&2
+ exit 1
+ ;;
+ esac
+ if nonmake $MAKE
+ then echo "$command: must have $MAKE to generate archives" >&2
+ exit 1
+ fi
+
+ # all work under $PACKAGEBIN
+
+ $make cd $PACKAGEBIN
+ case $list in
+ ?*) $exec rm -f $list ;;
+ esac
+
+ # go for it
+
+ for package
+ do if view - all $package.pkg || view - all lib/package/$package.pkg
+ then eval capture \$MAKE \$makeflags -X ignore \$noexec -f \$package.pkg \$qualifier \$action $assign
+ else echo "$command: $package: not a package" >&2
+ fi
+ done
+ ;;
+
+TEST) set '' $target $package
+ shift
+ case $1 in
+ binary|source)
+ action=$1
+ shift
+ ;;
+ esac
+ order "$@"
+ ;;
+
+*) echo "$command: $action: internal error" >&2
+ exit 1
+ ;;
+
+esac