Provided by: shapetools_1.4pl6-14_amd64 bug

NAME

       shape - identify and build program configurations from versions of source objects

SYNOPSIS

       shape
            [ -f <description file> ]
            [ -R <version selection rule> ] [ -V <variant name> ]
            [ -echo <macro name> ] [ -force <target> ] [ -rebuild <target> ]
            [ - dDehiknprs ]
            [ -bct ] [ -help ] [ -nomsg ] [ -novclass ] [ -version ] [ -xpoff ] [ -xpon ]
            [ target1 target2 ... ] [ macro=value ... ] [ macro+=value ... ]

DESCRIPTION

       Shape  allows  to  transparently  compile  source objects that are either regular files, or source object
       versions in the ShapeTools version object base. More generally, shape produces a set of  derived  objects
       (``targets'')  from  appropriately  selected  versions  of  corresponding  source  objects according to a
       description of the dependencies between the objects. Shape keeps track of  the  relevant  parameters  for
       compilations  (source  versions,  compiler versions, compiler switches etc.) and thus provides a safe and
       efficient build machinery.

       When shape compiles source objects, it stores the resulting derived objects together with  the  effective
       compile  parameters  in its derived object cache. Before the derivation process for a requested object is
       actually started, shape attempts to find an existing derived object that matches the requirements for the
       target,  in  the  derived object cache.  Caching and restoring of objects that are derived from immutable
       versions allows developers to profit from previous builds by other team members. Overall compile costs in
       projects are substantially reduced.

       When  serving a build request, shape considers a possibly large number of versions that are stored for an
       object. Which particular version is bound to an object's name in the description file, is  determined  by
       version selection rules.

       Shape can manage builds of different variants of a system in parallel.  Shape uses the combined potential
       of dynamic version selection, dynamic macro redefinition, and derived object management to handle variant
       builds.  As  most - if not all - of the objects and parameters involved in a build are defined as macros,
       shape provides a great deal of flexibility by allowing to alter some or all of  the  macros  dynamically,
       depending  on which variant shall be built. The concept of variant definition in shape's description file
       offers a clear focal point for all definitions that are relevant for a certain variant.

OPTIONS

       -f <description file>
              shape uses the supplied argument as name of the description file to be used for the build.  If  no
              -f  option  is  specified,  shape  tries  to  find  a  description  file  under  one  of the names
              ``Shapefile'', ``shapefile'', ``Makefile'', and ``makefile'' (from left to right). If  no  regular
              file  with  one of these names can be found, but versions of respective files are available in the
              version object base, shape will use the most recent version.  When more than one  -f  <description
              file>  argument  pair  appears,  shape  reads  each  description file in turn.  If the name of the
              description file is specified as ``-'', shape will  read  the  system  description  from  standard
              input.  It  is  possible  to  specify  the  description  file  in  bound  version  notation,  e.g.
              Shapefile[2.8] or Shapefile[Release4] (see vbind(1) for details about bound version notation).

       -R <selection rule name>
              activates the specified selection rule as initial version binding for source objects.  If  the  -R
              option  is  present,  and a selection rule is defined as the first dependency of the first target,
              shape will use the selection rule passed via the command line, and ignore the first (and only  the
              first)  selection  rule  activation  within the description file. The option is useful to override
              initial default selection rules, specified within the description file, from the command line.

       -V <variant name>
              activates  the  variant  specified  by  <variant  name>.   Several  variants  can   be   activated
              simultaneously  from  the  command  line  by  specifying the -V option multiple times. All variant
              specific definitions will be in effect as soon as shape reads the corresponding variant definition
              in the description file.

       -force <target>
              forces  shape  to  build the specified target unconditionally, i.e. even if a suitable, previously
              build object exists.

       -echo <macro name>
              the value of the macro <macro name> is written to  standard  output.  This  option  is  useful  to
              extract  information  from  the  system description file (e.g. shape -echo SOURCES, or shape -echo
              SUBSYSTEMS), or to control the effect of variant activations.

       -rebuild <target>
              attempt a precise rebuild of target according to a bound configuration thread, supplied in a  file
              named <target>.bct (see description of -bct switch).

       -d     run shape in debug mode. Print out detailed information about object dependencies and attributes.

       -D     print  detailed  information  about  the  version binding process, and shape's reasoning regarding
              (re)builds of targets, or retrievals from the derived object cache.  This switch is useful to find
              out about the exact reasons, why shape rederives a target (or not).

       -e     macro definitions that are imported from the environment (see description of special macro IMPORT,
              below) override macro definitions in the description file (by default, macro  definitions  in  the
              description file have precedence over imports from the environment).

       -h     print  usage  information  on  standard  output (this is an abbreviation for the -help switch, see
              below).

       -i     ignore error codes returned by commands.

       -k     when a nonzero error status is returned by an invoked command, the work on the current  target  is
              abandoned but shape continues with other branches that do not depend on the failed target.

       -n     no  execution  mode.  Shape  prints  out  commands,  but does not execute them. Even command lines
              beginning with @ are printed. If a command contains the $(MAKE)  macro  reference,  however,  that
              line is always executed in order to allow tracing of recursive build processes.

       -p     print  out  the  complete  set  of  macro  definitions, target descriptions, and rule definitions,
              respectively.

       -r     do not use shape's built-in implicit rules. Implicit rules defined in the description file  remain
              in effect.

       -s     run in silent mode. Shape does not print out the commands before executing them.

       -bct   record  the  build  in  a  bound  configuration thread file. A shape configuration thread contains
              precise definitions of all source versions, their dependencies, the involved  tools,  and  related
              options  that  were in effect for a build. The configuration thread for a produced toplevel target
              (the first target in the description file, or a target requested from the command line) is  stored
              in  a  file named <target>.bct. Bound configuration threads can be used as input for rebuilds (see
              option -rebuild, above). If the source version context of a bct-build is unsafe, shape will record
              that fact in the bct, and issue a warning message.

       -help  print usage information on standard output.

       -nomsg turn off the trace facility msg in version selection rules.

       -novclass
              disable checking for incompatibility of activated variants.

       -version
              print the version identification of the shape program.

       -xpoff turn  off  attribute  expansion  in  source  versions  retrieved from the object base. By default,
              attribute expansion is turned on for all source objects  that  are  directly  retrieved  from  the
              object  base,  and  turned off for source objects that are regular files (see retrv(1) for details
              about attribute expansion).

       -xpon  turn on attribute expansion for all source objects, even in regular files. By  default,  attribute
              expansion  is  turned  off for source objects that are regular files, and turned on for all source
              objects that are directly retrieved from the object base.

       target ...
              A list of target names can be passed to shape via the command line. If no target is given  on  the
              command  line,  and  the special target .DEFAULT is not defined within the description file, shape
              tries to produce the first target defined in the description file.

       <macro definition>
              It is possible to define or modify macros in the description file from the command  line.   Macros
              that  are  defined  this  way  take  precedence  over  all  other  definitions. Command line macro
              definitions have either of two forms:

               NAME=VALUE
       and
               NAME+=VALUE

       with NAME being a word and VALUE an arbitrary string. If VALUE contains white space, make sure  to  quote
       it.   The  first  form of command line macro definitions sets NAME to the substitution VALUE. If VALUE is
       empty, the macro is reset.  The second form appends VALUE with a leading space character to  the  current
       substitution  of  NAME. The current substitution may be defined in the description file, or by a previous
       setting on the command line. For details about the semantics of macro definitions and substitutions,  see
       the respective sections below.

