Provided by: shapetools_1.4pl6-15_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

shape_CM-4.9                                Thu Jul  8 01:21:47 1993                                    shape(1)