[comp.sources.unix] v19i044: A software configuration management system, Part31/33

rsalz@uunet.uu.net (Rich Salz) (06/08/89)

Submitted-by: Axel Mahler <unido!coma!axel>
Posting-number: Volume 19, Issue 44
Archive-name: shape/part31



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 31 (of 33)."
# Contents:  papers/boston.ms
# Wrapped by rsalz@papaya.bbn.com on Thu Jun  1 19:27:20 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'papers/boston.ms' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'papers/boston.ms'\"
else
echo shar: Extracting \"'papers/boston.ms'\" \(49291 characters\)
sed "s/^X//" >'papers/boston.ms' <<'END_OF_FILE'
X.de Mc
X.nr L1 \\n(LL*10/21
X.if \\n(.$ .nr L1 \\$1n
X.nr NQ \\n(LL/\\n(L1
X.if \\n(NQ<1 .nr NQ 1
X.if \\n(NQ>2 .if (\\n(LL%\\n(L1)=0 .nr NQ -1
X.if !\\n(1T \{\
X.	BG
X.	if n .sp 4
X.	if t .sp 2
X.\}
X.if !\\n(NX .nr NX 1
X.if !\\n(NX=\\n(NQ \{\
X.	RT
X.	if \\n(NX>1 .bp
X.	mk
X.	nr NC 1
X.	po \\n(POu
X.\}
X.if \\n(NQ>1 .hy 12
X.nr NX \\n(NQ
X.nr CW \\n(L1
X.ll \\n(CWu
X.nr FL \\n(CWu*11u/12u
X.if \\n(NX>1 .nr GW (\\n(LL-(\\n(NX*\\n(CW))/(\\n(NX-1)
X.nr RO \\n(CW+\\n(GW
X.ns
X..
X.de C
X.nr PQ \\n(.f
X.if t .ft 9
X.if "\\$1"" .if n .ul 1000
X.if !"\\$1"" .if n .ul 1
X.if t .if !"\\$1"" \&\\$1\f\\n(PQ\\$2
X.if n .if \\n(.$=1 \&\\$1
X.if n .if \\n(.$>1 \&\\$1\c
X.if n .if \\n(.$>1 \&\\$2
X..
X.ND
X.IZ
X.nr PS 11
X.ps \n(PS
X.nr VS 13
X.vs \n(VSp
X.nr LL 7i
X.ll 7i
X.nr HM -0.1i
X.nr PO -0.3i
X.po \n(POu
X.ds [. \f1[
X.ds .] ]\fP
X.ds Rf References
X.mc
X.hw con-fig-u-ra-tion
X.ds CH
X.ds CF
X.ds Un \\s-1\\fHU\\s-2NI\\s+2B\\s-2ASE\\fR\\s+3
X.ds Da \\s-2\\fHDAMOKLES\\fR\\s+2
X.ds sh \\s-1\\fHshape\\fR\\s+1
X.sp -0.5i
X.ps 16
X.vs 18
X.nf
X.ce 3
XAn Integrated Toolset for Engineering Software Configurations\(dd
X.fi
X.FS
X\(dd in \fIProceedings of the ACM SIGSOFT/SIGPLAN Software Engineering
XSymposium on Practical Software Development Environments\fR
X.br
XBoston MA, 28-30 November 1988
X.br
XACM SIGSOFT SE Notes Vol.13-No.5 / ACM SIGPLAN Notices Vol.24-No.2, pp. 191-200
X.FE
X.vs \n(VSp
X.ps \n(PS
X.sp 0.3i
X\fIAxel Mahler\fR and \fIAndreas Lampen\fR
X.br
XTechnische Universit\*:at Berlin, West-Germany
X.sp 25p
X.Mc
X.LP
X\fBAbstract\fR
X.nr PS 10
X.ps \n(PS
X.nr VS 12
X.vs \n(VSp
X.PP
XConfiguration management in toolkit oriented software development
Xenvironments (SDE), such as the
X.UX
Xsystem, is a long standing nuisance. Mostly, one has to
Xface the choice between poorly or not at all integrated, independent
Xtools, or highly integrated, most specialized, and often language
Xdependent environments. The first choice offers very limited support
Xfor a complex task that needs a broad informational basis. The second
Xchoice often takes away the programmers' most cherished tools, forces
Xhim to adopt some different work discipline, and thereby eventually
Xrestricts his creativity. The toolset described in this paper integrates
Xa dedicated version control system and \*(sh, a significantly enhanced
XMake [Feld79a] 
Xprogram, on the basis of a common object model. This object model 
Xcomprises multiple versions of software objects as well as conventional
Xfile system objects. Taking this approach made it possible to have
Xa sufficiently integrated toolsystem for engineering software configurations
Xwhile retaining the flexibility of the basic toolbox philosophy, permitting
Xthe use of 'off-the-shelf' tools, e.g. editors or compilers.
X.ps 12
X.nr PS 11
X.ps \n(PS
X.nr VS 13
X.vs \n(VSp
X.NH 1 
XIntroduction
X.PP
XConfiguration management is a management technique, designed
Xto control very large development and maintenance projects.
XAs military and government institutions played a principal role 
Xin the establishment of configuration management, the related
Xterminology is precisely defined in an ANSI standard [IEEE83a].
XAn in-depth discussion of the underlying concepts can be found in [Bers80a].
X.PP
XTriggered off by the surge of interest in programming environments (PE)
Xduring the last few years, the term \fIsoftware configuration
Xmanagement\fR (SCM) made its way from the management domain
Xtowards
Xthe software engineering and development domain. Today, there are a
Xnumber of PEs with built-in SCM support (e.g. DSEE, Adele,
XISTAR [Lebl84a,\|Estu86a,\|Dows86a]).
XHowever, it is not clear whether SCM is more of a development or
Xmanagement task.  In particular, we suspect that strongly
Xmanagement-oriented approaches to SCM are likely to produce red tape,
Xtending to stand in the (programmer's) way, and consequently
Xdiscourage their systematic application.  On the other hand, strongly
Xde\%vel\%op\%ment-o\%ri\%en\%ted SCM tools often perform a brilliant job in
Xsupporting the programmer, but produce little or no usable information
Xfor project management. To avoid confusion of management-oriented
Xand development-oriented interpretation of SCM, we'd rather prefer
Xthe term \fIsoftware configuration engineering\fR (SCE) to emphasize
Xthe more technical aspects as version control, configuration identification,
Xand system building.
X.PP
XOur toolsystem for engineering of software configurations 
Xconsists of
Xan \fIobject base\fR for attributed software objects,
Xa dedicated \fIversion control system\fR, and \*(sh, a significantly
Xenhanced Make program.  Enhancements include full access to the
Xobject base, and support of \fIconfiguration rules\fR which
Xcontrol the selection process for component objects during
Xidentification, build or rebuild of system configurations. 
X.PP
XSince integration of version control was a major objective for our
Xsystem, we had to face the need for an object identification scheme
Xthat goes beyond the usual way of specifying just name and type.
XAs a consequence, we began to design an object base for attributed
Xsoftware objects [Lamp88a] 
Xthat allows to attach any number of attributes to software objects,
Xand introduces a much more generalized scheme
Xfor object identification.  The object base's name, \fIattributed 
Xfilesystem\fR (AFS), mirrors the basic idea, to enhance the regular
X.UX
Xfilesystem by supporting more fileattributes than
Xjust a name and the information stored in the inode.
XThe AFS comprises concepts for
Xversion control, support of variants or status models for example. Furthermore,
Xit helps to abstract from the particular underlying data storage
Xsystem. For the AFS application writer it makes no difference whether it is an
Xordinary filesystem or a dedicated database system like e.g. \*(Da [Ditt86a].
X.NH 2
XRelated Systems
X.PP
XAt first glance, the user-level appearance of the \*(sh toolkit resembles
Xa combination of Make and a version control system such as
XSCCS [Roch75a]
Xor RCS [Tich85a].
XOver the last years some unsatisfying attempts have been made to integrate 
XMake with source code control systems [Nick83a,\|AUGM83a].
XThe CMS/MMS tool \*([.DECC84a,\|DECM84a\*(.]
Xunder VAX/VMS
Xcorresponds to \fIAugmented Make\fR and SCCS. CMS and SCCS not only 
Xprovide a user command interface, but also give application programs
Xdirect access to the version control facilities through a procedural
Xinterface. However, despite availability of these interfaces, 
Xneither Make nor MMS are build on top of them and more complex
Xconfiguration management applications find a hard limit in this lack
Xof integration.
X\*(sh's AFS interface can be seen as an extended and more generalized interface
Xto the version control system. \*(sh and the related version control
Xcommands are entirely build on top of this interface.
X.PP
XBesides these toolbox oriented systems, there are some highly 
Xspecialized configuration management tools that are usually part of 
Xa software engineering environment.
XBecause they are part of an overall tool concept that also includes
Xprogramming languages, the functionality of these tools is often 
Xmore comprehensive in terms of consistency enforcement. Cedar's
XSystem Modeller [Lamp83a]
Xand the Gandalf version control facility [Habe82a]
Xfall into this category.
XAn interesting approach to the determination of system configurations
Xbased on sets of software objects and functions to model the relations
Xbetween them is presented in Jasmine [Marz86a].
X.PP
XCommon to all of the systems mentioned above is that a system description 
Xdocument (\fIsystem model\fR) is employed to define components and
Xoverall architecture of a software system.
XIn contrast to that, the Adele configuration manager \fIderives\fR a
Xconfiguration from a system description
Xin terms of \fIdesired characteristics\fR 
Xrather than some sort of component list. The description
Xis evaluated against a \fImodule dependency graph\fR and \fImanuals\fR
X(module descriptions) stored in a database of programs.
XThe Odin System [Clem86a] 
Xin turn uses a (compiled) knowledge base, called \fIderivation graph\fR,
Xdescribing derivative relationships between \fIdocument types\fR,
Xand associated tools to perform necessary derivations 
Xin order to obtain a requested object.
XOdin integrates remarkably well with the standard 
X.UX
Xtool environment
Xand can be used to construct comprehensive special purpose environments
Xfrom existing tools [Wait88a].
X.PP
XFinally, DSEE
Xrepresents to the authors' knowledge the most
Xoutstanding configuration management system so far. It is based on system
Xmodels, describing the version-independent structure of a software
Xsystem and \fIconfiguration threads\fR, describing the version
Xrequirements that must be met by the elements of a configuration to be
Xidentified. DSEE combines configuration management with sophisticated
Xproject support facilities, enabling large programmer teams to cooperate
Xover a (local or wide area) computer network.
X.PP
XIn the design of \*(sh, we tried to adopt a number of the best
Xconcepts mentioned above. Namely Make, Adele and DSEE had a strong
Xinfluence on the design of the \*(sh toolkit.  Despite the integration
Xof the toolkit itself, care has been taken to smoothly fit the SCE
Xsystem into the standard
X.UX
Xenvironment. The entry cost for new
Xusers (in terms of initial learning effort) is very low. The system may be
Xused as just a friendly version control tool, an upward compatible 
Xreplacement for Make, or an intelligent integration of both.
XUtilization of the toolkit can be gradually extended up to a network
Xbased project support environment, employing a number of programmer
Xteams working on large software development and maintenance projects.
X.PP
XThe simple,
X.UX-like
Xnature of the toolkit's basic user interface
Xoffers a broad range of possibilities to create dedicated user
Xinterfaces that provide an integrated, problem oriented view of the
XSCE system.  Currently in the works are an implementation of a
Xspecially tailored SCE shell on the basis of \*(Th [H\*u87a]
X(a graphical user interface system), and an implementation of a SCE-tool for
Xthe \fIX Window System\fR.
X.PP
XThe rest of this paper describes the \*(sh program and AFS, the
Xobject base on top of which \*(sh and the version control commands
Xare built. Also, a number of problems,
Xencountered while trying to introduce general support for the 
Xhandling of \fIvariants\fR, and implementing AFS on top of \*(Da,
Xwill be discussed.
X.NH 1
XThe Shape Toolkit
X.PP
XThe user interface of the SCE toolkit consists of a set of commands for 
Xversion control, project interaction, and the shape program itself.
XThe appearance of the version control commands is not unlike to
XRCS' user interface. There are funtions to save and restore
Xan object version (\fCsave/retrv\fR), to manipulate object histories
Xand attributes of object versions (\fCvadm [ -delete | -setattr | -chmod 
X\fR(etc.) \fC]\fR), as well as a funtion to obtain information about 
Xthe contents of the object base (\fCvl\fR, gives a \fCls(1)\fR-like 
Xview of the object base).
X.PP
XThe toolkit supports a basic project organization scheme that
Xdistinguishes private workspaces for individual developers, and a
Xcentral library that is shared by the project team. The project
Xlibrary is administered by the system integrator. The toolkit provides
Xfunctions for project interaction, controlling concurrent development
X(\fIobject locking\fR), and orderly submission of software objects.
X\fCresrv\fR (developer) attempts to reserve the update privilege for a
Xdocument history, \fCsbmit\fR (developer) submits a work result to be
Xincluded into the next release of a system, \fCaccpt\fR (system
Xintegrator) accepts a submitted document version and gives it an
Xofficial, publically accessible state, and \fCrject\fR (system
Xintegrator) denies a submitted work result the official state and
Xsends a corresponding message to the submitting programmer.
X.PP
XVersion control and project interaction are functionally supported 
Xby a built-in general version status model. The states \fCbusy\fR,
X\fCsaved\fR, \fCproposed\fR, \fCpublished\fR, \fCaccessed\fR, and 
X\fCfrozen\fR are not only intended to say something about the relative
Xquality of a particular object version, but also reflect whether an
Xobject version is in a developer's private experimentation domain, or
Xin the project's official domain, where it is visible and accessible
Xto the entirety of a project team. A more detailed description of the
Xversion control system can be found in [Mahl88a].
X.PP
XThe first implementation of \*(sh resembles Make.  As
Xin Make, the configuration process is controlled by a system
Xdescription document.
XUnlike Make, however, \*(sh operates on objects in an object base
Xrather than
X.UX
Xfilesystem objects.
XWhen building a certain configuration,
X\*(sh searches the object base for appropriate
Xversions of a system's component objects, installs them temporarily
Xas
X.UX
Xfilesystem objects (regular files), eventually invokes some of
X.UX's
Xstandard tools on them, and stores the resulting \fIderived objects\fR
Xin the object base.
XAccordingly, the most significant improvement with respect to Make is
Xthe introduction
Xof \fIselection rules\fR into the
Xdescription document, the \fIShapefile\fR. Selection rules control the 
Xselection process for component versions during identification, build or
Xrebuild of system configurations. 
X.KS
X.LP
XThe system description document used by \*(sh consists 
Xof four basic components:
X.in +0.2i
X.IP \(bu 0.2i
Xsystem description
X.IP \(bu
Xselection rules
X.IP \(bu
Xtransformation rules, and
X.IP \(bu
Xvariant definitions.
X.in -0.2i
X.KE
X.LP
XWhile the syntax for the
Xsystem description part is the same as for Makefiles,
Xthe remaining \*(sh-file sections have a slightly different 
Xsyntax from Makefiles and must be preceded and ended by
Xspecial comment sequences (\fC\s-1#%\ RULE-SECTION, #%\ VARIANT-SECTION, 
X#%\ END-RULE-SECTION\s+1\fR a.s.o.).
X.NH 2
XSelection of Component Objects
X.PP
XConfiguration selection rules are used to \fIbind concrete object
Xinstances\fR in the object base to \fIcomponent names\fR applied
Xin the Shapefile at build time.  A selection rule is a
Xnamed sequence of \fIalternatives\fR, separated by semicolons,
Xconstituting a logical OR expression. Each alternative consists of a
Xsequence of \fIpredicates\fR, separated by commas, constituting a
Xlogical AND expression.  A selection rule \fIsucceeds\fR if one of its
Xalternatives succeeds (i.e. leads to the unique identification of some
Xobject instance).
X.PP
XA selection rule that \- when activated \- would cause the configuration
Xof an experimental system (\fI\(lqselect the newest version of all components
Xthat I am working on; select the newest published version of all other 
Xcomponents\(rq\fR) might look like:
X.LP
X.nf
X\fC\s-1exprule:
X	*.c, attr (author, andy), 
X	   attr (state, busy);
X	*.c, attrge (state, published), 
X	   attrmax (version).\s+1\fR
X.fi
X.PP
XAnother example illustrates how known versions of particular modules
Xcould be configured into otherwise experimental systems:
X.LP
X.nf
X\fC\s-1special_rule:
X	afs_def.h, attr (version, 8.22);
X	afs_hparse.c, attr (version, 8.17);
X	*.c, attr (author, andy), 
X	   attr (state, busy);
X	*.c, attrge (state, published), 
X	   attrmax (version).\s+1\fR
X.fi
X.PP
XIn alternatives, the first predicate (e.g. \fC*.c\fR) is usually a
Xpattern against which the name attribute of a sought component
Xis matched.  The patterns used by \*(sh have the same structure as those
Xused by \fCed\fR.
XThe other predicates allow certain requirements to be expressed with respect
Xto the object attributes. \fIAttr\fR and \fIattrge\fR are
Xpredefined predicates that require a specified attribute to be equal
Xor greater-than-or-equal (with respect to a defined or lexical
Xorder) a given value. The similarly predefined predicate \fIattrmax\fR
Xrequires objects to have a maximal value in the specified attribute.
XIn order to uniquely identify exactly one object instance by
Xevaluation of a selection rule, the alternatives must be sufficient to
Xsingle out one element from a possible set. Usually, the last predicate
Xof an alternative guarantees a unique selection. Predicates like
X\fIattrmax (attribute_name), attr (state, busy), \fRor\fI attr
X(version, 4.2)\fR are examples of such selections.
X.PP
XThe basic procedure of \*(sh is similar to Make's: Names \- so-called
X\fItargets\fR \- are produced. \*(sh checks whether the
Xtarget already exists and is \fIcurrent\fR, or tries to produce it
Xfrom its \fIdependents\fR. 
XA target is considered current if neither the source objects nor the
Xderivation context have changed.
XIn order to check whether a given target
Xis current, both the target document itself, and all of its dependents,
Xmust be configured. A name\(dg
X.FS
X\(dg Conceptually, name \fIand type\fR of a document are passed as implicit
Xparameters. In this discussion, \fIname\fR stands for the concatenation
X\fIname.type\fR
X.FE
Xthat has to be configured is passed as implicit parameter to the
Xactive selection rule. During rule evaluation, the name is
Xsequentially matched against the name pattern of the rule
Xalternatives. If a pattern matches a name, the attempt will be made to
Xcomplete the following predicate sequence.
X.PP
XAfter a name match, \*(sh queries the object base for all objects with 
Xthe given name and thereby initializes
Xan internal \fIhit set\fR. The subsequent sequence
Xof predicates will be applied to the set of found AFS objects. An
Xalternative fails if one of the following conditions is true:
X.in +0.2i
X.IP \(bu 0.2i
Xthe pattern does not match
X.IP \(bu
Xa predicate of the alternative fails
X.IP \(bu
Xupon completion of the alternative, the cardinality of the hit set is
Xnot equal to one, i.e. no unique name resolution was possible.
X.in -0.2i
X.LP
XThe application of predicates to the hit set results in the removal of
Xall AFS objects from the hit set that do not conform to the specified
Xrequirements. A predicate's evaluation fails if the cardinality
Xof the hit set becomes equal to zero.
XAfter the target and all of it's dependents have been configured,
Xthe transformation predicate is applied to the target and each of its
Xdependents.
X.PP
XSelection rules can be activated on a per production basis by simply
Xgiving the name of the rule as the first dependent of a production.
XThus, it is possible to define targets for the configuration of e.g.
Xtestsystems and releasable systems within the same \*(sh-file.
X.LP
X.nf
X	\fC\s-1test: exp_rule prog
X	release: rel_rule prog
X	prog: x.o y.o z.o\s+1\fR
X.fi
X.PP
XA selection rule remains active until it is superseded by activation
Xof another selection rule or until the target that caused the activation
Xis produced. If no selection rule is specified, the default rule, which
Xis the same as Make's (\(lq\fIselect the busy object in the current 
Xdirectory\fR\(rq), is active.
X.PP
XAfter having uniquely identified the system's components, they will
Xbe temporarily installed as 
X.UX
Xfilesystem objects, and the necessary
Xtransformation actions can be performed.
X.PP
XThe search space for retrieve operations is defined by
Xthe \fIcurrent project\fR which is an explicitly selected work context.
XIf \*(sh cannot find a document in the local search space,
Xit tries to connect to a \fIproject server\fR, whose address is
Xdefined by the current project. The project server might reside locally
Xor somewhere in the network. It provides controlled access to the
Xproject's database. Thus, if a particular document could not be tracked
Xdown locally, it might still be somewhere in the project library.
X.NH 2
XTransformation Rules
X.PP
X\*(sh's transformation rules describe, which kind of \fIsource object\fR
Xis transformed into which kind of \fIderived object\fR, how this
Xtransformation is performed, and which parameters are significant
Xfor that transformation.
XTransformation rules consist of a \fItransformation specification\fR,
Xand a \fItransformation script\fR. Transformation specifications
Xdescribe prerequisites and resulting objects of a transformation. The
Xtransformation script is a template for a shell script that
Xwill be passed to a shell process upon activation of a transformation.
XThe syntax for these rules is an extension of Make's default rule
Xspecification formalism. \*(sh's rule by which the transformation
Xof a C source object into a '\fC\&.\&o\fR' (speak: dot-o) derived object
Xis defined looks like:
X.LP
X.nf
X.C
X\s-1%.o: %.c : +(CC) +(CFLAGS)
X	$(CC) -c $(CFLAGS) %.c\s+1
X.R
X.fi
X.LP
XA request to produce a derived object \- let's say \fCxyzzy.o\fR \- would,
Xby evaluating the transformation rule, result in the compilation
Xof \fCxyzzy.c\fR with the compiler defined by 
Xthe macro \fCCC\fR, with compile switches defined by \fCCFLAGS\fR.
XThe percent sign is consistently substituted by the name \(lqxyzzy\(rq
Xthroughout the transformation rule. The notation \fI$(NAME)\fR substitutes
Xthe value of the macro \fINAME\fR, while \fI+(NAME)\fR substitutes the
Xentire macro definition (i.e. \fINAME=value\fR).
X.PP
XWhen a transformation rule is evaluated, the name of the source object
Xis passed to the current selection rule and thereby bound to a
Xconcrete source object version in the object base. After the
Xtransformation script has been executed (successfully), \*(sh assumes
Xthat the specified derived object has been produced, and stores the
Xfilesystem object that represents the derived object (in the example
Xabove \fCxyzzy.o\fR) in a special area in the object base, called the
X\fIbinary pool\fR. When put into the binary pool, an attribute
Xdescribing the transformation that just took place, is attached to the
Xderived object. This \fIderivation attribute\fR contains the
Xidentification of all source objects, as well as the definitions of
Xthe specified macros that were used in the transformation script.
X.PP
XIn Make, triggering of transformations is controlled by the built-in
Xpredicate \fIis_newer (target, source)\fR. This predicate fails to
Xproduce a target, if a source object is left unchanged, but something in the
Xproduction environment changed. A common example of this case in
X.UX 
Xis the compilation of the same C source file with different precompiler
Xswitches. On the other hand, transformations can be omitted, if the source
Xwas a saved version and the derived object is still existent in the
Xbinary pool. When requested to produce a target, \*(sh configures
Xthe source objects (by evaluating the selection rule), constructs the
Xderivation attribute that \fIwould be\fR assigned to the derived object, and
Xchecks if a derived object
Xthat already has such an attribute is readily available from the binary 
Xpool. In this case no compilation would be necessary. If something in
Xthe source context or the transformation context has changed (e.g.
Xthe compile switches in \fCCFLAGS\fR), a new derived object instance 
Xwould be created.
X.NH 2
XVariant Support
X.PP
XThere is a common understanding of variants as \fIalternative\fR realizations
Xof the same concept. The typical example
Xfor the genesis of variants is porting of software products to 
Xdifferent architectures. The idea of variants sounds quite simple, but
Xto actually handle them can be an extremely difficult task.
X.PP
XVariant documents can be represented by a single source document that has
Xto be \fIpreprocessed\fR in order to access a particular variant.
XVariant documents can also be \fIphysically separated\fR, i.e. each variant
Xis a document of its own. Variants of this kind may have different
Xnames, or the same name but in different name spaces (e.g. directories).
XVariants can be identified by supplying a set of options to the preprocessor
Xor appropriate names or pathnames. Both techniques have their particular
Xadvantages and disadvantages. In the case of preprocessed variants,
Xone has to write source documents that contain lots of precompiler-
Xor macroprocessor-related code. When things grow complex, it is easy 
Xto make mistakes. Besides, source documents of this kind are hard to read
Xand understand. Consequently, they are less maintainable.
XAlso, the specification of a planned configuration may require a lot
Xof error-prone work. 
X.PP
XThe other case, the physically separate administration of variants, is 
Xexpensive in terms of disk space and organizational overhead.
XMoreover, it is extremely problematic when changes (e.g. bug-fixes,
Xfeature enhancements) are made in sections that are common to all
Xvariants. One has to face the choice of 
X.in +0.2i
X.IP \(bu 0.2i
Xdoing the work all over again
Xfor all variants, 
X.IP \(bu
Xtrying to \fImerge\fR changes that have been made in
Xone variant (semi-) automatically into the others, or 
X.IP \(bu
Xchanging only one 
Xvariant (the best selling) and abandoning the others.
X.in -0.2i
X.PP
XThe real problem is even more complex. We suspect that it is still an
Xunsolved problem of software engineering to produce \fIportable
Xsoftware designs\fR in the sense of predicting and planning the possibility
Xthat certain modules of a system sprout variant branches.  It is still
Xa fact that variants \fIhappen\fR. In order to port a system to some
Xnew architecture (that might not have even existed at the time of the
Xsystem's design), almost any module might be struck by the necessity
Xof minor or major adjustments. As a consequence, both techniques of
Xvariant administration may happen to be mixed. Also variants of
Xvariants (sub- or multivariants) may come into existence.  A complex
Xsystem often has lots of variant options that are completely
Xindependent (e.g. a compiler that produces French diagnostics and VAX
Xcode for a
X.UX
XSystem V environment). Variant properties of different modules
Xmight also be dependent or contradictory (e.g. certain memory
Xmanagement algorithms may rely on virtual memory, which a specified
Xtarget architecture lacks).  Furthermore, it is easily possible that
Xthe overall structure of a software system becomes variant.  All this
Xcomes to a climax at a point where module variation is a mere
Xsymptom of metamorphosis, in which a system variant evolves into a
Xcompletely different product. The question arises, how long variants
Xshould be treated as such, and when they start a life of their own.
X.PP
XWe don't claim
Xthat \*(sh offers a \(lqquick fix\(rq for the variant problem.  For
Xtools like \*(sh, only flexibility, rather than conceptual or
Xmethodological corsets can be an answer.
X\*(sh offers a simple but flexible mechanism for the
Xhandling of variants that supports both elementary administration
Xconcepts and their combination. For the realization in a
X.UX
Xfilesystem environment, \*(sh allows \fIvariant names\fR to be defined
Xand to be associated with variant-flags, that may be passed to the
Xtransforming tool, and a variant-path, that extends the search space
Xby directories, which could host an object variant. The following
Xexample illustrates the use of variant definitions:
X.LP
X.nf
X\fC\s-1#% VARIANT-SECTION
Xvclass system ::= (vaxbsd, munix)
Xvclass database ::= (damokles, unixfs)
Xvaxbsd: 
X	vflags="-DUNIX -DBSD43 -DSTDCC \e
X	   -DVAX -DPSDEBUG" 
X	vpath="sys/vaxbsd"
Xunixfs:
X	vflags="-DFS"
X	vpath="data/unixfs"
X.sp 2p
X	(\ .\ .\ .\ )
X.sp 2p
X#% END-VARIANT-SECTION\s+1\fR
X.fi
X.PP
XVariant names, as defined in the variant section, can be applied in
Xselection rules through the predefined (pseudo-)predicate \fIattrvar\fR.
XThey provide a unified concept for the administration of variants within
Xthe version control system, with preprocessor technique, and with
Xphysical separation. Configuration selection rules making use of
Xthe variant attribute might look like:
X.LP
X.nf
X\fC\s-1fsexp:
X  *.[ch], attrvar (vaxbsd), \e
X    attrvar (unixfs), attr (state, busy).
X.fi
X.LP
X\*(sh uses the special macros \fIvflags\fR and \fIvpath\fR to hold 
Xpreprocessor options and extensions to the default document search 
Xpath. 
XLocations specified by \fIvpath\fR are searched for 
Xdocuments prior to the default location. If a document with the specified
Xattributes is found in a \fIvpath-\fRdirectory, the default directory
Xwill \fInot\fR be searched.
X.PP
XInitially, both macros have an empty value. When variants are selected
Xin an alternative of a selection rule, the associated macro values are 
X\fIadded\fR to \fIvflags\fR and \fIvpath\fR. In our example, during 
Xevaluation of rule \fCfsexp\fR,
X\fIvflags\fR would become:
X.sp 5p
X.nf
X\fC\s-1vflags="-DUNIX -DBSD43 -DSTDCC \e
X	-DVAX -DPSDEBUG -DFS"\s+1\fR
X.fi
X.sp 5p
Xand \fIvpath\fR  would be:
X.sp 5p
X.nf
X\fC\s-1vpath="sys/vaxbsd:data/unixfs"\s+1\fR.
X.fi
X.sp 5p
XUpon completion of each alternative both macros are reset.
X.PP
XThe construct \fIvclass system ::= (vaxbsd, munix)\fR defines a
X\fIvariant class\fR. Variant classes define mutually exclusive variant
Xnames. Variant classes can usually be given meaningful names, because
Xthey mostly correspond to certain properties, in which the particular
Xvariants vary. A variant class \fIcputype\fR for instance, with
Xelement names \fIIBM4381, VAX630, VAX7XX, m68k\fR a.s.o. might be
Xdefined in order to prevent the selection of different cpu-specific
Xmodules with mismatching cpu attributes. \*(sh will complain if such a
Xcondition is detected.  So far, this is the only concept in \*(sh for ensuring
Xsemantic consistency across variant system components.
XIn this area, more work needs to be done. For a more thorough discussion
Xof this matter, we refer to [Perr87a].
X.NH 2
XConfiguration Identification and Reproducibility
X.PP
X\*(sh can, for the purpose of configuration identification, be asked
Xto produce a \fIconfiguration identification document\fR (CID) for a
Xconfiguration. CIDs have the form of a Shapefile that is \fIcompletely
Xbound\fR. All components of the configuration are precisely identified
Xby their version number, and eventually variant identification. The
XCID also contains all necessary macro definitions.  It is a good idea
Xto place the tools that are used to create system configurations
Xunder version control as well. If this has been done, the tool
Xversions are also included in the CID.  Another important information
Xrecorded in the CID is the \fIproject domain\fR. It defines the name of
Xthe project from which a configuration originates, and the next-higher
Xdomain in which the projectname can be resolved (e.g.  a network\-,
Xhost\-, or pathname). This is necessary in order to define the object
Xbase against which a possible rebuild of the configuration shall be
Xdone.
X.PP
XRecording of system configurations in CIDs is the prerequisite
Xfor proper rebuilds of a complex system. The ability to rebuild 
Xa released configuration is in turn the prerequisite for proper
Xproduct maintenance.
XThe fact that \*(sh CIDs are themselves Shapefiles makes it very
Xeasy to reproduce a recorded configuration, provided the original object 
Xbase is available and intact.
X.PP
XHowever, complete reproducibility of system releases is a goal that is hard
Xto achieve. To rebuild old configurations as identically as possible
Xnot only requires keeping all document versions that have ever been
Xpart of a release, but also a straight history of all tools (e.g. compilers)
Xthat have ever been used to produce releases. The cost for this might be
Xconsiderable administrative overhead, because every project
Xneeds a current \fItool registry\fR, where all production tools 
Xare logged. The gain on the other hand is increased security for the
Xmaintenance phase of long lived software products. The \*(sh toolkit
Xwill offer support for tool registries but not require to keep them.
X.NH 1
XThe Object Base
X.PP
XMost conventional filesystems, such as those of the
X.UX
Xflavor, solely use a file's
X(path-) name to establish access to its
Xcontents. 
XThey usually offer no provision for the maintenance of object
Xhistories. Version control systems like SCCS or RCS
Xhad to be introduced as auxiliary tools to avoid the problem of
Xconflicting filenames and to store versions in an efficient manner.
XHistories of related objects are typically maintained completely
Xindependently, so there is no obvious way to figure out which versions
Xof which objects were meant for each other.  Integration of version control
Xwith system
Xbuilding tools like Make is very poor.
XThe choice, which component
Xversions go into a system configuration, is often limited to the
Xselection of either the \fInewest available\fR versions or
X\fIstatically designated\fR, i.e. a priori known versions (composition
Xlist).
X.PP
XFor configuration identification it is more desirable to
X\fIdescribe\fR a planned configuration in terms of
Xproperties that its components must have in order to be eligible.
XThe \fIattributed filesystem\fR (AFS) provides an
Xextended view of software objects to application programs. This view comprises
Xthe concept of \fIobject histories\fR, as well as the possibility to
Xtag any number of \fIuser-defined attributes\fR to object instances.
XInterpretation and use of these
Xattributes is left to the application that uses them. 
X.NH 2
XThe Attributed Filesystem
X.PP
XThe term attributed filesystem is only used for historical
Xreasons. The AFS layer described in this section rather implements a
Xdata storage system independent base of \fIattributed software objects\fR\(dg
X.FS
X\(dgWe adhere to the terminology proposed in [Tich88a].
X.FE
X(ASO), on top
Xof which all programs of the configuration engineering toolkit are
Xbuilt. 
X.PP
XEach software object
Xis understood as a complex of \fIcontent
Xdata\fR and a set of \fIassociated attributes\fR.  
XAttributes
Xhave the general form \fIname=value\fR, where \fIname\fR represents
Xthe attribute name, and \fIvalue\fR a possibly empty attribute value.
XThere are some implicitly defined \fIstandard attributes\fR for
Xevery object instance.  Some of the standard attributes (e.g.
Xname, size, owner, or protection attributes) are inherited from the
Xunderlying data storage system;
Xothers (e.g. revision number or state) are AFS specific.
X.PP
XAFS is realized as a callable interface to a \fIdata storage
Xsystem\fR and provides a general, attribute based method to identify
Xobjects in the object base.  All attributes are considered equally
Xsuited for object identification. For instance, it is possible to
Xretrieve all ASOs with an attribute \fIname=xyzzy\fR, or all
Xitems that have the attributes \fIauthor=andy\fR and
X\fIstate=published\fR.  Versions are treated as \(lqjust another
Xattribute\(rq. AFS provides applications \- such as \*(sh \- with
Xfully transparent, stream oriented access to all object instances.
X.sp 5p
X.KS
X.sp 4c
X.ce 
X\f3Fig 3.1.\f1 "The AFS and its applications"
X.KE
X.sp 5p
X.PP
XWith AFS, software objects are retrieved by specifying an \fIattribute
Xpattern\fR.  An AFS retrieval results in a \- possibly empty \- set of
X\fIobject keys\fR, each of which representing a unique object instance
Xthat matches the specified attribute pattern.
X.PP
XThe current implementation of AFS uses two
Xkinds of special files to realize the described concept of ASOs,
X\fIhistory files\fR and \fIbinary pools\fR.  Both file types are
Xarchives and capable of holding a possibly large number of objects. 
XHistory files store successive versions of
Xsource objects, which are
Xin most cases of textual nature. To preserve diskspace,
Xonly differences
Xbetween successive versions are kept (\fIdelta technique\fR).
XThe version control system employs 
Xa new delta technique [Obst87a],
Xyielding deltas that
Xare about 30 percent smaller than deltas generated by \fIdiff\fR
X(the standard 
X.UX
Xcomparison tool for generating deltas).
X.PP
XBinary pools are designed to hold \fIderived\fR objects, i.e. objects
Xthat are produced by processing (transforming, compiling) of source
Xobjects. Since derived objects can be reproduced from a corresponding
Xsource object, binary pools are administered in a cache fashion,
Xi.e. when space runs short, binaries are cleaned out on a \(lqleast
Xaccessed\(rq basis. The concept of binary pools resembles
XDSEE's \fIderived object pools\fR.
X.PP
XSimilar to other version control systems, history files generally
Xaccompany a regular file, the so called workfile. In the context of
X\*(sh and AFS, we use the term \fIbusy object\fR, instead of
Xworkfile.  Busy objects are regular files, thus making it
Xpossible to use tools, such as the EMACS editor, which don't know
Xabout the AFS.  Access to non busy objects however, can only be
Xestablished through the AFS interface, because usually they must
Xfirst be regenerated from the information stored in the corresponding history
Xfile. When a saved version is opened, the I/O operations
Xwill actually access a temporarily created file. All the action
Xhappens \- of course \- behind the scenes, and an AFS application
Xaccesses busy objects as well as all other versions transparently
Xthrough the same mechanism.
X.PP
XThe attributes of all version instances of an object, including the
Xbusy object, are stored in the history file. Attributes of derived
Xobjects are stored in the binary pool file that hosts them.
X.PP
XEvery regular file can be accessed through the AFS.  In this case, it
Xwill be treated as a busy object without AFS specific or user-defined
Xattributes.  If such a file is checked into the version control system
Xfor instance, a history file will be created, and the missing standard
Xattributes will be supplemented in a meaningful manner.
X.NH 2
XAFS on top of \*(Da
X.PP
XA second implementation of AFS on top of \*(Da, a dedicated software
Xengineering database (prototype) is currently under way.
X\*(Da is based on an \fIextended entity relationship model\fR and designed 
Xto serve as universal data management system for a large set of tools
Xto be part of an integrated programming environment.
X.PP
XThe fact that the various tools are supposed to store their data in a
Xtool specific structure (of entities and relationships) leads to
Xsome serious problems. First, opening of an ASO containing application
Xspecific \*(Da structures must yield an object specific key rather
Xthan a
X.UX
Xfile pointer. Second, simple operations such as copying,
Xmoving, or printing of object contents are representation dependent and
Xcan't be performed by the AFS any more. In particular, there is no easy
Xway for AFS to compute \fIversion deltas\fR between \*(Da object structures
X(how should this kind of delta look like ?).
X.PP
XAnother very practical problem is extensibility. In the current state,
Xa \*(Da database has \fIone\fR schema that defines the internal
Xstructure of the entire database.  Addition of a new tool with the
Xnecessity of schema updates requires the generation of a new database
Xand the (troublesome) transfer of all data from the old database to
Xthe new one.  Due to these problems and the current lack of of \*(Da
Xbased tools, we decided to use the database only as replacement 
Xfor archive\- and binary pool files.
XBusy objects and temporary files (containing the data of
Xreconstructed older versions) are still stored in the
X.UX
Xfilesystem.
XAFS applications have no direct access to the database.  Similar to
Xthe filesystem implementation, the contents of an ASO has the form of
Xa byte array.  Until now, there is no substantial difference between this
Ximplementation and the filesystem implementation \(em except that it
Xwill be slower.
X.PP
XA solution to the described problems that will allow AFS applications
Xto take full advantage of \*(Da' structuring facilities while
Xsupporting the dynamic extension of the SPU without the necessity to
Xchange or even recompile any part of the environment, can be found by
Xtaking a consequently object oriented approach.  The design of an
Xobject oriented AFS to be basic part of an object oriented \fIenvironment
Xframe\fR is currently in its early stage. However, we expect substantial
Xresults in this direction in the near future.
X.NH 1
XConclusion
X.PP
XThe described system for engineering of software configurations
Xintegrates tools for version control, system building, and
Xproject organization on top of a common object concept. Despite the
Xintegration of the toolkit itself, care has been taken to smoothly fit
Xthe SCE system into the standard
X.UX
Xenvironment. The entry cost for
Xnew users (in terms of initial learning effort) is very low. The
Xsystem may be used as just a friendly version control tool, an upward
Xcompatible replacement for Make, or an intelligent integration of
Xboth.  Utilization of the toolkit can be gradually extended up to a
Xnetwork based project support environment, employing a number of
Xprogrammer teams working on large software development and maintenance
Xprojects.
X.PP
XThe simple, 
X.UX-like
Xnature of the toolkit's basic user interface
Xoffers a broad range of possibilities to create dedicated user interfaces
Xthat provide an integrated, problem oriented view of the SCE system.
X.PP
XThere are, however, a number of areas where much more work needs to
Xbe done. Particularly, powerful formalisms to deal with the complexity
Xof variant control are still at large. The use of software engineering
Xdatbases as underlying data storage system is still a problem. However,
Xthe use of object oriented design principles for a new version of the 
Xsystem is expected to overcome these problems and to open up exciting
Xperspectives for a \(lqgeneric, integrated, open software engineering
Xtoolkit environment\(rq.
X.NH 1
XAcknowledgement
X.PP
XThis work is part of the \*(Un project. The project is supported by the
XBundesministerium f\*:ur Forschung und Technologie 
X(Federal Ministry for Research and Technology) under grant ITS 8308.
X.]<
X.\"AUGMAKE-1983-1
X.ds [F AUGM83a
X.]-
X.ds [A AUGMAKE
X.ds [T An Augmented Version of Make
X.ds [J System V/68 Support Tools Guide
X.ds [I Motorola Microsystems Inc., Ord.No. M68KUNSTG/D1
X.ds [P 21-40
X.nr [P 1
X.ds [D January 1983
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Bersoff.E.H.-1980-2
X.ds [F Bers80a
X.]-
X.ds [A Edward H. Bersoff
X.as [A ", Vilas D. Henderson
X.as [A ", and Stanley G. Siegel
X.ds [T Software Configuration Management
X.ds [I Prentice Hall
X.ds [C Englewood Cliffs, N.J.
X.ds [D 1980
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 2 book
X.\"Clemm.G.M.-1986-3
X.ds [F Clem86a
X.]-
X.ds [A Geoffrey M. Clemm
X.ds [T The Odin System: An Object Manager for Extensible Software Environments
X.ds [J CU-CS-314-86
X.ds [I The University of Colorado
X.ds [C Boulder, Colorado
X.ds [D February 1986
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"DECCMS-1984-4
X.ds [F DECC84a
X.]-
X.ds [A DECCMS
X.ds [T VAX DEC/CMS 2.0 Reference Manual
X.ds [J VAX DEC/CMS Reference Manual, Order No. AA-L372B-TE
X.ds [I Digital Equipment Corporation
X.ds [C Maynard, Massachusetts
X.ds [D November 1984
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"DECMMS-1984-5
X.ds [F DECM84a
X.]-
X.ds [A DECMMS
X.ds [T VAX DEC/MMS 2.0 User's Guide
X.ds [J VAX DEC/MMS User's Guide, Order No. AA-P119B-TE
X.ds [I Digital Equipment Corporation
X.ds [C Maynard, Massachusetts
X.ds [D August 1984
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Dittrich.K-1986-6
X.ds [F Ditt86a
X.]-
X.ds [A Klaus Dittrich
X.as [A ", Willi Gotthard
X.as [A ", and Peter C. Lockemann
X.ds [T DAMOKLES. A Database System for Software Engineering Environments
X.ds [J International Workshop on Advanced Programming Environments
X.ds [P 351-371
X.nr [P 1
X.ds [I IFIP WG2.4
X.ds [I Springer Verlag
X.ds [C Trondheim, Norway
X.ds [D June 1986
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Dowson.M-1986-7
X.ds [F Dows86a
X.]-
X.ds [A Mark Dowson
X.ds [T ISTAR - An Integrated Project Support Environment
X.ds [J Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering
X.ds [J Symposium on Practical Software Development Environments
X.ds [J SIGPLAN Notices
X.ds [V 22, 1
X.ds [P 16-27
X.nr [P 1
X.ds [I ACM
X.ds [C Palo Alto, California
X.ds [D December 1986
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Estublier.J.-1986-8
X.ds [F Estu86a
X.]-
X.ds [A J. Estublier
X.as [A " and N. Belkhatir
X.ds [T Experience with a Database of Programs
X.ds [J Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering
X.ds [J Symposium on Practical Software Development Environments
X.ds [J SIGPLAN Notices
X.ds [V 22, 1
X.ds [P 84-91
X.nr [P 1
X.ds [I ACM
X.ds [C Palo Alto, California
X.ds [D December 1986
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Feldman.S.I.-1979-9
X.ds [F Feld79a
X.]-
X.ds [A Stuart I. Feldman
X.ds [T MAKE - A Program for Maintaining Computer Programs
X.ds [J Software - Practice and Experience
X.ds [V 9,3
X.ds [P 255-265
X.nr [P 1
X.ds [D March 1979
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Haberman.A.N-1982-10
X.ds [F Habe82a
X.]-
X.ds [A A. Nico Haberman
X.as [A " and Gail E. Kaiser
X.ds [T An Environment for System Version Control
X.ds [J Dig. Papers Spring Compcon
X.ds [I IEEE
X.ds [D November 1982
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"H\*ubner.W.-1987-11
X.ds [F H\*u87a
X.]-
X.ds [A W. H\*ubner
X.as [A ", G. Lux-M\*ulders
X.as [A ", and M. Muth
X.ds [T THESEUS \- Die Benutzungsoberfl\*ache der UNIBASE Softwareentwicklungsumgebung
X.ds [J Beitr\*age zur Graphischen Datenverarbeitung
X.ds [I Zentrum f\*ur Graphische Datenverarbeitung
X.ds [I Springer Verlag
X.ds [C Berlin
X.ds [D 1987
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"IEEE-1983-12
X.ds [F IEEE83a
X.]-
X.ds [A IEEE
X.ds [T IEEE Standard Glossary for Software Engineering Terminology
X.ds [I IEEE
X.ds [C New York, N.Y.
X.ds [D February 1983
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 2 book
X.\"Lampen.A-1988-13
X.ds [F Lamp88a
X.]-
X.ds [A Andreas Lampen
X.as [A " and Axel Mahler
X.ds [T An Object Base for Attributed Software Objects
X.ds [J (to appear in) Proceedings of the Fall 1988 EUUG Conference
X.ds [I European Unix systems User Group
X.ds [C Lisbon, Portugal
X.ds [D October 1988
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Lampson.B.-1983-14
X.ds [F Lamp83a
X.]-
X.ds [A B. Lampson
X.as [A " and E. Schmidt
X.ds [T Organizing Software in a Distributed Environment
X.ds [J Proc. of the SIGPLAN 83 Symposium on Programming Language Issues in Software Systems
X.ds [V 18, 6
X.ds [P 1-13
X.nr [P 1
X.ds [C San Francisco, California
X.ds [D June 1983
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Leblang.D.B.-1984-15
X.ds [F Lebl84a
X.]-
X.ds [A David B. Leblang
X.as [A " and Robert P. Chase
X.ds [T Computer-Aided Software Engineering in a Distributed Workstation Environment
X.ds [J Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering
X.ds [J Symposium on Practical Software Development Environments
X.ds [J SIGPLAN Notices
X.ds [V 19, 5
X.ds [P 104-113
X.nr [P 1
X.ds [I ACM
X.ds [C Pittsburgh, PA.
X.ds [D April 1984
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Mahler.A-1988-16
X.ds [F Mahl88a
X.]-
X.ds [A Axel Mahler
X.as [A " and Andreas Lampen
X.ds [T shape \- A Software Configuration Management Tool
X.ds [J Proceedings of the International Workshop on Software Version and Configuration Control
X.ds [I German Chapter of the ACM
X.ds [I B.G. Teubner
X.ds [P 228-243
X.nr [P 1
X.ds [C Grassau, West-Germany
X.ds [D January 1988
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Marzullo.K-1986-17
X.ds [F Marz86a
X.]-
X.ds [A Keith Marzullo
X.as [A " and Douglas Wiebe
X.ds [T Jasmine: A Software System Modelling Facility
X.ds [J Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering
X.ds [J Symposium on Practical Software Development Environments
X.ds [J SIGPLAN Notices
X.ds [V 22, 1
X.ds [P 121-130
X.nr [P 1
X.ds [I ACM
X.ds [C Palo Alto, California
X.ds [D December 1986
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Nicklin.P.J.-1983-18
X.ds [F Nick83a
X.]-
X.ds [A Peter J. Nicklin
X.ds [T The SPMS Software Project Management System
X.ds [I UC Berkeley
X.ds [C Berkeley, CA.
X.ds [D August 1983
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 2 book
X.\"Obst.W-1987-19
X.ds [F Obst87a
X.]-
X.ds [A Wolfgang Obst
X.ds [T Delta Technique and String-to-String Correction
X.ds [J Proceedings of the 1st European Software Engineering Conference
X.ds [J Lecture Notes in Computer Science
X.ds [P 69-73
X.nr [P 1
X.ds [I Springer Verlag
X.ds [C Berlin
X.ds [D September 1987
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Perry.D.E.-1987-20
X.ds [F Perr87a
X.]-
X.ds [A Dewayne E. Perry
X.ds [T Version Control in the Inscape Environment
X.ds [J Proceedings of the 9th International Conference on Software Engineering
X.ds [I IEEE
X.ds [P 142-149
X.nr [P 1
X.ds [C Monterey, California
X.ds [D March 1987
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Rochkind.M.J.-1975-21
X.ds [F Roch75a
X.]-
X.ds [A Marc J. Rochkind
X.ds [T The Source Code Control System
X.ds [J IEEE Transactions on Software Engineering
X.ds [V SE-1
X.ds [P 364-370
X.nr [P 1
X.ds [D 1975
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Tichy.W.F.-1985-22
X.ds [F Tich85a
X.]-
X.ds [A Walter F. Tichy
X.ds [T RCS - A System for Version Control
X.ds [J Software - Practice and Experience
X.ds [V 15,7
X.ds [P 637-654
X.nr [P 1
X.ds [D July 1985
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Tichy.W.F.-1988-23
X.ds [F Tich88a
X.]-
X.ds [A Walter F. Tichy
X.ds [T Tools for Software Configuration Management
X.ds [J Proceedings of the International Workshop on Software Version and Configuration Control
X.ds [P 1-20
X.nr [P 1
X.ds [I B.G. Teubner
X.ds [I German Chapter of the ACM
X.ds [C Grassau, FRG
X.ds [D January 1988
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.\"Waite.W.M.-1988-24
X.ds [F Wait88a
X.]-
X.ds [A William M. Waite
X.as [A ", V. P. Heuring
X.as [A ", and Uwe Kastens
X.ds [T Configuration Control in Compiler Construction
X.ds [J Proceedings of the International Workshop on Software Version and Configuration Control
X.ds [I German Chapter of the ACM
X.ds [I B.G. Teubner
X.ds [P 228-243
X.nr [P 1
X.ds [C Grassau, West-Germany
X.ds [D January 1988
X.nr [T 0
X.nr [A 0
X.nr [O 0
X.][ 1 journal-article
X.]>
END_OF_FILE
if test 49291 -ne `wc -c <'papers/boston.ms'`; then
    echo shar: \"'papers/boston.ms'\" unpacked with wrong size!
fi
# end of 'papers/boston.ms'
fi
echo shar: End of archive 31 \(of 33\).
cp /dev/null ark31isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 33 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.