DESCRIPTION FILES

       The  operation  of  shape  is  controlled by a system description file (usually a Makefile) that provides
       structural information about the system to be managed. Other than make(1), shape works  on  top  of  AtFS
       (Attributed File System), a repository of versioned objects, rather than plain files. Thus, genuine shape
       description files (usually called Shapefile) feature version selection rules, and variant definitions  in
       addition  to  standard  Makefile  dependency  rules.   Shape's  description  file is an upward compatible
       extension of make(1)'s description file,  the  Makefile.   A  useful  structuring  convention  for  shape
       description  files  is to maintain a Makefile, and a Shapefile in parallel. Only genuine shape constructs
       (such as version selection rules, or variant definitions) are kept in Shapefile, while the bulk of target
       rule-  and  macro  definitions  is  kept  in  Makefile.  The Makefile shall be included in Shapefile (see
       description of include directive, below).  This structuring convention has the  advantage  that  programs
       that  were  developed  with the support of the ShapeTools system can be shipped as source distribution to
       sites that don't use ShapeTools.

       Although shape is largely downward compatible with the original make program, it  should  be  noted  that
       several  popular  extensions of the original make program, such as GNU Make or Sun Make, provide features
       not present in shape.  See the section on known incompatibilities below.

       The description file provides an ideal  central  information  base  for  all  sorts  of  product  related
       definitions.   Shape  encourages  the  development  of  a  set  of  (project-  or  organization-specific)
       conventions for system description, and provides a simple way to extract  this  information  for  use  by
       other  tools  (see -echo option, above). The description file syntax not only serves to specify component
       dependencies that are relevant for build processes, but allows  a  general,  hierarchical  definition  of
       product  oriented tasks.  The concept of recursive dependencies maps directly to a stepwise refinement of
       task definitions. Such tasks can be fully, partly, or not at all automated as appropriate. Thus,  certain
       activities  may  be  automated  and standardized, while other activities are just informally described in
       order to document them or to reason about them (see shape_rms(1) for examples).

Syntactical Structure

       The basic syntactical structure of shape's description file is made up of:

       Comments
              Comments begin with a ``#'' character and extend to the end of the line. In Shapefiles, the end of
              a  line  is  defined as an unescaped newline (``\<newline>''), or the end of the file. The comment
              character can't be escaped, but can be quoted in single- or double quotes. Comment  characters  in
              command lines of target rules are ignored by shape.

       Directives
              Directives are special keywords, known to shape. Directives begin at column 0 of a line and extend
              to the line end. Currently, the only directive recognized by shape is

               include <list of file names>

       Macro Definitions
              Macro definitions have the general form:

               NAME <macro definition symbol> VALUE

       NAME must be a single word consisting of a sequence of name characters. Name characters are all printable
       characters except the following:

                                                $ # : = ; <space> \t \n

       The  macro  definition  symbol  is  either  of  ``='',  ``+='',  or  ``:=''. VALUE is an arbitrary string
       terminated by the end of the line, or a comment. Macro definitions usually begin in the first column of a
       line, but may be preceded by leading <space> characters. Macro definitions must not contain leading <tab>
       characters (see section on Macro Definitions, below, for more details).

       Macro References
              Macro references have one of the following forms:

               $(<macro name>)
               ${<macro name>}
               $<single character name>

       The macro substitution operator (``$'') can't be escaped, but can  be  represented  by  the  substitution
       ``$$''. Macro substitution occurs anywhere in the description file, except in comments, macro names, left
       hand sides of version selection rule- and variant definition headers  (see  next  section),  and  variant
       class definitions (see section on Macro Substitutions, below, for more details).

       Rules  Rules  are  made  up  from a rule header, and an optional rule body. The rule header consists of a
              left hand side, a rule definition symbol, and an optional right hand  side.  The  left  hand  side
              usually begins in column 0 of a line, and may be preceded by leading <space> characters. Left hand
              sides of rule headers must not contain leading <tab> characters. The optional right hand side of a
              rule  header  extends  to  the  end  of  the  line, or the beginning of the rule body. A rule body
              consists of consecutive lines beginning with a <tab> character. The body of a rule  is  terminated
              by the next line not beginning with a <tab> character, or the end of the file.

              Shape recognizes three different kinds of rules, distinguished by their respective rule definition
              symbols:

              •
                target rules. Target rules have a single colon character (``:'') as rule definition symbol.  The
                left  hand  side  of  target rule headers is a space-separated list of names. The optional right
                hand side consists of a  space-separated  list  of  names,  followed  by  an  optional  list  of
                production ingredients (see section on Target Rules, below).

              •
                version  selection  rules.  Version  selection rules have the rule definition symbol ``:-''. The
                rule header of version selection rules has a single word on its left hand  side,  and  no  right
                hand side (see section on Version Selection Rules, below).

              •
                variant  definitions. Although variant definitions are - as the name suggests - definitions, not
                rules (from a semantical view point), their  syntactical  representation  is  that  of  a  rule.
                Variant  definitions  have  the  rule  definition  symbol  ``:+''.  The rule header of a variant
                definition has a single word on its left hand side, and no  right  hand  side  (see  section  on
                Variant Definitions, below).

       Variant Class Definitions
              Variant class definitions have the form

                                      vclass <name> ::= (variant1, variant2, ...)

       (see section on Variants, below).

       Line Continuations
              If  the  end  of  an input line is escaped by a backslash (``\'') the next line is considered as a
              continuation line. The backslash newline character sequence is replaced by a space.

