aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/bmake.cat1
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bmake/bmake.cat1')
-rw-r--r--contrib/bmake/bmake.cat12386
1 files changed, 863 insertions, 1523 deletions
diff --git a/contrib/bmake/bmake.cat1 b/contrib/bmake/bmake.cat1
index d9723b35cf7f..7c50930807f4 100644
--- a/contrib/bmake/bmake.cat1
+++ b/contrib/bmake/bmake.cat1
@@ -1,1584 +1,924 @@
-BMAKE(1) FreeBSD General Commands Manual BMAKE(1)
+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 option is
+given, tries to open then in order to find the specifications.
+If the file exists, it is read, see This manual page is intended
+as a reference document only. For a more thorough description of
+and makefiles, please refer to (from 1993). prepends the con-
+tents of the environment variable to the command line arguments
+before parsing them. The options are as follows: Try to be back-
+wards compatible by executing a single shell per command and by
+making the sources of a dependency line in sequence. Change to
+before reading the makefiles or doing anything else. If multiple
+options are specified, each is interpreted relative to the previ-
+ous one: is equivalent to Define to be 1, in the global scope.
+Turn on debugging, and specify which portions of are to print de-
+bugging information. Unless the flags are preceded by they are
+added to the environment variable and are passed on to any child
+make processes. By default, debugging information is printed to
+standard error, but this can be changed using the debugging flag.
+The debugging output is always unbuffered; in addition, if debug-
+ging is enabled but debugging output is not directed to standard
+output, the standard output is line buffered. The available are:
+Print all possible debugging information; equivalent to specify-
+ing all of the debugging flags. Print debugging information
+about archive searching and caching. Print debugging information
+about the current working directory. Print debugging information
+about conditional evaluation. Print debugging information about
+directory searching and caching. Print debugging information
+about failed commands and targets. Specify where debugging out-
+put is written. This must be the last flag, because it consumes
+the remainder of the argument. If the character immediately af-
+ter the flag is the file is opened in append mode; otherwise the
+file is overwritten. If the file name is or 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 the is re-
+placed by the pid. Print debugging information about loop evalu-
+ation. Print the input graph before making anything. Print the
+input graph after making everything, or before exiting on error.
+Print the input graph before exiting on error. Print debugging
+information about hash table operations. Print debugging infor-
+mation about running multiple shells. Turn on lint checks. This
+throws errors for variable assignments that do not parse cor-
+rectly, at the time of assignment, so the file and line number
+are available. Print commands in Makefiles regardless of whether
+or not they are prefixed by or other flags. Also known as behav-
+ior. Print debugging information about mode decisions about tar-
+gets. Print debugging information about making targets, includ-
+ing modification dates. Don't delete the temporary command
+scripts created when running commands. These temporary scripts
+are created in the directory referred to by the environment vari-
+able, or in if is unset or set to the empty string. The tempo-
+rary scripts are created by and have names of the form This can
+create many files in or so use with care. Print debugging infor-
+mation about makefile parsing. Print debugging information about
+suffix-transformation rules. Print debugging information about
+target list maintenance. Force the option to print raw values of
+variables, overriding the default behavior set via Print debug-
+ging information about variable assignment and expansion. Run
+shell commands with so the actual commands are printed as they
+are executed. Let environment variables override global vari-
+ables within makefiles. Specify a makefile to read instead of
+the default or If is standard input is read. Multiple makefiles
+may be specified, and are read in the order specified. Specify a
+directory in which to search for makefiles and included make-
+files. The system makefile directory (or directories, see the
+option) is automatically included as part of this list. Ignore
+non-zero exit of shell commands in the makefile. Equivalent to
+specifying before each command line in the makefile. This option
+should be specified by the user. When the 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. Specify the maximum number of jobs
+that may have running at any one time. If is a floating point
+number, or ends with then the value is multiplied by the number
+of CPUs reported online by The value of is saved in Turns compat-
+ibility mode off, unless the option is also specified. When com-
+patibility mode is off, all commands associated with a target are
+executed in a single shell invocation as opposed to the tradi-
+tional 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 tokens is used
+to control the total number of jobs running. Each instance of
+will wait for a token from the pool before running a new job.
+Continue processing after errors are encountered, but only on
+those targets that do not depend on the target whose creation
+caused the error. Specify a directory in which to search for and
+makefiles included via the include statement. The option can be
+used multiple times to form a search path. This path overrides
+the default system include path Furthermore, the system include
+path is appended to the search path used for include statements
+(see the option). The system include path can be referenced via
+the read-only variable If a directory name in the argument (or
+the environment variable) starts with the string searches for the
+specified file or directory named in the remaining 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 argument. This feature allows to easily
+search in the current source tree for customized files (e.g., by
+using as an argument). Display the commands that would have been
+executed, but do not actually execute them unless the target de-
+pends on the special source (see below) or the command is pre-
+fixed with 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. Do
+not execute any commands, instead exit 0 if the specified targets
+are up to date, and 1 otherwise. Do not use the built-in rules
+specified in the system makefile. Stop processing if an error is
+encountered. This is the default behavior and the opposite of Do
+not echo any commands as they are executed. Equivalent to speci-
+fying before each command line in the makefile. When used with
+the flag, append a trace record to for each job started and com-
+pleted. 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. Print the value of Do not build any targets.
+Multiple instances of this option may be specified; the variables
+are printed one per line, with a blank line for each null or un-
+defined 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 additional unexpanded vari-
+able references) are shown. If contains a it is not interpreted
+as a variable name but rather as an expression. Its value is ex-
+panded before printing. The value is also expanded before print-
+ing if is set to true and the option has not been used to over-
+ride it. Note that loop-local and target-local variables, as
+well as values taken temporarily by global variables during make-
+file processing, are not accessible via this option. The debug
+mode can be used to see these at the cost of generating substan-
+tial extraneous output. Like but all printed variables are al-
+ways expanded to their complete value. The last occurrence of or
+decides whether all variables are expanded or not. Treat any
+warnings during makefile parsing as errors. Print entering and
+leaving directory messages, pre and post processing. Don't ex-
+port variables passed on the command line to the environment in-
+dividually. Variables passed on the command line are still ex-
+ported via the environment variable. This option may be useful
+on systems which have a small limit on the size of command argu-
+ments. Set the value of the variable to Normally, all values
+passed on the command line are also exported to sub-makes in the
+environment. The flag disables this behavior. Variable assign-
+ments should follow options for POSIX compatibility but no order-
+ing is enforced. There are several different types of lines in a
+makefile: dependency specifications, shell commands, variable as-
+signments, include statements, conditional directives, for loops,
+other directives, and comments. 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. Dependency lines consist of
+one or more targets, an operator, and zero or more sources. This
+creates a relationship where the targets on the sources and are
+customarily created from them. A target is considered out of
+date if it does not exist, or if its modification time is less
+than that of any of its sources. An out-of-date target is re-
+created, but not until all sources have been examined and them-
+selves re-created as needed. Three operators may be used: Many
+dependency lines may name this target but only one may have at-
+tached shell commands. All sources named in all dependency lines
+are considered together, and if needed the attached shell com-
+mands are run to create or re-create the target. If is inter-
+rupted, the target is removed. The same, but the target is al-
+ways 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 circumstances. Fur-
+thermore, unlike for dependency lines with no sources, the at-
+tached shell commands are always run. Also unlike the target is
+not removed if 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 neces-
+sarily be used to describe existing files. Expansion is in di-
+rectory order, not alphabetically as done in the shell. Each
+target may have associated with it one or more lines of shell
+commands, normally used to create the target. Each of the lines
+in this script be preceded by a tab. (For historical reasons,
+spaces are not accepted.) While targets can occur in many depen-
+dency lines if desired, 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 ex-
+ecuted 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 combination of or the command
+is treated specially. causes the command not to be echoed before
+it is executed. causes the command to be executed even when is
+given. This is similar to the effect of the special source, ex-
+cept that the effect can be limited to a single line of a script.
+in compatibility mode causes any non-zero exit status of the com-
+mand line to be ignored. When is run in jobs mode with the en-
+tire 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 char-
+acters it is passed to the shell; otherwise attempts direct exe-
+cution. 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 opera-
+tion does not change their behavior. For example, any command
+which uses or 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 ex-
+ample: 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 changes the current working
+directory to before executing any targets, each child process
+starts with that as its current working directory. Variables in
+make behave much like macros in the C preprocessor. Variable as-
+signments have the form where: is a single-word variable name,
+consisting, by tradition, of all upper-case letters, is one of
+the variable assignment operators described below, and is inter-
+preted according to the variable assignment operator. Whitespace
+around and is discarded. The five operators that assign values
+to variables are: Assign the value to the variable. Any previous
+value is overwritten. Append the value to the current value of
+the variable, separating 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. References to undefined
+variables are 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 variable. Any newlines in the result are replaced
+with spaces. In most contexts where variables are expanded, ex-
+pands to a single dollar sign. In other contexts (most variable
+modifiers, string literals in conditions), expands to a single
+dollar sign. References to variables have the form or If the
+variable name consists of only a single character and the expres-
+sion contains no modifiers, the surrounding curly braces or
+parentheses are not required. This shorter form is not recom-
+mended. If the variable name contains a dollar, the name itself
+is expanded first. This allows almost arbitrary variable names,
+however names containing dollar, braces, parentheses or white-
+space are really best avoided. If the result of expanding a
+nested variable expression contains a dollar sign the result is
+subject to further expansion. Variable substitution occurs at
+four distinct times, depending on where the variable is being
+used. Variables in dependency lines are expanded as the line is
+read. Variables in conditionals are expanded individually, but
+only as far as necessary to determine the result of the condi-
+tional. Variables in shell commands are expanded when the shell
+command is executed. 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: contains which expands to contains
+which expands to contains which expands to and further to The
+four different classes of variables (in order of increasing
+precedence) are: Variables defined as part of environment. Vari-
+ables defined in the makefile or in included makefiles. Vari-
+ables defined as part of the command line. Variables that are
+defined specific to a certain target. Local variables can be set
+on a dependency line, unless is set to 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 are impacted by that filter (in mode) and simply en-
+abling/disabling any of the compiler wrappers does not render all
+of those targets out-of-date. target-local variable assignments
+behave differently in that; Only appends to a previous local as-
+signment for the same target and variable. Is redundant with re-
+spect to global variables, which have already been expanded. The
+seven built-in local variables are: The list of all sources for
+this target; also known as The name of the archive file; also
+known as In suffix-transformation rules, the name/path of the
+source from which the target is to be transformed (the source);
+also known as It is not defined in explicit rules. The name of
+the archive member; also known as The list of sources for this
+target that were deemed out-of-date; also known as The name of
+the target with suffix (if declared in removed; also known as The
+name of the target; also known as For compatibility with other
+makes this is an alias for in archive member rules. The shorter
+forms and are permitted for backward compatibility with histori-
+cal makefiles and legacy POSIX make and are not recommended.
+Variants of these variables with the punctuation followed immedi-
+ately by or e.g. are legacy forms equivalent to using the and
+modifiers. These forms are accepted for compatibility with make-
+files and POSIX but are not recommended. Four of the local vari-
+ables may be used in sources on dependency lines because they ex-
+pand to the proper value for each target on the line. These
+variables are and In addition, sets or knows about the following
+variables: The list of all targets encountered in the makefiles.
+If evaluated during makefile parsing, lists only those targets
+encountered thus far. A path to the directory where was exe-
+cuted. Refer to the description of for more details. Is used in
+error handling, see Is used in error handling, see Is used in er-
+ror handling, see Is used in error handling in mode, see Is used
+in error handling, see The directory of the file this makefile
+was included from. The filename of the file this makefile was
+included from. The machine hardware name, see The machine
+processor architecture name, see The name that was executed with
+The same as for compatibility. The preferred variable to use is
+the environment variable because it is more compatible with other
+make variants and cannot be confused with the special target with
+the same name. Names the makefile (default from which generated
+dependencies are read. If set to do not print error information
+at the end. A boolean that controls the default behavior of the
+option. If true, variable values printed with are fully ex-
+panded; if false, the raw variable contents (which may include
+additional unexpanded variable references) are shown. The list
+of variables exported by The top-level makefile that is currently
+read, as given in the command line. The environment variable may
+contain anything that may be specified on command line. Anything
+specified on command line is appended to the variable, which is
+then added to the environment for all programs that executes.
+The numeric group ID of the user running It is read-only. If is
+run with the output for each target is prefixed with a token the
+first part of which can be controlled via If is empty, no token
+is printed. For example, setting to would produce tokens like
+making it easier to track the degree of parallelism being
+achieved. The argument to the option. A read-only boolean that
+indicates whether the option supports use of The recursion depth
+of The top-level instance of has level 0, and each child make has
+its parent level plus 1. This allows tests like: to protect
+things which should only be evaluated in the top-level instance
+of The name of the environment variable that stores the level of
+nested calls to The ordered list of makefile names (default that
+looks for. The list of makefiles read by which is useful for
+tracking dependencies. Each makefile is recorded only once, re-
+gardless of the number of times read. In mode, provides a list
+of prefixes which match the directories controlled by If a file
+that was generated outside of but within said bailiwick is miss-
+ing, the current target is considered out-of-date. In mode, it
+can (very rarely!) be useful to filter command lines before com-
+parison. 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. In mode, this variable contains a list of all the meta
+files updated. If not empty, it can be used to trigger process-
+ing of In 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. Provides a
+list of variable modifiers to apply to each pathname. Ignore if
+the expansion is an empty string. Provides a list of path pre-
+fixes that should be ignored; because the contents are expected
+to change over time. The default list includes: Provides a list
+of patterns to match against pathnames. Ignore any that match.
+Defines the message printed for each meta file updated in mode.
+The default value is: Processed after reading all makefiles. Af-
+fects the mode that runs in. It can contain these keywords: Like
+puts into mode. Puts into mode, where meta files are created for
+each target to capture the command run, the output generated, and
+if is available, the system calls which are of interest to The
+captured output can be useful when diagnosing errors. By de-
+fault, does not create files in This can be overridden by setting
+to a value which represents true. If is true, a missing file
+makes the target out-of-date. If is true, missing filemon data
+makes the target out-of-date. Do not use For debugging, it can
+be useful to include the environment in the file. If in mode,
+print a clue about the target being built. This is useful if the
+build is otherwise running silently. The message printed is the
+expanded value of Some makefiles have commands which are simply
+not stable. This keyword causes them to be ignored for determin-
+ing whether a target is out of date in mode. See also If is
+true, when a .meta file is created, mark the target In both com-
+pat and parallel mode, do not make the targets in the usual or-
+der, but instead randomize their order. This mode can be used to
+detect undeclared dependencies between files. Used to create
+files in a separate directory, see Used to force a separate di-
+rectory for the created files, even if that directory is not
+writable, see Used to create files in a separate directory, see
+The name of the operating system, see It is read-only. 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 This
+behavior can be disabled by assigning an empty value to within a
+makefile. Extra variables can be exported from a makefile by ap-
+pending their names to is re-exported whenever is modified. If
+was built with support, this is set to the path of the device
+node. This allows makefiles to test for this support. The
+process ID of It is read-only. The parent process ID of It is
+read-only. When stops due to an error, it sets to the name of
+the target that failed, to the exit status of the failed target,
+to the commands of the failed target, and in mode, it also sets
+to the and to the path of the meta file (if any) describing the
+failed target. It then prints its name and the value of as well
+as the value of any variables named in If true, are preserved
+when doing assignments. The default is false, for backwards com-
+patibility. Set to true for compatability with other makes. If
+set to false, becomes per normal evaluation rules. If set to ap-
+parent variable assignments in dependency lines are treated as
+normal sources. The numeric ID of the user running It is read-
+only. 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, prints the vari-
+able names and their values using: A path to the directory where
+the targets are built. Its value is determined by trying to to
+the following directories in order and using the first match:
+(Only if is set in the environment or on the command line.)
+(Only if is set in the environment or on the command line.)
+Variable expansion is performed on the value before it is used,
+so expressions such as may be used. This is especially useful
+with may be modified in the makefile via the special target In
+all cases, changes to the specified directory if it exists, and
+sets and to that directory before executing any targets. Except
+in the case of an explicit target, checks that the specified di-
+rectory is writable and ignores it if not. This check can be
+skipped by setting the environment variable to The directory name
+of the current makefile being parsed. The basename of the cur-
+rent makefile being parsed. This variable and are both set only
+while the makefiles are being parsed. To retain their current
+values, assign them to a variable using assignment with expansion
+The space-separated list of directories that searches for files.
+To update this search list, use the special target rather than
+modifying the variable directly. Is set in POSIX mode, see the
+special target. Alternate path to the current directory. nor-
+mally sets to the canonical path given by However, if the envi-
+ronment variable is set and gives a path to the current direc-
+tory, sets to the value of instead. This behavior is disabled if
+is set or contains a variable transform. is set to the value of
+for all programs which executes. The pathname of the shell used
+to run target scripts. It is read-only. The list of known suf-
+fixes. It is read-only. The space-separated list of directories
+that searches for makefiles, referred to as the system include
+path. To update this search list, use the special target rather
+than modifying the variable which is read-only. The list of tar-
+gets explicitly specified on the command line, if any. The
+colon-separated list of directories that searches for files.
+This variable is supported for compatibility with old make pro-
+grams only, use instead. The general format of a variable expan-
+sion is: 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 follows:
+
+In this case, the first modifier in the does not start with a
+colon, since that colon already occurs in the referencing vari-
+able. If any of the modifiers in the contains a dollar sign
+these must be doubled to avoid early expansion. Some modifiers
+interpret the expression value as a single string, others treat
+the expression value as a whitespace-separated list of words.
+When splitting a string into words, whitespace can be escaped us-
+ing double quotes, single quotes and backslashes, like in the
+shell. The quotes and backslashes are retained in the words.
+The supported modifiers are: Replaces each word with its suffix.
+Replaces each word with its dirname. Selects only those words
+that match The standard shell wildcard characters and may be
+used. The wildcard characters may be escaped with a backslash As
+a consequence of the way values are split into words, matched,
+and then joined, the construct removes all leading and trailing
+whitespace and normalizes the inter-word spacing to a single
+space. This is the opposite of selecting all words which do
+match Orders the words lexicographically. Orders the words nu-
+merically. A number followed by one of or is multiplied by the
+appropriate factor, which is 1024 for 1048576 for or 1073741824
+for Both upper- and lower-case letters are accepted. Orders the
+words in reverse lexicographical order. Orders the words in re-
+verse numerical order. Shuffles the words. The results are dif-
+ferent each time you are referring to the modified variable; use
+the assignment with expansion to prevent such behavior. For ex-
+ample, LIST= uno due tre quattro RAN-
+DOM_LIST= ${LIST:Ox} STATIC_RAN-
+DOM_LIST:= ${LIST:Ox}
+
+all: @echo "${RANDOM_LIST}" @echo "${RAN-
+DOM_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 quat-
+tro tre Quotes every shell meta-character in the value, so that
+it can be passed safely to the shell. Quotes every shell meta-
+character in the value, and also doubles characters so that it
+can be passed safely through recursive invocations of This is
+equivalent to Replaces each word with everything but its suffix.
+The value is an integer sequence representing the words of the
+original value, or the supplied The value is interpreted as a
+format string for using producing the formatted timestamp. Note:
+the format should only be used with If a value is not provided or
+is 0, the current time is used. Computes a 32-bit hash of the
+value and encodes it as 8 hex digits. The value is interpreted
+as a format string for using producing the formatted timestamp.
+If a value is not provided or is 0, the current time is used.
+Call with each word as pathname; use as the new value. If fails;
+use or current time. If is set to then failure will cause an er-
+ror. Attempts to convert the value to an absolute path using If
+that fails, the value is unchanged. Converts the value to lower-
+case letters. 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 If
+is omitted, no separator is used. The common escapes (including
+octal numeric codes) work as expected. Converts the value to up-
+per-case letters. Causes subsequent modifiers to treat the value
+as a single word (possibly containing embedded whitespace). See
+also Causes the value to be treated as a list of words. See also
+Modifies the first occurrence of in each word of the value, re-
+placing it with If a is appended to the last delimiter of the
+pattern, all occurrences in each word are replaced. If a is ap-
+pended to the last delimiter of the pattern, only the first oc-
+currence is affected. If a is appended to the last delimiter of
+the pattern, the value is treated as a single word. If begins
+with a caret is anchored at the beginning of each word. If ends
+with a dollar sign it is anchored at the end of each word. In-
+side an ampersand is replaced by (without the anchoring or Any
+character may be used as the delimiter for the parts of the modi-
+fier string. The anchoring, ampersand and delimiter characters
+can be escaped with a backslash Both and may contain nested ex-
+pressions. To prevent a dollar sign from starting a nested ex-
+pression, escape it with a backslash. The modifier works like
+the modifier except that the old and new strings, instead of be-
+ing simple strings, are an extended regular expression (see and
+an Normally, the first occurrence of the pattern in each word of
+the value is substituted with The modifier causes the substitu-
+tion to apply to at most one word; the modifier causes the sub-
+stitution to apply to as many instances of the search pattern as
+occur in the word or words it is found in; the modifier causes
+the value to be treated as a single word (possibly containing em-
+bedded whitespace). As for the modifier, the and are subjected
+to variable expansion before being parsed as regular expressions.
+Replaces each word with its last path component (basename). Re-
+moves adjacent duplicate words (like If the variable name (not
+its value), when parsed as a conditional expression, evaluates to
+true, return as its value the otherwise return the Since the
+variable name is used as the expression, :? must be the first
+modifier after the variable name which, of course, usually con-
+tains variable expansions. A common error is trying to use ex-
+pressions like which actually tests defined(NUMBERS). To deter-
+mine if any words match you need to use something like: This is
+the style substitution. It can only be the last modifier speci-
+fied, as a in either or is treated as a regular character, not as
+the end of the modifier. If does not contain the pattern match-
+ing character and the word ends with or equals it, that suffix is
+replaced with Otherwise, the first in matches a possibly empty
+substring of arbitrary characters, and if the whole pattern is
+found in the word, the matching part is replaced with and the
+first occurrence of in (if any) is replaced with the substring
+matched by the Both and may contain nested expressions. To pre-
+vent a dollar sign from starting a nested expression, escape it
+with a backslash. This is the loop expansion mechanism from the
+OSF Development Environment (ODE) make. Unlike loops, expansion
+occurs at the time of reference. For each word in the value, as-
+sign the word to the variable named and evaluate The ODE conven-
+tion is that should start and end with a period, for example:
+However, a single-letter variable is often more readable: Saves
+the current variable value in or the named 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
+
+
+Here is used to save the result of the modifier which is later
+referenced using the index values from If the variable is unde-
+fined, the optional (which may be empty) is the value. If the
+variable is defined, the existing value is returned. This is an-
+other ODE make feature. It is handy for setting per-target
+CFLAGS for instance: If a value is only required if the variable
+is undefined, use: If the variable is defined, (which may be
+empty) is the value. The name of the variable is the value. 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. The output of running is the value. The value is
+run as a command, and the output becomes the new value. The
+variable is assigned the value after substitution. This modifier
+and its variations are useful in obscure situations such as want-
+ing to set a variable at a point where a target's shell commands
+are being parsed. These assignment modifiers always expand to
+nothing. The helps avoid false matches with the style modifier
+and since substitution always occurs, the form is vaguely appro-
+priate. As for but only if the variable does not already have a
+value. Append to the variable. Assign the output of to the
+variable. Selects one or more words from the value, or performs
+other operations 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 modifier, 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 is subjected to variable expansion, and the expanded
+result is then interpreted as follows: Selects a single word from
+the value. Selects all words from to inclusive. For example,
+selects all words from the second word to the last word. If is
+greater than the words are output in reverse order. For example,
+selects all the words from last to first. If the list is already
+ordered, this effectively reverses the list, but it is more effi-
+cient to use instead of Causes subsequent modifiers to treat the
+value as a single word (possibly containing embedded whitespace).
+Analogous to the effect of in Bourne shell. Means the same as
+Causes subsequent modifiers to treat the value as a sequence of
+words delimited by whitespace. Analogous to the effect of in
+Bourne shell. Returns the number of words in the value. 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 or Files are included with either or Variables between
+the angle brackets or double quotes are expanded to form the file
+name. If angle brackets are used, the included makefile is ex-
+pected to be in the system makefile directory. If double quotes
+are used, the including makefile's directory and any directories
+specified using the option are searched before the system make-
+file directory. For compatibility with other make variants,
+(without leading dot) is also accepted. If the include statement
+is written as or as errors locating and/or opening include files
+are ignored. If the include statement is written as not only are
+errors locating and/or opening include files ignored, but stale
+dependencies within the included file are ignored just like in
+The directives for exporting and unexporting variables are: Ex-
+port the specified global variable. If no variable list is pro-
+vided, all globals are exported except for internal variables
+(those that start with This is not affected by the flag, so
+should be used with caution. For compatibility with other make
+programs, (without leading dot) is also accepted. Appending a
+variable name to is equivalent to exporting a variable. The same
+as except that the variable is not appended to This allows ex-
+porting a value to the environment which is different from that
+used by internally. The same as except that variables in the
+value are not expanded. The opposite of The specified global is
+removed from If no variable list is provided, all globals are un-
+exported, and deleted. Unexport all globals previously exported
+and clear the environment inherited from the parent. This opera-
+tion causes a memory leak of the original environment, so should
+be used sparingly. Testing for being 0 would make sense. Also
+note that any variables which originated in the parent environ-
+ment should be explicitly preserved if desired. For example:
+PATH := ${PATH} Would result in an environment containing only
+which is the minimal useful environment. Actually is also pushed
+into the new environment. The directives for printing messages
+to the output are: The message is printed along with the name of
+the makefile and line number. The message prefixed by is printed
+along with the name of the makefile and line number. The message
+is printed along with the name of the makefile and line number,
+exits immediately. The directives for conditionals are: Test the
+value of an expression. Test whether a variable is defined.
+Test whether a variable is not defined. Test the target being
+requested. Test the target being requested. Reverse the sense
+of the last conditional. A combination of followed by A combina-
+tion of followed by A combination of followed by A combination of
+followed by A combination of followed by End the body of the con-
+ditional. The may be any one of the following: Logical OR. Log-
+ical AND; of higher precedence than only evaluates a conditional
+as far as is necessary to determine its value. Parentheses can
+be used to override the operator precedence. The boolean opera-
+tor may be used to logically negate an expression, typically a
+function call. It is of higher precedence than The value of may
+be any of the following function call expressions: Evaluates to
+true if the variable has been defined. Evaluates to true if the
+target was specified as part of command line or was declared the
+default target (either implicitly or explicitly, see before the
+line containing the conditional. Evaluates to true if the expan-
+sion of the variable, after applying the modifiers, results in an
+empty string. Evaluates to true if the given pathname exists.
+If relative, the pathname is searched for on the system search
+path (see Evaluates to true if the target has been defined.
+Evaluates to true if the target has been defined and has commands
+associated with it. may also be an arithmetic or string compari-
+son. Variable expansion is performed on both sides of the com-
+parison. If both sides are numeric and neither is enclosed in
+quotes, the comparison is done numerically, otherwise lexico-
+graphically. A string is interpreted as a hexadecimal integer if
+it is preceded by otherwise it is interpreted as a decimal float-
+ing-point number; octal numbers are not supported. All compar-
+isons may use the operators and Numeric comparisons may also use
+the operators and If the comparison has neither a comparison op-
+erator nor a right side, the expression evaluates to true if it
+is nonempty and its numeric value (if any) is not zero. When is
+evaluating one of these conditional expressions, and it encoun-
+ters a (whitespace-separated) word it doesn't recognize, either
+the or function is applied to it, depending on the form of the
+conditional. If the form is or the function is applied. Simi-
+larly, if the form is or the function is applied. If the condi-
+tional evaluates to true, parsing of the makefile continues as
+before. If it evaluates to false, the following lines until the
+corresponding variant, or are skipped. For loops are typically
+used to apply a set of rules to a list of files. The syntax of a
+for loop is: The is expanded and then split into words. On each
+iteration of the loop, one word is taken and assigned to each in
+order, and these are substituted into the 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 provided
+must be a multiple of three. If is encountered within a loop, it
+causes early termination of the loop, otherwise a parse error.
+Un-define the specified global variables. Only global variables
+can be un-defined. Comments begin with a hash character, any-
+where but in a shell command line, and continue to the end of an
+unescaped new line. Target is never out of date, but always exe-
+cute commands anyway. Ignore any errors from the commands asso-
+ciated with this target, exactly as if they all were preceded by
+a dash Mark all sources of this target as being up to date. Exe-
+cute the commands associated with this target even if the or op-
+tions were specified. Normally used to mark recursive Create a
+meta file for the target, even if it is flagged as or Usage in
+conjunction with is the most likely case. In mode, the target is
+out-of-date if the meta file is missing. Do not create a meta
+file for the target. Meta files are also not created for or tar-
+gets. 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 ap-
+plies to any command line that uses the variable 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 pattern suppresses any expansion of the unwanted variable.
+Do not search for the target in the directories specified by Nor-
+mally selects the first target it encounters as the default tar-
+get to be built if no target was specified. This source prevents
+this target from being selected. If a target is marked with this
+attribute and can't figure out how to create it, it ignores this
+fact and assumes the file isn't needed or already exists. The
+target does not correspond to an actual file; it is always con-
+sidered to be out of date, and is not created with the option.
+Suffix-transformation rules are not applied to targets. When is
+interrupted, it normally removes any partially made targets.
+This source prevents the target from being removed. Synonym for
+Do not echo any of the commands associated with this target, ex-
+actly as if they all were preceded by an at sign Turn the target
+into version of a macro. When the target is used as a source for
+another target, the other target acquires the commands, sources,
+and attributes (except for of the source. If the target already
+has commands, the target's commands are appended to them. Like
+but instead of appending, prepend the target commands to the tar-
+get. If appears in a dependency line, the sources that precede
+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 being 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 The ordering imposed by is only relevant for
+parallel makes. Special targets may not be included with other
+targets, i.e. they must be the only target specified. Any com-
+mand lines attached to this target are executed before anything
+else is done. This is sort of a rule for any target (that was
+used only as a source) that can't figure out any other way to
+create. Only the shell script is used. The variable of a target
+that inherits commands is set to the target's own name. 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. Any command lines at-
+tached to this target are executed after everything else is done
+successfully. Any command lines attached to this target are exe-
+cuted when another target fails. See for the variables that will
+be set. Mark each of the sources with the attribute. If no
+sources are specified, this is the equivalent of specifying the
+option. If is interrupted, the commands for this target are exe-
+cuted. If no target is specified when is invoked, this target is
+built. This target provides a way to specify flags for at the
+time when the makefiles are read. The flags are as if typed to
+the shell, though the option has no effect. Apply the attribute
+to any specified sources. Disable parallel mode. Synonym for
+for compatibility with other pmake variants. clear the read-only
+attribute from the global variables specified as sources. The
+source is a new value for If it exists, changes the current work-
+ing directory to it and updates the value of 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 depen-
+dents of a target do not get built until the target itself could
+be built, unless is built by another part of the dependency
+graph, the following is a dependency loop: .ORDER: b a b: a The
+sources are directories which are to be searched for files not
+found in the current directory. If no sources are specified, any
+previously specified directories are removed from the search
+path. If the source is the special target, the current working
+directory is searched last. Like but applies only to files with
+a particular suffix. The suffix must have been previously de-
+clared with Apply the attribute to any specified sources. If
+this is the first non-comment line in the main makefile, the
+variable is set to the value and the makefile is included if it
+exists, to provide POSIX-compatible default rules. If is run
+with the flag, only contributes to the default rules. Apply the
+attribute to any specified sources. If no sources are specified,
+the attribute is applied to every target in the file. set the
+read-only attribute on the global variables specified as sources.
+Sets the shell that uses to execute commands. The sources are a
+set of pairs. This is the minimal specification, used to select
+one of the built-in shell specs; and Specifies the absolute path
+to the shell. Indicates whether the shell supports exit on er-
+ror. The command to turn on error checking. The command to dis-
+able error checking. The command to turn on echoing of commands
+executed. The command to turn off echoing of commands executed.
+The output to filter after issuing the command. It is typically
+identical to The flag to pass the shell to enable error checking.
+The flag to pass the shell to enable command echoing. The string
+literal to pass the shell that results in a single newline char-
+acter 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'" Apply the attribute to any specified sources. If
+no sources are specified, the attribute is applied to every com-
+mand in the file. This target gets run when a dependency file
+contains stale entries, having set to the name of that dependency
+file. Each source specifies a suffix to If no sources are speci-
+fied, 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} The sources
+are directories which are to be added to the system include path
+which searches for makefiles. If no sources are specified, any
+previously specified directories are removed from the system in-
+clude path. uses the following environment variables, if they
+exist: and and may only be set in the environment or on the com-
+mand line to and not as makefile variables; see the description
+of for more details. list of dependencies first default makefile
+if no makefile is specified on the command line second default
+makefile if no makefile is specified on the command line system
+makefile system makefile directory The basic make syntax is com-
+patible between different make variants; however the special
+variables, variable modifiers and conditionals are not. An in-
+complete list of changes in older versions of 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
+problems 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 algorithms
+used may change again in the future. Other make dialects (GNU
+make, SVR4 make, POSIX make, etc.) do not support most of the
+features of as described in this manual. Most notably: The and
+declarations and most functionality pertaining to paralleliza-
+tion. (GNU make supports parallelization but lacks the features
+needed to control it effectively.) Directives, including for
+loops and conditionals and most of the forms of include files.
+(GNU make has its own incompatible 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 and Variable modifiers, except for
+the string substitution, which does not portably support globbing
+with and historically only works on declared suffixes. The vari-
+able even in its short form; most makes support this functional-
+ity but its name varies. Some features are somewhat more
+portable, such as assignment with and The functionality is based
+on an older feature 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 uni-
+versally portable, as is the variable. Basic use of suffix rules
+(for files only in the current directory, not trying to chain
+transformations together, etc.) is also reasonably portable. is
+derived from NetBSD It uses autoconf to facilitate portability to
+other platforms. A make command appeared in This make implemen-
+tation is based on Adam de Boor's pmake program, which was writ-
+ten for Sprite at Berkeley. It was designed to be a parallel
+distributed make running jobs on different machines using a dae-
+mon called Historically the target/dependency has been used to
+FoRCe rebuilding (since the target/dependency does not exist ...
+unless someone creates an file). The make syntax is difficult to
+parse. For instance, finding the end of a variable's use should
+involve scanning each of the modifiers, using the correct termi-
+nator 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.
+Sometimes the attempt to suppress a cascade of unnecessary er-
+rors, can result in a seemingly unexplained
-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 makefile option is
- given, bmake will try 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.
- bmake will prepend 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 executing the commands to make the sources of a
- dependency line in sequence.
- -C directory
- Change to directory before reading the makefiles or doing any-
- thing else. If multiple -C options are specified, each is inter-
- preted relative to the previous one: -C / -C etc is equivalent 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 will
- be processed by any child make processes. By default, debugging
- information is printed to standard error, but this can be changed
- using the F debugging flag. The debugging output is always un-
- buffered; in addition, if debugging is enabled but debugging out-
- put is not directed to standard output, then the standard output
- is line buffered. Flags is one or more of the following:
- 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 current working direc-
- tory.
- c Print debugging information about conditional evaluation.
- 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 `+', then the file will be opened in append mode;
- otherwise the file will be overwritten. If the file name
- is `stdout' or `stderr' then debugging output will be
- written to the standard output or standard error output
- file descriptors respectively (and the `+' option has no
- effect). Otherwise, the output will be written to the
- named file. If the file name ends `.%d' then 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 before
- exiting on error.
-
- g3 Print the input graph before exiting on error.
-
- h Print debugging information about hash table operations.
-
- j Print debugging information about running multiple
- shells.
-
- L Turn on lint checks. This will throw 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, includ-
- ing 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 vari-
- able, 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.
-
- x Run shell commands with -x so the actual commands are
- printed as they are executed.
-
- -e Specify that environment variables override macro assignments
- within makefiles.
-
- -f makefile
- Specify a makefile to read instead of the default `makefile'. If
- makefile is `-', standard input is read. Multiple makefiles may
- be specified, and are read in the order specified.
-
- -I directory
- Specify a directory in which to search for makefiles and included
- makefiles. The system makefile directory (or directories, see
- the -m option) is automatically included as part of this list.
-
- -i Ignore non-zero exit of shell commands in the makefile. Equiva-
- lent to specifying `-' before each command line in the makefile.
-
- -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 is saved in .MAKE.JOBS. Turns compati-
- bility mode off, unless the B flag is also specified. When com-
- patibility mode is off, all commands associated with a target are
- executed in a single shell invocation as opposed to the tradi-
- tional 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.
-
- -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 will
- override the default system include path: /usr/share/mk. Fur-
- thermore the system include path will be appended to the search
- path used for "file"-style include statements (see the -I op-
- tion).
-
- If a file or directory name in the -m argument (or the
- MAKESYSPATH environment variable) starts with the string ".../"
- then bmake will search for the specified file or directory named
- in the remaining part of the argument string. The search starts
- with the current directory of the Makefile and then works upward
- towards the root of the file system. If the search is success-
- ful, then the resulting directory replaces the ".../" specifica-
- tion in the -m argument. If used, 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 spe-
- cial source (see below) or the command is prefixed with `+'.
-
- -N Display the commands which 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, but 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 default
- 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. Multiple
- instances of this option may be specified; the variables will be
- printed one per line, with a blank line for each null or unde-
- fined 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 additional unexpanded vari-
- able references) are shown. If variable contains a `$' then the
- value will be recursively expanded to its complete resultant text
- before printing. The expanded value will also be printed 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 vari-
- ables during makefile processing, are not accessible via this op-
- tion. The -dv debug mode can be used to see these at the cost of
- generating substantial extraneous output.
-
- -v variable
- Like -V but the variable is always expanded to its complete
- value.
-
- -W Treat any warnings during makefile parsing as errors.
-
- -w Print entering and leaving directory messages, pre and post pro-
- cessing.
-
- -X Don't export variables passed on the command line to the environ-
- ment individually. Variables passed on the command line are
- still exported via the MAKEFLAGS environment variable. This op-
- tion 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. Vari-
- able assignments should follow options for POSIX compatibility
- but no ordering is enforced.
-
- There are seven different types of lines in a makefile: file dependency
- specifications, shell commands, variable assignments, include statements,
- conditional directives, for loops, and comments.
-
- In general, 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 target is consid-
- ered out-of-date if it does not exist, or if its modification time is
- less than that of any of its sources. An out-of-date target will be 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 inter-
- rupted, 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 at-
- tached shell commands are run if the target is out of date with re-
- spect to (only) those sources. Thus, different groups of the at-
- tached shell commands may be run depending on the circumstances.
- Furthermore, unlike :, for dependency lines with no sources, the
- attached shell commands are always run. Also unlike :, the target
- will not be removed if bmake is interrupted.
- All dependency lines mentioning a particular target must use the same op-
- erator.
-
- 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 must be used to describe ex-
- isting files. The value `{}' need not necessarily be used to describe
- existing 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 appear 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 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 combination
- of `@', `+', or `-', the command is treated specially. A `@' causes the
- command not to be echoed before it is executed. A `+' 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 sin-
- gle line of a script. A `-' 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 com-
- mand contains any shell meta characters (`#=|^(){};&<>*?[]:$`\\n') it
- will be passed to the shell; otherwise bmake will attempt direct execu-
- tion. If a line starts with `-' and the shell has ErrCtl enabled then
- failure of the command line will be ignored as in compatibility mode.
- Otherwise `-' affects the entire job; the script will stop at the first
- command line that fails, but the target will not be 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 needs to use "cd"
- or "chdir" without potentially changing the directory for subsequent com-
- mands should be put in parentheses so it executes in a subshell. To
- force the use of one 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 will chdir(2) to `.OBJDIR' before executing any targets, each
- child process starts with that as its current working directory.
-
-VARIABLE ASSIGNMENTS
- Variables in make are much like variables in the shell, and, by tradi-
- tion, consist of all upper-case letters.
-
- Variable assignment modifiers
- The five operators that can be used to assign values to variables are as
- follows:
-
- = Assign the value to the variable. Any previous value is overrid-
- den.
-
- += Append the value to the current value of the variable.
-
- ?= Assign the value to the variable if it is not already defined.
-
- := Assign with expansion, i.e. expand the value before assigning it
- to the variable. Normally, expansion is not done until the vari-
- able is referenced. 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 and as-
- sign the result to the variable. Any newlines in the result are
- replaced with spaces.
-
- Any white-space before the assigned value is removed; if the value is be-
- ing appended, a single space is inserted between the previous contents of
- the variable and the appended value.
-
- Variables are expanded by surrounding the variable name with either curly
- braces (`{}') or parentheses (`()') and preceding it with a dollar sign
- (`$'). If the variable name contains only a single letter, the surround-
- ing braces or parentheses are not required. This shorter form is not
- recommended.
-
- If the variable name contains a dollar, then 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 variable contains a dollar sign (`$') the
- string is expanded again.
-
- Variable substitution occurs at three 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 shell commands are expanded when the shell command is
- executed.
-
- 3. ".for" loop index variables are expanded on each loop iteration.
- Note that other variables are not expanded inside loops so the fol-
- lowing example code:
- .for i in 1 2 3
- a+= ${i}
- j= ${i}
- b+= ${j}
- .endfor
- all:
- @echo ${a}
- @echo ${b}
- will print:
- 1 2 3
- 3 3 3
- Because while ${a} contains "1 2 3" after the loop is executed, ${b}
- contains "${j} ${j} ${j}" which expands to "3 3 3" since after the
- loop completes ${j} contains "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 are all built in and their values vary magically from
- target to target. It is not currently possible to define new local vari-
- ables. The seven local variables are as follows:
- .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 defined
- 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 file prefix of the target, containing only the file
- portion, no suffix or preceding directory components;
- also known as `*'. The suffix must be one of the known
- suffixes declared with .SUFFIXES or it will not be recog-
- nized.
- .TARGET The name of the target; also known as `@'. For compati-
- bility 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:
- $ A single dollar sign `$', i.e. `$$' expands to a single
- dollar sign.
- .ALLTARGETS The list of all targets encountered in the Makefile. If
- evaluated during Makefile parsing, lists only those tar-
- gets encountered thus far.
- .CURDIR A path to the directory where bmake was executed. Refer
- to the description of `PWD' for more details.
- .INCLUDEDFROMDIR
- The directory of the file this Makefile was included
- from.
-
- .INCLUDEDFROMFILE
- The filename of the file this Makefile was included from.
-
- MAKE The name that bmake was executed with (argv[0]). For
- compatibility bmake also sets .MAKE with the same value.
- The preferred variable to use is the environment variable
- MAKE because it is more compatible with other versions of
- bmake and cannot be confused with the special target with
- the same name.
-
- .MAKE.DEPENDFILE
- Names the makefile (default `.depend') from which gener-
- ated dependencies are read.
-
- .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 refer-
- ences) are shown.
-
- .MAKE.EXPORTED The list of variables exported by bmake.
-
- .MAKE.JOBS The argument to the -j option.
-
- .MAKE.JOB.PREFIX
- If bmake is run with j then 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 example:
- .MAKE.JOB.PREFIX=${.newline}---${.MAKE:T}[${.MAKE.PID}]
- would produce tokens like `---make[1234] target ---' mak-
- ing it easier to track the degree of parallelism being
- achieved.
-
- 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 entered into the envi-
- ronment for all programs which bmake executes.
-
- .MAKE.LEVEL The recursion depth of bmake. The initial instance of
- bmake will be 0, and an incremented value is put into the
- environment to be seen by the next generation. This al-
- lows tests like: .if ${.MAKE.LEVEL} == 0 to protect
- things which should only be evaluated in the initial in-
- stance of bmake.
-
- .MAKE.MAKEFILE_PREFERENCE
- The ordered list of makefile names (default `makefile',
- `Makefile') that bmake will look for.
-
- .MAKE.MAKEFILES
- The list of makefiles read by bmake, which is useful for
- tracking dependencies. Each makefile is recorded only
- once, regardless of the number of times read.
-
- .MAKE.MODE Processed after reading all makefiles. Can affect the
- mode that bmake runs in. It can contain a number of key-
- words:
-
- compat Like -B, puts bmake into "compat"
- mode.
-
- meta Puts bmake into "meta" mode, where
- meta files are created for each tar-
- get 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 very useful when
- diagnosing errors.
-
- curdirOk= bf Normally bmake will 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, then a missing .meta
- file makes the target out-of-date.
-
- missing-filemon= bf If bf is True, then 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 environment 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
- running silently. The message
- printed the value of:
- .MAKE.META.PREFIX.
-
- ignore-cmd Some makefiles have commands which
- are simply not stable. 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.
-
- .MAKE.META.BAILIWICK
- In "meta" mode, provides a list of prefixes which match
- the directories 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.CREATED
- In "meta" mode, this variable contains a list of all the
- meta files updated. If not empty, it can be used to
- trigger processing 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 informa-
- tion.
-
- .MAKE.META.IGNORE_PATHS
- Provides a list of path prefixes that should be ignored;
- because the contents are expected to change over time.
- The default 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.IGNORE_FILTER
- Provides a list of variable modifiers to apply to each
- pathname. Ignore if the expansion is an empty string.
-
- .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}
-
- .MAKEOVERRIDES This variable is used to record the names of variables
- assigned to on the command line, so that they may be ex-
- ported as part of `MAKEFLAGS'. This behavior can be dis-
- abled by assigning an empty value to `.MAKEOVERRIDES'
- within a makefile. Extra variables 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.
-
- .MAKE.PPID The parent process-id of bmake.
-
- .MAKE.SAVE_DOLLARS
- value should be a boolean that controls whether `$$' are
- preserved when doing `:=' assignments. The default is
- false, for backwards compatibility. Set to true for com-
- patability with other makes. If set to false, `$$' be-
- comes `$' per normal evaluation rules.
-
- .MAKE.UID The user-id running bmake.
-
- .MAKE.GID The group-id running bmake.
-
- 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 commands 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'.
-
- .newline This variable is simply assigned a newline character as
- its value. This allows expansions using the :@ modifier
- to put a newline between iterations of the loop rather
- than a space. For example, the printing of
- `MAKE_PRINT_VAR_ON_ERROR' could be done as
- ${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 follow-
- ing directories in order and using the first match:
-
- 1. ${MAKEOBJDIRPREFIX}${.CURDIR}
-
- (Only if `MAKEOBJDIRPREFIX' is set in the environ-
- ment 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's
- 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
- target `.OBJDIR'. In all cases, bmake will chdir(2) to
- the specified directory if it exists, and set `.OBJDIR'
- and `PWD' to that directory before executing any targets.
-
- Except in the case of an explicit `.OBJDIR' target, bmake
- will check that the specified directory is writable and
- ignore it if not. This check can be skipped by setting
- the environment variable `MAKE_OBJDIR_CHECK_WRITABLE' to
- "no".
-
- .PARSEDIR A path to the directory of the current `Makefile' being
- parsed.
-
- .PARSEFILE The basename of the current `Makefile' being parsed.
- This variable and `.PARSEDIR' are both set only while the
- `Makefiles' are being parsed. If you want to retain
- their current values, assign them to a variable using as-
- signment with expansion: (`:=').
- .PATH A variable that represents the list of directories that
- bmake will search for files. The search list should be
- updated using the target `.PATH' rather than the vari-
- able.
- 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, then 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 executes.
- .SHELL The pathname of the shell used to run target scripts. It
- is read-only.
- .TARGETS The list of targets explicitly specified on the command
- line, if any.
- VPATH Colon-separated (":") lists of directories that bmake
- will search for files. The variable is supported for
- compatibility with old make programs only, use `.PATH'
- instead.
- Variable modifiers
- Variable expansion may be modified to select or modify each word of the
- variable (where a "word" is white-space delimited sequence of charac-
- ters). The general format of a variable expansion is as follows:
- ${variable[:modifier[:...]]}
- Each modifier begins with a colon, which may be escaped with a backslash
- (`\').
- A set of modifiers can be specified via a variable, as follows:
- modifier_variable=modifier[:...]
- ${variable:${modifier_variable}[:...]}
- In this case the first modifier in the modifier_variable does not start
- with a colon, since that must appear in the referencing variable. If any
- of the modifiers in the modifier_variable contain a dollar sign (`$'),
- these must be doubled to avoid early expansion.
- The supported modifiers are:
- :E Replaces each word in the variable with its suffix.
- :H Replaces each word in the variable with everything but the last com-
- ponent.
- :Mpattern
- Selects only those words that match pattern. The standard shell
- wildcard characters (`*', `?', and `[]') may be used. The wildcard
- characters may be escaped with a backslash (`\'). As a consequence
- of the way values are split into words, matched, and then joined, a
- construct like
- ${VAR:M*}
- will normalize the inter-word spacing, removing all leading and
- trailing space, and converting multiple consecutive spaces to single
- spaces.
-
- :Npattern
- This is identical to `:M', but selects all words which do not match
- pattern.
-
- :O Orders every word in variable alphabetically.
-
- :Or Orders every word in variable in reverse alphabetical order.
-
- :Ox Shuffles the words in variable. The results will be different each
- time you are referring to the modified variable; use the assignment
- with expansion (`:=') 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 variable, so that it can be
- passed safely to the shell.
-
- :q Quotes every shell meta-character in the variable, and also doubles
- `$' characters so that it can be passed safely through recursive in-
- vocations of bmake. This is equivalent to: `:S/\$/&&/g:Q'.
-
- :R Replaces each word in the variable with everything but its suffix.
-
- :range[=count]
- The value is an integer sequence representing the words of the orig-
- inal value, or the supplied count.
-
- :gmtime[=utc]
- The value is a format string for strftime(3), using gmtime(3). If a
- utc value is not provided or is 0, the current time is used.
-
- :hash
- Computes a 32-bit hash of the value and encode it as hex digits.
-
- :localtime[=utc]
- The value is a format string for strftime(3), using localtime(3).
- If a utc value is not provided or is 0, the current time is used.
-
- :tA Attempts to convert variable to an absolute path using realpath(3),
- if that fails, the value is unchanged.
-
- :tl Converts variable to lower-case letters.
-
- :tsc
- Words in the variable are normally separated by a space on expan-
- sion. This modifier sets the separator to the character c. If c is
- omitted, then no separator is used. The common escapes (including
- octal numeric codes) work as expected.
-
- :tu Converts variable to upper-case letters.
-
- :tW Causes the value to be treated as a single word (possibly containing
- embedded white space). See also `:[*]'.
-
- :tw Causes the value to be treated as a sequence of words delimited by
- white space. See also `:[@]'.
-
- :S/old_string/new_string/[1gW]
- Modifies the first occurrence of old_string in each word of the
- variable's value, replacing it with new_string. If a `g' is ap-
- pended 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 pattern, only the first occurrence is affected. If a `W' is ap-
- pended to the last delimiter of the pattern, then the value is
- treated as a single word (possibly containing embedded white space).
- 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 any `^' or
- `$'). Any character may be used as a delimiter for the parts of the
- modifier string. The anchoring, ampersand and delimiter characters
- may be escaped with a backslash (`\').
-
- Variable expansion occurs in the normal fashion inside both
- old_string and new_string with the single exception that a backslash
- is used to prevent the expansion of a dollar sign (`$'), not a pre-
- ceding dollar sign as is usual.
-
- :C/pattern/replacement/[1gW]
- The :C modifier is just like the :S modifier except that the old and
- new strings, instead of being simple strings, are an extended regu-
- lar expression (see regex(3)) string pattern and an ed(1)-style
- string 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 in the variable with its last path component.
-
- :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 variable
- name is used as the expression, :? must be the first modifier after
- the variable name itself - which will, of course, usually contain
- 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 variable substitution. It must
- be the last modifier specified. If old_string or new_string do not
- contain the pattern matching character % then it is assumed that
- they are anchored at the end of each word, so only suffixes or en-
- tire words may be replaced. Otherwise % is the substring of
- old_string to be replaced in new_string. If only old_string con-
- tains the pattern matching character %, and old_string matches, then
- the result is the new_string. If only the new_string contains the
- pattern matching character %, then it is not treated specially and
- it is printed as a literal % on match. If there is more than one
- pattern matching character (%) in either the new_string or
- old_string, only the first instance is treated specially (as the
- pattern character); all subsequent instances are treated as regular
- characters.
-
- Variable expansion occurs in the normal fashion inside both
- old_string and new_string with the single exception that a backslash
- is used to prevent the expansion of a dollar sign (`$'), not a pre-
- ceding dollar sign as is usual.
-
- :@temp@string@
- This is the loop expansion mechanism from the OSF Development Envi-
- ronment (ODE) make. Unlike .for loops, expansion occurs at the time
- of reference. Assigns temp to each word in the variable and evalu-
- ates string. The ODE convention is that temp should start and end
- with a period. For example.
- ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}
-
- However a single character 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 variable
- is defined, the existing value is returned. This is another ODE
- make feature. It is handy for setting per-target CFLAGS for in-
- stance:
- ${_${.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, then the name of
- the variable is used. In order for this modifier to work, the name
- (node) must at least have appeared on the rhs of a dependency.
-
- :!cmd!
- The output of running cmd is the value.
-
- :sh If the variable is non-empty it 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 when shell commands are being parsed.
- These assignment modifiers always expand to nothing, so if appearing
- in a rule line by themselves should be preceded with something to
- keep bmake happy.
-
- 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 divided into words.
-
- Ordinarily, a value is treated as a sequence of words delimited by
- white space. Some modifiers suppress this behavior, causing a value
- to be treated as a single word (possibly containing embedded white
- space). An empty value, or a value that consists entirely of white-
- space, is treated as a single word. For the purposes of the `:[]'
- modifier, the words are indexed both forwards using positive inte-
- gers (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 example,
- `:[2..-1]' selects all words from the second word to the last
- word. If start is greater than end, then the words are out-
- put in reverse order. For example, `:[-1..1]' selects all
- the words from last to first. If the list is already or-
- dered, then 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 white space). Analogous
- to the effect of "$*" in Bourne shell.
-
- 0 Means the same as `:[*]'.
-
- @ Causes subsequent modifiers to treat the value as a sequence
- of words delimited by white space. Analogous to the effect
- of "$@" in Bourne shell.
-
- # Returns the number of words in the value.
-
-INCLUDE STATEMENTS, CONDITIONALS AND FOR LOOPS
- Makefile inclusion, conditional structures and for loops reminiscent of
- the C programming language are provided in bmake. All such structures
- are identified by a line beginning with a single dot (`.') character.
- Files are included with either .include <file> or .include "file". Vari-
- ables between the angle brackets or double quotes are expanded to form
- the file name. If angle brackets are used, the included makefile is ex-
- pected to be in the system makefile directory. If double quotes are
- used, the including makefile's directory and any directories specified
- using the -I option are searched before the system makefile directory.
- For compatibility with other versions of bmake `include file ...' is also
- accepted.
-
- If the include statement is written as .-include or as .sinclude then er-
- rors locating and/or opening include files are ignored.
-
- If the include statement is written as .dinclude not only are errors lo-
- cating and/or opening include files ignored, but stale dependencies
- within the included file will be ignored just like .MAKE.DEPENDFILE.
- Conditional expressions are also preceded by a single dot as the first
- character of a line. The possible conditionals are as follows:
- .error message
- The message is printed along with the name of the makefile and
- line number, then bmake will exit immediately.
- .export variable ...
- Export the specified global variable. If no variable list is
- provided, all globals are exported except for internal variables
- (those that start with `.'). This is not affected by the -X
- flag, so should be used with caution. For compatibility with
- other bmake programs `export variable=value' is also accepted.
-
- Appending a variable name to .MAKE.EXPORTED is equivalent to ex-
- porting 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 environ-
- ment 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.
-
- .info message
- The message is printed along with the name of the makefile and
- line number.
-
- .undef variable ...
- Un-define the specified global variables. Only global variables
- can be un-defined.
-
- .unexport variable ...
- The opposite of `.export'. The specified global variable will be
- 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 will cause a mem-
- ory leak of the original environment, so should be used spar-
- ingly. Testing for .MAKE.LEVEL being 0, would make sense. Also
- note that any variables which originated in the parent environ-
- ment 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' will also
- be pushed into the new environment.
-
- .warning message
- The message prefixed by `warning:' is printed along with the name
- of the makefile and line number.
-
- .if [!]expression [operator expression ...]
- Test the value of an expression.
-
- .ifdef [!]variable [operator variable ...]
- Test the value of a variable.
-
- .ifndef [!]variable [operator variable ...]
- Test the value of a variable.
-
- .ifmake [!]target [operator target ...]
- Test the target being built.
-
- .ifnmake [!] target [operator target ...]
- Test the target being built.
-
- .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 "||".
-
- As in C, bmake will only evaluate a conditional as far as is necessary to
- determine its value. Parentheses may be used to change the order of
- evaluation. The boolean operator `!' may be used to logically negate an
- entire conditional. It is of higher precedence than `&&'.
-
- The value of expression may be any of the following:
-
- defined Takes a variable name as an argument and evaluates to true if
- the variable has been defined.
-
- make Takes a target name as an argument and evaluates to true if the
- target was specified as part of bmake's command line or was de-
- clared the default target (either implicitly or explicitly, see
- .MAIN) before the line containing the conditional.
-
- empty Takes a variable, with possible modifiers, and evaluates to true
- if the expansion of the variable would result in an empty
- string.
-
- exists Takes a file name as an argument and evaluates to true if the
- file exists. The file is searched for on the system search path
- (see .PATH).
-
- target Takes a target name as an argument and evaluates to true if the
- target has been defined.
-
- commands
- Takes a target name as an argument and evaluates to true if the
- target has been defined and has commands associated with it.
-
- Expression may also be an arithmetic or string comparison. Variable ex-
- pansion is performed on both sides of the comparison, after which the nu-
- merical values are compared. A value is interpreted as hexadecimal if it
- is preceded by 0x, otherwise it is decimal; octal numbers are not sup-
- ported. The standard C relational operators are all supported. If after
- variable expansion, either the left or right hand side of a `==' or `!='
- operator is not a numerical value, then string comparison is performed
- between the expanded variables. If no relational operator is given, it
- is assumed that the expanded variable is being compared against 0, or an
- empty string in the case of a string comparison.
-
- When bmake is evaluating one of these conditional expressions, and it en-
- counters a (white-space separated) word it doesn't recognize, either the
- "make" or "defined" expression is applied to it, depending on the form of
- the conditional. If the form is `.ifdef', `.ifndef', or `.if' the
- "defined" expression is applied. Similarly, if the form is `.ifmake' or
- `.ifnmake', the "make" expression is applied.
-
- If the conditional evaluates to true the parsing of the makefile contin-
- ues as before. If it evaluates to false, the following lines are
- skipped. In both cases this continues until a `.else' or `.endif' is
- found.
-
- 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
-
- After the for expression is evaluated, it is split into words. On each
- iteration 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 provided
- must be a multiple of three.
-
-COMMENTS
- Comments begin with a hash (`#') character, anywhere but in a shell com-
- mand 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 recursive
- 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 will still be 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 de-
- sired:
-
-
- skip-compare-for-some:
- @echo this will be compared
- @echo this will not ${.OODATE:M.NOMETA_CMP}
- @echo this will also be 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 fig-
- ure out how to create it, it will ignore this fact and assume
- the file isn't needed or already exists.
-
- .PHONY The target does not correspond to an actual file; it is always
- considered to be out of date, and will not be 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 tar-
- get is used as a source for another target, the other target
- 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
- Exactly like .USE, but prepend the .USEBEFORE target commands
- to the target.
-
- .WAIT If .WAIT appears in a dependency line, the sources that precede
- it are made before the sources that succeed it in the line.
- Since the dependents of files are not made until the file it-
- self could be made, this also stops the dependents being 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 target'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 be-
- ing left around and corrupting future rebuilds.
-
- .END Any command lines attached to this target are executed after ev-
- erything else is done.
-
- .ERROR Any command lines attached to this target are executed when an-
- other 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 will be
- executed.
-
- .MAIN If no target is specified when bmake is invoked, this target
- will be built.
-
- .MAKEFLAGS
- This target provides a way to specify flags for bmake when the
- makefile is used. The flags are as if typed to the shell,
- though the -f option will have 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.
-
- .OBJDIR The source is a new value for `.OBJDIR'. If it exists, bmake
- will chdir(2) to it and update the value of `.OBJDIR'.
-
- .ORDER The named targets are made in sequence. This ordering does not
- add targets to the list of targets to be made. Since the depen-
- dents 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
-
- The ordering imposed by .ORDER is only relevant for parallel
- makes.
-
- .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 deleted. If the
- source is the special .DOTLAST target, then 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.
-
- .PRECIOUS
- Apply the .PRECIOUS attribute to any specified sources. If no
- sources are specified, the .PRECIOUS attribute is applied to ev-
- ery target in the file.
-
- .SHELL Sets the shell that bmake will use to execute commands. 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 path to the shell.
-
- hasErrCtl Indicates whether the shell supports exit on error.
-
- check The command to turn on error checking.
-
- ignore The command to disable error checking.
-
- echo The command to turn on echoing of commands executed.
-
- 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 checking.
-
- 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: .o
- .c.o:
- cc -o ${.TARGET} -c ${.IMPSRC}
-
-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 descrip-
- tion of `.OBJDIR' for more details.
-
-FILES
- .depend list of dependencies
- Makefile list of dependencies
- makefile list of dependencies
- sys.mk system makefile
- /usr/share/mk system makefile directory
-
-COMPATIBILITY
- The basic make syntax is compatible between different versions of make;
- 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 problems us-
- ing 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 no-
- tably:
-
- +o The .WAIT and .ORDER declarations and most functionality per-
- taining to parallelization. (GNU make supports parallelization
- but lacks these features needed to control it effectively.)
-
- +o Directives, including for loops and conditionals and most of
- the forms of include files. (GNU make has its own incompatible
- and less powerful syntax for conditionals.)
-
- +o All built-in variables that begin with a dot.
-
- +o Most of the special sources and targets that begin with a dot,
- with the notable exception of .PHONY, .PRECIOUS, and .SUFFIXES.
-
- +o Variable modifiers, except for the
- :old=new
- string substitution, which does not portably support globbing
- with `%' and historically only works on declared suffixes.
-
- +o 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 be-
- havior 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 cur-
- rent 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 implementation
- 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 creates
- an "FRC" file).
-
-BUGS
- The make syntax is difficult to parse without actually acting on the
- data. For instance, finding the end of a variable's use should involve
- scanning each of the modifiers, using 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.
-
-FreeBSD 13.0 December 22, 2020 FreeBSD 13.0