make: Selective Search

 
 4.5.2 The 'vpath' Directive
 ---------------------------
 
 Similar to the 'VPATH' variable, but more selective, is the 'vpath'
 directive (note lower case), which allows you to specify a search path
 for a particular class of file names: those that match a particular
 pattern.  Thus you can supply certain search directories for one class
 of file names and other directories (or none) for other file names.
 
    There are three forms of the 'vpath' directive:
 
 'vpath PATTERN DIRECTORIES'
      Specify the search path DIRECTORIES for file names that match
      PATTERN.
 
      The search path, DIRECTORIES, is a list of directories to be
      searched, separated by colons (semi-colons on MS-DOS and
      MS-Windows) or blanks, just like the search path used in the
      'VPATH' variable.
 
 'vpath PATTERN'
      Clear out the search path associated with PATTERN.
 
 'vpath'
 
      Clear all search paths previously specified with 'vpath'
      directives.
 
    A 'vpath' pattern is a string containing a '%' character.  The string
 must match the file name of a prerequisite that is being searched for,
 the '%' character matching any sequence of zero or more characters (as
 in pattern rules; SeeDefining and Redefining Pattern Rules Pattern
 Rules.).  For example, '%.h' matches files that end in '.h'.  (If there
 is no '%', the pattern must match the prerequisite exactly, which is not
 useful very often.)
 
    '%' characters in a 'vpath' directive's pattern can be quoted with
 preceding backslashes ('\').  Backslashes that would otherwise quote '%'
 characters can be quoted with more backslashes.  Backslashes that quote
 '%' characters or other backslashes are removed from the pattern before
 it is compared to file names.  Backslashes that are not in danger of
 quoting '%' characters go unmolested.
 
    When a prerequisite fails to exist in the current directory, if the
 PATTERN in a 'vpath' directive matches the name of the prerequisite
 file, then the DIRECTORIES in that directive are searched just like (and
 before) the directories in the 'VPATH' variable.
 
    For example,
 
      vpath %.h ../headers
 
 tells 'make' to look for any prerequisite whose name ends in '.h' in the
 directory '../headers' if the file is not found in the current
 directory.
 
    If several 'vpath' patterns match the prerequisite file's name, then
 'make' processes each matching 'vpath' directive one by one, searching
 all the directories mentioned in each directive.  'make' handles
 multiple 'vpath' directives in the order in which they appear in the
 makefile; multiple directives with the same pattern are independent of
 each other.
 
    Thus,
 
      vpath %.c foo
      vpath %   blish
      vpath %.c bar
 
 will look for a file ending in '.c' in 'foo', then 'blish', then 'bar',
 while
 
      vpath %.c foo:bar
      vpath %   blish
 
 will look for a file ending in '.c' in 'foo', then 'bar', then 'blish'.