Macro Definitions

       Macro definitions associate names with strings that will be substituted wherever the name of the macro is
       referenced  (see  next  section).  Macros  are  useful  for  writing  maintainable,  and somewhat generic
       description files. Even moderately large projects will find it extremely rewarding to define  conventions
       for naming and usage of certain macros throughout the product description file.

       There are three different kinds of macro definitions:

       Simple Macro Definitions

       A simple macro definition looks like

               NAME = <any string>

       The  string  that  is  associated with the macro name can contain macro references. If a macro is defined
       multiple times within a description file, the last definition will be effective. Macros  defined  on  the
       command line take precedence over definitions of the same macro in the description file.

       Additive Macro Definitions

       This type of macro definition looks like

               NAME += <any string>

       The  string  on  the  right hand side of the definition is appended to any existing value associated with
       NAME, separated by a space character. Multiple additive macro definitions are concatenated in  the  order
       in which they appear in the description file. If an additive macro definition occurs on the command line,
       the last string value defined in the description file is prepended to the string  value  defined  on  the
       command line. Additive macro definitions in the description file are appended to string values defined on
       the command line.

       Evaluative Macro Definitions

       Evaluative macros are defined in the following way:

               NAME := <any string>

       First, the string value is associated to NAME in the same way as for simple macro definitions. When  NAME
       is  substituted for the first time, the right hand side of the definition is evaluated, and the result of
       this evaluation replaces the original string value associated with NAME. Thus, evaluation  of  the  right
       hand  side  occurs  exactly  once.  This  is  particularly  useful  if  the  defining string is a command
       substitution (see next section).

