xref: /freebsd/contrib/bmake/bmake.1 (revision 734e82fe33aa764367791a7d603b383996c6b40b)
1.\"	$NetBSD: make.1,v 1.366 2023/05/10 18:22:33 sjg Exp $
2.\"
3.\" Copyright (c) 1990, 1993
4.\"	The Regents of the University of California.  All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\" 3. Neither the name of the University nor the names of its contributors
15.\"    may be used to endorse or promote products derived from this software
16.\"    without specific prior written permission.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28.\" SUCH DAMAGE.
29.\"
30.\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
31.\"
32.Dd May 10, 2023
33.Dt BMAKE 1
34.Os
35.Sh NAME
36.Nm bmake
37.Nd maintain program dependencies
38.Sh SYNOPSIS
39.Nm
40.Op Fl BeikNnqrSstWwX
41.Op Fl C Ar directory
42.Op Fl D Ar variable
43.Op Fl d Ar flags
44.Op Fl f Ar makefile
45.Op Fl I Ar directory
46.Op Fl J Ar private
47.Op Fl j Ar max_jobs
48.Op Fl m Ar directory
49.Op Fl T Ar file
50.Op Fl V Ar variable
51.Op Fl v Ar variable
52.Op Ar variable\| Ns Cm \&= Ns Ar value
53.Op Ar target No ...
54.Sh DESCRIPTION
55.Nm
56is a program designed to simplify the maintenance of other programs.
57Its input is a list of specifications as to the files upon which programs
58and other files depend.
59If no
60.Fl f Ar makefile
61option is given,
62.Nm
63tries to open
64.Sq Pa makefile
65then
66.Sq Pa Makefile
67in order to find the specifications.
68If the file
69.Sq Pa .depend
70exists, it is read, see
71.Xr mkdep 1 .
72.Pp
73This manual page is intended as a reference document only.
74For a more thorough description of
75.Nm
76and makefiles, please refer to
77.%T "PMake \- A Tutorial"
78(from 1993).
79.Pp
80.Nm
81prepends the contents of the
82.Ev MAKEFLAGS
83environment variable to the command line arguments before parsing them.
84.Pp
85The options are as follows:
86.Bl -tag -width Ds
87.It Fl B
88Try to be backwards compatible by executing a single shell per command and
89by making the sources of a dependency line in sequence.
90.It Fl C Ar directory
91Change to
92.Ar directory
93before reading the makefiles or doing anything else.
94If multiple
95.Fl C
96options are specified, each is interpreted relative to the previous one:
97.Fl C Pa / Fl C Pa etc
98is equivalent to
99.Fl C Pa /etc .
100.It Fl D Ar variable
101Define
102.Ar variable
103to be 1, in the global scope.
104.It Fl d Oo Cm \- Oc Ns Ar flags
105Turn on debugging, and specify which portions of
106.Nm
107are to print debugging information.
108Unless the flags are preceded by
109.Ql \- ,
110they are added to the
111.Ev MAKEFLAGS
112environment variable and are passed on to any child make processes.
113By default, debugging information is printed to standard error,
114but this can be changed using the
115.Cm F
116debugging flag.
117The debugging output is always unbuffered; in addition, if debugging
118is enabled but debugging output is not directed to standard output,
119the standard output is line buffered.
120The available
121.Ar flags
122are:
123.Bl -tag -width Ds
124.It Cm A
125Print all possible debugging information;
126equivalent to specifying all of the debugging flags.
127.It Cm a
128Print debugging information about archive searching and caching.
129.It Cm C
130Print debugging information about the current working directory.
131.It Cm c
132Print debugging information about conditional evaluation.
133.It Cm d
134Print debugging information about directory searching and caching.
135.It Cm e
136Print debugging information about failed commands and targets.
137.It Cm F Ns Oo Cm \&+ Oc Ns Ar filename
138Specify where debugging output is written.
139This must be the last flag, because it consumes the remainder of
140the argument.
141If the character immediately after the
142.Cm F
143flag is
144.Ql \&+ ,
145the file is opened in append mode;
146otherwise the file is overwritten.
147If the file name is
148.Ql stdout
149or
150.Ql stderr ,
151debugging output is written to the standard output or standard error output
152respectively (and the
153.Ql \&+
154option has no effect).
155Otherwise, the output is written to the named file.
156If the file name ends with
157.Ql .%d ,
158the
159.Ql %d
160is replaced by the pid.
161.It Cm f
162Print debugging information about loop evaluation.
163.It Cm g1
164Print the input graph before making anything.
165.It Cm g2
166Print the input graph after making everything, or before exiting
167on error.
168.It Cm g3
169Print the input graph before exiting on error.
170.It Cm h
171Print debugging information about hash table operations.
172.It Cm j
173Print debugging information about running multiple shells.
174.It Cm L
175Turn on lint checks.
176This throws errors for variable assignments that do not parse correctly,
177at the time of assignment, so the file and line number are available.
178.It Cm l
179Print commands in Makefiles regardless of whether or not they are prefixed by
180.Ql @
181or other
182.Dq quiet
183flags.
184Also known as
185.Dq loud
186behavior.
187.It Cm M
188Print debugging information about
189.Dq meta
190mode decisions about targets.
191.It Cm m
192Print debugging information about making targets, including modification
193dates.
194.It Cm n
195Don't delete the temporary command scripts created when running commands.
196These temporary scripts are created in the directory
197referred to by the
198.Ev TMPDIR
199environment variable, or in
200.Pa /tmp
201if
202.Ev TMPDIR
203is unset or set to the empty string.
204The temporary scripts are created by
205.Xr mkstemp 3 ,
206and have names of the form
207.Pa makeXXXXXX .
208.Em NOTE :
209This can create many files in
210.Ev TMPDIR
211or
212.Pa /tmp ,
213so use with care.
214.It Cm p
215Print debugging information about makefile parsing.
216.It Cm s
217Print debugging information about suffix-transformation rules.
218.It Cm t
219Print debugging information about target list maintenance.
220.It Cm V
221Force the
222.Fl V
223option to print raw values of variables,
224overriding the default behavior set via
225.Va .MAKE.EXPAND_VARIABLES .
226.It Cm v
227Print debugging information about variable assignment and expansion.
228.It Cm x
229Run shell commands with
230.Fl x
231so the actual commands are printed as they are executed.
232.El
233.It Fl e
234Let environment variables override global variables within makefiles.
235.It Fl f Ar makefile
236Specify a makefile to read instead of the default
237.Pa makefile
238or
239.Pa Makefile .
240If
241.Ar makefile
242is
243.Ql \&- ,
244standard input is read.
245Multiple makefiles may be specified, and are read in the order specified.
246.It Fl I Ar directory
247Specify a directory in which to search for makefiles and included makefiles.
248The system makefile directory (or directories, see the
249.Fl m
250option) is automatically included as part of this list.
251.It Fl i
252Ignore non-zero exit of shell commands in the makefile.
253Equivalent to specifying
254.Ql \&-
255before each command line in the makefile.
256.It Fl J Ar private
257This option should
258.Em not
259be specified by the user.
260.Pp
261When the
262.Fl j
263option is in use in a recursive build, this option is passed by a make
264to child makes to allow all the make processes in the build to
265cooperate to avoid overloading the system.
266.It Fl j Ar max_jobs
267Specify the maximum number of jobs that
268.Nm
269may have running at any one time.
270The value of
271.Ar max_jobs
272is saved in
273.Va .MAKE.JOBS .
274Turns compatibility mode off, unless the
275.Fl B
276option is also specified.
277When compatibility mode is off, all commands associated with a
278target are executed in a single shell invocation as opposed to the
279traditional one shell invocation per line.
280This can break traditional scripts which change directories on each
281command invocation and then expect to start with a fresh environment
282on the next line.
283It is more efficient to correct the scripts rather than turn backwards
284compatibility on.
285.Pp
286A job token pool with
287.Ar max_jobs
288tokens is used to control the total number of jobs running.
289Each instance of
290.Nm
291will wait for a token from the pool before running a new job.
292.It Fl k
293Continue processing after errors are encountered, but only on those targets
294that do not depend on the target whose creation caused the error.
295.It Fl m Ar directory
296Specify a directory in which to search for
297.Pa sys.mk
298and makefiles included via the
299.Li \&< Ns Ar file Ns Li \&> Ns -style
300include statement.
301The
302.Fl m
303option can be used multiple times to form a search path.
304This path overrides the default system include path
305.Pa /usr/share/mk .
306Furthermore, the system include path is appended to the search path used for
307.Li \*q Ns Ar file Ns Li \*q Ns -style
308include statements (see the
309.Fl I
310option).
311The system include path can be referenced via the read-only variable
312.Va .SYSPATH .
313.Pp
314If a directory name in the
315.Fl m
316argument (or the
317.Ev MAKESYSPATH
318environment variable) starts with the string
319.Ql \&.../ ,
320.Nm
321searches for the specified file or directory named in the remaining part
322of the argument string.
323The search starts with the current directory
324and then works upward towards the root of the file system.
325If the search is successful, the resulting directory replaces the
326.Ql \&.../
327specification in the
328.Fl m
329argument.
330This feature allows
331.Nm
332to easily search in the current source tree for customized
333.Pa sys.mk
334files (e.g., by using
335.Ql \&.../mk/sys.mk
336as an argument).
337.It Fl n
338Display the commands that would have been executed, but do not
339actually execute them unless the target depends on the
340.Va .MAKE
341special source (see below) or the command is prefixed with
342.Sq Cm + .
343.It Fl N
344Display the commands that would have been executed,
345but do not actually execute any of them;
346useful for debugging top-level makefiles
347without descending into subdirectories.
348.It Fl q
349Do not execute any commands,
350instead exit 0 if the specified targets are up to date, and 1 otherwise.
351.It Fl r
352Do not use the built-in rules specified in the system makefile.
353.It Fl S
354Stop processing if an error is encountered.
355This is the default behavior and the opposite of
356.Fl k .
357.It Fl s
358Do not echo any commands as they are executed.
359Equivalent to specifying
360.Sq Ic @
361before each command line in the makefile.
362.It Fl T Ar tracefile
363When used with the
364.Fl j
365flag,
366append a trace record to
367.Ar tracefile
368for each job started and completed.
369.It Fl t
370Rather than re-building a target as specified in the makefile, create it
371or update its modification time to make it appear up-to-date.
372.It Fl V Ar variable
373Print the value of
374.Ar variable .
375Do not build any targets.
376Multiple instances of this option may be specified;
377the variables are printed one per line,
378with a blank line for each null or undefined variable.
379The value printed is extracted from the global scope after all
380makefiles have been read.
381.Pp
382By default, the raw variable contents (which may
383include additional unexpanded variable references) are shown.
384If
385.Ar variable
386contains a
387.Ql \&$ ,
388it is not interpreted as a variable name but rather as an expression.
389Its value is expanded before printing.
390The value is also expanded before printing if
391.Va .MAKE.EXPAND_VARIABLES
392is set to true and the
393.Fl dV
394option has not been used to override it.
395.Pp
396Note that loop-local and target-local variables, as well as values
397taken temporarily by global variables during makefile processing, are
398not accessible via this option.
399The
400.Fl dv
401debug mode can be used to see these at the cost of generating
402substantial extraneous output.
403.It Fl v Ar variable
404Like
405.Fl V ,
406but all printed variables are always expanded to their complete value.
407The last occurrence of
408.Fl V
409or
410.Fl v
411decides whether all variables are expanded or not.
412.It Fl W
413Treat any warnings during makefile parsing as errors.
414.It Fl w
415Print entering and leaving directory messages, pre and post processing.
416.It Fl X
417Don't export variables passed on the command line to the environment
418individually.
419Variables passed on the command line are still exported via the
420.Ev MAKEFLAGS
421environment variable.
422This option may be useful on systems which have a small limit on the
423size of command arguments.
424.It Ar variable\| Ns Cm \&= Ns Ar value
425Set the value of the variable
426.Ar variable
427to
428.Ar value .
429Normally, all values passed on the command line are also exported to
430sub-makes in the environment.
431The
432.Fl X
433flag disables this behavior.
434Variable assignments should follow options for POSIX compatibility
435but no ordering is enforced.
436.El
437.Pp
438There are several different types of lines in a makefile: dependency
439specifications, shell commands, variable assignments, include statements,
440conditional directives, for loops, other directives, and comments.
441.Pp
442Lines may be continued from one line to the next
443by ending them with a backslash
444.Pq Ql \e .
445The trailing newline character and initial whitespace on the following
446line are compressed into a single space.
447.Sh FILE DEPENDENCY SPECIFICATIONS
448Dependency lines consist of one or more targets, an operator, and zero
449or more sources.
450This creates a relationship where the targets
451.Dq depend
452on the sources and are customarily created from them.
453A target is considered out of date if it does not exist,
454or if its modification time is less than that of any of its sources.
455An out-of-date target is re-created, but not until all sources
456have been examined and themselves re-created as needed.
457Three operators may be used:
458.Bl -tag -width flag
459.It Ic \&:
460Many dependency lines may name this target but only one may have
461attached shell commands.
462All sources named in all dependency lines are considered together,
463and if needed the attached shell commands are run to create or
464re-create the target.
465If
466.Nm
467is interrupted, the target is removed.
468.It Ic \&!
469The same, but the target is always re-created whether or not it is out
470of date.
471.It Ic \&::
472Any dependency line may have attached shell commands, but each one
473is handled independently: its sources are considered and the attached
474shell commands are run if the target is out of date with respect to
475(only) those sources.
476Thus, different groups of the attached shell commands may be run
477depending on the circumstances.
478Furthermore, unlike
479.Ic \&: ,
480for dependency lines with no sources, the attached shell
481commands are always run.
482Also unlike
483.Ic \&: ,
484the target is not removed if
485.Nm
486is interrupted.
487.El
488.Pp
489All dependency lines mentioning a particular target must use the same
490operator.
491.Pp
492Targets and sources may contain the shell wildcard values
493.Ql \&? ,
494.Ql * ,
495.Ql [] ,
496and
497.Ql {} .
498The values
499.Ql \&? ,
500.Ql * ,
501and
502.Ql []
503may only be used as part of the final component of the target or source,
504and only match existing files.
505The value
506.Ql {}
507need not necessarily be used to describe existing files.
508Expansion is in directory order, not alphabetically as done in the shell.
509.Sh SHELL COMMANDS
510Each target may have associated with it one or more lines of shell commands,
511normally used to create the target.
512Each of the lines in this script
513.Em must
514be preceded by a tab.
515(For historical reasons, spaces are not accepted.)
516While targets can occur in many dependency lines if desired,
517by default only one of these rules may be followed by a creation script.
518If the
519.Sq Ic \&::
520operator is used, however, all rules may include scripts,
521and the respective scripts are executed in the order found.
522.Pp
523Each line is treated as a separate shell command,
524unless the end of line is escaped with a backslash
525.Ql \e ,
526in which case that line and the next are combined.
527If the first characters of the command are any combination of
528.Sq Ic @ ,
529.Sq Ic + ,
530or
531.Sq Ic \- ,
532the command is treated specially.
533.Bl -tag -offset indent -width indent
534.It Ic @
535causes the command not to be echoed before it is executed.
536.It Ic +
537causes the command to be executed even when
538.Fl n
539is given.
540This is similar to the effect of the
541.Va .MAKE
542special source,
543except that the effect can be limited to a single line of a script.
544.It Ic \-
545in compatibility mode
546causes any non-zero exit status of the command line to be ignored.
547.El
548.Pp
549When
550.Nm
551is run in jobs mode with
552.Fl j Ar max_jobs ,
553the entire script for the target is fed to a single instance of the shell.
554In compatibility (non-jobs) mode, each command is run in a separate process.
555If the command contains any shell meta characters
556.Pq Ql #=|^(){};&<>*?[]:$`\e\en ,
557it is passed to the shell; otherwise
558.Nm
559attempts direct execution.
560If a line starts with
561.Sq Ic \-
562and the shell has ErrCtl enabled,
563failure of the command line is ignored as in compatibility mode.
564Otherwise
565.Sq Ic \-
566affects the entire job;
567the script stops at the first command line that fails,
568but the target is not deemed to have failed.
569.Pp
570Makefiles should be written so that the mode of
571.Nm
572operation does not change their behavior.
573For example, any command which uses
574.Dq cd
575or
576.Dq chdir
577without the intention of changing the directory for subsequent commands
578should be put in parentheses so it executes in a subshell.
579To force the use of a single shell, escape the line breaks so as to make
580the whole script one command.
581For example:
582.Bd -literal -offset indent
583avoid-chdir-side-effects:
584	@echo "Building $@ in $$(pwd)"
585	@(cd ${.CURDIR} && ${MAKE} $@)
586	@echo "Back in $$(pwd)"
587
588ensure-one-shell-regardless-of-mode:
589	@echo "Building $@ in $$(pwd)"; \e
590	(cd ${.CURDIR} && ${MAKE} $@); \e
591	echo "Back in $$(pwd)"
592.Ed
593.Pp
594Since
595.Nm
596changes the current working directory to
597.Sq Va .OBJDIR
598before executing any targets,
599each child process starts with that as its current working directory.
600.Sh VARIABLE ASSIGNMENTS
601Variables in make behave much like macros in the C preprocessor.
602.Pp
603Variable assignments have the form
604.Sq Ar NAME Ar op Ar value ,
605where:
606.Bl -tag -offset Ds -width Ds
607.It Ar NAME
608is a single-word variable name,
609consisting, by tradition, of all upper-case letters,
610.It Ar op
611is one of the variable assignment operators described below, and
612.It Ar value
613is interpreted according to the variable assignment operator.
614.El
615.Pp
616Whitespace around
617.Ar NAME ,
618.Ar op
619and
620.Ar value
621is discarded.
622.Ss Variable assignment operators
623The five operators that assign values to variables are:
624.Bl -tag -width Ds
625.It Ic \&=
626Assign the value to the variable.
627Any previous value is overwritten.
628.It Ic \&+=
629Append the value to the current value of the variable,
630separating them by a single space.
631.It Ic \&?=
632Assign the value to the variable if it is not already defined.
633.It Ic \&:=
634Expand the value, then assign it to the variable.
635.Pp
636.Em NOTE :
637References to undefined variables are
638.Em not
639expanded.
640This can cause problems when variable modifiers are used.
641.\" See var-op-expand.mk, the section with LATER and INDIRECT.
642.It Ic \&!=
643Expand the value and pass it to the shell for execution,
644then assign the output from the child's standard output to the variable.
645Any newlines in the result are replaced with spaces.
646.El
647.Ss Expansion of variables
648In most contexts where variables are expanded,
649.Ql \&$$
650expands to a single dollar sign.
651In other contexts (most variable modifiers, string literals in conditions),
652.Ql \&\e$
653expands to a single dollar sign.
654.Pp
655References to variables have the form
656.Cm \&${ Ns Ar name Ns Oo Ns Cm \&: Ns Ar modifiers Oc Ns Cm \&}
657or
658.Cm \&$( Ns Ar name Ns Oo Ns Cm \&: Ns Ar modifiers Oc Ns Cm \&) .
659If the variable name consists of only a single character
660and the expression contains no modifiers,
661the surrounding curly braces or parentheses are not required.
662This shorter form is not recommended.
663.Pp
664If the variable name contains a dollar, the name itself is expanded first.
665This allows almost arbitrary variable names, however names containing dollar,
666braces, parentheses or whitespace are really best avoided.
667.Pp
668If the result of expanding a nested variable expression contains a dollar sign
669.Pq Ql \&$ ,
670the result is subject to further expansion.
671.Pp
672Variable substitution occurs at four distinct times, depending on where
673the variable is being used.
674.Bl -enum
675.It
676Variables in dependency lines are expanded as the line is read.
677.It
678Variables in conditionals are expanded individually,
679but only as far as necessary to determine the result of the conditional.
680.It
681Variables in shell commands are expanded when the shell command is
682executed.
683.It
684.Ic .for
685loop index variables are expanded on each loop iteration.
686Note that other variables are not expanded when composing the body of a loop,
687so the following example code:
688.Bd -literal -offset indent
689\&.for i in 1 2 3
690a+=     ${i}
691j=      ${i}
692b+=     ${j}
693\&.endfor
694
695all:
696	@echo ${a}
697	@echo ${b}
698.Ed
699.Pp
700prints:
701.Bd -literal -offset indent
7021 2 3
7033 3 3
704.Ed
705.Pp
706After the loop is executed:
707.Bl -tag -offset indent -width indent
708.It Va a
709contains
710.Ql ${:U1} ${:U2} ${:U3} ,
711which expands to
712.Ql 1 2 3 .
713.It Va j
714contains
715.Ql ${:U3} ,
716which expands to
717.Ql 3 .
718.It Va b
719contains
720.Ql ${j} ${j} ${j} ,
721which expands to
722.Ql ${:U3} ${:U3} ${:U3}
723and further to
724.Ql 3 3 3 .
725.El
726.El
727.Ss Variable classes
728The four different classes of variables (in order of increasing precedence)
729are:
730.Bl -tag -width Ds
731.It Environment variables
732Variables defined as part of
733.Nm Ns 's
734environment.
735.It Global variables
736Variables defined in the makefile or in included makefiles.
737.It Command line variables
738Variables defined as part of the command line.
739.It Local variables
740Variables that are defined specific to a certain target.
741.El
742.Pp
743Local variables can be set on a dependency line, unless
744.Va .MAKE.TARGET_LOCAL_VARIABLES
745is set to
746.Ql false .
747The rest of the line
748(which already has had global variables expanded)
749is the variable value.
750For example:
751.Bd -literal -offset indent
752COMPILER_WRAPPERS= ccache distcc icecc
753
754${OBJS}: .MAKE.META.CMP_FILTER=${COMPILER_WRAPPERS:S,^,N,}
755.Ed
756.Pp
757Only the targets
758.Ql ${OBJS}
759are impacted by that filter (in
760.Dq meta
761mode) and
762simply enabling/disabling any of the compiler wrappers does not render all
763of those targets out-of-date.
764.Pp
765.Em NOTE :
766target-local variable assignments behave differently in that;
767.Bl -tag -width Ds -offset indent
768.It Ic \&+=
769Only appends to a previous local assignment
770for the same target and variable.
771.It Ic \&:=
772Is redundant with respect to global variables,
773which have already been expanded.
774.El
775.Pp
776The seven built-in local variables are:
777.Bl -tag -width ".Va .ARCHIVE" -offset indent
778.It Va .ALLSRC
779The list of all sources for this target; also known as
780.Sq Va \&> .
781.It Va .ARCHIVE
782The name of the archive file; also known as
783.Sq Va \&! .
784.It Va .IMPSRC
785In suffix-transformation rules, the name/path of the source from which the
786target is to be transformed (the
787.Dq implied
788source); also known as
789.Sq Va \&< .
790It is not defined in explicit rules.
791.It Va .MEMBER
792The name of the archive member; also known as
793.Sq Va % .
794.It Va .OODATE
795The list of sources for this target that were deemed out-of-date; also
796known as
797.Sq Va \&? .
798.It Va .PREFIX
799The name of the target with suffix (if declared in
800.Ic .SUFFIXES )
801removed; also known as
802.Sq Va * .
803.It Va .TARGET
804The name of the target; also known as
805.Sq Va @ .
806For compatibility with other makes this is an alias for
807.Va .ARCHIVE
808in archive member rules.
809.El
810.Pp
811The shorter forms
812.Po
813.Sq Va \&> ,
814.Sq Va \&! ,
815.Sq Va \&< ,
816.Sq Va \&% ,
817.Sq Va \&? ,
818.Sq Va \&* ,
819and
820.Sq Va \&@
821.Pc
822are permitted for backward
823compatibility with historical makefiles and legacy POSIX make and are
824not recommended.
825.Pp
826Variants of these variables with the punctuation followed immediately by
827.Ql D
828or
829.Ql F ,
830e.g.\&
831.Ql $(@D) ,
832are legacy forms equivalent to using the
833.Ql :H
834and
835.Ql :T
836modifiers.
837These forms are accepted for compatibility with
838.At V
839makefiles and POSIX but are not recommended.
840.Pp
841Four of the local variables may be used in sources on dependency lines
842because they expand to the proper value for each target on the line.
843These variables are
844.Sq Va .TARGET ,
845.Sq Va .PREFIX ,
846.Sq Va .ARCHIVE ,
847and
848.Sq Va .MEMBER .
849.Ss Additional built-in variables
850In addition,
851.Nm
852sets or knows about the following variables:
853.Bl -tag
854.\" NB: This list is sorted case-insensitive, ignoring punctuation.
855.\" NB: To find all built-in variables in make's source code,
856.\" NB: search for Var_*, Global_*, SetVarObjdir, GetBooleanExpr,
857.\" NB: and the implementation of Var_SetWithFlags.
858.\" NB: Last synced on 2023-01-01.
859.It Va .ALLTARGETS
860The list of all targets encountered in the makefiles.
861If evaluated during makefile parsing,
862lists only those targets encountered thus far.
863.It Va .CURDIR
864A path to the directory where
865.Nm
866was executed.
867Refer to the description of
868.Sq Va PWD
869for more details.
870.It Va .ERROR_CMD
871Is used in error handling, see
872.Va MAKE_PRINT_VAR_ON_ERROR .
873.It Va .ERROR_CWD
874Is used in error handling, see
875.Va MAKE_PRINT_VAR_ON_ERROR .
876.It Va .ERROR_META_FILE
877Is used in error handling in
878.Dq meta
879mode, see
880.Va MAKE_PRINT_VAR_ON_ERROR .
881.It Va .ERROR_TARGET
882Is used in error handling, see
883.Va MAKE_PRINT_VAR_ON_ERROR .
884.It Va .INCLUDEDFROMDIR
885The directory of the file this makefile was included from.
886.It Va .INCLUDEDFROMFILE
887The filename of the file this makefile was included from.
888.\" .INCLUDES is intentionally undocumented, as it is obsolete.
889.\" .LIBS is intentionally undocumented, as it is obsolete.
890.It Va MACHINE
891The machine hardware name, see
892.Xr uname 1 .
893.It Va MACHINE_ARCH
894The machine processor architecture name, see
895.Xr uname 1 .
896.It Va MAKE
897The name that
898.Nm
899was executed with
900.Pq Va argv[0] .
901.It Va .MAKE
902The same as
903.Va MAKE ,
904for compatibility.
905The preferred variable to use is the environment variable
906.Ev MAKE
907because it is more compatible with other make variants
908and cannot be confused with the special target with the same name.
909.\" '.MAKE.cmd_filtered' is intentionally undocumented,
910.\" as it is an internal implementation detail.
911.It Va .MAKE.DEPENDFILE
912Names the makefile (default
913.Sq Pa .depend )
914from which generated dependencies are read.
915.It Va .MAKE.DIE_QUIETLY
916If set to
917.Ql true ,
918do not print error information at the end.
919.It Va .MAKE.EXPAND_VARIABLES
920A boolean that controls the default behavior of the
921.Fl V
922option.
923If true, variable values printed with
924.Fl V
925are fully expanded; if false, the raw variable contents (which may
926include additional unexpanded variable references) are shown.
927.It Va .MAKE.EXPORTED
928The list of variables exported by
929.Nm .
930.It Va MAKEFILE
931The top-level makefile that is currently read,
932as given in the command line.
933.It Va .MAKEFLAGS
934The environment variable
935.Sq Ev MAKEFLAGS
936may contain anything that
937may be specified on
938.Nm Ns 's
939command line.
940Anything specified on
941.Nm Ns 's
942command line is appended to the
943.Va .MAKEFLAGS
944variable, which is then added to the environment for all programs that
945.Nm
946executes.
947.It Va .MAKE.GID
948The numeric group ID of the user running
949.Nm .
950It is read-only.
951.It Va .MAKE.JOB.PREFIX
952If
953.Nm
954is run with
955.Fl j ,
956the output for each target is prefixed with a token
957.Dl --- Ar target Li ---
958the first part of which can be controlled via
959.Va .MAKE.JOB.PREFIX .
960If
961.Va .MAKE.JOB.PREFIX
962is empty, no token is printed.
963For example, setting
964.Va .MAKE.JOB.PREFIX
965to
966.Ql ${.newline}---${.MAKE:T}[${.MAKE.PID}]
967would produce tokens like
968.Dl ---make[1234] Ar target Li ---
969making it easier to track the degree of parallelism being achieved.
970.It Va .MAKE.JOBS
971The argument to the
972.Fl j
973option.
974.It Va .MAKE.LEVEL
975The recursion depth of
976.Nm .
977The top-level instance of
978.Nm
979has level 0, and each child make has its parent level plus 1.
980This allows tests like:
981.Li .if ${.MAKE.LEVEL} == 0
982to protect things which should only be evaluated in the top-level instance of
983.Nm .
984.It Va .MAKE.LEVEL.ENV
985The name of the environment variable that stores the level of nested calls to
986.Nm .
987.It Va .MAKE.MAKEFILE_PREFERENCE
988The ordered list of makefile names
989(default
990.Sq Pa makefile ,
991.Sq Pa Makefile )
992that
993.Nm
994looks for.
995.It Va .MAKE.MAKEFILES
996The list of makefiles read by
997.Nm ,
998which is useful for tracking dependencies.
999Each makefile is recorded only once, regardless of the number of times read.
1000.It Va .MAKE.META.BAILIWICK
1001In
1002.Dq meta
1003mode, provides a list of prefixes which
1004match the directories controlled by
1005.Nm .
1006If a file that was generated outside of
1007.Va .OBJDIR
1008but within said bailiwick is missing,
1009the current target is considered out-of-date.
1010.It Va .MAKE.META.CMP_FILTER
1011In
1012.Dq meta
1013mode, it can (very rarely!) be useful to filter command
1014lines before comparison.
1015This variable can be set to a set of modifiers that are applied to
1016each line of the old and new command that differ, if the filtered
1017commands still differ, the target is considered out-of-date.
1018.It Va .MAKE.META.CREATED
1019In
1020.Dq meta
1021mode, this variable contains a list of all the meta files
1022updated.
1023If not empty, it can be used to trigger processing of
1024.Va .MAKE.META.FILES .
1025.It Va .MAKE.META.FILES
1026In
1027.Dq meta
1028mode, this variable contains a list of all the meta files
1029used (updated or not).
1030This list can be used to process the meta files to extract dependency
1031information.
1032.It Va .MAKE.META.IGNORE_FILTER
1033Provides a list of variable modifiers to apply to each pathname.
1034Ignore if the expansion is an empty string.
1035.It Va .MAKE.META.IGNORE_PATHS
1036Provides a list of path prefixes that should be ignored;
1037because the contents are expected to change over time.
1038The default list includes:
1039.Sq Pa /dev /etc /proc /tmp /var/run /var/tmp
1040.It Va .MAKE.META.IGNORE_PATTERNS
1041Provides a list of patterns to match against pathnames.
1042Ignore any that match.
1043.It Va .MAKE.META.PREFIX
1044Defines the message printed for each meta file updated in
1045.Dq meta verbose
1046mode.
1047The default value is:
1048.Dl Building ${.TARGET:H:tA}/${.TARGET:T}
1049.It Va .MAKE.MODE
1050Processed after reading all makefiles.
1051Affects the mode that
1052.Nm
1053runs in.
1054It can contain these keywords:
1055.Bl -tag -width indent
1056.It Cm compat
1057Like
1058.Fl B ,
1059puts
1060.Nm
1061into
1062.Dq compat
1063mode.
1064.It Cm meta
1065Puts
1066.Nm
1067into
1068.Dq meta
1069mode, where meta files are created for each target
1070to capture the command run, the output generated, and if
1071.Xr filemon 4
1072is available, the system calls which are of interest to
1073.Nm .
1074The captured output can be useful when diagnosing errors.
1075.It Cm curdirOk= Ns Ar bf
1076By default,
1077.Nm
1078does not create
1079.Pa .meta
1080files in
1081.Sq Va .CURDIR .
1082This can be overridden by setting
1083.Ar bf
1084to a value which represents true.
1085.It Cm missing-meta= Ns Ar bf
1086If
1087.Ar bf
1088is true, a missing
1089.Pa .meta
1090file makes the target out-of-date.
1091.It Cm missing-filemon= Ns Ar bf
1092If
1093.Ar bf
1094is true, missing filemon data makes the target out-of-date.
1095.It Cm nofilemon
1096Do not use
1097.Xr filemon 4 .
1098.It Cm env
1099For debugging, it can be useful to include the environment
1100in the
1101.Pa .meta
1102file.
1103.It Cm verbose
1104If in
1105.Dq meta
1106mode, print a clue about the target being built.
1107This is useful if the build is otherwise running silently.
1108The message printed is the expanded value of
1109.Va .MAKE.META.PREFIX .
1110.It Cm ignore-cmd
1111Some makefiles have commands which are simply not stable.
1112This keyword causes them to be ignored for
1113determining whether a target is out of date in
1114.Dq meta
1115mode.
1116See also
1117.Ic .NOMETA_CMP .
1118.It Cm silent= Ns Ar bf
1119If
1120.Ar bf
1121is true, when a .meta file is created, mark the target
1122.Ic .SILENT .
1123.It Cm randomize-targets
1124In both compat and parallel mode, do not make the targets in the usual order,
1125but instead randomize their order.
1126This mode can be used to detect undeclared dependencies between files.
1127.El
1128.It Va MAKEOBJDIR
1129Used to create files in a separate directory, see
1130.Va .OBJDIR .
1131.It Va MAKE_OBJDIR_CHECK_WRITABLE
1132Used to force a separate directory for the created files,
1133even if that directory is not writable, see
1134.Va .OBJDIR .
1135.It Va MAKEOBJDIRPREFIX
1136Used to create files in a separate directory, see
1137.Va .OBJDIR .
1138.It Va .MAKE.OS
1139The name of the operating system, see
1140.Xr uname 1 .
1141It is read-only.
1142.It Va .MAKEOVERRIDES
1143This variable is used to record the names of variables assigned to
1144on the command line, so that they may be exported as part of
1145.Sq Ev MAKEFLAGS .
1146This behavior can be disabled by assigning an empty value to
1147.Sq Va .MAKEOVERRIDES
1148within a makefile.
1149Extra variables can be exported from a makefile
1150by appending their names to
1151.Sq Va .MAKEOVERRIDES .
1152.Sq Ev MAKEFLAGS
1153is re-exported whenever
1154.Sq Va .MAKEOVERRIDES
1155is modified.
1156.It Va .MAKE.PATH_FILEMON
1157If
1158.Nm
1159was built with
1160.Xr filemon 4
1161support, this is set to the path of the device node.
1162This allows makefiles to test for this support.
1163.It Va .MAKE.PID
1164The process ID of
1165.Nm .
1166It is read-only.
1167.It Va .MAKE.PPID
1168The parent process ID of
1169.Nm .
1170It is read-only.
1171.It Va MAKE_PRINT_VAR_ON_ERROR
1172When
1173.Nm
1174stops due to an error, it sets
1175.Sq Va .ERROR_TARGET
1176to the name of the target that failed,
1177.Sq Va .ERROR_CMD
1178to the commands of the failed target,
1179and in
1180.Dq meta
1181mode, it also sets
1182.Sq Va .ERROR_CWD
1183to the
1184.Xr getcwd 3 ,
1185and
1186.Sq Va .ERROR_META_FILE
1187to the path of the meta file (if any) describing the failed target.
1188It then prints its name and the value of
1189.Sq Va .CURDIR
1190as well as the value of any variables named in
1191.Sq Va MAKE_PRINT_VAR_ON_ERROR .
1192.It Va .MAKE.SAVE_DOLLARS
1193If true,
1194.Ql $$
1195are preserved when doing
1196.Ql :=
1197assignments.
1198The default is false, for backwards compatibility.
1199Set to true for compatability with other makes.
1200If set to false,
1201.Ql $$
1202becomes
1203.Ql $
1204per normal evaluation rules.
1205.It Va .MAKE.TARGET_LOCAL_VARIABLES
1206If set to
1207.Ql false ,
1208apparent variable assignments in dependency lines are
1209treated as normal sources.
1210.It Va .MAKE.UID
1211The numeric ID of the user running
1212.Nm .
1213It is read-only.
1214.\" 'MAKE_VERSION' is intentionally undocumented
1215.\" since it is only defined in the bmake distribution,
1216.\" but not in NetBSD's native make.
1217.\" '.meta.%d.lcwd' is intentionally undocumented
1218.\" since it is an internal implementation detail.
1219.\" '.meta.%d.ldir' is intentionally undocumented
1220.\" since it is an internal implementation detail.
1221.\" 'MFLAGS' is intentionally undocumented
1222.\" since it is obsolete.
1223.It Va .newline
1224This variable is simply assigned a newline character as its value.
1225It is read-only.
1226This allows expansions using the
1227.Cm \&:@
1228modifier to put a newline between
1229iterations of the loop rather than a space.
1230For example, in case of an error,
1231.Nm
1232prints the variable names and their values using:
1233.Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}
1234.It Va .OBJDIR
1235A path to the directory where the targets are built.
1236Its value is determined by trying to
1237.Xr chdir 2
1238to the following directories in order and using the first match:
1239.Bl -enum
1240.It
1241.Cm ${MAKEOBJDIRPREFIX} Ns Cm ${.CURDIR}
1242.Pp
1243(Only if
1244.Sq Ev MAKEOBJDIRPREFIX
1245is set in the environment or on the command line.)
1246.It
1247.Cm ${MAKEOBJDIR}
1248.Pp
1249(Only if
1250.Sq Ev MAKEOBJDIR
1251is set in the environment or on the command line.)
1252.It
1253.Cm ${.CURDIR} Ns Pa /obj. Ns Cm ${MACHINE}
1254.It
1255.Cm ${.CURDIR} Ns Pa /obj
1256.It
1257.Pa /usr/obj/ Ns Cm ${.CURDIR}
1258.It
1259.Cm ${.CURDIR}
1260.El
1261.Pp
1262Variable expansion is performed on the value before it is used,
1263so expressions such as
1264.Cm ${.CURDIR:S,^/usr/src,/var/obj,}
1265may be used.
1266This is especially useful with
1267.Sq Ev MAKEOBJDIR .
1268.Pp
1269.Sq Va .OBJDIR
1270may be modified in the makefile via the special target
1271.Sq Ic .OBJDIR .
1272In all cases,
1273.Nm
1274changes to the specified directory if it exists, and sets
1275.Sq Va .OBJDIR
1276and
1277.Sq Va PWD
1278to that directory before executing any targets.
1279.Pp
1280Except in the case of an explicit
1281.Sq Ic .OBJDIR
1282target,
1283.Nm
1284checks that the specified directory is writable and ignores it if not.
1285This check can be skipped by setting the environment variable
1286.Sq Ev MAKE_OBJDIR_CHECK_WRITABLE
1287to
1288.Dq no .
1289.It Va .PARSEDIR
1290The directory name of the current makefile being parsed.
1291.It Va .PARSEFILE
1292The basename of the current makefile being parsed.
1293This variable and
1294.Sq Va .PARSEDIR
1295are both set only while the makefiles are being parsed.
1296To retain their current values,
1297assign them to a variable using assignment with expansion
1298.Sq Cm \&:= .
1299.It Va .PATH
1300The space-separated list of directories that
1301.Nm
1302searches for files.
1303To update this search list, use the special target
1304.Sq Ic .PATH
1305rather than modifying the variable directly.
1306.It Va %POSIX
1307Is set in POSIX mode, see the special
1308.Ql Va .POSIX
1309target.
1310.\" XXX: There is no make variable named 'PWD',
1311.\" XXX: make only reads and writes the environment variable 'PWD'.
1312.It Va PWD
1313Alternate path to the current directory.
1314.Nm
1315normally sets
1316.Sq Va .CURDIR
1317to the canonical path given by
1318.Xr getcwd 3 .
1319However, if the environment variable
1320.Sq Ev PWD
1321is set and gives a path to the current directory,
1322.Nm
1323sets
1324.Sq Va .CURDIR
1325to the value of
1326.Sq Ev PWD
1327instead.
1328This behavior is disabled if
1329.Sq Ev MAKEOBJDIRPREFIX
1330is set or
1331.Sq Ev MAKEOBJDIR
1332contains a variable transform.
1333.Sq Va PWD
1334is set to the value of
1335.Sq Va .OBJDIR
1336for all programs which
1337.Nm
1338executes.
1339.It Va .SHELL
1340The pathname of the shell used to run target scripts.
1341It is read-only.
1342.It Va .SUFFIXES
1343The list of known suffixes.
1344It is read-only.
1345.It Va .SYSPATH
1346The space-separated list of directories that
1347.Nm
1348searches for makefiles, referred to as the system include path.
1349To update this search list, use the special target
1350.Sq Ic .SYSPATH
1351rather than modifying the variable which is read-only.
1352.It Va .TARGETS
1353The list of targets explicitly specified on the command line, if any.
1354.It Va VPATH
1355The colon-separated
1356.Pq Dq \&:
1357list of directories that
1358.Nm
1359searches for files.
1360This variable is supported for compatibility with old make programs only, use
1361.Sq Va .PATH
1362instead.
1363.El
1364.Ss Variable modifiers
1365The general format of a variable expansion is:
1366.Pp
1367.Sm off
1368.D1 Ic \&${ Ar variable\| Oo Ic \&: Ar modifier\| Oo Ic \&: No ... Oc Oc Ic \&}
1369.Sm on
1370.Pp
1371Each modifier begins with a colon.
1372To escape a colon, precede it with a backslash
1373.Ql \e .
1374.Pp
1375A list of indirect modifiers can be specified via a variable, as follows:
1376.Pp
1377.Bd -literal -offset indent
1378.Ar modifier_variable\^ Li \&= Ar modifier Ns Oo Ic \&: Ns No ... Oc
1379
1380.Sm off
1381.Ic \&${ Ar variable Ic \&:${ Ar modifier_variable Ic \&} Oo Ic \&: No ... Oc Ic \&}
1382.Sm on
1383.Ed
1384.Pp
1385In this case, the first modifier in the
1386.Ar modifier_variable
1387does not start with a colon,
1388since that colon already occurs in the referencing variable.
1389If any of the modifiers in the
1390.Ar modifier_variable
1391contains a dollar sign
1392.Pq Ql $ ,
1393these must be doubled to avoid early expansion.
1394.Pp
1395Some modifiers interpret the expression value as a single string,
1396others treat the expression value as a whitespace-separated list of words.
1397When splitting a string into words,
1398whitespace can be escaped using double quotes, single quotes and backslashes,
1399like in the shell.
1400The quotes and backslashes are retained in the words.
1401.Pp
1402The supported modifiers are:
1403.Bl -tag -width EEE
1404.It Cm \&:E
1405Replaces each word with its suffix.
1406.It Cm \&:H
1407Replaces each word with its dirname.
1408.It Cm \&:M\| Ns Ar pattern
1409Selects only those words that match
1410.Ar pattern .
1411The standard shell wildcard characters
1412.Pf ( Ql * ,
1413.Ql \&? ,
1414and
1415.Ql \&[] )
1416may
1417be used.
1418The wildcard characters may be escaped with a backslash
1419.Pq Ql \e .
1420As a consequence of the way values are split into words, matched,
1421and then joined, the construct
1422.Ql ${VAR:M*}
1423removes all leading and trailing whitespace
1424and normalizes the inter-word spacing to a single space.
1425.It Cm \&:N\| Ns Ar pattern
1426This is the opposite of
1427.Sq Cm \&:M ,
1428selecting all words which do
1429.Em not
1430match
1431.Ar pattern .
1432.It Cm \&:O
1433Orders the words lexicographically.
1434.It Cm \&:On
1435Orders the words numerically.
1436A number followed by one of
1437.Ql k ,
1438.Ql M
1439or
1440.Ql G
1441is multiplied by the appropriate factor, which is 1024 for
1442.Ql k ,
14431048576 for
1444.Ql M ,
1445or 1073741824 for
1446.Ql G .
1447Both upper- and lower-case letters are accepted.
1448.It Cm \&:Or
1449Orders the words in reverse lexicographical order.
1450.It Cm \&:Orn
1451Orders the words in reverse numerical order.
1452.It Cm \&:Ox
1453Shuffles the words.
1454The results are different each time you are referring to the
1455modified variable; use the assignment with expansion
1456.Sq Cm \&:=
1457to prevent such behavior.
1458For example,
1459.Bd -literal -offset indent
1460LIST=			uno due tre quattro
1461RANDOM_LIST=		${LIST:Ox}
1462STATIC_RANDOM_LIST:=	${LIST:Ox}
1463
1464all:
1465	@echo "${RANDOM_LIST}"
1466	@echo "${RANDOM_LIST}"
1467	@echo "${STATIC_RANDOM_LIST}"
1468	@echo "${STATIC_RANDOM_LIST}"
1469.Ed
1470may produce output similar to:
1471.Bd -literal -offset indent
1472quattro due tre uno
1473tre due quattro uno
1474due uno quattro tre
1475due uno quattro tre
1476.Ed
1477.It Cm \&:Q
1478Quotes every shell meta-character in the value, so that it can be passed
1479safely to the shell.
1480.It Cm \&:q
1481Quotes every shell meta-character in the value, and also doubles
1482.Sq $
1483characters so that it can be passed
1484safely through recursive invocations of
1485.Nm .
1486This is equivalent to
1487.Sq Cm \&:S/\e\&$/&&/g:Q .
1488.It Cm \&:R
1489Replaces each word with everything but its suffix.
1490.It Cm \&:range Ns Oo Cm = Ns Ar count Oc
1491The value is an integer sequence representing the words of the original
1492value, or the supplied
1493.Ar count .
1494.It Cm \&:gmtime Ns Oo Cm = Ns Ar timestamp Oc
1495The value is interpreted as a format string for
1496.Xr strftime 3 ,
1497using
1498.Xr gmtime 3 ,
1499producing the formatted timestamp.
1500If a
1501.Ar timestamp
1502value is not provided or is 0, the current time is used.
1503.It Cm \&:hash
1504Computes a 32-bit hash of the value and encodes it as 8 hex digits.
1505.It Cm \&:localtime Ns Oo Cm = Ns Ar timestamp Oc
1506The value is interpreted as a format string for
1507.Xr strftime 3 ,
1508using
1509.Xr localtime 3 ,
1510producing the formatted timestamp.
1511If a
1512.Ar timestamp
1513value is not provided or is 0, the current time is used.
1514.It Cm \&:mtime Ns Oo Cm = Ns Ar timestamp Oc
1515Call
1516.Xr stat 2
1517with each word as pathname;
1518use
1519.Ql st_mtime
1520as the new value.
1521If
1522.Xr stat 2
1523fails; use
1524.Ar timestamp
1525or current time.
1526If
1527.Ar timestamp
1528is set to
1529.Ql error ,
1530then
1531.Xr stat 2
1532failure will cause an error.
1533.It Cm \&:tA
1534Attempts to convert the value to an absolute path using
1535.Xr realpath 3 .
1536If that fails, the value is unchanged.
1537.It Cm \&:tl
1538Converts the value to lower-case letters.
1539.It Cm \&:ts Ns Ar c
1540When joining the words after a modifier that treats the value as words,
1541the words are normally separated by a space.
1542This modifier changes the separator to the character
1543.Ar c .
1544If
1545.Ar c
1546is omitted, no separator is used.
1547The common escapes (including octal numeric codes) work as expected.
1548.It Cm \&:tu
1549Converts the value to upper-case letters.
1550.It Cm \&:tW
1551Causes subsequent modifiers to treat the value as a single word
1552(possibly containing embedded whitespace).
1553See also
1554.Sq Cm \&:[*] .
1555.It Cm \&:tw
1556Causes the value to be treated as a list of words.
1557See also
1558.Sq Cm \&:[@] .
1559.Sm off
1560.It Cm \&:S\| No \&/ Ar old_string\| No \&/ Ar new_string\| No \&/ Op Cm 1gW
1561.Sm on
1562Modifies the first occurrence of
1563.Ar old_string
1564in each word of the value, replacing it with
1565.Ar new_string .
1566If a
1567.Ql g
1568is appended to the last delimiter of the pattern,
1569all occurrences in each word are replaced.
1570If a
1571.Ql 1
1572is appended to the last delimiter of the pattern,
1573only the first occurrence is affected.
1574If a
1575.Ql W
1576is appended to the last delimiter of the pattern,
1577the value is treated as a single word.
1578If
1579.Ar old_string
1580begins with a caret
1581.Pq Ql ^ ,
1582.Ar old_string
1583is anchored at the beginning of each word.
1584If
1585.Ar old_string
1586ends with a dollar sign
1587.Pq Ql \&$ ,
1588it is anchored at the end of each word.
1589Inside
1590.Ar new_string ,
1591an ampersand
1592.Pq Ql &
1593is replaced by
1594.Ar old_string
1595(without the anchoring
1596.Ql ^
1597or
1598.Ql \&$ ) .
1599Any character may be used as the delimiter for the parts of the modifier
1600string.
1601The anchoring, ampersand and delimiter characters can be escaped with a
1602backslash
1603.Pq Ql \e .
1604.Pp
1605Both
1606.Ar old_string
1607and
1608.Ar new_string
1609may contain nested expressions.
1610To prevent a dollar sign from starting a nested expression,
1611escape it with a backslash.
1612.Sm off
1613.It Cm \&:C\| No \&/ Ar pattern\| No \&/ Ar replacement\| No \&/ Op Cm 1gW
1614.Sm on
1615The
1616.Cm \&:C
1617modifier works like the
1618.Cm \&:S
1619modifier except that the old and new strings, instead of being
1620simple strings, are an extended regular expression
1621.Ar pattern
1622(see
1623.Xr regex 3 )
1624and an
1625.Xr ed 1 Ns \-style
1626.Ar replacement .
1627Normally, the first occurrence of the pattern
1628.Ar pattern
1629in each word of the value is substituted with
1630.Ar replacement .
1631The
1632.Ql 1
1633modifier causes the substitution to apply to at most one word; the
1634.Ql g
1635modifier causes the substitution to apply to as many instances of the
1636search pattern
1637.Ar pattern
1638as occur in the word or words it is found in; the
1639.Ql W
1640modifier causes the value to be treated as a single word
1641(possibly containing embedded whitespace).
1642.Pp
1643As for the
1644.Cm \&:S
1645modifier, the
1646.Ar pattern
1647and
1648.Ar replacement
1649are subjected to variable expansion before being parsed as
1650regular expressions.
1651.It Cm \&:T
1652Replaces each word with its last path component (basename).
1653.It Cm \&:u
1654Removes adjacent duplicate words (like
1655.Xr uniq 1 ) .
1656.Sm off
1657.It Cm \&:\&?\| Ar true_string\| Cm \&: Ar false_string
1658.Sm on
1659If the variable name (not its value), when parsed as a
1660.Cm .if
1661conditional expression, evaluates to true, return as its value the
1662.Ar true_string ,
1663otherwise return the
1664.Ar false_string .
1665Since the variable name is used as the expression,
1666\&:\&? must be the first modifier after the variable name
1667.No itself Ns \^\(em\^ Ns
1668which, of course, usually contains variable expansions.
1669A common error is trying to use expressions like
1670.Dl ${NUMBERS:M42:?match:no}
1671which actually tests defined(NUMBERS).
1672To determine if any words match
1673.Dq 42 ,
1674you need to use something like:
1675.Dl ${"${NUMBERS:M42}" != \&"\&":?match:no} .
1676.It Cm :\| Ns Ar old_string\| Ns Cm = Ns Ar new_string
1677This is the
1678.At V
1679style substitution.
1680It can only be the last modifier specified,
1681as a
1682.Ql \&:
1683in either
1684.Ar old_string
1685or
1686.Ar new_string
1687is treated as a regular character, not as the end of the modifier.
1688.Pp
1689If
1690.Ar old_string
1691does not contain the pattern matching character
1692.Ql % ,
1693and the word ends with
1694.Ar old_string
1695or equals it,
1696that suffix is replaced with
1697.Ar new_string .
1698.Pp
1699Otherwise, the first
1700.Ql %
1701in
1702.Ar old_string
1703matches a possibly empty substring of arbitrary characters,
1704and if the whole pattern is found in the word,
1705the matching part is replaced with
1706.Ar new_string ,
1707and the first occurrence of
1708.Ql %
1709in
1710.Ar new_string
1711(if any) is replaced with the substring matched by the
1712.Ql % .
1713.Pp
1714Both
1715.Ar old_string
1716and
1717.Ar new_string
1718may contain nested expressions.
1719To prevent a dollar sign from starting a nested expression,
1720escape it with a backslash.
1721.Sm off
1722.It Cm \&:@ Ar varname\| Cm @ Ar string\| Cm @
1723.Sm on
1724This is the loop expansion mechanism from the OSF Development
1725Environment (ODE) make.
1726Unlike
1727.Cm \&.for
1728loops, expansion occurs at the time of reference.
1729For each word in the value, assign the word to the variable named
1730.Ar varname
1731and evaluate
1732.Ar string .
1733The ODE convention is that
1734.Ar varname
1735should start and end with a period, for example:
1736.Dl ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}
1737.Pp
1738However, a single-letter variable is often more readable:
1739.Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}
1740.It Cm \&:_ Ns Oo Cm = Ns Ar var Oc
1741Saves the current variable value in
1742.Ql $_
1743or the named
1744.Ar var
1745for later reference.
1746Example usage:
1747.Bd -literal -offset indent
1748M_cmpv.units = 1 1000 1000000
1749M_cmpv = S,., ,g:_:range:@i@+ $${_:[-$$i]} \&\\
1750\\* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh
1751
1752.Dv .if ${VERSION:${M_cmpv}} < ${3.1.12:L:${M_cmpv}}
1753
1754.Ed
1755Here
1756.Ql $_
1757is used to save the result of the
1758.Ql :S
1759modifier which is later referenced using the index values from
1760.Ql :range .
1761.It Cm \&:U\| Ns Ar newval
1762If the variable is undefined,
1763.Ar newval
1764is the value.
1765If the variable is defined, the existing value is returned.
1766This is another ODE make feature.
1767It is handy for setting per-target CFLAGS for instance:
1768.Dl ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
1769If a value is only required if the variable is undefined, use:
1770.Dl ${VAR:D:Unewval}
1771.It Cm \&:D\| Ns Ar newval
1772If the variable is defined,
1773.Ar newval
1774is the value.
1775.It Cm \&:L
1776The name of the variable is the value.
1777.It Cm \&:P
1778The path of the node which has the same name as the variable is the value.
1779If no such node exists or its path is null, the name of the variable is used.
1780In order for this modifier to work, the name (node) must at least have
1781appeared on the right-hand side of a dependency.
1782.Sm off
1783.It Cm \&:\&! Ar cmd\| Cm \&!
1784.Sm on
1785The output of running
1786.Ar cmd
1787is the value.
1788.It Cm \&:sh
1789The value is run as a command, and the output becomes the new value.
1790.It Cm \&::= Ns Ar str
1791The variable is assigned the value
1792.Ar str
1793after substitution.
1794This modifier and its variations are useful in obscure situations
1795such as wanting to set a variable
1796at a point where a target's shell commands are being parsed.
1797These assignment modifiers always expand to nothing.
1798.Pp
1799The
1800.Sq Cm \&::
1801helps avoid false matches with the
1802.At V
1803style
1804.Ql \&:=
1805modifier and since substitution always occurs, the
1806.Ql \&::=
1807form is vaguely appropriate.
1808.It Cm \&::?= Ns Ar str
1809As for
1810.Cm \&::=
1811but only if the variable does not already have a value.
1812.It Cm \&::+= Ns Ar str
1813Append
1814.Ar str
1815to the variable.
1816.It Cm \&::!= Ns Ar cmd
1817Assign the output of
1818.Ar cmd
1819to the variable.
1820.It Cm \&:\&[ Ns Ar range Ns Cm \&]
1821Selects one or more words from the value,
1822or performs other operations related to the way in which the
1823value is split into words.
1824.Pp
1825An empty value, or a value that consists entirely of white-space,
1826is treated as a single word.
1827For the purposes of the
1828.Sq Cm \&:[]
1829modifier, the words are indexed both forwards using positive integers
1830(where index 1 represents the first word),
1831and backwards using negative integers
1832(where index \-1 represents the last word).
1833.Pp
1834The
1835.Ar range
1836is subjected to variable expansion, and the expanded result is
1837then interpreted as follows:
1838.Bl -tag -width index
1839.\" :[n]
1840.It Ar index
1841Selects a single word from the value.
1842.\" :[start..end]
1843.It Ar start Ns Cm \&.. Ns Ar end
1844Selects all words from
1845.Ar start
1846to
1847.Ar end ,
1848inclusive.
1849For example,
1850.Sq Cm \&:[2..-1]
1851selects all words from the second word to the last word.
1852If
1853.Ar start
1854is greater than
1855.Ar end ,
1856the words are output in reverse order.
1857For example,
1858.Sq Cm \&:[-1..1]
1859selects all the words from last to first.
1860If the list is already ordered,
1861this effectively reverses the list,
1862but it is more efficient to use
1863.Sq Cm \&:Or
1864instead of
1865.Sq Cm \&:O:[-1..1] .
1866.\" :[*]
1867.It Cm \&*
1868Causes subsequent modifiers to treat the value as a single word
1869(possibly containing embedded whitespace).
1870Analogous to the effect of
1871.Li \&$*
1872in Bourne shell.
1873.\" :[0]
1874.It 0
1875Means the same as
1876.Sq Cm \&:[*] .
1877.\" :[*]
1878.It Cm \&@
1879Causes subsequent modifiers to treat the value as a sequence of words
1880delimited by whitespace.
1881Analogous to the effect of
1882.Li \&$@
1883in Bourne shell.
1884.\" :[#]
1885.It Cm \&#
1886Returns the number of words in the value.
1887.El \" :[range]
1888.El
1889.Sh DIRECTIVES
1890.Nm
1891offers directives for including makefiles, conditionals and for loops.
1892All these directives are identified by a line beginning with a single dot
1893.Pq Ql \&.
1894character, followed by the keyword of the directive, such as
1895.Cm include
1896or
1897.Cm if .
1898.Ss File inclusion
1899Files are included with either
1900.Cm \&.include \&< Ns Ar file Ns Cm \&>
1901or
1902.Cm \&.include \&\*q Ns Ar file Ns Cm \&\*q .
1903Variables between the angle brackets or double quotes are expanded
1904to form the file name.
1905If angle brackets are used, the included makefile is expected to be in
1906the system makefile directory.
1907If double quotes are used, the including makefile's directory and any
1908directories specified using the
1909.Fl I
1910option are searched before the system makefile directory.
1911.Pp
1912For compatibility with other make variants,
1913.Sq Cm include Ar file No ...
1914(without leading dot)
1915is also accepted.
1916.Pp
1917If the include statement is written as
1918.Cm .-include
1919or as
1920.Cm .sinclude ,
1921errors locating and/or opening include files are ignored.
1922.Pp
1923If the include statement is written as
1924.Cm .dinclude ,
1925not only are errors locating and/or opening include files ignored,
1926but stale dependencies within the included file are ignored just like in
1927.Va .MAKE.DEPENDFILE .
1928.Ss Exporting variables
1929The directives for exporting and unexporting variables are:
1930.Bl -tag -width Ds
1931.It Ic .export Ar variable No ...
1932Export the specified global variable.
1933If no variable list is provided, all globals are exported
1934except for internal variables (those that start with
1935.Ql \&. ) .
1936This is not affected by the
1937.Fl X
1938flag, so should be used with caution.
1939For compatibility with other make programs,
1940.Cm export Ar variable\| Ns Cm \&= Ns Ar value
1941(without leading dot) is also accepted.
1942.Pp
1943Appending a variable name to
1944.Va .MAKE.EXPORTED
1945is equivalent to exporting a variable.
1946.It Ic .export-env Ar variable No ...
1947The same as
1948.Ql .export ,
1949except that the variable is not appended to
1950.Va .MAKE.EXPORTED .
1951This allows exporting a value to the environment which is different from that
1952used by
1953.Nm
1954internally.
1955.It Ic .export-literal Ar variable No ...
1956The same as
1957.Ql .export-env ,
1958except that variables in the value are not expanded.
1959.It Ic .unexport Ar variable No ...
1960The opposite of
1961.Ql .export .
1962The specified global
1963.Ar variable
1964is removed from
1965.Va .MAKE.EXPORTED .
1966If no variable list is provided, all globals are unexported,
1967and
1968.Va .MAKE.EXPORTED
1969deleted.
1970.It Ic .unexport-env
1971Unexport all globals previously exported and
1972clear the environment inherited from the parent.
1973This operation causes a memory leak of the original environment,
1974so should be used sparingly.
1975Testing for
1976.Va .MAKE.LEVEL
1977being 0 would make sense.
1978Also note that any variables which originated in the parent environment
1979should be explicitly preserved if desired.
1980For example:
1981.Bd -literal -offset indent
1982.Li .if ${.MAKE.LEVEL} == 0
1983PATH := ${PATH}
1984.Li .unexport-env
1985.Li .export PATH
1986.Li .endif
1987.Pp
1988.Ed
1989Would result in an environment containing only
1990.Sq Ev PATH ,
1991which is the minimal useful environment.
1992.\" TODO: Check the below sentence, environment variables don't start with '.'.
1993Actually
1994.Sq Va .MAKE.LEVEL
1995is also pushed into the new environment.
1996.El
1997.Ss Messages
1998The directives for printing messages to the output are:
1999.Bl -tag -width Ds
2000.It Ic .info Ar message
2001The message is printed along with the name of the makefile and line number.
2002.It Ic .warning Ar message
2003The message prefixed by
2004.Sq Li warning:
2005is printed along with the name of the makefile and line number.
2006.It Ic .error Ar message
2007The message is printed along with the name of the makefile and line number,
2008.Nm
2009exits immediately.
2010.El
2011.Ss Conditionals
2012The directives for conditionals are:
2013.ds maybenot Oo Ic \&! Oc Ns
2014.Bl -tag
2015.It Ic .if \*[maybenot] Ar expression Op Ar operator expression No ...
2016Test the value of an expression.
2017.It Ic .ifdef \*[maybenot] Ar variable Op Ar operator variable No ...
2018Test whether a variable is defined.
2019.It Ic .ifndef \*[maybenot] Ar variable Op Ar operator variable No ...
2020Test whether a variable is not defined.
2021.It Ic .ifmake \*[maybenot] Ar target Op Ar operator target No ...
2022Test the target being requested.
2023.It Ic .ifnmake \*[maybenot] Ar target Op Ar operator target No ...
2024Test the target being requested.
2025.It Ic .else
2026Reverse the sense of the last conditional.
2027.It Ic .elif \*[maybenot] Ar expression Op Ar operator expression No ...
2028A combination of
2029.Sq Ic .else
2030followed by
2031.Sq Ic .if .
2032.It Ic .elifdef \*[maybenot] Ar variable Op Ar operator variable No ...
2033A combination of
2034.Sq Ic .else
2035followed by
2036.Sq Ic .ifdef .
2037.It Ic .elifndef \*[maybenot] Ar variable Op Ar operator variable No ...
2038A combination of
2039.Sq Ic .else
2040followed by
2041.Sq Ic .ifndef .
2042.It Ic .elifmake \*[maybenot] Ar target Op Ar operator target No ...
2043A combination of
2044.Sq Ic .else
2045followed by
2046.Sq Ic .ifmake .
2047.It Ic .elifnmake \*[maybenot] Ar target Op Ar operator target No ...
2048A combination of
2049.Sq Ic .else
2050followed by
2051.Sq Ic .ifnmake .
2052.It Ic .endif
2053End the body of the conditional.
2054.El
2055.Pp
2056The
2057.Ar operator
2058may be any one of the following:
2059.Bl -tag
2060.It Ic \&|\&|
2061Logical OR.
2062.It Ic \&&&
2063Logical AND; of higher precedence than
2064.Sq Ic \&|\&| .
2065.El
2066.Pp
2067.Nm
2068only evaluates a conditional as far as is necessary to determine its value.
2069Parentheses can be used to override the operator precedence.
2070The boolean operator
2071.Sq Ic \&!
2072may be used to logically negate an entire conditional.
2073It is of higher precedence than
2074.Sq Ic \&&& .
2075.Pp
2076The value of
2077.Ar expression
2078may be any of the following function call expressions:
2079.Bl -tag
2080.Sm off
2081.It Ic defined Li \&( Ar varname Li \&)
2082.Sm on
2083Evaluates to true if the variable
2084.Ar varname
2085has been defined.
2086.Sm off
2087.It Ic make Li \&( Ar target Li \&)
2088.Sm on
2089Evaluates to true if the target was specified as part of
2090.Nm Ns 's
2091command line or was declared the default target (either implicitly or
2092explicitly, see
2093.Va .MAIN )
2094before the line containing the conditional.
2095.Sm off
2096.It Ic empty Li \&( Ar varname Oo Li : Ar modifiers Oc Li \&)
2097.Sm on
2098Evaluates to true if the expansion of the variable,
2099after applying the modifiers, results in an empty string.
2100.Sm off
2101.It Ic exists Li \&( Ar pathname Li \&)
2102.Sm on
2103Evaluates to true if the given pathname exists.
2104If relative, the pathname is searched for on the system search path (see
2105.Va .PATH ) .
2106.Sm off
2107.It Ic target Li \&( Ar target Li \&)
2108.Sm on
2109Evaluates to true if the target has been defined.
2110.Sm off
2111.It Ic commands Li \&( Ar target Li \&)
2112.Sm on
2113Evaluates to true if the target has been defined
2114and has commands associated with it.
2115.El
2116.Pp
2117.Ar Expression
2118may also be an arithmetic or string comparison.
2119Variable expansion is performed on both sides of the comparison.
2120If both sides are numeric and neither is enclosed in quotes,
2121the comparison is done numerically, otherwise lexicographically.
2122A string is interpreted as hexadecimal integer if it is preceded by
2123.Li 0x ,
2124otherwise it is a decimal floating-point number;
2125octal numbers are not supported.
2126.Pp
2127All comparisons may use the operators
2128.Sq Ic \&==
2129and
2130.Sq Ic \&!= .
2131Numeric comparisons may also use the operators
2132.Sq Ic \&< ,
2133.Sq Ic \&<= ,
2134.Sq Ic \&>
2135and
2136.Sq Ic \&>= .
2137.Pp
2138If the comparison has neither a comparison operator nor a right side,
2139the expression evaluates to true if it is nonempty
2140and its numeric value (if any) is not zero.
2141.Pp
2142When
2143.Nm
2144is evaluating one of these conditional expressions, and it encounters
2145a (whitespace separated) word it doesn't recognize, either the
2146.Dq make
2147or
2148.Dq defined
2149function is applied to it, depending on the form of the conditional.
2150If the form is
2151.Sq Ic .ifdef ,
2152.Sq Ic .ifndef
2153or
2154.Sq Ic .if ,
2155the
2156.Dq defined
2157function is applied.
2158Similarly, if the form is
2159.Sq Ic .ifmake
2160or
2161.Sq Ic .ifnmake ,
2162the
2163.Dq make
2164function is applied.
2165.Pp
2166If the conditional evaluates to true,
2167parsing of the makefile continues as before.
2168If it evaluates to false, the following lines are skipped.
2169In both cases, this continues until the corresponding
2170.Sq Ic .else
2171or
2172.Sq Ic .endif
2173is found.
2174.Ss For loops
2175For loops are typically used to apply a set of rules to a list of files.
2176The syntax of a for loop is:
2177.Pp
2178.Bl -tag -compact -width Ds
2179.It Ic \&.for Ar variable Oo Ar variable No ... Oc Ic in Ar expression
2180.It Aq Ar make-lines
2181.It Ic \&.endfor
2182.El
2183.Pp
2184The
2185.Ar expression
2186is expanded and then split into words.
2187On each iteration of the loop, one word is taken and assigned to each
2188.Ar variable ,
2189in order, and these
2190.Ar variables
2191are substituted into the
2192.Ar make-lines
2193inside the body of the for loop.
2194The number of words must come out even; that is, if there are three
2195iteration variables, the number of words provided must be a multiple
2196of three.
2197.Pp
2198If
2199.Sq Ic .break
2200is encountered within a
2201.Cm \&.for
2202loop, it causes early termination of the loop, otherwise a parse error.
2203.\" TODO: Describe limitations with defined/empty.
2204.Ss Other directives
2205.Bl -tag -width Ds
2206.It Ic .undef Ar variable No ...
2207Un-define the specified global variables.
2208Only global variables can be un-defined.
2209.El
2210.Sh COMMENTS
2211Comments begin with a hash
2212.Pq Ql \&#
2213character, anywhere but in a shell
2214command line, and continue to the end of an unescaped new line.
2215.Sh SPECIAL SOURCES (ATTRIBUTES)
2216.Bl -tag -width .IGNOREx
2217.It Ic .EXEC
2218Target is never out of date, but always execute commands anyway.
2219.It Ic .IGNORE
2220Ignore any errors from the commands associated with this target, exactly
2221as if they all were preceded by a dash
2222.Pq Ql \- .
2223.\" .It Ic .INVISIBLE
2224.\" XXX
2225.\" .It Ic .JOIN
2226.\" XXX
2227.It Ic .MADE
2228Mark all sources of this target as being up to date.
2229.It Ic .MAKE
2230Execute the commands associated with this target even if the
2231.Fl n
2232or
2233.Fl t
2234options were specified.
2235Normally used to mark recursive
2236.Nm Ns s .
2237.It Ic .META
2238Create a meta file for the target, even if it is flagged as
2239.Ic .PHONY ,
2240.Ic .MAKE ,
2241or
2242.Ic .SPECIAL .
2243Usage in conjunction with
2244.Ic .MAKE
2245is the most likely case.
2246In
2247.Dq meta
2248mode, the target is out-of-date if the meta file is missing.
2249.It Ic .NOMETA
2250Do not create a meta file for the target.
2251Meta files are also not created for
2252.Ic .PHONY ,
2253.Ic .MAKE ,
2254or
2255.Ic .SPECIAL
2256targets.
2257.It Ic .NOMETA_CMP
2258Ignore differences in commands when deciding if target is out of date.
2259This is useful if the command contains a value which always changes.
2260If the number of commands change, though,
2261the target is still considered out of date.
2262The same effect applies to any command line that uses the variable
2263.Va .OODATE ,
2264which can be used for that purpose even when not otherwise needed or desired:
2265.Bd -literal -offset indent
2266
2267skip-compare-for-some:
2268	@echo this is compared
2269	@echo this is not ${.OODATE:M.NOMETA_CMP}
2270	@echo this is also compared
2271
2272.Ed
2273The
2274.Cm \&:M
2275pattern suppresses any expansion of the unwanted variable.
2276.It Ic .NOPATH
2277Do not search for the target in the directories specified by
2278.Va .PATH .
2279.It Ic .NOTMAIN
2280Normally
2281.Nm
2282selects the first target it encounters as the default target to be built
2283if no target was specified.
2284This source prevents this target from being selected.
2285.It Ic .OPTIONAL
2286If a target is marked with this attribute and
2287.Nm
2288can't figure out how to create it, it ignores this fact and assumes
2289the file isn't needed or already exists.
2290.It Ic .PHONY
2291The target does not correspond to an actual file;
2292it is always considered to be out of date,
2293and is not created with the
2294.Fl t
2295option.
2296Suffix-transformation rules are not applied to
2297.Ic .PHONY
2298targets.
2299.It Ic .PRECIOUS
2300When
2301.Nm
2302is interrupted, it normally removes any partially made targets.
2303This source prevents the target from being removed.
2304.It Ic .RECURSIVE
2305Synonym for
2306.Ic .MAKE .
2307.It Ic .SILENT
2308Do not echo any of the commands associated with this target, exactly
2309as if they all were preceded by an at sign
2310.Pq Ql @ .
2311.It Ic .USE
2312Turn the target into
2313.Nm Ns 's
2314version of a macro.
2315When the target is used as a source for another target, the other target
2316acquires the commands, sources, and attributes (except for
2317.Ic .USE )
2318of the
2319source.
2320If the target already has commands, the
2321.Ic .USE
2322target's commands are appended
2323to them.
2324.It Ic .USEBEFORE
2325Like
2326.Ic .USE ,
2327but instead of appending, prepend the
2328.Ic .USEBEFORE
2329target commands to the target.
2330.It Ic .WAIT
2331If
2332.Ic .WAIT
2333appears in a dependency line, the sources that precede it are
2334made before the sources that succeed it in the line.
2335Since the dependents of files are not made until the file itself
2336could be made, this also stops the dependents being built unless they
2337are needed for another branch of the dependency tree.
2338So given:
2339.Bd -literal
2340x: a .WAIT b
2341	echo x
2342a:
2343	echo a
2344b: b1
2345	echo b
2346b1:
2347	echo b1
2348
2349.Ed
2350the output is always
2351.Ql a ,
2352.Ql b1 ,
2353.Ql b ,
2354.Ql x .
2355.Pp
2356The ordering imposed by
2357.Ic .WAIT
2358is only relevant for parallel makes.
2359.El
2360.Sh SPECIAL TARGETS
2361Special targets may not be included with other targets, i.e. they must be
2362the only target specified.
2363.Bl -tag -width .BEGINx
2364.It Ic .BEGIN
2365Any command lines attached to this target are executed before anything
2366else is done.
2367.It Ic .DEFAULT
2368This is sort of a
2369.Ic .USE
2370rule for any target (that was used only as a source) that
2371.Nm
2372can't figure out any other way to create.
2373Only the shell script is used.
2374The
2375.Va .IMPSRC
2376variable of a target that inherits
2377.Ic .DEFAULT Ns 's
2378commands is set to the target's own name.
2379.It Ic .DELETE_ON_ERROR
2380If this target is present in the makefile, it globally causes make to
2381delete targets whose commands fail.
2382(By default, only targets whose commands are interrupted during
2383execution are deleted.
2384This is the historical behavior.)
2385This setting can be used to help prevent half-finished or malformed
2386targets from being left around and corrupting future rebuilds.
2387.It Ic .END
2388Any command lines attached to this target are executed after everything
2389else is done successfully.
2390.It Ic .ERROR
2391Any command lines attached to this target are executed when another target fails.
2392The
2393.Va .ERROR_TARGET
2394variable is set to the target that failed.
2395See also
2396.Va MAKE_PRINT_VAR_ON_ERROR .
2397.It Ic .IGNORE
2398Mark each of the sources with the
2399.Ic .IGNORE
2400attribute.
2401If no sources are specified, this is the equivalent of specifying the
2402.Fl i
2403option.
2404.It Ic .INTERRUPT
2405If
2406.Nm
2407is interrupted, the commands for this target are executed.
2408.It Ic .MAIN
2409If no target is specified when
2410.Nm
2411is invoked, this target is built.
2412.It Ic .MAKEFLAGS
2413This target provides a way to specify flags for
2414.Nm
2415at the time when the makefiles are read.
2416The flags are as if typed to the shell, though the
2417.Fl f
2418option has
2419no effect.
2420.\" XXX: NOT YET!!!!
2421.\" .It Ic .NOTPARALLEL
2422.\" The named targets are executed in non parallel mode.
2423.\" If no targets are
2424.\" specified, all targets are executed in non parallel mode.
2425.It Ic .NOPATH
2426Apply the
2427.Ic .NOPATH
2428attribute to any specified sources.
2429.It Ic .NOTPARALLEL
2430Disable parallel mode.
2431.It Ic .NO_PARALLEL
2432Synonym for
2433.Ic .NOTPARALLEL ,
2434for compatibility with other pmake variants.
2435.It Ic .NOREADONLY
2436clear the read-only attribute from the global variables specified as sources.
2437.It Ic .OBJDIR
2438The source is a new value for
2439.Sq Va .OBJDIR .
2440If it exists,
2441.Nm
2442changes the current working directory to it and updates the value of
2443.Sq Va .OBJDIR .
2444.It Ic .ORDER
2445In parallel mode, the named targets are made in sequence.
2446This ordering does not add targets to the list of targets to be made.
2447.Pp
2448Since the dependents of a target do not get built until the target itself
2449could be built, unless
2450.Ql a
2451is built by another part of the dependency graph,
2452the following is a dependency loop:
2453.Bd -literal
2454\&.ORDER: b a
2455b: a
2456.Ed
2457.Pp
2458.\" XXX: NOT YET!!!!
2459.\" .It Ic .PARALLEL
2460.\" The named targets are executed in parallel mode.
2461.\" If no targets are
2462.\" specified, all targets are executed in parallel mode.
2463.It Ic .PATH
2464The sources are directories which are to be searched for files not
2465found in the current directory.
2466If no sources are specified,
2467any previously specified directories are removed from the search path.
2468If the source is the special
2469.Ic .DOTLAST
2470target, the current working directory is searched last.
2471.It Ic .PATH. Ns Ar suffix
2472Like
2473.Ic .PATH
2474but applies only to files with a particular suffix.
2475The suffix must have been previously declared with
2476.Ic .SUFFIXES .
2477.It Ic .PHONY
2478Apply the
2479.Ic .PHONY
2480attribute to any specified sources.
2481.It Ic .POSIX
2482If this is the first non-comment line in the main makefile,
2483the variable
2484.Va %POSIX
2485is set to the value
2486.Ql 1003.2
2487and the makefile
2488.Ql <posix.mk>
2489is included if it exists,
2490to provide POSIX-compatible default rules.
2491If
2492.Nm
2493is run with the
2494.Fl r
2495flag, only
2496.Ql posix.mk
2497contributes to the default rules.
2498.It Ic .PRECIOUS
2499Apply the
2500.Ic .PRECIOUS
2501attribute to any specified sources.
2502If no sources are specified, the
2503.Ic .PRECIOUS
2504attribute is applied to every target in the file.
2505.It Ic .READONLY
2506set the read-only attribute on the global variables specified as sources.
2507.It Ic .SHELL
2508Sets the shell that
2509.Nm
2510uses to execute commands in jobs mode.
2511The sources are a set of
2512.Ar field\| Ns Cm \&= Ns Ar value
2513pairs.
2514.Bl -tag -width ".Li hasErrCtls"
2515.It Li name
2516This is the minimal specification, used to select one of the built-in
2517shell specs;
2518.Li sh ,
2519.Li ksh ,
2520and
2521.Li csh .
2522.It Li path
2523Specifies the absolute path to the shell.
2524.It Li hasErrCtl
2525Indicates whether the shell supports exit on error.
2526.It Li check
2527The command to turn on error checking.
2528.It Li ignore
2529The command to disable error checking.
2530.It Li echo
2531The command to turn on echoing of commands executed.
2532.It Li quiet
2533The command to turn off echoing of commands executed.
2534.It Li filter
2535The output to filter after issuing the
2536.Li quiet
2537command.
2538It is typically identical to
2539.Li quiet .
2540.It Li errFlag
2541The flag to pass the shell to enable error checking.
2542.It Li echoFlag
2543The flag to pass the shell to enable command echoing.
2544.It Li newline
2545The string literal to pass the shell that results in a single newline
2546character when used outside of any quoting characters.
2547.El
2548Example:
2549.Bd -literal
2550\&.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \e
2551	check="set \-e" ignore="set +e" \e
2552	echo="set \-v" quiet="set +v" filter="set +v" \e
2553	echoFlag=v errFlag=e newline="'\en'"
2554.Ed
2555.It Ic .SILENT
2556Apply the
2557.Ic .SILENT
2558attribute to any specified sources.
2559If no sources are specified, the
2560.Ic .SILENT
2561attribute is applied to every
2562command in the file.
2563.It Ic .STALE
2564This target gets run when a dependency file contains stale entries, having
2565.Va .ALLSRC
2566set to the name of that dependency file.
2567.It Ic .SUFFIXES
2568Each source specifies a suffix to
2569.Nm .
2570If no sources are specified, any previously specified suffixes are deleted.
2571It allows the creation of suffix-transformation rules.
2572.Pp
2573Example:
2574.Bd -literal
2575\&.SUFFIXES: .c .o
2576\&.c.o:
2577	cc \-o ${.TARGET} \-c ${.IMPSRC}
2578.Ed
2579.It Ic .SYSPATH
2580The sources are directories which are to be added to the system
2581include path which
2582.Nm
2583searches for makefiles.
2584If no sources are specified,
2585any previously specified directories are removed from the system
2586include path.
2587.El
2588.Sh ENVIRONMENT
2589.Nm
2590uses the following environment variables, if they exist:
2591.Ev MACHINE ,
2592.Ev MACHINE_ARCH ,
2593.Ev MAKE ,
2594.Ev MAKEFLAGS ,
2595.Ev MAKEOBJDIR ,
2596.Ev MAKEOBJDIRPREFIX ,
2597.Ev MAKESYSPATH ,
2598.Ev PWD ,
2599and
2600.Ev TMPDIR .
2601.Pp
2602.Ev MAKEOBJDIRPREFIX
2603and
2604.Ev MAKEOBJDIR
2605may only be set in the environment or on the command line to
2606.Nm
2607and not as makefile variables;
2608see the description of
2609.Sq Va .OBJDIR
2610for more details.
2611.Sh FILES
2612.Bl -tag -width /usr/share/mk -compact
2613.It .depend
2614list of dependencies
2615.It makefile
2616first default makefile if no makefile is specified on the command line
2617.It Makefile
2618second default makefile if no makefile is specified on the command line
2619.It sys.mk
2620system makefile
2621.It /usr/share/mk
2622system makefile directory
2623.El
2624.Sh COMPATIBILITY
2625The basic make syntax is compatible between different make variants;
2626however the special variables, variable modifiers and conditionals are not.
2627.Ss Older versions
2628An incomplete list of changes in older versions of
2629.Nm :
2630.Pp
2631The way that .for loop variables are substituted changed after
2632NetBSD 5.0
2633so that they still appear to be variable expansions.
2634In particular this stops them being treated as syntax, and removes some
2635obscure problems using them in .if statements.
2636.Pp
2637The way that parallel makes are scheduled changed in
2638NetBSD 4.0
2639so that .ORDER and .WAIT apply recursively to the dependent nodes.
2640The algorithms used may change again in the future.
2641.Ss Other make dialects
2642Other make dialects (GNU make, SVR4 make, POSIX make, etc.) do not
2643support most of the features of
2644.Nm
2645as described in this manual.
2646Most notably:
2647.Bl -bullet -offset indent
2648.It
2649The
2650.Ic .WAIT
2651and
2652.Ic .ORDER
2653declarations and most functionality pertaining to parallelization.
2654(GNU make supports parallelization but lacks the features needed to
2655control it effectively.)
2656.It
2657Directives, including for loops and conditionals and most of the
2658forms of include files.
2659(GNU make has its own incompatible and less powerful syntax for
2660conditionals.)
2661.\" The "less powerful" above means that GNU make does not have the
2662.\" make(target), target(target) and commands(target) functions.
2663.It
2664All built-in variables that begin with a dot.
2665.It
2666Most of the special sources and targets that begin with a dot,
2667with the notable exception of
2668.Ic .PHONY ,
2669.Ic .PRECIOUS ,
2670and
2671.Ic .SUFFIXES .
2672.It
2673Variable modifiers, except for the
2674.Ql :old=new
2675string substitution, which does not portably support globbing with
2676.Ql %
2677and historically only works on declared suffixes.
2678.It
2679The
2680.Ic $>
2681variable even in its short form; most makes support this functionality
2682but its name varies.
2683.El
2684.Pp
2685Some features are somewhat more portable, such as assignment with
2686.Ic += ,
2687.Ic ?= ,
2688and
2689.Ic != .
2690The
2691.Va .PATH
2692functionality is based on an older feature
2693.Ic VPATH
2694found in GNU make and many versions of SVR4 make; however,
2695historically its behavior is too ill-defined (and too buggy) to rely
2696upon.
2697.Pp
2698The
2699.Ic $@
2700and
2701.Ic $<
2702variables are more or less universally portable, as is the
2703.Ic $(MAKE)
2704variable.
2705Basic use of suffix rules (for files only in the current directory,
2706not trying to chain transformations together, etc.) is also reasonably
2707portable.
2708.Sh SEE ALSO
2709.Xr mkdep 1
2710.Sh HISTORY
2711.Nm
2712is derived from NetBSD
2713.Xr make 1 .
2714It uses autoconf to facilitate portability to other platforms.
2715.Pp
2716A
2717make
2718command appeared in
2719.At v7 .
2720This
2721make
2722implementation is based on Adam de Boor's pmake program,
2723which was written for Sprite at Berkeley.
2724It was designed to be a parallel distributed make running jobs on different
2725machines using a daemon called
2726.Dq customs .
2727.Pp
2728Historically the target/dependency
2729.Ic FRC
2730has been used to FoRCe rebuilding (since the target/dependency
2731does not exist ... unless someone creates an
2732.Pa FRC
2733file).
2734.Sh BUGS
2735The
2736make
2737syntax is difficult to parse.
2738For instance, finding the end of a variable's use should involve scanning
2739each of the modifiers, using the correct terminator for each field.
2740In many places
2741make
2742just counts {} and () in order to find the end of a variable expansion.
2743.Pp
2744There is no way of escaping a space character in a filename.
2745.Pp
2746In jobs mode, when a target fails;
2747make
2748will put an error token into the job token pool.
2749This will cause all other instances of
2750make
2751using that token pool to abort the build and exit with error code 6.
2752Sometimes the attempt to suppress a cascade of unnecessary errors,
2753can result in a seemingly unexplained
2754.Ql *** Error code 6
2755