Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
BMAKE(1)		    General Commands Manual		      BMAKE(1)

NAME
       bmake --	maintain program dependencies

SYNOPSIS
       bmake   [-BeikNnqrSstWwX]  [-C  directory]  [-D	variable]  [-d	flags]
	     [-f  makefile]  [-I  directory]  [-J   private]   [-j   max_jobs]
	     [-m   directory]	[-T   file]   [-V   variable]	[-v  variable]
	     [variable=value] [target ...]

DESCRIPTION
       bmake is	a program designed to simplify the maintenance of  other  pro-
       grams.	Its  input  is	a  list	of specifications as to	the files upon
       which programs and other	files depend.  If no  -f  makefile  option  is
       given,  bmake tries to open `makefile' then `Makefile' in order to find
       the specifications.  If the file	`.depend'  exists,  it	is  read,  see
       mkdep(1).

       This  manual page is intended as	a reference document only.  For	a more
       thorough	description of bmake and makefiles, please refer to PMake -  A
       Tutorial	(from 1993).

       bmake  prepends	the  contents of the MAKEFLAGS environment variable to
       the command line	arguments before parsing them.

       The options are as follows:

       -B      Try to be backwards compatible by executing a single shell  per
	       command	and  by	making the sources of a	dependency line	in se-
	       quence.

       -C directory
	       Change to directory before reading the makefiles	or doing  any-
	       thing  else.  If	multiple -C options are	specified, each	is in-
	       terpreted relative to the previous one: -C / -C etc is  equiva-
	       lent to -C /etc.

       -D variable
	       Define variable to be 1,	in the global scope.

       -d [-]flags
	       Turn  on	 debugging, and	specify	which portions of bmake	are to
	       print debugging information.  Unless the	flags are preceded  by
	       `-',  they  are added to	the MAKEFLAGS environment variable and
	       are passed on to	any child make processes.  By default,	debug-
	       ging  information is printed to standard	error, but this	can be
	       changed using the F debugging flag.  The	 debugging  output  is
	       always unbuffered; in addition, if debugging is enabled but de-
	       bugging output is not directed to standard output, the standard
	       output is line buffered.	 The available flags are:

	       A       Print all possible debugging information; equivalent to
		       specifying all of the debugging flags.

	       a       Print debugging information about archive searching and
		       caching.

	       C       Print  debugging	 information about the current working
		       directory.

	       c       Print debugging information about  conditional  evalua-
		       tion.

	       d       Print  debugging	 information about directory searching
		       and caching.

	       e       Print debugging information about failed	 commands  and
		       targets.

	       F[+]filename
		       Specify	where  debugging output	is written.  This must
		       be the last flag, because it consumes the remainder  of
		       the argument.  If the character immediately after the F
		       flag  is	`+', the file is opened	in append mode;	other-
		       wise the	file is	overwritten.   If  the	file  name  is
		       `stdout'	 or  `stderr',	debugging output is written to
		       the standard output or standard	error  output  respec-
		       tively  (and the	`+' option has no effect).  Otherwise,
		       the output is written to	the named file.	 If  the  file
		       name ends with `.%d', the `%d' is replaced by the pid.

	       f       Print debugging information about loop evaluation.

	       g1      Print the input graph before making anything.

	       g2      Print  the  input graph after making everything,	or be-
		       fore exiting on error.

	       g3      Print the input graph before exiting on error.

	       h       Print debugging information  about  hash	 table	opera-
		       tions.

	       j       Print  debugging	 information  about  running  multiple
		       shells.

	       L       Turn on lint checks.  This throws errors	 for  variable
		       assignments that	do not parse correctly,	at the time of
		       assignment, so the file and line	number are available.

	       l       Print  commands	in  Makefiles regardless of whether or
		       not they	are prefixed by	`@' or	other  "quiet"	flags.
		       Also known as "loud" behavior.

	       M       Print debugging information about "meta"	mode decisions
		       about targets.

	       m       Print  debugging	 information about making targets, in-
		       cluding modification dates.

	       n       Don't delete the	temporary command scripts created when
		       running commands.  These	temporary scripts are  created
		       in  the directory referred to by	the TMPDIR environment
		       variable, or in /tmp if TMPDIR is unset or set  to  the
		       empty  string.	The  temporary	scripts	are created by
		       mkstemp(3), and have  names  of	the  form  makeXXXXXX.
		       NOTE:  This can create many files in TMPDIR or /tmp, so
		       use with	care.

	       p       Print debugging information about makefile parsing.

	       s       Print debugging information about suffix-transformation
		       rules.

	       t       Print debugging information about target	 list  mainte-
		       nance.

	       V       Force  the  -V option to	print raw values of variables,
		       overriding    the    default    behavior	   set	   via
		       .MAKE.EXPAND_VARIABLES.

	       v       Print  debugging	 information about variable assignment
		       and expansion.

	       x       Run shell commands with -x so the actual	 commands  are
		       printed as they are executed.

       -e      Let  environment	 variables  override  global  variables	within
	       makefiles.

       -f makefile
	       Specify a makefile to read instead of the default  makefile  or
	       Makefile.   If makefile is `-', standard	input is read.	Multi-
	       ple makefiles may be specified, and are read in the order spec-
	       ified.

       -I directory
	       Specify a directory in which to search for  makefiles  and  in-
	       cluded  makefiles.   The	system makefile	directory (or directo-
	       ries, see the -m	option)	is automatically included as  part  of
	       this list.

       -i      Ignore non-zero exit of shell commands in the makefile.	Equiv-
	       alent  to  specifying `-' before	each command line in the make-
	       file.

       -J private
	       This option should not be specified by the user.

	       When the	-j option is in	use in a recursive build, this	option
	       is  passed  by  a  make	to  child  makes to allow all the make
	       processes in the	build to cooperate to  avoid  overloading  the
	       system.

       -j max_jobs
	       Specify	the maximum number of jobs that	bmake may have running
	       at any one time.	 The value of max_jobs is saved	in .MAKE.JOBS.
	       Turns compatibility mode	off, unless  the  -B  option  is  also
	       specified.   When compatibility mode is off, all	commands asso-
	       ciated with a target are	executed in a single shell  invocation
	       as  opposed  to	the traditional	one shell invocation per line.
	       This can	break traditional scripts which	change directories  on
	       each  command  invocation and then expect to start with a fresh
	       environment on the next line.  It is more efficient to  correct
	       the scripts rather than turn backwards compatibility on.

	       A  job  token  pool with	max_jobs tokens	is used	to control the
	       total number of jobs running.  Each instance of bmake will wait
	       for a token from	the pool before	running	a new job.

       -k      Continue	processing after errors	are encountered, but  only  on
	       those  targets  that do not depend on the target	whose creation
	       caused the error.

       -m directory
	       Specify a directory in which to search for sys.mk and makefiles
	       included	via the	<file>-style include statement.	 The -m	option
	       can be used multiple times to form a search  path.   This  path
	       overrides  the default system include path /usr/share/mk.  Fur-
	       thermore, the system include path is  appended  to  the	search
	       path  used  for "file"-style include statements (see the	-I op-
	       tion).  The system include path can be referenced via the read-
	       only variable .SYSPATH.

	       If a directory name in the -m argument (or the MAKESYSPATH  en-
	       vironment  variable)  starts  with  the	string	`.../',	 bmake
	       searches	for the	specified file or directory named in  the  re-
	       maining	part  of  the argument string.	The search starts with
	       the current directory and then works upward towards the root of
	       the file	system.	 If the	search is  successful,	the  resulting
	       directory replaces the `.../' specification in the -m argument.
	       This  feature  allows  bmake  to	 easily	 search	in the current
	       source  tree  for  customized  sys.mk  files  (e.g.,  by	 using
	       `.../mk/sys.mk' as an argument).

       -n      Display	the commands that would	have been executed, but	do not
	       actually	execute	them unless the	target depends	on  the	 .MAKE
	       special source (see below) or the command is prefixed with `+'.

       -N      Display	the commands that would	have been executed, but	do not
	       actually	execute	any of them; useful  for  debugging  top-level
	       makefiles without descending into subdirectories.

       -q      Do  not	execute	 any commands, instead exit 0 if the specified
	       targets are up to date, and 1 otherwise.

       -r      Do not use the built-in rules specified in the system makefile.

       -S      Stop processing if an error is encountered.  This  is  the  de-
	       fault behavior and the opposite of -k.

       -s      Do  not	echo any commands as they are executed.	 Equivalent to
	       specifying `@' before each command line in the makefile.

       -T tracefile
	       When used with the -j flag, append a trace record to  tracefile
	       for each	job started and	completed.

       -t      Rather  than re-building	a target as specified in the makefile,
	       create it or update its modification time to make it appear up-
	       to-date.

       -V variable
	       Print the value of variable.  Do	not build any targets.	Multi-
	       ple instances of	this option may	be  specified;	the  variables
	       are  printed  one  per line, with a blank line for each null or
	       undefined variable.  The	value printed is  extracted  from  the
	       global scope after all makefiles	have been read.

	       By  default, the	raw variable contents (which may include addi-
	       tional unexpanded variable references) are shown.  If  variable
	       contains	 a  `$',  it is	not interpreted	as a variable name but
	       rather as an expression.	 Its value is expanded	before	print-
	       ing.    The   value   is	  also	expanded  before  printing  if
	       .MAKE.EXPAND_VARIABLES is set to	true and the  -dV  option  has
	       not been	used to	override it.

	       Note  that  loop-local  and  target-local variables, as well as
	       values taken temporarily	by global  variables  during  makefile
	       processing,  are	not accessible via this	option.	 The -dv debug
	       mode can	be used	to see these at	the cost  of  generating  sub-
	       stantial	extraneous output.

       -v variable
	       Like -V,	but all	printed	variables are always expanded to their
	       complete	 value.	  The  last  occurrence	 of  -V	 or -v decides
	       whether all variables are expanded or not.

       -W      Treat any warnings during makefile parsing as errors.

       -w      Print entering and leaving directory  messages,	pre  and  post
	       processing.

       -X      Don't  export variables passed on the command line to the envi-
	       ronment individually.  Variables	passed on the command line are
	       still exported via the MAKEFLAGS	 environment  variable.	  This
	       option may be useful on systems which have a small limit	on the
	       size of command arguments.

       variable=value
	       Set the value of	the variable variable to value.	 Normally, all
	       values  passed  on  the	command	line are also exported to sub-
	       makes in	the environment.  The -X flag disables this  behavior.
	       Variable	 assignments  should follow options for	POSIX compati-
	       bility but no ordering is enforced.

       There are several different types of lines in  a	 makefile:  dependency
       specifications,	shell  commands,  variable assignments,	include	state-
       ments, conditional directives, for loops, other	directives,  and  com-
       ments.

       Lines  may be continued from one	line to	the next by ending them	with a
       backslash (`\').	 The trailing newline character	and initial whitespace
       on the following	line are compressed into a single space.

FILE DEPENDENCY	SPECIFICATIONS
       Dependency lines	consist	of one or more targets,	an operator, and  zero
       or  more	 sources.   This  creates  a  relationship  where  the targets
       "depend"	on the sources and are customarily created from	them.  A  tar-
       get is considered out of	date if	it does	not exist, or if its modifica-
       tion time is less than that of any of its sources.  An out-of-date tar-
       get  is	re-created,  but  not until all	sources	have been examined and
       themselves re-created as	needed.	 Three operators may be	used:

       :     Many dependency lines may name this target	but only one may  have
	     attached  shell  commands.	  All  sources named in	all dependency
	     lines are considered together, and	if needed the  attached	 shell
	     commands  are run to create or re-create the target.  If bmake is
	     interrupted, the target is	removed.

       !     The same, but the target is always	re-created whether or  not  it
	     is	out of date.

       ::    Any  dependency  line  may	have attached shell commands, but each
	     one is handled independently: its sources are considered and  the
	     attached shell commands are run if	the target is out of date with
	     respect  to  (only) those sources.	 Thus, different groups	of the
	     attached shell commands may  be  run  depending  on  the  circum-
	     stances.	Furthermore,  unlike  :,  for dependency lines with no
	     sources, the attached shell commands are always run.  Also	unlike
	     :,	the target is not removed if bmake is interrupted.

       All dependency lines mentioning a particular target must	use  the  same
       operator.

       Targets	and  sources  may  contain the shell wildcard values `?', `*',
       `[]', and `{}'.	The values `?',	`*', and `[]' may only be used as part
       of the final component of the target or source, and only	match existing
       files.  The value `{}' need not necessarily be used to describe	exist-
       ing files.  Expansion is	in directory order, not	alphabetically as done
       in the shell.

SHELL COMMANDS
       Each target may have associated with it one or more lines of shell com-
       mands,  normally	 used to create	the target.  Each of the lines in this
       script must be preceded by a tab.  (For historical reasons, spaces  are
       not accepted.)  While targets can occur in many dependency lines	if de-
       sired, by default only one of these rules may be	followed by a creation
       script.	 If  the `::' operator is used,	however, all rules may include
       scripts,	and the	respective scripts are executed	in the order found.

       Each line is treated as a separate shell	command,  unless  the  end  of
       line  is	 escaped with a	backslash `\', in which	case that line and the
       next are	combined.  If the first	characters of the command are any com-
       bination	of `@',	`+', or	`-', the command is treated specially.

	     @	     causes the	command	not to be echoed  before  it  is  exe-
		     cuted.

	     +	     causes  the command to be executed	even when -n is	given.
		     This is similar  to  the  effect  of  the	.MAKE  special
		     source, except that the effect can	be limited to a	single
		     line of a script.

	     -	     in	 compatibility mode causes any non-zero	exit status of
		     the command line to be ignored.

       When bmake is run in jobs mode with -j max_jobs,	the entire script  for
       the  target is fed to a single instance of the shell.  In compatibility
       (non-jobs) mode,	each command is	run in a  separate  process.   If  the
       command	contains any shell meta	characters (`#=|^(){};&<>*?[]:$`\\n'),
       it is passed to the shell; otherwise bmake attempts  direct  execution.
       If  a line starts with `-' and the shell	has ErrCtl enabled, failure of
       the command line	is ignored as in compatibility	mode.	Otherwise  `-'
       affects the entire job; the script stops	at the first command line that
       fails, but the target is	not deemed to have failed.

       Makefiles  should  be  written so that the mode of bmake	operation does
       not change their	behavior.  For example,	any command which uses "cd" or
       "chdir" without the intention of	changing the directory for  subsequent
       commands	should be put in parentheses so	it executes in a subshell.  To
       force  the  use of a single shell, escape the line breaks so as to make
       the whole script	one command.  For example:

	     avoid-chdir-side-effects:
		     @echo "Building $@	in $$(pwd)"
		     @(cd ${.CURDIR} &&	${MAKE}	$@)
		     @echo "Back in $$(pwd)"

	     ensure-one-shell-regardless-of-mode:
		     @echo "Building $@	in $$(pwd)"; \
		     (cd ${.CURDIR} && ${MAKE} $@); \
		     echo "Back	in $$(pwd)"

       Since bmake changes the current working directory to  `.OBJDIR'	before
       executing  any targets, each child process starts with that as its cur-
       rent working directory.

VARIABLE ASSIGNMENTS
       Variables in make behave	much like macros in the	C preprocessor.

       Variable	assignments have the form `NAME	op value', where:

	     NAME    is	a single-word variable name, consisting, by tradition,
		     of	all upper-case letters,

	     op	     is	one of the variable assignment operators described be-
		     low, and

	     value   is	interpreted according to the variable assignment oper-
		     ator.

       Whitespace around NAME, op and value is discarded.

   Variable assignment operators
       The five	operators that assign values to	variables are:

       =       Assign the value	to the variable.  Any previous value is	 over-
	       written.

       +=      Append the value	to the current value of	the variable, separat-
	       ing them	by a single space.

       ?=      Assign the value	to the variable	if it is not already defined.

       :=      Expand the value, then assign it	to the variable.

	       NOTE: References	to undefined variables are not expanded.  This
	       can cause problems when variable	modifiers are used.

       !=      Expand  the  value and pass it to the shell for execution, then
	       assign the output from the child's standard output to the vari-
	       able.  Any newlines in the result are replaced with spaces.

   Expansion of	variables
       In most contexts	where variables	are expanded, `$$' expands to a	single
       dollar sign.  In	other contexts (most variable modifiers, string	liter-
       als in conditions), `\$'	expands	to a single dollar sign.

       References  to  variables  have	 the   form   ${name[:modifiers]}   or
       $(name[:modifiers]).   If  the  variable	name consists of only a	single
       character and the expression contains  no  modifiers,  the  surrounding
       curly braces or parentheses are not required.  This shorter form	is not
       recommended.

       If  the	variable  name	contains a dollar, the name itself is expanded
       first.  This allows almost arbitrary variable names, however names con-
       taining dollar, braces,	parentheses  or	 whitespace  are  really  best
       avoided.

       If the result of	expanding a nested variable expression contains	a dol-
       lar sign	(`$'), the result is subject to	further	expansion.

       Variable	substitution occurs at four distinct times, depending on where
       the variable is being used.

       1.   Variables in dependency lines are expanded as the line is read.

       2.   Variables  in  conditionals	are expanded individually, but only as
	    far	as necessary to	determine the result of	the conditional.

       3.   Variables in shell commands	are expanded when the shell command is
	    executed.

       4.   .for loop index variables are expanded  on	each  loop  iteration.
	    Note that other variables are not expanded when composing the body
	    of a loop, so the following	example	code:

		  .for i in 1 2	3
		  a+=	  ${i}
		  j=	  ${i}
		  b+=	  ${j}
		  .endfor

		  all:
			  @echo	${a}
			  @echo	${b}

	    prints:

		  1 2 3
		  3 3 3

	    After the loop is executed:

		  a	  contains `${:U1} ${:U2} ${:U3}', which expands to `1
			  2 3'.

		  j	  contains `${:U3}', which expands to `3'.

		  b	  contains  `${j} ${j} ${j}', which expands to `${:U3}
			  ${:U3} ${:U3}' and further to	`3 3 3'.

   Variable classes
       The four	different classes of variables (in order of increasing	prece-
       dence) are:

       Environment variables
	       Variables defined as part of bmake's environment.

       Global variables
	       Variables defined in the	makefile or in included	makefiles.

       Command line variables
	       Variables defined as part of the	command	line.

       Local variables
	       Variables that are defined specific to a	certain	target.

       Local   variables   can	 be   set   on	 a   dependency	 line,	unless
       .MAKE.TARGET_LOCAL_VARIABLES is set to `false'.	The rest of  the  line
       (which  already	has  had  global  variables  expanded) is the variable
       value.  For example:

	     COMPILER_WRAPPERS=	ccache distcc icecc

	     ${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}

       Only the	targets	`${OBJS}' are impacted by that filter (in "meta" mode)
       and simply enabling/disabling any of the	 compiler  wrappers  does  not
       render all of those targets out-of-date.

       NOTE: target-local variable assignments behave differently in that;

	     +=	     Only  appends to a	previous local assignment for the same
		     target and	variable.

	     :=	     Is	redundant with respect to global variables, which have
		     already been expanded.

       The seven built-in local	variables are:

	     .ALLSRC   The list	of all sources for this	target;	also known  as
		       `>'.

	     .ARCHIVE  The name	of the archive file; also known	as `!'.

	     .IMPSRC   In  suffix-transformation  rules,  the name/path	of the
		       source from which the target is to be transformed  (the
		       "implied"  source);  also  known	as `<'.	 It is not de-
		       fined in	explicit rules.

	     .MEMBER   The name	of the archive member; also known as `%'.

	     .OODATE   The list	of sources for this target  that  were	deemed
		       out-of-date; also known as `?'.

	     .PREFIX   The  name  of  the  target  with	suffix (if declared in
		       .SUFFIXES) removed; also	known as `*'.

	     .TARGET   The name	of the target; also known as `@'.  For compat-
		       ibility with other makes	this is	an alias for  .ARCHIVE
		       in archive member rules.

       The shorter forms (`>', `!', `<', `%', `?', `*',	and `@') are permitted
       for  backward  compatibility with historical makefiles and legacy POSIX
       make and	are not	recommended.

       Variants	of these variables with	the punctuation	 followed  immediately
       by  `D'	or `F',	e.g. `$(@D)', are legacy forms equivalent to using the
       `:H' and	`:T' modifiers.	 These forms are  accepted  for	 compatibility
       with AT&T System	V UNIX makefiles and POSIX but are not recommended.

       Four  of	the local variables may	be used	in sources on dependency lines
       because they expand to the proper value for each	target	on  the	 line.
       These variables are `.TARGET', `.PREFIX', `.ARCHIVE', and `.MEMBER'.

   Additional built-in variables
       In addition, bmake sets or knows	about the following variables:

       .ALLTARGETS
	       The list	of all targets encountered in the makefiles.  If eval-
	       uated during makefile parsing, lists only those targets encoun-
	       tered thus far.

       .CURDIR
	       A path to the directory where bmake was executed.  Refer	to the
	       description of `PWD' for	more details.

       .ERROR_CMD
	       Is used in error	handling, see MAKE_PRINT_VAR_ON_ERROR.

       .ERROR_CWD
	       Is used in error	handling, see MAKE_PRINT_VAR_ON_ERROR.

       .ERROR_META_FILE
	       Is    used    in	  error	  handling   in	  "meta"   mode,   see
	       MAKE_PRINT_VAR_ON_ERROR.

       .ERROR_TARGET
	       Is used in error	handling, see MAKE_PRINT_VAR_ON_ERROR.

       .INCLUDEDFROMDIR
	       The directory of	the file this makefile was included from.

       .INCLUDEDFROMFILE
	       The filename of the file	this makefile was included from.

       MACHINE
	       The machine hardware name, see uname(1).

       MACHINE_ARCH
	       The machine processor architecture name,	see uname(1).

       MAKE    The name	that bmake was executed	with (argv[0]).

       .MAKE   The same	as MAKE, for compatibility.  The preferred variable to
	       use is the environment variable MAKE because it is more compat-
	       ible with other make variants and cannot	be confused  with  the
	       special target with the same name.

       .MAKE.DEPENDFILE
	       Names the makefile (default `.depend') from which generated de-
	       pendencies are read.

       .MAKE.DIE_QUIETLY
	       If set to `true', do not	print error information	at the end.

       .MAKE.EXPAND_VARIABLES
	       A  boolean that controls	the default behavior of	the -V option.
	       If true,	variable values	printed	with -V	are fully expanded; if
	       false, the raw variable contents	(which may include  additional
	       unexpanded variable references) are shown.

       .MAKE.EXPORTED
	       The list	of variables exported by bmake.

       MAKEFILE
	       The  top-level makefile that is currently read, as given	in the
	       command line.

       .MAKEFLAGS
	       The environment variable	`MAKEFLAGS' may	contain	anything  that
	       may  be	specified on bmake's command line.  Anything specified
	       on bmake's command line is appended to the .MAKEFLAGS variable,
	       which is	then added to the environment for  all	programs  that
	       bmake executes.

       .MAKE.GID
	       The  numeric  group  ID of the user running bmake.  It is read-
	       only.

       .MAKE.JOB.PREFIX
	       If bmake	is run with -j,	the output for each target is prefixed
	       with a token
		     --- target	---
	       the first part of which can be controlled via .MAKE.JOB.PREFIX.
	       If .MAKE.JOB.PREFIX is empty, no	token is printed.   For	 exam-
	       ple,	       setting		 .MAKE.JOB.PREFIX	    to
	       `${.newline}---${.MAKE:T}[${.MAKE.PID}]'	would  produce	tokens
	       like
		     ---make[1234] target ---
	       making  it  easier  to  track  the  degree of parallelism being
	       achieved.

       .MAKE.JOBS
	       The argument to the -j option.

       .MAKE.LEVEL
	       The recursion depth of bmake.  The top-level instance of	 bmake
	       has  level  0, and each child make has its parent level plus 1.
	       This allows tests like: .if  ${.MAKE.LEVEL}  ==	0  to  protect
	       things which should only	be evaluated in	the top-level instance
	       of bmake.

       .MAKE.LEVEL.ENV
	       The  name  of the environment variable that stores the level of
	       nested calls to bmake.

       .MAKE.MAKEFILE_PREFERENCE
	       The  ordered  list  of  makefile	 names	(default   `makefile',
	       `Makefile') that	bmake looks for.

       .MAKE.MAKEFILES
	       The list	of makefiles read by bmake, which is useful for	track-
	       ing dependencies.  Each makefile	is recorded only once, regard-
	       less of the number of times read.

       .MAKE.META.BAILIWICK
	       In "meta" mode, provides	a list of prefixes which match the di-
	       rectories  controlled  by  bmake.  If a file that was generated
	       outside of .OBJDIR but within said bailiwick  is	 missing,  the
	       current target is considered out-of-date.

       .MAKE.META.CMP_FILTER
	       In  "meta" mode,	it can (very rarely!) be useful	to filter com-
	       mand lines before comparison.  This variable can	be  set	 to  a
	       set  of	modifiers that are applied to each line	of the old and
	       new command that	differ,	if the filtered	commands still differ,
	       the target is considered	out-of-date.

       .MAKE.META.CREATED
	       In "meta" mode, this variable contains a	list of	all  the  meta
	       files  updated.	 If  not empty,	it can be used to trigger pro-
	       cessing of .MAKE.META.FILES.

       .MAKE.META.FILES
	       In "meta" mode, this variable contains a	list of	all  the  meta
	       files  used (updated or not).  This list	can be used to process
	       the meta	files to extract dependency information.

       .MAKE.META.IGNORE_FILTER
	       Provides	a list of variable modifiers to	apply  to  each	 path-
	       name.  Ignore if	the expansion is an empty string.

       .MAKE.META.IGNORE_PATHS
	       Provides	 a  list  of path prefixes that	should be ignored; be-
	       cause the contents are expected to change over time.   The  de-
	       fault list includes: `/dev /etc /proc /tmp /var/run /var/tmp'

       .MAKE.META.IGNORE_PATTERNS
	       Provides	a list of patterns to match against pathnames.	Ignore
	       any that	match.

       .MAKE.META.PREFIX
	       Defines the message printed for each meta file updated in "meta
	       verbose"	mode.  The default value is:
		     Building ${.TARGET:H:tA}/${.TARGET:T}

       .MAKE.MODE
	       Processed  after	 reading all makefiles.	 Affects the mode that
	       bmake runs in.  It can contain these keywords:

	       compat  Like -B,	puts bmake into	"compat" mode.

	       meta    Puts bmake into "meta" mode, where meta files are  cre-
		       ated  for  each	target to capture the command run, the
		       output generated, and if	filemon(4) is  available,  the
		       system  calls which are of interest to bmake.  The cap-
		       tured output can	be useful when diagnosing errors.

	       curdirOk=bf
		       By default,  bmake  does	 not  create  .meta  files  in
		       `.CURDIR'.   This  can be overridden by setting bf to a
		       value which represents true.

	       missing-meta=bf
		       If bf is	true, a	missing	.meta file  makes  the	target
		       out-of-date.

	       missing-filemon=bf
		       If  bf  is  true, missing filemon data makes the	target
		       out-of-date.

	       nofilemon
		       Do not use filemon(4).

	       env     For debugging, it can be	useful to include the environ-
		       ment in the .meta file.

	       verbose
		       If in "meta" mode, print	a clue about the target	 being
		       built.	This  is useful	if the build is	otherwise run-
		       ning silently.  The message  printed  is	 the  expanded
		       value of	.MAKE.META.PREFIX.

	       ignore-cmd
		       Some  makefiles have commands which are simply not sta-
		       ble.  This keyword causes them to be ignored for	deter-
		       mining whether a	target is out of date in "meta"	 mode.
		       See also	.NOMETA_CMP.

	       silent=bf
		       If  bf  is true,	when a .meta file is created, mark the
		       target .SILENT.

	       randomize-targets
		       In both compat and parallel mode, do not	make the  tar-
		       gets  in	 the  usual order, but instead randomize their
		       order.  This mode can be	used to	detect undeclared  de-
		       pendencies between files.

       MAKEOBJDIR
	       Used to create files in a separate directory, see .OBJDIR.

       MAKE_OBJDIR_CHECK_WRITABLE
	       Used  to	force a	separate directory for the created files, even
	       if that directory is not	writable, see .OBJDIR.

       MAKEOBJDIRPREFIX
	       Used to create files in a separate directory, see .OBJDIR.

       .MAKE.OS
	       The name	of the operating system, see uname(1).	 It  is	 read-
	       only.

       .MAKEOVERRIDES
	       This variable is	used to	record the names of variables assigned
	       to on the command line, so that they may	be exported as part of
	       `MAKEFLAGS'.   This  behavior  can  be disabled by assigning an
	       empty value to `.MAKEOVERRIDES' within a	makefile.  Extra vari-
	       ables can be exported from a makefile by	appending their	 names
	       to   `.MAKEOVERRIDES'.	`MAKEFLAGS'  is	 re-exported  whenever
	       `.MAKEOVERRIDES'	is modified.

       .MAKE.PATH_FILEMON
	       If bmake	was built with filemon(4) support, this	is set to  the
	       path  of	 the  device  node.  This allows makefiles to test for
	       this support.

       .MAKE.PID
	       The process ID of bmake.	 It is read-only.

       .MAKE.PPID
	       The parent process ID of	bmake.	It is read-only.

       MAKE_PRINT_VAR_ON_ERROR
	       When bmake stops	due to an error, it  sets  `.ERROR_TARGET'  to
	       the  name  of  the target that failed, `.ERROR_CMD' to the com-
	       mands of	the failed target, and in "meta" mode,	it  also  sets
	       `.ERROR_CWD'  to	 the  getcwd(3), and `.ERROR_META_FILE'	to the
	       path of the meta	file (if any) describing  the  failed  target.
	       It  then	 prints	its name and the value of `.CURDIR' as well as
	       the value of any	variables named	in `MAKE_PRINT_VAR_ON_ERROR'.

       .MAKE.SAVE_DOLLARS
	       If true,	`$$' are preserved when	doing `:='  assignments.   The
	       default is false, for backwards compatibility.  Set to true for
	       compatability  with other makes.	 If set	to false, `$$' becomes
	       `$' per normal evaluation rules.

       .MAKE.TARGET_LOCAL_VARIABLES
	       If set to `false', apparent variable assignments	in  dependency
	       lines are treated as normal sources.

       .MAKE.UID
	       The numeric ID of the user running bmake.  It is	read-only.

       .newline
	       This  variable  is  simply  assigned a newline character	as its
	       value.  It is read-only.	 This allows expansions	using  the  :@
	       modifier	to put a newline between iterations of the loop	rather
	       than  a	space.	For example, in	case of	an error, bmake	prints
	       the variable names and their values using:
		     ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}

       .OBJDIR
	       A path to the directory where the targets are built.  Its value
	       is determined by	trying to chdir(2) to the  following  directo-
	       ries in order and using the first match:

	       1.   ${MAKEOBJDIRPREFIX}${.CURDIR}

		    (Only  if  `MAKEOBJDIRPREFIX' is set in the	environment or
		    on the command line.)

	       2.   ${MAKEOBJDIR}

		    (Only if `MAKEOBJDIR' is set in the	environment or on  the
		    command line.)

	       3.   ${.CURDIR}/obj.${MACHINE}

	       4.   ${.CURDIR}/obj

	       5.   /usr/obj/${.CURDIR}

	       6.   ${.CURDIR}

	       Variable	expansion is performed on the value before it is used,
	       so  expressions such as ${.CURDIR:S,^/usr/src,/var/obj,}	may be
	       used.  This is especially useful	with `MAKEOBJDIR'.

	       `.OBJDIR' may be	modified in the	makefile via the special  tar-
	       get  `.OBJDIR'.	 In  all cases,	bmake changes to the specified
	       directory if it exists, and sets	`.OBJDIR' and  `PWD'  to  that
	       directory before	executing any targets.

	       Except  in  the	case  of  an  explicit `.OBJDIR' target, bmake
	       checks that the specified directory is writable and ignores  it
	       if  not.	  This check can be skipped by setting the environment
	       variable	`MAKE_OBJDIR_CHECK_WRITABLE' to	"no".

       .PARSEDIR
	       The directory name of the current makefile being	parsed.

       .PARSEFILE
	       The basename of the current makefile being parsed.  This	 vari-
	       able  and `.PARSEDIR' are both set only while the makefiles are
	       being parsed.  To retain	their current values, assign them to a
	       variable	using assignment with expansion	`:='.

       .PATH   The space-separated list	of directories that bmake searches for
	       files.  To update this search  list,  use  the  special	target
	       `.PATH' rather than modifying the variable directly.

       %POSIX  Is set in POSIX mode, see the special `.POSIX' target.

       PWD     Alternate  path	to the current directory.  bmake normally sets
	       `.CURDIR' to the	canonical path given by	 getcwd(3).   However,
	       if  the	environment  variable `PWD' is set and gives a path to
	       the current directory, bmake sets `.CURDIR'  to	the  value  of
	       `PWD' instead.  This behavior is	disabled if `MAKEOBJDIRPREFIX'
	       is set or `MAKEOBJDIR' contains a variable transform.  `PWD' is
	       set to the value	of `.OBJDIR' for all programs which bmake exe-
	       cutes.

       .SHELL  The  pathname  of  the shell used to run	target scripts.	 It is
	       read-only.

       .SUFFIXES
	       The list	of known suffixes.  It is read-only.

       .SYSPATH
	       The space-separated list	of directories that bmake searches for
	       makefiles, referred to as the system include path.   To	update
	       this search list, use the special target	`.SYSPATH' rather than
	       modifying the variable which is read-only.

       .TARGETS
	       The  list  of targets explicitly	specified on the command line,
	       if any.

       VPATH   The  colon-separated  (":")  list  of  directories  that	 bmake
	       searches	for files.  This variable is supported for compatibil-
	       ity with	old make programs only,	use `.PATH' instead.

   Variable modifiers
       The general format of a variable	expansion is:

	     ${variable[:modifier[:...]]}

       Each  modifier begins with a colon.  To escape a	colon, precede it with
       a backslash `\'.

       A list of indirect modifiers can	be specified via a variable,  as  fol-
       lows:

	     modifier_variable = modifier[:...]

	     ${variable:${modifier_variable}[:...]}

       In  this	 case,	the  first  modifier in	the modifier_variable does not
       start with a colon, since that colon already occurs in the  referencing
       variable.   If any of the modifiers in the modifier_variable contains a
       dollar sign (`$'), these	must be	doubled	to avoid early expansion.

       Some modifiers interpret	the expression value as	a single string,  oth-
       ers treat the expression	value as a whitespace-separated	list of	words.
       When  splitting	a  string  into	words, whitespace can be escaped using
       double quotes, single quotes and	backslashes, like in the  shell.   The
       quotes and backslashes are retained in the words.

       The supported modifiers are:

       :E   Replaces each word with its	suffix.

       :H   Replaces each word with its	dirname.

       :Mpattern
	    Selects  only  those words that match pattern.  The	standard shell
	    wildcard characters	(`*', `?', and `[]') may be used.   The	 wild-
	    card  characters may be escaped with a backslash (`\').  As	a con-
	    sequence of	the way	values are split into words, matched, and then
	    joined, the	construct `${VAR:M*}' removes all leading and trailing
	    whitespace and normalizes  the  inter-word	spacing	 to  a	single
	    space.

       :Npattern
	    This  is  the  opposite  of	`:M', selecting	all words which	do not
	    match pattern.

       :O   Orders the words lexicographically.

       :On  Orders the words numerically.  A number followed by	 one  of  `k',
	    `M'	 or `G'	is multiplied by the appropriate factor, which is 1024
	    for	`k', 1048576 for `M', or 1073741824 for	`G'.  Both upper-  and
	    lower-case letters are accepted.

       :Or  Orders the words in	reverse	lexicographical	order.

       :Orn
	    Orders the words in	reverse	numerical order.

       :Ox  Shuffles  the  words.  The results are different each time you are
	    referring to the modified variable;	use the	assignment with	expan-
	    sion `:=' to prevent such behavior.	 For example,

		  LIST=			  uno due tre quattro
		  RANDOM_LIST=		  ${LIST:Ox}
		  STATIC_RANDOM_LIST:=	  ${LIST:Ox}

		  all:
			  @echo	"${RANDOM_LIST}"
			  @echo	"${RANDOM_LIST}"
			  @echo	"${STATIC_RANDOM_LIST}"
			  @echo	"${STATIC_RANDOM_LIST}"
	    may	produce	output similar to:

		  quattro due tre uno
		  tre due quattro uno
		  due uno quattro tre
		  due uno quattro tre

       :Q   Quotes every shell meta-character in the value, so that it can  be
	    passed safely to the shell.

       :q   Quotes  every  shell meta-character	in the value, and also doubles
	    `$'	characters so that it can be passed safely  through  recursive
	    invocations	of bmake.  This	is equivalent to `:S/\$/&&/g:Q'.

       :R   Replaces each word with everything but its suffix.

       :range[=count]
	    The	 value	is  an	integer	sequence representing the words	of the
	    original value, or the supplied count.

       :gmtime[=timestamp]
	    The	value is interpreted as	a format string	for strftime(3), using
	    gmtime(3), producing the  formatted	 timestamp.   If  a  timestamp
	    value is not provided or is	0, the current time is used.

       :hash
	    Computes  a	 32-bit	hash of	the value and encodes it as 8 hex dig-
	    its.

       :localtime[=timestamp]
	    The	value is interpreted as	a format string	for strftime(3), using
	    localtime(3), producing the	formatted timestamp.  If  a  timestamp
	    value is not provided or is	0, the current time is used.

       :mtime[=timestamp]
	    Call stat(2) with each word	as pathname; use `st_mtime' as the new
	    value.   If	 stat(2)  fails;  use  timestamp  or current time.  If
	    timestamp is set to	`error', then stat(2) failure  will  cause  an
	    error.

       :tA  Attempts   to   convert  the  value	 to  an	 absolute  path	 using
	    realpath(3).  If that fails, the value is unchanged.

       :tl  Converts the value to lower-case letters.

       :tsc
	    When joining the words after a modifier that treats	the  value  as
	    words, the words are normally separated by a space.	 This modifier
	    changes  the  separator  to	 the character c.  If c	is omitted, no
	    separator is used.	The common escapes  (including	octal  numeric
	    codes) work	as expected.

       :tu  Converts the value to upper-case letters.

       :tW  Causes  subsequent	modifiers  to treat the	value as a single word
	    (possibly containing embedded whitespace).	See also `:[*]'.

       :tw  Causes the value to	be treated as  a  list	of  words.   See  also
	    `:[@]'.

       :S/old_string/new_string/[1gW]
	    Modifies  the  first  occurrence of	old_string in each word	of the
	    value, replacing it	with new_string.  If a `g' is appended to  the
	    last  delimiter  of	 the pattern, all occurrences in each word are
	    replaced.  If a `1'	is appended to the last	delimiter of the  pat-
	    tern, only the first occurrence is affected.  If a `W' is appended
	    to	the  last  delimiter of	the pattern, the value is treated as a
	    single word.  If old_string	begins with a caret (`^'),  old_string
	    is	anchored  at  the  beginning of	each word.  If old_string ends
	    with a dollar sign (`$'), it is anchored at	the end	of each	 word.
	    Inside  new_string,	 an  ampersand (`&') is	replaced by old_string
	    (without the anchoring `^' or `$').	 Any character may be used  as
	    the	 delimiter  for	the parts of the modifier string.  The anchor-
	    ing, ampersand and delimiter characters  can  be  escaped  with  a
	    backslash (`\').

	    Both old_string and	new_string may contain nested expressions.  To
	    prevent a dollar sign from starting	a nested expression, escape it
	    with a backslash.

       :C/pattern/replacement/[1gW]
	    The	:C modifier works like the :S modifier except that the old and
	    new	strings, instead of being simple strings, are an extended reg-
	    ular   expression	pattern	 (see  regex(3))  and  an  ed(1)-style
	    replacement.   Normally,  the  first  occurrence  of  the  pattern
	    pattern in each word of the	value is substituted with replacement.
	    The	 `1'  modifier causes the substitution to apply	to at most one
	    word; the `g' modifier causes the substitution to apply to as many
	    instances of the search pattern pattern as occur in	 the  word  or
	    words  it  is  found  in;  the `W' modifier	causes the value to be
	    treated as a single	 word  (possibly  containing  embedded	white-
	    space).

	    As	for the	:S modifier, the pattern and replacement are subjected
	    to variable	expansion before being parsed as regular expressions.

       :T   Replaces each word with its	last path component (basename).

       :u   Removes adjacent duplicate words (like uniq(1)).

       :?true_string:false_string
	    If the variable name (not its value), when parsed as a .if	condi-
	    tional  expression,	 evaluates  to	true,  return as its value the
	    true_string, otherwise return the false_string.  Since  the	 vari-
	    able name is used as the expression, :? must be the	first modifier
	    after the variable name itself--which, of course, usually contains
	    variable  expansions.  A common error is trying to use expressions
	    like
		  ${NUMBERS:M42:?match:no}
	    which actually tests defined(NUMBERS).  To determine if any	 words
	    match "42",	you need to use	something like:
		  ${"${NUMBERS:M42}" !=	"":?match:no}.

       :old_string=new_string
	    This is the	AT&T System V UNIX style substitution.	It can only be
	    the	 last  modifier	 specified,  as	 a `:' in either old_string or
	    new_string is treated as a regular character, not as  the  end  of
	    the	modifier.

	    If old_string does not contain the pattern matching	character `%',
	    and	the word ends with old_string or equals	it, that suffix	is re-
	    placed with	new_string.

	    Otherwise,	the  first  `%'	in old_string matches a	possibly empty
	    substring of arbitrary characters, and if  the  whole  pattern  is
	    found  in the word,	the matching part is replaced with new_string,
	    and	the first occurrence of	`%' in new_string (if any) is replaced
	    with the substring matched by the `%'.

	    Both old_string and	new_string may contain nested expressions.  To
	    prevent a dollar sign from starting	a nested expression, escape it
	    with a backslash.

       :@varname@string@
	    This is the	loop expansion mechanism from the OSF Development  En-
	    vironment  (ODE) make.  Unlike .for	loops, expansion occurs	at the
	    time of reference.	For each word in the value, assign the word to
	    the	variable named varname and evaluate string.  The  ODE  conven-
	    tion is that varname should	start and end with a period, for exam-
	    ple:
		  ${LINKS:@.LINK.@${LN}	${TARGET} ${.LINK.}@}

	    However, a single-letter variable is often more readable:
		  ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}

       :_[=var]
	    Saves  the	current	 variable  value  in `$_' or the named var for
	    later reference.  Example usage:

		  M_cmpv.units = 1 1000	1000000
		  M_cmpv = S,.,	,g:_:range:@i@+	$${_:[-$$i]} \
		  \* $${M_cmpv.units:[$$i]}@:S,^,expr 0	,1:sh

		  .if ${VERSION:${M_cmpv}} < ${3.1.12:L:${M_cmpv}}

	    Here `$_' is used to save the result of the	`:S' modifier which is
	    later referenced using the index values from `:range'.

       :Unewval
	    If the variable is undefined, newval is the	value.	If  the	 vari-
	    able  is defined, the existing value is returned.  This is another
	    ODE	make feature.  It is handy for setting per-target  CFLAGS  for
	    instance:
		  ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
	    If a value is only required	if the variable	is undefined, use:
		  ${VAR:D:Unewval}

       :Dnewval
	    If the variable is defined,	newval is the value.

       :L   The	name of	the variable is	the value.

       :P   The	 path  of  the node which has the same name as the variable is
	    the	value.	If no such node	exists or its path is null,  the  name
	    of	the variable is	used.  In order	for this modifier to work, the
	    name (node)	must at	least have appeared on the right-hand side  of
	    a dependency.

       :!cmd!
	    The	output of running cmd is the value.

       :sh  The	 value	is  run	 as  a command,	and the	output becomes the new
	    value.

       ::=str
	    The	variable is assigned the value str after  substitution.	  This
	    modifier  and its variations are useful in obscure situations such
	    as wanting to set a	variable at a point  where  a  target's	 shell
	    commands  are being	parsed.	 These assignment modifiers always ex-
	    pand to nothing.

	    The	`::' helps avoid false matches with the	 AT&T  System  V  UNIX
	    style  `:='	 modifier  and	since  substitution always occurs, the
	    `::=' form is vaguely appropriate.

       ::?=str
	    As for ::= but only	if the variable	does not already have a	value.

       ::+=str
	    Append str to the variable.

       ::!=cmd
	    Assign the output of cmd to	the variable.

       :[range]
	    Selects one	or more	words from the value, or performs other	opera-
	    tions related to the way in	which the value	is split into words.

	    An empty value, or a value that consists entirely of  white-space,
	    is	treated	as a single word.  For the purposes of the `:[]' modi-
	    fier, the words are	indexed	both forwards using positive  integers
	    (where  index  1  represents  the first word), and backwards using
	    negative integers (where index -1 represents the last word).

	    The	range is subjected to variable expansion, and the expanded re-
	    sult is then interpreted as	follows:

	    index  Selects a single word from the value.

	    start..end
		   Selects all words from start	to end,	inclusive.  For	 exam-
		   ple,	 `:[2..-1]'  selects all words from the	second word to
		   the last word.  If start is greater than end, the words are
		   output in reverse order.  For example,  `:[-1..1]'  selects
		   all	the  words from	last to	first.	If the list is already
		   ordered, this effectively reverses the list,	but it is more
		   efficient to	use `:Or' instead of `:O:[-1..1]'.

	    *	   Causes subsequent modifiers to treat	the value as a	single
		   word	 (possibly containing embedded whitespace).  Analogous
		   to the effect of $* in Bourne shell.

	    0	   Means the same as `:[*]'.

	    @	   Causes subsequent modifiers to treat	the  value  as	a  se-
		   quence  of words delimited by whitespace.  Analogous	to the
		   effect of $@	in Bourne shell.

	    #	   Returns the number of words in the value.

DIRECTIVES
       bmake offers directives for including makefiles,	conditionals  and  for
       loops.	All these directives are identified by a line beginning	with a
       single dot (`.')	character, followed by the keyword of  the  directive,
       such as include or if.

   File	inclusion
       Files  are  included  with  either  .include <file> or .include "file".
       Variables between the angle brackets or double quotes are  expanded  to
       form  the file name.  If	angle brackets are used, the included makefile
       is expected to be in the	system makefile	directory.  If	double	quotes
       are used, the including makefile's directory and	any directories	speci-
       fied using the -I option	are searched before the	system makefile	direc-
       tory.

       For compatibility with other make variants, `include file ...' (without
       leading dot) is also accepted.

       If  the	include	statement is written as	.-include or as	.sinclude, er-
       rors locating and/or opening include files are ignored.

       If the include statement	is written as .dinclude, not only  are	errors
       locating	 and/or	 opening include files ignored,	but stale dependencies
       within the included file	are ignored just like in .MAKE.DEPENDFILE.

   Exporting variables
       The directives for exporting and	unexporting variables are:

       .export variable	...
	       Export the specified global variable.  If no variable  list  is
	       provided,  all  globals	are exported except for	internal vari-
	       ables (those that start with `.').  This	is not affected	by the
	       -X flag,	so should be used  with	 caution.   For	 compatibility
	       with  other make	programs, export variable=value	(without lead-
	       ing dot)	is also	accepted.

	       Appending a variable name to .MAKE.EXPORTED  is	equivalent  to
	       exporting a variable.

       .export-env variable ...
	       The same	as `.export', except that the variable is not appended
	       to  .MAKE.EXPORTED.  This allows	exporting a value to the envi-
	       ronment which is	different from that used by bmake internally.

       .export-literal variable	...
	       The same	as `.export-env', except that variables	in  the	 value
	       are not expanded.

       .unexport variable ...
	       The  opposite  of  `.export'.  The specified global variable is
	       removed from .MAKE.EXPORTED.  If	no variable list is  provided,
	       all globals are unexported, and .MAKE.EXPORTED deleted.

       .unexport-env
	       Unexport	all globals previously exported	and clear the environ-
	       ment inherited from the parent.	This operation causes a	memory
	       leak  of	the original environment, so should be used sparingly.
	       Testing for .MAKE.LEVEL being 0 would make  sense.   Also  note
	       that  any  variables which originated in	the parent environment
	       should be explicitly preserved if desired.  For example:

		     .if ${.MAKE.LEVEL}	== 0
		     PATH := ${PATH}
		     .unexport-env
		     .export PATH
		     .endif

	       Would result in an environment containing only `PATH', which is
	       the minimal useful environment.	Actually `.MAKE.LEVEL' is also
	       pushed into the new environment.

   Messages
       The directives for printing messages to the output are:

       .info message
	       The message is printed along with the name of the makefile  and
	       line number.

       .warning	message
	       The  message  prefixed  by `warning:' is	printed	along with the
	       name of the makefile and	line number.

       .error message
	       The message is printed along with the name of the makefile  and
	       line number, bmake exits	immediately.

   Conditionals
       The directives for conditionals are:

       .if [!]expression [operator expression ...]
	       Test the	value of an expression.

       .ifdef [!]variable [operator variable ...]
	       Test whether a variable is defined.

       .ifndef [!]variable [operator variable ...]
	       Test whether a variable is not defined.

       .ifmake [!]target [operator target ...]
	       Test the	target being requested.

       .ifnmake	[!]target [operator target ...]
	       Test the	target being requested.

       .else   Reverse the sense of the	last conditional.

       .elif [!]expression [operator expression	...]
	       A combination of	`.else'	followed by `.if'.

       .elifdef	[!]variable [operator variable ...]
	       A combination of	`.else'	followed by `.ifdef'.

       .elifndef [!]variable [operator variable	...]
	       A combination of	`.else'	followed by `.ifndef'.

       .elifmake [!]target [operator target ...]
	       A combination of	`.else'	followed by `.ifmake'.

       .elifnmake [!]target [operator target ...]
	       A combination of	`.else'	followed by `.ifnmake'.

       .endif  End the body of the conditional.

       The operator may	be any one of the following:

       ||      Logical OR.

       &&      Logical AND; of higher precedence than `||'.

       bmake  only evaluates a conditional as far as is	necessary to determine
       its value.  Parentheses can be used to  override	 the  operator	prece-
       dence.  The boolean operator `!'	may be used to logically negate	an ex-
       pression,  typically  a function	call.  It is of	higher precedence than
       `&&'.

       The value of expression may be any of the following function  call  ex-
       pressions:

       defined(varname)
	       Evaluates to true if the	variable varname has been defined.

       make(target)
	       Evaluates  to  true  if	the  target  was  specified as part of
	       bmake's command line or was declared the	default	target (either
	       implicitly or explicitly, see .MAIN) before the line containing
	       the conditional.

       empty(varname[:modifiers])
	       Evaluates to true if the	expansion of the variable,  after  ap-
	       plying the modifiers, results in	an empty string.

       exists(pathname)
	       Evaluates  to  true if the given	pathname exists.  If relative,
	       the pathname is searched	for on the  system  search  path  (see
	       .PATH).

       target(target)
	       Evaluates to true if the	target has been	defined.

       commands(target)
	       Evaluates  to  true if the target has been defined and has com-
	       mands associated	with it.

       Expression may also be an arithmetic or	string	comparison.   Variable
       expansion  is performed on both sides of	the comparison.	 If both sides
       are numeric and neither is enclosed in quotes, the comparison  is  done
       numerically, otherwise lexicographically.  A string is interpreted as a
       hexadecimal  integer  if	 it  is	preceded by 0x,	otherwise it is	inter-
       preted as a decimal floating-point number; octal	numbers	are  not  sup-
       ported.

       All  comparisons	 may use the operators `==' and	`!='.  Numeric compar-
       isons may also use the operators	`<', `<=', `>' and `>='.

       If the comparison has neither a comparison operator nor a  right	 side,
       the  expression	evaluates  to  true  if	it is nonempty and its numeric
       value (if any) is not zero.

       When bmake is evaluating	one of these conditional expressions,  and  it
       encounters  a  (whitespace-separated) word it doesn't recognize,	either
       the "make" or "defined" function	is applied to  it,  depending  on  the
       form  of	the conditional.  If the form is `.ifdef', `.ifndef' or	`.if',
       the "defined" function is applied.  Similarly, if the form is `.ifmake'
       or `.ifnmake', the "make" function is applied.

       If the conditional evaluates to true, parsing of	the makefile continues
       as before.  If it evaluates to false, the  following  lines  until  the
       corresponding `.elif' variant, `.else' or `.endif' are skipped.

   For loops
       For  loops  are	typically  used	 to  apply a set of rules to a list of
       files.  The syntax of a for loop	is:

       .for variable [variable ...] in expression
       <make-lines>
       .endfor

       The expression is expanded and then split into words.  On  each	itera-
       tion  of	 the loop, one word is taken and assigned to each variable, in
       order, and these	variables are substituted into the  make-lines	inside
       the body	of the for loop.  The number of	words must come	out even; that
       is,  if	there  are three iteration variables, the number of words pro-
       vided must be a multiple	of three.

       If `.break' is encountered within a .for	loop, it causes	early termina-
       tion of the loop, otherwise a parse error.

   Other directives
       .undef variable ...
	       Un-define the specified global variables.   Only	 global	 vari-
	       ables can be un-defined.

COMMENTS
       Comments	 begin	with  a	 hash (`#') character, anywhere	but in a shell
       command line, and continue to the end of	an unescaped new line.

SPECIAL	SOURCES	(ATTRIBUTES)
       .EXEC	 Target	is never out of	date, but always execute commands any-
		 way.

       .IGNORE	 Ignore	any errors from	the commands associated	with this tar-
		 get, exactly as if they all were preceded by a	dash (`-').

       .MADE	 Mark all sources of this target as being up to	date.

       .MAKE	 Execute the commands associated with this target even if  the
		 -n  or	 -t options were specified.  Normally used to mark re-
		 cursive bmakes.

       .META	 Create	a meta file for	the target, even if it is  flagged  as
		 .PHONY,  .MAKE, or .SPECIAL.  Usage in	conjunction with .MAKE
		 is the	most likely case.  In "meta" mode, the target is  out-
		 of-date if the	meta file is missing.

       .NOMETA	 Do  not  create  a  meta file for the target.	Meta files are
		 also not created for .PHONY, .MAKE, or	.SPECIAL targets.

       .NOMETA_CMP
		 Ignore	differences in commands	when deciding if target	is out
		 of date.  This	is useful if  the  command  contains  a	 value
		 which	always	changes.   If  the  number of commands change,
		 though, the target is still considered	out of date.  The same
		 effect	applies	to any command line  that  uses	 the  variable
		 .OODATE,  which  can  be  used	for that purpose even when not
		 otherwise needed or desired:

		       skip-compare-for-some:
			       @echo this is compared
			       @echo this is not ${.OODATE:M.NOMETA_CMP}
			       @echo this is also compared

		 The :M	pattern	suppresses any expansion of the	unwanted vari-
		 able.

       .NOPATH	 Do not	search for the target in the directories specified  by
		 .PATH.

       .NOTMAIN	 Normally  bmake selects the first target it encounters	as the
		 default target	to be built if no target was specified.	  This
		 source	prevents this target from being	selected.

       .OPTIONAL
		 If  a	target	is  marked with	this attribute and bmake can't
		 figure	out how	to create it, it ignores this fact and assumes
		 the file isn't	needed or already exists.

       .PHONY	 The target does not correspond	to an actual file; it  is  al-
		 ways  considered  to  be out of date, and is not created with
		 the -t	option.	 Suffix-transformation rules are  not  applied
		 to .PHONY targets.

       .PRECIOUS
		 When  bmake is	interrupted, it	normally removes any partially
		 made targets.	This source prevents the target	from being re-
		 moved.

       .RECURSIVE
		 Synonym for .MAKE.

       .SILENT	 Do not	echo any of the	commands associated with this  target,
		 exactly as if they all	were preceded by an at sign (`@').

       .USE	 Turn  the  target  into bmake's version of a macro.  When the
		 target	is used	as a source for	another	target,	the other tar-
		 get acquires the commands, sources,  and  attributes  (except
		 for .USE) of the source.  If the target already has commands,
		 the .USE target's commands are	appended to them.

       .USEBEFORE
		 Like  .USE,  but instead of appending,	prepend	the .USEBEFORE
		 target	commands to the	target.

       .WAIT	 If .WAIT appears in a dependency line,	the sources that  pre-
		 cede  it  are	made before the	sources	that succeed it	in the
		 line.	Since the dependents of	files are not made  until  the
		 file itself could be made, this also stops the	dependents be-
		 ing  built  unless  they are needed for another branch	of the
		 dependency tree.  So given:

		 x: a .WAIT b
			 echo x
		 a:
			 echo a
		 b: b1
			 echo b
		 b1:
			 echo b1

		 the output is always `a', `b1', `b', `x'.

		 The ordering imposed by .WAIT is only relevant	 for  parallel
		 makes.

SPECIAL	TARGETS
       Special	targets	may not	be included with other targets,	i.e. they must
       be the only target specified.

       .BEGIN	Any command lines attached to this target are executed	before
		anything else is done.

       .DEFAULT
		This is	sort of	a .USE rule for	any target (that was used only
		as a source) that bmake	can't figure out any other way to cre-
		ate.   Only the	shell script is	used.  The .IMPSRC variable of
		a target that inherits .DEFAULT's commands is set to the  tar-
		get's own name.

       .DELETE_ON_ERROR
		If  this target	is present in the makefile, it globally	causes
		make to	delete targets whose commands fail.  (By default, only
		targets	whose commands are interrupted	during	execution  are
		deleted.   This	is the historical behavior.)  This setting can
		be used	to help	prevent	 half-finished	or  malformed  targets
		from being left	around and corrupting future rebuilds.

       .END	Any  command  lines attached to	this target are	executed after
		everything else	is done	successfully.

       .ERROR	Any command lines attached to this target  are	executed  when
		another	 target	 fails.	  The .ERROR_TARGET variable is	set to
		the target that	failed.	 See also MAKE_PRINT_VAR_ON_ERROR.

       .IGNORE	Mark each of the sources with the .IGNORE  attribute.	If  no
		sources	 are  specified,  this is the equivalent of specifying
		the -i option.

       .INTERRUPT
		If bmake is interrupted, the commands for this target are exe-
		cuted.

       .MAIN	If no target is	specified when bmake is	invoked,  this	target
		is built.

       .MAKEFLAGS
		This  target  provides a way to	specify	flags for bmake	at the
		time when the makefiles	are read.  The flags are as  if	 typed
		to the shell, though the -f option has no effect.

       .NOPATH	Apply the .NOPATH attribute to any specified sources.

       .NOTPARALLEL
		Disable	parallel mode.

       .NO_PARALLEL
		Synonym	 for  .NOTPARALLEL, for	compatibility with other pmake
		variants.

       .NOREADONLY
		clear the read-only attribute from the global variables	speci-
		fied as	sources.

       .OBJDIR	The source is a	new value for `.OBJDIR'.  If it	exists,	 bmake
		changes	 the  current  working directory to it and updates the
		value of `.OBJDIR'.

       .ORDER	In parallel mode, the named  targets  are  made	 in  sequence.
		This  ordering	does not add targets to	the list of targets to
		be made.

		Since the dependents of	a target do not	get  built  until  the
		target	itself	could be built,	unless `a' is built by another
		part of	the dependency graph, the following  is	 a  dependency
		loop:

		.ORDER:	b a
		b: a

       .PATH	The sources are	directories which are to be searched for files
		not  found in the current directory.  If no sources are	speci-
		fied, any previously specified directories  are	 removed  from
		the  search  path.  If the source is the special .DOTLAST tar-
		get, the current working directory is searched last.

       .PATH.suffix
		Like .PATH but applies only to files with a particular suffix.
		The suffix must	have been previously declared with .SUFFIXES.

       .PHONY	Apply the .PHONY attribute to any specified sources.

       .POSIX	If this	is the first non-comment line in  the  main  makefile,
		the variable %POSIX is set to the value	`1003.2' and the make-
		file  `<posix.mk>' is included if it exists, to	provide	POSIX-
		compatible default rules.  If bmake is run with	the  -r	 flag,
		only `posix.mk'	contributes to the default rules.

       .PRECIOUS
		Apply the .PRECIOUS attribute to any specified sources.	 If no
		sources	 are  specified, the .PRECIOUS attribute is applied to
		every target in	the file.

       .READONLY
		set the	read-only attribute on the global variables  specified
		as sources.

       .SHELL	Sets  the  shell  that	bmake uses to execute commands in jobs
		mode.  The sources are a set of	field=value pairs.

		name	    This is the	minimal	specification, used to	select
			    one	of the built-in	shell specs; sh, ksh, and csh.

		path	    Specifies the absolute path	to the shell.

		hasErrCtl   Indicates  whether	the shell supports exit	on er-
			    ror.

		check	    The	command	to turn	on error checking.

		ignore	    The	command	to disable error checking.

		echo	    The	command	to turn	on echoing  of	commands  exe-
			    cuted.

		quiet	    The	 command  to turn off echoing of commands exe-
			    cuted.

		filter	    The	output to filter after issuing the quiet  com-
			    mand.  It is typically identical to	quiet.

		errFlag	    The	 flag to pass the shell	to enable error	check-
			    ing.

		echoFlag    The	flag to	pass the shell to enable command echo-
			    ing.

		newline	    The	string literal to pass the shell that  results
			    in a single	newline	character when used outside of
			    any	quoting	characters.
		Example:

		.SHELL:	name=ksh path=/bin/ksh hasErrCtl=true \
			check="set -e" ignore="set +e" \
			echo="set -v" quiet="set +v" filter="set +v" \
			echoFlag=v errFlag=e newline="'\n'"

       .SILENT	Apply  the  .SILENT attribute to any specified sources.	 If no
		sources	are specified, the .SILENT  attribute  is  applied  to
		every command in the file.

       .STALE	This target gets run when a dependency file contains stale en-
		tries, having .ALLSRC set to the name of that dependency file.

       .SUFFIXES
		Each  source  specifies	 a suffix to bmake.  If	no sources are
		specified, any previously specified suffixes are deleted.   It
		allows the creation of suffix-transformation rules.

		Example:

		.SUFFIXES: .c .o
		.c.o:
			cc -o ${.TARGET} -c ${.IMPSRC}

       .SYSPATH
		The  sources are directories which are to be added to the sys-
		tem include path which bmake searches for  makefiles.	If  no
		sources	 are  specified,  any previously specified directories
		are removed from the system include path.

ENVIRONMENT
       bmake uses the following	environment variables, if they exist: MACHINE,
       MACHINE_ARCH,   MAKE,	MAKEFLAGS,    MAKEOBJDIR,    MAKEOBJDIRPREFIX,
       MAKESYSPATH, PWD, and TMPDIR.

       MAKEOBJDIRPREFIX	 and  MAKEOBJDIR may only be set in the	environment or
       on the command line to bmake and	not as makefile	variables; see the de-
       scription of `.OBJDIR' for more details.

FILES
       .depend	      list of dependencies
       makefile	      first default makefile if	no makefile  is	 specified  on
		      the command line
       Makefile	      second  default  makefile	if no makefile is specified on
		      the command line
       sys.mk	      system makefile
       /usr/share/mk  system makefile directory

COMPATIBILITY
       The basic make syntax is	compatible between  different  make  variants;
       however	the special variables, variable	modifiers and conditionals are
       not.

   Older versions
       An incomplete list of changes in	older versions of bmake:

       The way that .for loop variables	are substituted	changed	 after	NetBSD
       5.0 so that they	still appear to	be variable expansions.	 In particular
       this stops them being treated as	syntax,	and removes some obscure prob-
       lems using them in .if statements.

       The way that parallel makes are scheduled changed in NetBSD 4.0 so that
       .ORDER  and  .WAIT apply	recursively to the dependent nodes.  The algo-
       rithms used may change again in the future.

   Other make dialects
       Other make dialects (GNU	make, SVR4 make, POSIX make, etc.) do not sup-
       port most of the	features of bmake as described in this	manual.	  Most
       notably:

	     	 The .WAIT and .ORDER declarations and most functionality per-
		 taining  to parallelization.  (GNU make supports paralleliza-
		 tion but lacks	the  features  needed  to  control  it	effec-
		 tively.)

	     	 Directives,  including	for loops and conditionals and most of
		 the forms of include files.  (GNU make	has its	own incompati-
		 ble and less powerful syntax for conditionals.)

	     	 All built-in variables	that begin with	a dot.

	     	 Most of the special sources and targets  that	begin  with  a
		 dot,  with  the  notable  exception of	.PHONY,	.PRECIOUS, and
		 .SUFFIXES.

	     	 Variable modifiers, except for	the `:old=new' string  substi-
		 tution, which does not	portably support globbing with `%' and
		 historically only works on declared suffixes.

	     	 The  $>  variable  even in its	short form; most makes support
		 this functionality but	its name varies.

       Some features are somewhat more portable, such as assignment  with  +=,
       ?=, and !=.  The	.PATH functionality is based on	an older feature VPATH
       found in	GNU make and many versions of SVR4 make; however, historically
       its behavior is too ill-defined (and too	buggy) to rely upon.

       The  $@	and  $<	variables are more or less universally portable, as is
       the $(MAKE) variable.  Basic use	of suffix rules	(for files only	in the
       current directory, not trying to	chain transformations together,	 etc.)
       is also reasonably portable.

SEE ALSO
       mkdep(1)

HISTORY
       bmake  is  derived from NetBSD make(1).	It uses	autoconf to facilitate
       portability to other platforms.

       A make command appeared in Version 7 AT&T UNIX.	This make  implementa-
       tion  is	 based	on Adam	de Boor's pmake	program, which was written for
       Sprite at Berkeley.  It was designed to be a parallel distributed  make
       running jobs on different machines using	a daemon called	"customs".

       Historically  the target/dependency FRC has been	used to	FoRCe rebuild-
       ing (since the target/dependency	does not exist ... unless someone cre-
       ates an FRC file).

BUGS
       The make	syntax is difficult to parse.  For instance, finding  the  end
       of  a variable's	use should involve scanning each of the	modifiers, us-
       ing the correct terminator for each field.  In many  places  make  just
       counts {} and ()	in order to find the end of a variable expansion.

       There is	no way of escaping a space character in	a filename.

       In  jobs	 mode,	when a target fails; make will put an error token into
       the job token pool.  This will cause all	other instances	of make	 using
       that  token  pool to abort the build and	exit with error	code 6.	 Some-
       times the attempt to suppress a cascade of unnecessary errors, can  re-
       sult in a seemingly unexplained `*** Error code 6'

FreeBSD	Ports 14.quarterly	 June 28, 2023			      BMAKE(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=bmake&sektion=1&manpath=FreeBSD+Ports+14.3.quarterly>

home | help