Macro Substitutions

       Macro substitution is the process of substituting a macro reference by the string value associated with a
       macro  name.   References  to  undefined macros are substituted by an empty string. Macro references have
       either of the forms:

               $(NAME)
               ${NAME}
               $<any single character>

       The following are valid macro references:

               $(CFLAGS)
               $7
               ${SOURCE-FILES}
               $(X)
               $X

       The last two references have identical substitutions. The macro reference

               $$

       will substitute a single dollar sign.

       Before a macro reference is substituted, the associated string will be evaluated. Evaluation of a  string
       value includes

       -
         substitution of all macro references in the string value

       -
         command  substitution.  Any substring of the string value enclosed in backquotes (```'') will be passed
         as command to the shell, and be replaced by the command's standard output.

       -
         string substitution. If a macro reference has the form

               $(NAME:<old>=<new>)

       the reference will be substituted by the evaluated value of NAME, with  all  occurrences  of  the  string
       <old>  replaced  by  the  string  <new>.  This  is particularly useful to maintain related lists, such as
       CSOURCES and OBJECTS for example, automatically:

               CSOURCES := `echo *.c`
               OBJECTS := $(CSOURCES:.c=.o)

       Shape substitutes macro references as late as possible. Macro references occurring in a macro  definition
       are  only  substituted when the defined macro itself is substituted. Macro references on the dependencies
       side of target rules are substituted when the rule is evaluated. Macro references on the target  side  of
       target  rules  are  substituted  immediately  after  shape has read the description file, i.e. before any
       production is started. Macro references in include directives  are  substituted  when  the  directive  is
       executed while shape reads the description file.

Built-in and Special Purpose Macros

       In  order to provide parametrization of shape's built-in implicit rules, a number of predefined macros is
       supplied by convention. These macros have meaningful initial values that can  be  altered  by  the  user.
       There are also several macros that have special meaning for shape.

       Macro       Purpose            Initial value   Remark

       @           full name of the current           <dynamic>special
                   target

       ?           list of target dependencies        <dynamic>special

       <           name of the first target           <dynamic>special
                   dependency

       *           prefix shared by target            <dynamic>special
                   and the dependent filenames

       #           bound version id of the current    <dynamic>special
                   dependency

       $           the character ``$''                $<special>

       +           name of object to be bound         <dynamic>special
                   to a version (selection rules
                   only!)

       AS          Program for doing assembly         asconventional

       ASFLAGS     Flags for the assembler            <none>conventional

       CC          Program for compiling C            ccconventional
                   programs

       CFLAGS      Flags for the C compiler           <none>conventional

       FC          Program for compiling Fortran      f77conventional
                   programs

       FFLAGS      Flags for the Fortran compiler     <none>conventional

       HOSTTYPE    Host architecture of the           <none>special
                   computer that runs shape.
                   The value of this macro is
                   used by shape to construct
                   the derivation key attribute
                   for derived objects

       IMPORT      List of environment variables      <none>special
                   that shall be imported as
                   macro definitions

       LD          Program to link programs           ldconventional

       LDFLAGS     Flags for the linker               <none>conventional

       LEX         Program to turn Lex grammars       lexconventional
                   into C or Ratfor programs

       LFLAGS      Flags for the lexical analyzer     <none>conventional
                   lex

       LOGNAME     The name or network-id under       <dynamic>special
                   which the user who owns the
                   shape process is logged on

       M2C         Program for compiling Modula2      m2cconventional
                   programs

       M2FLAGS     Flags for the Modula2 compiler     <none>conventional

       MAKE        The command line with which        shape $(MAKEFLAGS)special
                   shape has been invoked.
                   This macro is used for
                   recursive calls to shape

       MAKEFLAGS   Command line flags relevant        <defined fromspecial
                   for recursive calls to shape       command line>

       PC          Program for compiling Pascal       pcconventional
                   programs

       PFLAGS      Flags for the Pascal compiler      <none>conventional

       RFLAGS      Flags for the Fortran compiler     <none>conventional
                   for Ratfor programs

       SHAPEPID    The process id of the              <dynamic>special
                   running shape program

       SHAPEVERSION                   The version id of theshape_CM-4.4special
                   shape program      (or above)

       SHELL       The command processor for          /bin/shspecial
                   the target rule command
                   lines. The referenced command
                   processor must be able to
                   take its commands  from
                   standard input (see section
                   on Command execution,
                   below)

       VPATH       Search path extension for          <none>special
                   localizing source components

       YACC        Program to turn Yacc grammars      yaccconventional
                   into C programs

       YFLAGS      Flags for yacc     <none>          conventional

       vpath       Dynamic search path extension      <none>special
                   for variants of source components

       The  function of the special purpose macros HOSTTYPE, IMPORT, MAKE, VPATH, and vpath are described in the
       sections on OPERATION, and Variants below.

Target Rules

       A target rule defines how, and under what conditions a target is derived from a  set  of  source  objects
       and/or  other  targets.  A target is a name that can refer to a file but need not to do so.  Target rules
       have the following format:

               <target>... : [<version binding>] [+<variant>...] [<dependency>...] \
                       [: <ingredient>...] [; <command>]
                       \t[<command>]
                       ...

       The header of a target rule (see Syntactical Structure, above) consists of a list of targets,  terminated
       by a colon, followed by an optional list of dependencies, and an optional list of production ingredients,
       beginning after a second colon character.  The rule header is terminated by a newline or a semicolon, and
       followed  by  the  optional  rule  body. The rule body consists of command lines that are executed when a
       target needs to be rederived.   The  first  command  line  may  immediately  follow  the  semicolon  that
       terminates  the  rule header. Subsequent command lines must begin with a <tab> character. The target rule
       body is terminated by the first line that doesn't begin with a <tab>, or by the end of the file.

       Targets

       When multiple targets appear on the left hand side of a rule header, and the derivation process needs  to
       be started, shape will derive all of the targets in a single run.

       Dependencies

       Shape  checks  a target's dependencies from left to right. The first dependency is examined whether it is
       the name of a version selection rule. If it is, shape sets  the  selection  rule  active  (eclipsing  all
       previous selection rule activations), and proceeds to the next dependency. Next, shape checks whether the
       dependency is a variant activation. If the dependency starts with a ``+'' character followed by the  name
       of  a variant, the variant is activated (see the section on Variants, below). Shape proceeds to check for
       variant activations until the first dependency that isn't a variant  activation  is  found.  Next,  shape
       proceeds  through  the  list of remaining dependencies, and binds (or derives) each of them as necessary,
       performing a depth first traversal of the dependency graph (see the section on OPERATION, below).

       Production Ingredients

       After all dependencies have been  bound,  shape  constructs  the  derivation  key  for  the  target.  The
       derivation  key  is  an  attribute  that  defines the complete set of parameters that determine whether a
       target needs to be rebuild. Besides all bound dependencies, the derivation key  contains  the  production
       ingredients  that were specified in the target rule header. Production ingredients are typically complete
       definitions of the macros that are referenced in the  command  lines  of  the  rule's  body.  Thus,  tool
       versions  and switches affecting the operation of a tool can be made part of the derivation parameters of
       a target. In order to include macro definitions  into  the  derivation  key  of  a  target,  the  special
       reference

               +(NAME1) +(NAME2) ...

       must occur in place of the production ingredients.

       Command Lines

       When  shape  concludes  that  a target needs to be (re-)derived, the commands in the target rule body are
       executed. The rule body consists of consecutive lines that are treated as separate commands. Each command
       line  is  evaluated  as  described in the section on Macro Substitution, above, and passed to the command
       interpreter defined by the macro SHELL. Each command line is executed as a separate process.  If  complex
       commands  are  needed that don't fit on a single line, or if the overhead of repeated process invocations
       shall be avoided, a logical command line can be  extended  by  escaping  the  newline  with  a  backslash
       character (\<newline>), and continuing it on the next physical line.

       Command lines may be preceded by one or two special characters:

       -      shape ignores any nonzero error code returned by a command line for which the first character is a
              minus sign. The minus sign is not passed to the shell. When a command  returns  a  nonzero  return
              status,  shape  usually considers the derivation process for the target as failure and terminates,
              unless the -i or -k switches, or the .IGNORE special target is in effect.

       @      If the first character of a command is a ``@'', shape does not print the command before  executing
              it. The ``@'' is not passed to the shell.

       @-     If  the  first  two  non-<tab>  characters  are  ``@-'',  shape  ignores nonzero return codes, and
              suppresses the printing of the command line.

       If shape is invoked in no execution mode (-n), the  evaluated  command  lines  are  printed  on  standard
       output, showing what shape would do if invoked without -n. Command lines that contain the macro reference
       $(MAKE) are always executed, even if -n is set. This is done to allow simulation of recursive builds that
       may span over subdirectories. The reference $(MAKE) is substituted by a shape command invocation with all
       relevant command line switches set.

       Within command lines of the rule  body,  some  parts  of  the  target  rule  header  can  be  dynamically
       referenced. When a command line is evaluated, the following substitutions are possible

       Reference   Substitution
       $@          full name of the current target
       $?          list of dependencies
       $<          name of the first dependency
       $*          prefix shared by current and the dependent filenames
       $#          bound version id of the current dependency
                   (implicit rules only)

Implicit Rules

       Shape's target rules come in two different flavors: explicit, and implicit. Implicit rules can be seen as
       templates that define dependency patterns which apply to most targets of a given kind. For  this  reason,
       implicit  rules  are sometimes called pattern rules. Shape converts make's old-style implicit rules (e.g.
       .c.o:) to pattern rules while it reads the description  file.   A  typical  dependency  pattern  is,  for
       example,  the  dependency  of files containing linkable object code, e.g. module.o to corresponding files
       containing source code, e.g. module.c. The derivation process for most of these source/derived  pairs  is
       identical.   Rather  than  writing  separate rules for all source/derived dependencies of a system, it is
       possible to write a single, generic rule, called implicit rule.   An  implicit  rule  has  the  following
       format:

               %[.<suff1>] %[.<suff2>] ... : %[.<suff3>] %[.<suff4>]... \
                   [: <ingredient>...] [; <command>]
                   \t[<command>]
                   \t[<command>]
                   ...

       While  the  structure  of  implicit  rules  is  the  same  as  described  above, the names of targets and
       dependencies are replaced by  target  patterns,  and  dependency  templates  respectively.   The  percent
       character  in  a target pattern acts as wildcard that is matched against all of a target's name up to the
       optional trailing suffix. For shape, an object name suffix is the sequence of characters enclosed by  the
       last  period  character  (``.'')  within  the  name,  and the <space> character terminating the name. The
       following example illustrates shape's concept of suffixes:

           Name        Suffix
           sample.cde  cde
           sample.x.y.cc
           sample_c
           .sample.c   c

       The following is an example for an implicit rule that derives linkable object code from  corresponding  C
       source files:

           %.o : %.c : +(CC) +(CFLAGS)
               \t@echo shape - executing: $(CC) -c $(CFLAGS) $#;
               \t@$(CC) $(CFLAGS) -E %.c |
                 sed 's;^\(# [0-9][0-9]* \"\)%.c\(\".*\)$$;e1$#\2;' > %.i;
               \t@$(CC) -c $(CFLAGS) %.i;
               \t@rm %.i;

       NOTE:  This  rule  is  shape's  built-in  implicit  rule  to compile C source files.  The cryptic command
       sequence has the purpose to encode the complete file version id into the object code (e.g.  sample.c[3.4]
       rather  than  sample.c).  This  is  extremely  useful  in  conjunction  with with the -g switch of most C
       compilers, and version sensitive debuggers, such as vgdb.

       If a target is derived using implicit rules, the name  of  the  target  is  matched  against  the  target
       patterns  of  the  implicit  rules. If a rule matches, the matching portion of the target name (the stem,
       referred to by the ``%'') is consistently substituted for all other occurrences of the wildcard character
       throughout the rule. Once this is done, the implicit rule is treated like an explicit target rule.

Explicit Rules

       Explicit  rules  associate  explicit  target  names  with explicit dependencies.  Explicit rules are most
       typically used to specify dependencies that cannot be covered by implicit  rules,  such  as  deriving  an
       executable  program  by  linking  many  object  code  modules.  In many cases, explicit rules are used to
       specify only those target dependencies that are  not  implied  by  an  implicit  rule  (such  as  include
       dependencies  for  object  files),  while the ``natural'' dependencies are assumed as being present. If a
       description file contains only this sort of explicit dependencies, the omitted implicit dependencies (and
       an applicable rule body) are automatically added by shape to the total list of target dependencies.

Built-in Implicit Rules

       Shape  provides  a  number  of  predefined  implicit  target  rules  that cover many common source/target
       derivations. The following table lists target patterns, and dependency  templates  for  shape's  built-in
       implicit rules.

       Target      Dependency  Derivation
       %.a         %.c         Compile archive library from C source
       %.c         %.l         Generate C programs from Lex grammar
       %.c         %.y         Generate C programs from Yacc grammar
       %.o         %.l         Compile object code from Lex grammar
       %.o         %.y         Compile object code from Yacc grammar
       %.o         %.s         Translate assembler program to object code
       %.o         %.r         Compile Ratfor source
       %.o         %.F         Compile Fortran source
       %.o         %.f         Compile Fortran source
       %.sym       %.def       Compile Modula definition modules
       %.o         %.mod       Compile Modula implementation modules
       %.o         %.p         Compile Pascal source
       %.o         %.c         Compile C source
       %           %.sh        Make executable program from shell-script
       %           %.r         Build executable program from Ratfor source
       %           %.F         Build executable program from Fortran source
       %           %.f         Build executable program from Fortran source
       %           %.p         Build executable program from Pascal source
       %           %.mod       Build executable program from Modula source
       %           %.c         Build executable program from C source

       For a complete definition of shape's built-in implicit rules, run shape -p.

Special Purpose Targets

       Several  aspects  of shape's operation are controlled by special purpose targets that can be put into the
       description file. Special purpose targets by convention begin  with  a  period  character,  and  have  no
       associated commands.

       Target      Purpose

       .DEFAULT:   commands  in  the  rule  body  of  the .DEFAULT target rule are executed for all targets that
                   cannot be derived by explicit or implicit target rules.  If  no  commands  at  all  shall  be
                   executed for a rule but .DEFAULT is needed for other targets, that rule can be given an empty
                   command (either a ``;'' at the end of the rule  header,  or  an  empty  line  beginning  with
                   <tab>).  If  .DEFAULT  has  dependencies, and no targets are requested from the command line,
                   these dependencies are treated as if they were targets requested from the command line.

       .IGNORE:    causes shape to ignore non zero return codes of  invoked  commands.   Equivalent  to  the  -i
                   switch

       .SILENT:    silent  command execution. The command lines are not printed before execution.  Equivalent to
                   the -s switch

       .BPOOL:     only the dependencies associated with this target are stored in the derived object cache

       .NOBPOOL:   dependencies associated with this target are not stored in the derived object cache.

       If both, .BPOOL, and .NOBPOOL are defined, only the difference set  of  both  dependency  lists  will  be
       stored in the derived object cache.

Version Selection Rules

       When  shape builds a target, it uses version selection rules to bind a unique version to each name of the
       prerequisite source objects. Version selection rules  consist  of  a  name,  and  an  associated  set  of
       predicate lists in the rule body. The format of version selection rules is:
               <name> [( <arg1>, <arg2>,...)] :-
                   \t[<pattern1>,] <pred1> (...), <pred2> (...);
                   \t[<pattern2>,] <pred1> (...), <pred2> (...);
                   ...
                   \t.
       The  body  of  a  version selection rule consists of a sequence of alternatives, separated by semicolons.
       Each of the alternatives is an optional pattern, followed by a comma-separated list  of  predicates.  The
       selection rule is terminated by a period character. The semicolon-separated sequence of alternatives in a
       version selection rule constitutes a logical OR expression. The comma-separated list of predicates in  an
       alternative constitutes a logical AND expression.

       Version Binding

       Version  binding  is the process of determining exactly one version of a given source object from the set
       of all available versions. Version binding is said to succeed if one of the rule  alternatives  succeeds.
       An  alternative  succeeds,  if  it leads to the identification of exactly one version. It is said to fail
       otherwise.  When shape binds a version to the name of a source object, it tries each alternative  with  a
       matching  pattern,  until  the  name  is unambiguously bound to a version. If the pattern is omitted, the
       alternative will be tried unconditionally.

       The functioning of version selection rules is one of shape's most important, yet most subtile aspects. In
       order  to  provide  a basis for an intuitive understanding of the selection rule mechanism, an example is
       described. The rule most_recent, below, binds:
       - files that were checked out for modification by the shape-invoking user
       - versions of files that were recently modified (→ status saved) by the same user
       - the most recently proposed version (→ status proposed) of files modified by other users,
       - or the file version from the last release.

           LASTRELEASE := `lastrelease`# "lastrelease" returns the name
                                    # of the last release
           most_recent :-
               eq (status, busy), exists ($+[locked_by($(LOGNAME)):]);
               ge (status, saved), max (mtime),
                 max (version), eq (author, $(LOGNAME));
               ge (status, proposed), max (mtime),
                 max (version);
               eq (__SymbolicName__, $(LASTRELEASE));
               cut ($_rule$: couldn't bind $+ as requested!).

           locked_by (user_id) :-
               max (version), eq (locker, $_user_id$).

       For a more detailed description of version selection rule syntax, semantics, and  the  list  of  built-in
       predicates, see BindRules(7).

       Activation of Version Selection Rules

       A version selection for a certain target is invoked by specifying the name of the selection rule as first
       dependency of a target, or by supplying a selection rule name as  argument  to  the  -R  option.   If  no
       selection rule is specified explicitly, shape uses its built-in version selection rule that tries to bind
       a regular file, or the most recent version to the name of an object.

Variants

       The term variant refers to the intention to manage a product that must  comply  with  different  sets  of
       varying  external constraints as a unit. Independently from particular semantics that might be associated
       with the variant notion, there exists a small number of techniques to implement software variation  on  a
       technical level. These techniques are:

       physical  separation of variant components. This is achieved by maintaining separate copies of components
       in different directories, or by maintaining variant specific branches in version control systems;

       source preprocessing of variant components. With this technique, multiple logical variants  of  a  source
       component  are  maintained  in a single file that contains preprocessor instructions. Before a particular
       variant can be accessed, a preprocessor must extract it from the common source. A popular example of this
       technique is conditional compilation, controlled by the #if, and #ifdef instructions within the domain of
       C/C++ programming;

       composition variation of complex product variants. This  technique  addresses  the  case  when  different
       variants of a complex product (such as a program) are composed from different sets of components;

       derivation  variation  (or  variation of the process) that produces different variants of derived objects
       from the same set of sources by modifying parameters of the derivation process.  A  typical  example  for
       this   case  is  cross  compilation  of  the  same  sources  for  different  target  platforms,  or  code
       instrumentation for various purposes, such as debugging, testing, profiling, or optimization.

       Depending on the particular needs of a project, all of these techniques may be in simultaneous  use,  and
       can  occur  intermixed  as  appropriate.  Shape  allows  to associate logical variant names with a set of
       definitions that control all of the above mentioned techniques, making it possible to request  builds  of
       particular  system variants (and combinations of compatible variants) without the need to worry about how
       these variants are realized technically.

Variant Definitions

       Shape derives its flexibility from using macro substitution in the description  file  wherever  possible.
       Shape  variant definitions are basically groups of macro definitions that take effect when the variant is
       activated for a build. A variant definition has the following format:

               <variant-name> :+
                   \t<Macro name1>=<Value>
                   ...

       When a variant is activated, the macro definitions associated with  the  variant  become  effective.  Any
       previous  definition  of  a macro made in the description file, or on the command line is replaced by the
       variant macro substitution. If a macro is defined in several variants that are  activated  together,  the
       respective values are concatenated.

       Locating physically separate Variant Source Objects

       Shape  provides  a  special  macro,  vpath, that is intended to be used in variant definitions. The vpath
       macro defines shape's search precedence when source version archives are located. If vpath is  non-empty,
       shape  tries  to  find  any referenced source object in the vpath directories first. If several activated
       variants define vpath, the variant search path is concatenated and searched from right to left, i.e.  the
       last  variant  that  has  been  activated has precedence. Only if a referenced source component cannot be
       found in any of the vpath directories, the current directory is searched.  If a source  object  has  been
       found,  it will be bound by the current version selection rule, and be temporarily installed in the build
       directory. This means that components which are maintained in a vpath subdirectory are temporarily  moved
       up to the main directory. Thus, it is not necessary to make any reference to a vpath subdirectory path in
       the target rules.

       Variant Activation

       When a product is configured and built, variants are typically activated by supplying a variant  name  as
       argument to the -V options.

       Variants  can also be activated for a given target by specifying respective, ``+''-prefixed variant names
       as dependencies (see section on Target Rules, above). Variant activations for a target must occur  before
       any  real  object  dependency  on  the  dependency  line,  and  after the optional version selection rule
       activation.

Variant Class Definitions

       With Variant class definitions, shape offers a construct that allows  to  define  incompatible  variants,
       i.e. variants that cannot be activated simultaneously. Shape variant class definitions have the following
       format:

               vclass <variant-class-name>  ::= ( <var1>, <var2> ...)

       The same variant name can occur in multiple variant class definitions.  If a combination of  variants  is
       requested with any two variant names that are member of the same variant class, shape will issue an error
       message, and terminate. Checking of variant classes can be disabled by specifying the -novclass switch on
       the command line.

       NOTE:  variant  class  definitions  must  occur  in  the  description  file before any variant definition
       referenced in a variant class.  Variant classes that are defined after referenced variants cannot enforce
       mutual exclusion of incompatible variants.

       An Example

       The following example shall illustrate the use of variant definitions, and variant classes:

           vclass compiler ::= (gnu, prop)

           gnu:+
               CC = gcc -Wall
               OPTIMIZE = -O2 -inline-functions
               DEBUG = -g -g3
               PROFILE = -pg -a
               STDC = -ansi

           prop:+
               CC = cc
               OPTIMIZE = +O3
               DEBUG = -g -z +Y
               PROFILE = -G
               STDC = -Aa

           vclass quality ::= (debug, profile, optimize)

           debug:+
               VARCFLAGS = $(DEBUG)

           profile:+
               VARCFLAGS = $(PROFILE)

           optimize:+
               VARCFLAGS = $(OPTIMIZE)

           CFLAGS += $(VARCFLAGS)

       If a variant requires the modification of macros with predefined meaning, it is sometimes a good idea not
       to redefine the macro itself in the variant section. In such a case it is possible to augment an existing
       macro  value by using shape's additive macro definition facility, and a macro from the variant definition
       defined for this purpose (e.g. VARCFLAGS in the example above).

OPERATION

       When invoked, shape first parses the command line.  Shape  records  the  names  of  the  variants  to  be
       activated  from  the  command  line  via the -V option. Next, shape initializes the built-in, and special
       macros. Also, shape's built-in derivation rules are initialized.

       Reading the Description File

       After that, all macro definitions made on the command line are made effective.  Shape  then  locates  and
       opens its description file. If no description file is specified as argument to the -f option, shape tries
       to find one of the files Shapefile, shapefile, Makefile, or makefile.  For each  of  these  names,  shape
       tries  to find a regular file first, and, if no such file exists, to find the most recent version of that
       file in a version control archive. If no such version can be found, shape tries the next name.

       When shape reads the description file, it collects all macro  definitions,  and  makes  them  immediately
       effective,  unless  a  macro  of the same name has been defined on the command line. If the special macro
       IMPORT is encountered, the listed environment variables are defined as macros. If macros  with  the  same
       name  as  an  imported  environment  variable  occurs in the description file, it has precedence over the
       definition from the environment, unless the -e switch is in effect.

       When shape reads an include directive, it evaluates the rest  of  the  line  (i.e.  the  characters  that
       immediately follow the directive), and interprets each word as the name of a file to be read. Each of the
       file names is bound to either a regular file, or the most recent version of the file. Shape opens each of
       the  included files, suspends reading the current description file, and continues to read the contents of
       the included file(s), before it resumes reading of the original control file. If multiple file names  are
       specified in an include directive, shape reads each of the files in turn, starting with the leftmost, and
       ending with the rightmost file name. If an included file could not be opened, shape issues a warning.

       While shape reads its description files, version selection rules, and target rules  are  collected.  They
       are  defined  only  after  shape has finished reading the description file. Macro-, variant-, and variant
       class definitions are made effective as soon as they have been recognized.

       The Build Process

       After the description file has been read, shape determines which targets have been requested. If  targets
       have  been  requested  from the command line, shape will attempt to build each of them, starting with the
       leftmost target and proceeding towards the rightmost. If no target has been requested  from  the  command
       line, shape searches the description file for a target named .DEFAULT. If such a target exists, and there
       are any dependencies associated with it, shape will attempt to build each  of  these  dependencies,  from
       left to right. If no .DEFAULT target rule has been defined in the description file, shape will attempt to
       build the first target defined in the description file.

       When shape builds a target, it proceeds as follows:

       1)
          determine the names of the source objects for a given target by traversing the dependency graph, using
          built-in and user supplied target rules. The dependency graph is traversed depth first. The ids of all
          applied rules are recorded.

       2)
          for each required source object, locate the source version archive  in  the  repository.  Locating  of
          source version archives takes the current vpath into account.

       3)
          bind  each  of  the source object's names to an appropriate version as implied by the currently active
          version selection rule. Record the id of each bound dependency. If a dependency is  itself  a  derived
          object, use its cache key as id.

       4)
          construct  the  derivation  key  for the current target from the target name and the records resulting
          from steps 1) and 3).

       5)
          search the derived object cache for an  object  that  has  a  derivation  key  identical  to  the  key
          constructed in step 4).

       6a)
          if  an  appropriate derived object was found, a copy of it is installed in the build directory, rather
          than deriving it from its sources.

       6b)
          if no appropriate derived object was found, it is created by deriving it from its parts. The resulting
          derived  object is put into the derived object cache, and associated with the derivation key resulting
          from step 4).

       Targets with an empty list of dependencies - and thus an empty derivation key - are always (re-) derived.

       When shape determines the dependencies of a requested target, it does so by  evaluating  either  explicit
       target  rules,  or  by  applying  -  possibly built-in - implicit rules. If explicit target rules specify
       object dependencies but no derivation  script  in  the  rule  body,  shape  will  attempt  to  supply  an
       appropriate  default  derivation script. When searching for such a default derivation script, shape tries
       to find an applicable implicit rule for the current target. An implicit rule is considered applicable, if
       it  has  the  current target in its list of targets (after pattern substitution), and all - explicit, and
       implied - dependencies exist. If no implicit rule is found to be applicable, shape looks for the .DEFAULT
       target  rule. If such a rule exists, and if it has an associated derivation script in its rule body, this
       script will be supplied as default derivation script. If neither of the  two  possibilities  leads  to  a
       default derivation script, shape gives up.

       Derived Object Caching

       Before  the  derivation  process  for  a  requested target is started, it is attempted to find a suitable
       derived object in the derived object cache that matches the required properties. Shape is  based  on  the
       derivation  key  concept for target objects. The derivation key is constructed according to the algorithm
       described above. Relevant parameters that go into the derivation key are the list of dependency ids,  the
       target  rule  id,  the  list  of production ingredients, the build platform (usually defined by the macro
       HOSTTYPE; if this macro is not defined, shape takes the host id as build  platform),  and  the  attribute
       expansion  status  of each source object. When an object has been derived, shape stores it in the derived
       object cache, and marks it with the derivation key attribute.  For a detailed trace  of  shape's  derived
       object cache handling, and the use of derivation keys, run shape with the -D switch.

       Command Execution

       When  a  target needs to be (re-) derived, shape executes the commands associated with the target. Before
       the commands are executed, shape sets up the command  execution  context.  The  version  objects  of  the
       target's  dependencies  are  installed as regular files in the file system. If necessary, shape retrieves
       source objects from the version control archive. If a file with the object's name already exists  in  the
       place  where a version is to be installed, shape will temporarily move it to the AtFS subdirectory. After
       the command script has completed, shape will restore the original state of all affected directories.

       Shape executes a command line by starting the program referenced in the $(SHELL)  macro,  and  opening  a
       pipe  to  the  resulting process.  The command line is written to the pipe, and thus sent to the $(SHELL)
       process' standard input.

       Each of the command lines in a rule body are executed by a separate process. Thus, the  execution  status
       of  separate commands is not preserved. If multiple commands are needed that rely on the execution status
       of previous commands, all these commands must occur in a single command line. This is possible with  line
       continuations (see section on Syntactical Structure, above).
       NOTE:  many  command  interpreters  use  the  ``$''  character  as  special symbol (typically as variable
       reference). Make sure to pass ``$'' characters in commands to the $(SHELL) process by  using  the  ``$$''
       special macro (see section on Macro References, above).

INCOMPATIBILITIES

       In order to facilitate migration from make(1), shape was designed to be upward compatible with Makefiles.
       Although most of  make's  description  file  features  are  present  in  shape,  there  is  a  number  of
       incompatibilities  that may need to be taken care of. There exists also a number of popular extensions of
       the original make program (e.g. Sun's Make, HP's Make, GNU Make, nmake etc.) that offer  various  special
       features that aren't supported by other make extensions, or by shape. When a migration from make to shape
       is planned, it should be checked whether special extensions or incompatible features are used.

       Features not supported by shape

       Double colon rules
              Double colon rules associate the same target with different derivation scripts. This type of  rule
              is useful to support different derivations for a target depending on which dependencies are out of
              date. Because shape bases its decision whether to derive on the derivation key, rather  than  mere
              modification time stamps of files, this sort of rule makes no sense in shape.

       Archive member targets
              Archive  member  targets are objects that live in an archive file (see ar(1)) rather than the file
              system. Within these archives, make bases its decisions on the modification time stamps of  source
              files,  and  archive  entry dates. There is no way for shape to simulate the concept of derivation
              keys for archive members. Maintenance of archives, however, is easy with shape, because  all  data
              for  compiled  object files is maintained in the derived object cache. If the source for an object
              that is stored in an archive is modified, shape can rederive this object, and selectively  replace
              the entry in the archive.

       SCCS stuff
              In order to provide basic support for team oriented development processes, make allows to retrieve
              the most recent version of source  files  from  SCCS  archives.  Because  of  the  awkward  naming
              convention  for SCCS version archive files, special support for dealing with these archives had to
              be built into make. Because shape is tightly integrated with the AtFS version  object  repository,
              there is no need for any special SCCS support.

       Special targets
              Shape  does  not recognize the special targets .PRECIOUS:, and .SUFFIXES:. The .PRECIOUS target in
              Makefiles has the purpose to prevent deletion of  expensively  derived  intermediate  targets  (by
              default,  make  deletes  intermediate  targets).  Because shape stores intermediate targets in the
              derived object cache, there is no need for the .PRECIOUS feature. To prevent caching  of  possibly
              large,  useless  intermediate  targets,  use  the .NOBPOOL: special target (see section on Special
              Targets, above). The .SUFFIXES target in Makefiles has the purpose to introduce new  suffix  types
              into make's derivation engine, and to determine the order in which implicit rules (suffix rules in
              make terminology) are applied. In shape, new suffix types can  be  added  dynamically,  simply  by
              introducing  new  implicit  rules. Moreover, shape has an intelligent algorithm the determines the
              applicable implicit rule.

       Features with different semantics

       Environment Variables
              Many make programs import the entire set of environment variables as macro  definitions  into  the
              build  process. This can sometimes produce surprising results. In shape, environment variables are
              explicitly imported with the IMPORT special macro.

       ? Macro
              In make's target rules, the special macro reference $?  is  substituted  by  the  names  of  those
              dependency  file  names  that have been updated since the current target has been derived. Because
              shape bases its decision whether to derive on the concept of derivation key, rather than mere file
              modification time stamps, the ?  macro cannot be correctly defined. Instead, shape substitutes the
              entire list of dependency names - updated or not.

FILES

       Shapefile, shapefile, Makefile, makefile, /tmp/shapeXXXXXX, <target name>.bct

SEE ALSO

       make(1), save(1), retrv(1), vadm(1), vl(1), vgdb(1), vbind(1), afintro(3), atfstkintro(3),  sttkintro(3),
       bindrules(7)

CAVEATS AND BUGS

       Macro  references  containing  string  substitutions  cause  a  syntax  error  if used in place of target
       dependencies. Workaround: use indirect macro substitution.

       There are probably more bugs in shape. Please report any bug findings to shape-cr@cs.tu-berlin.de.

FURTHER READING

       Axel Mahler:
                 ``Using the Shape Toolkit for Cooperative Software Development - A Tutorial'', in  the  toolkit
                 distribution.

       Axel Mahler and Andreas Lampen:
                 ``An  Integrated  Toolset  for Engineering Software Configurations'', Sigplan Notices, Vol. 24,
                 No. 2, or Software Engineering Notes, Vol.  13, No. 5, November 1988.

       Andreas Lampen and Axel Mahler:
                 ``An Object Base  for  Attributed  Software  Objects'',  Proceedings  of  the  Fall  1988  EUUG
                 Conference.

       These and other papers are available via anonymous ftp from coma.cs.tu-berlin.de (pub/shapeTools/papers).

AUTHOR

       Shape  was  designed by the shape project team at Technical University Berlin. The program was originally
       implemented by Wolfgang Obst (1988). Extensive fixes and modifications were  introduced  by  Axel  Mahler
       (1992).  Valuable contributions came from Steve Emmerson. In 1993 most parts of shape were re-implemented
       by Axel Mahler. The version binding was re-implemented by Andreas Lampen. A complete re-implementation of
       the Shapefile parser was done by Juergen Nickelsen.

       Contact:
       SHAPE
       Technical University Berlin
       Sekr. FR 5-6
       Franklinstr. 28/29
       10587 Berlin

       General correspondence: shape@cs.tu-berlin.de
       Bug reports and modification requests: shape-cr@cs.tu-berlin.de