xref: /freebsd/contrib/bmake/make.1 (revision 19fae0f66023a97a9b464b3beeeabb2081f575b3)
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 MAKE 1
34.Os
35.Sh NAME
36.Nm make
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.It Va .MAKE.ALWAYS_PASS_JOB_QUEUE
910Tells
911.Nm
912whether to pass the descriptors of the job token queue
913even if the target is not tagged with
914.Ic .MAKE
915The default is
916.Ql Pa yes
917for backwards compatability with
918.Fx 9.0
919and earlier.
920.\" '.MAKE.cmd_filtered' is intentionally undocumented,
921.\" as it is an internal implementation detail.
922.It Va .MAKE.DEPENDFILE
923Names the makefile (default
924.Sq Pa .depend )
925from which generated dependencies are read.
926.It Va .MAKE.DIE_QUIETLY
927If set to
928.Ql true ,
929do not print error information at the end.
930.It Va .MAKE.EXPAND_VARIABLES
931A boolean that controls the default behavior of the
932.Fl V
933option.
934If true, variable values printed with
935.Fl V
936are fully expanded; if false, the raw variable contents (which may
937include additional unexpanded variable references) are shown.
938.It Va .MAKE.EXPORTED
939The list of variables exported by
940.Nm .
941.It Va MAKEFILE
942The top-level makefile that is currently read,
943as given in the command line.
944.It Va .MAKEFLAGS
945The environment variable
946.Sq Ev MAKEFLAGS
947may contain anything that
948may be specified on
949.Nm Ns 's
950command line.
951Anything specified on
952.Nm Ns 's
953command line is appended to the
954.Va .MAKEFLAGS
955variable, which is then added to the environment for all programs that
956.Nm
957executes.
958.It Va .MAKE.GID
959The numeric group ID of the user running
960.Nm .
961It is read-only.
962.It Va .MAKE.JOB.PREFIX
963If
964.Nm
965is run with
966.Fl j ,
967the output for each target is prefixed with a token
968.Dl --- Ar target Li ---
969the first part of which can be controlled via
970.Va .MAKE.JOB.PREFIX .
971If
972.Va .MAKE.JOB.PREFIX
973is empty, no token is printed.
974For example, setting
975.Va .MAKE.JOB.PREFIX
976to
977.Ql ${.newline}---${.MAKE:T}[${.MAKE.PID}]
978would produce tokens like
979.Dl ---make[1234] Ar target Li ---
980making it easier to track the degree of parallelism being achieved.
981.It Va .MAKE.JOBS
982The argument to the
983.Fl j
984option.
985.It Va .MAKE.LEVEL
986The recursion depth of
987.Nm .
988The top-level instance of
989.Nm
990has level 0, and each child make has its parent level plus 1.
991This allows tests like:
992.Li .if ${.MAKE.LEVEL} == 0
993to protect things which should only be evaluated in the top-level instance of
994.Nm .
995.It Va .MAKE.LEVEL.ENV
996The name of the environment variable that stores the level of nested calls to
997.Nm .
998.It Va .MAKE.MAKEFILE_PREFERENCE
999The ordered list of makefile names
1000(default
1001.Sq Pa makefile ,
1002.Sq Pa Makefile )
1003that
1004.Nm
1005looks for.
1006.It Va .MAKE.MAKEFILES
1007The list of makefiles read by
1008.Nm ,
1009which is useful for tracking dependencies.
1010Each makefile is recorded only once, regardless of the number of times read.
1011.It Va .MAKE.META.BAILIWICK
1012In
1013.Dq meta
1014mode, provides a list of prefixes which
1015match the directories controlled by
1016.Nm .
1017If a file that was generated outside of
1018.Va .OBJDIR
1019but within said bailiwick is missing,
1020the current target is considered out-of-date.
1021.It Va .MAKE.META.CMP_FILTER
1022In
1023.Dq meta
1024mode, it can (very rarely!) be useful to filter command
1025lines before comparison.
1026This variable can be set to a set of modifiers that are applied to
1027each line of the old and new command that differ, if the filtered
1028commands still differ, the target is considered out-of-date.
1029.It Va .MAKE.META.CREATED
1030In
1031.Dq meta
1032mode, this variable contains a list of all the meta files
1033updated.
1034If not empty, it can be used to trigger processing of
1035.Va .MAKE.META.FILES .
1036.It Va .MAKE.META.FILES
1037In
1038.Dq meta
1039mode, this variable contains a list of all the meta files
1040used (updated or not).
1041This list can be used to process the meta files to extract dependency
1042information.
1043.It Va .MAKE.META.IGNORE_FILTER
1044Provides a list of variable modifiers to apply to each pathname.
1045Ignore if the expansion is an empty string.
1046.It Va .MAKE.META.IGNORE_PATHS
1047Provides a list of path prefixes that should be ignored;
1048because the contents are expected to change over time.
1049The default list includes:
1050.Sq Pa /dev /etc /proc /tmp /var/run /var/tmp
1051.It Va .MAKE.META.IGNORE_PATTERNS
1052Provides a list of patterns to match against pathnames.
1053Ignore any that match.
1054.It Va .MAKE.META.PREFIX
1055Defines the message printed for each meta file updated in
1056.Dq meta verbose
1057mode.
1058The default value is:
1059.Dl Building ${.TARGET:H:tA}/${.TARGET:T}
1060.It Va .MAKE.MODE
1061Processed after reading all makefiles.
1062Affects the mode that
1063.Nm
1064runs in.
1065It can contain these keywords:
1066.Bl -tag -width indent
1067.It Cm compat
1068Like
1069.Fl B ,
1070puts
1071.Nm
1072into
1073.Dq compat
1074mode.
1075.It Cm meta
1076Puts
1077.Nm
1078into
1079.Dq meta
1080mode, where meta files are created for each target
1081to capture the command run, the output generated, and if
1082.Xr filemon 4
1083is available, the system calls which are of interest to
1084.Nm .
1085The captured output can be useful when diagnosing errors.
1086.It Cm curdirOk= Ns Ar bf
1087By default,
1088.Nm
1089does not create
1090.Pa .meta
1091files in
1092.Sq Va .CURDIR .
1093This can be overridden by setting
1094.Ar bf
1095to a value which represents true.
1096.It Cm missing-meta= Ns Ar bf
1097If
1098.Ar bf
1099is true, a missing
1100.Pa .meta
1101file makes the target out-of-date.
1102.It Cm missing-filemon= Ns Ar bf
1103If
1104.Ar bf
1105is true, missing filemon data makes the target out-of-date.
1106.It Cm nofilemon
1107Do not use
1108.Xr filemon 4 .
1109.It Cm env
1110For debugging, it can be useful to include the environment
1111in the
1112.Pa .meta
1113file.
1114.It Cm verbose
1115If in
1116.Dq meta
1117mode, print a clue about the target being built.
1118This is useful if the build is otherwise running silently.
1119The message printed is the expanded value of
1120.Va .MAKE.META.PREFIX .
1121.It Cm ignore-cmd
1122Some makefiles have commands which are simply not stable.
1123This keyword causes them to be ignored for
1124determining whether a target is out of date in
1125.Dq meta
1126mode.
1127See also
1128.Ic .NOMETA_CMP .
1129.It Cm silent= Ns Ar bf
1130If
1131.Ar bf
1132is true, when a .meta file is created, mark the target
1133.Ic .SILENT .
1134.It Cm randomize-targets
1135In both compat and parallel mode, do not make the targets in the usual order,
1136but instead randomize their order.
1137This mode can be used to detect undeclared dependencies between files.
1138.El
1139.It Va MAKEOBJDIR
1140Used to create files in a separate directory, see
1141.Va .OBJDIR .
1142.It Va MAKE_OBJDIR_CHECK_WRITABLE
1143Used to force a separate directory for the created files,
1144even if that directory is not writable, see
1145.Va .OBJDIR .
1146.It Va MAKEOBJDIRPREFIX
1147Used to create files in a separate directory, see
1148.Va .OBJDIR .
1149.It Va .MAKE.OS
1150The name of the operating system, see
1151.Xr uname 1 .
1152It is read-only.
1153.It Va .MAKEOVERRIDES
1154This variable is used to record the names of variables assigned to
1155on the command line, so that they may be exported as part of
1156.Sq Ev MAKEFLAGS .
1157This behavior can be disabled by assigning an empty value to
1158.Sq Va .MAKEOVERRIDES
1159within a makefile.
1160Extra variables can be exported from a makefile
1161by appending their names to
1162.Sq Va .MAKEOVERRIDES .
1163.Sq Ev MAKEFLAGS
1164is re-exported whenever
1165.Sq Va .MAKEOVERRIDES
1166is modified.
1167.It Va .MAKE.PATH_FILEMON
1168If
1169.Nm
1170was built with
1171.Xr filemon 4
1172support, this is set to the path of the device node.
1173This allows makefiles to test for this support.
1174.It Va .MAKE.PID
1175The process ID of
1176.Nm .
1177It is read-only.
1178.It Va .MAKE.PPID
1179The parent process ID of
1180.Nm .
1181It is read-only.
1182.It Va MAKE_PRINT_VAR_ON_ERROR
1183When
1184.Nm
1185stops due to an error, it sets
1186.Sq Va .ERROR_TARGET
1187to the name of the target that failed,
1188.Sq Va .ERROR_CMD
1189to the commands of the failed target,
1190and in
1191.Dq meta
1192mode, it also sets
1193.Sq Va .ERROR_CWD
1194to the
1195.Xr getcwd 3 ,
1196and
1197.Sq Va .ERROR_META_FILE
1198to the path of the meta file (if any) describing the failed target.
1199It then prints its name and the value of
1200.Sq Va .CURDIR
1201as well as the value of any variables named in
1202.Sq Va MAKE_PRINT_VAR_ON_ERROR .
1203.It Va .MAKE.SAVE_DOLLARS
1204If true,
1205.Ql $$
1206are preserved when doing
1207.Ql :=
1208assignments.
1209The default is false, for backwards compatibility.
1210Set to true for compatability with other makes.
1211If set to false,
1212.Ql $$
1213becomes
1214.Ql $
1215per normal evaluation rules.
1216.It Va .MAKE.TARGET_LOCAL_VARIABLES
1217If set to
1218.Ql false ,
1219apparent variable assignments in dependency lines are
1220treated as normal sources.
1221.It Va .MAKE.UID
1222The numeric ID of the user running
1223.Nm .
1224It is read-only.
1225.\" 'MAKE_VERSION' is intentionally undocumented
1226.\" since it is only defined in the bmake distribution,
1227.\" but not in NetBSD's native make.
1228.\" '.meta.%d.lcwd' is intentionally undocumented
1229.\" since it is an internal implementation detail.
1230.\" '.meta.%d.ldir' is intentionally undocumented
1231.\" since it is an internal implementation detail.
1232.\" 'MFLAGS' is intentionally undocumented
1233.\" since it is obsolete.
1234.It Va .newline
1235This variable is simply assigned a newline character as its value.
1236It is read-only.
1237This allows expansions using the
1238.Cm \&:@
1239modifier to put a newline between
1240iterations of the loop rather than a space.
1241For example, in case of an error,
1242.Nm
1243prints the variable names and their values using:
1244.Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}
1245.It Va .OBJDIR
1246A path to the directory where the targets are built.
1247Its value is determined by trying to
1248.Xr chdir 2
1249to the following directories in order and using the first match:
1250.Bl -enum
1251.It
1252.Cm ${MAKEOBJDIRPREFIX} Ns Cm ${.CURDIR}
1253.Pp
1254(Only if
1255.Sq Ev MAKEOBJDIRPREFIX
1256is set in the environment or on the command line.)
1257.It
1258.Cm ${MAKEOBJDIR}
1259.Pp
1260(Only if
1261.Sq Ev MAKEOBJDIR
1262is set in the environment or on the command line.)
1263.It
1264.Cm ${.CURDIR} Ns Pa /obj. Ns Cm ${MACHINE}
1265.It
1266.Cm ${.CURDIR} Ns Pa /obj
1267.It
1268.Pa /usr/obj/ Ns Cm ${.CURDIR}
1269.It
1270.Cm ${.CURDIR}
1271.El
1272.Pp
1273Variable expansion is performed on the value before it is used,
1274so expressions such as
1275.Cm ${.CURDIR:S,^/usr/src,/var/obj,}
1276may be used.
1277This is especially useful with
1278.Sq Ev MAKEOBJDIR .
1279.Pp
1280.Sq Va .OBJDIR
1281may be modified in the makefile via the special target
1282.Sq Ic .OBJDIR .
1283In all cases,
1284.Nm
1285changes to the specified directory if it exists, and sets
1286.Sq Va .OBJDIR
1287and
1288.Sq Va PWD
1289to that directory before executing any targets.
1290.Pp
1291Except in the case of an explicit
1292.Sq Ic .OBJDIR
1293target,
1294.Nm
1295checks that the specified directory is writable and ignores it if not.
1296This check can be skipped by setting the environment variable
1297.Sq Ev MAKE_OBJDIR_CHECK_WRITABLE
1298to
1299.Dq no .
1300.It Va .PARSEDIR
1301The directory name of the current makefile being parsed.
1302.It Va .PARSEFILE
1303The basename of the current makefile being parsed.
1304This variable and
1305.Sq Va .PARSEDIR
1306are both set only while the makefiles are being parsed.
1307To retain their current values,
1308assign them to a variable using assignment with expansion
1309.Sq Cm \&:= .
1310.It Va .PATH
1311The space-separated list of directories that
1312.Nm
1313searches for files.
1314To update this search list, use the special target
1315.Sq Ic .PATH
1316rather than modifying the variable directly.
1317.It Va %POSIX
1318Is set in POSIX mode, see the special
1319.Ql Va .POSIX
1320target.
1321.\" XXX: There is no make variable named 'PWD',
1322.\" XXX: make only reads and writes the environment variable 'PWD'.
1323.It Va PWD
1324Alternate path to the current directory.
1325.Nm
1326normally sets
1327.Sq Va .CURDIR
1328to the canonical path given by
1329.Xr getcwd 3 .
1330However, if the environment variable
1331.Sq Ev PWD
1332is set and gives a path to the current directory,
1333.Nm
1334sets
1335.Sq Va .CURDIR
1336to the value of
1337.Sq Ev PWD
1338instead.
1339This behavior is disabled if
1340.Sq Ev MAKEOBJDIRPREFIX
1341is set or
1342.Sq Ev MAKEOBJDIR
1343contains a variable transform.
1344.Sq Va PWD
1345is set to the value of
1346.Sq Va .OBJDIR
1347for all programs which
1348.Nm
1349executes.
1350.It Va .SHELL
1351The pathname of the shell used to run target scripts.
1352It is read-only.
1353.It Va .SUFFIXES
1354The list of known suffixes.
1355It is read-only.
1356.It Va .SYSPATH
1357The space-separated list of directories that
1358.Nm
1359searches for makefiles, referred to as the system include path.
1360To update this search list, use the special target
1361.Sq Ic .SYSPATH
1362rather than modifying the variable which is read-only.
1363.It Va .TARGETS
1364The list of targets explicitly specified on the command line, if any.
1365.It Va VPATH
1366The colon-separated
1367.Pq Dq \&:
1368list of directories that
1369.Nm
1370searches for files.
1371This variable is supported for compatibility with old make programs only, use
1372.Sq Va .PATH
1373instead.
1374.El
1375.Ss Variable modifiers
1376The general format of a variable expansion is:
1377.Pp
1378.Sm off
1379.D1 Ic \&${ Ar variable\| Oo Ic \&: Ar modifier\| Oo Ic \&: No ... Oc Oc Ic \&}
1380.Sm on
1381.Pp
1382Each modifier begins with a colon.
1383To escape a colon, precede it with a backslash
1384.Ql \e .
1385.Pp
1386A list of indirect modifiers can be specified via a variable, as follows:
1387.Pp
1388.Bd -literal -offset indent
1389.Ar modifier_variable\^ Li \&= Ar modifier Ns Oo Ic \&: Ns No ... Oc
1390
1391.Sm off
1392.Ic \&${ Ar variable Ic \&:${ Ar modifier_variable Ic \&} Oo Ic \&: No ... Oc Ic \&}
1393.Sm on
1394.Ed
1395.Pp
1396In this case, the first modifier in the
1397.Ar modifier_variable
1398does not start with a colon,
1399since that colon already occurs in the referencing variable.
1400If any of the modifiers in the
1401.Ar modifier_variable
1402contains a dollar sign
1403.Pq Ql $ ,
1404these must be doubled to avoid early expansion.
1405.Pp
1406Some modifiers interpret the expression value as a single string,
1407others treat the expression value as a whitespace-separated list of words.
1408When splitting a string into words,
1409whitespace can be escaped using double quotes, single quotes and backslashes,
1410like in the shell.
1411The quotes and backslashes are retained in the words.
1412.Pp
1413The supported modifiers are:
1414.Bl -tag -width EEE
1415.It Cm \&:E
1416Replaces each word with its suffix.
1417.It Cm \&:H
1418Replaces each word with its dirname.
1419.It Cm \&:M\| Ns Ar pattern
1420Selects only those words that match
1421.Ar pattern .
1422The standard shell wildcard characters
1423.Pf ( Ql * ,
1424.Ql \&? ,
1425and
1426.Ql \&[] )
1427may
1428be used.
1429The wildcard characters may be escaped with a backslash
1430.Pq Ql \e .
1431As a consequence of the way values are split into words, matched,
1432and then joined, the construct
1433.Ql ${VAR:M*}
1434removes all leading and trailing whitespace
1435and normalizes the inter-word spacing to a single space.
1436.It Cm \&:N\| Ns Ar pattern
1437This is the opposite of
1438.Sq Cm \&:M ,
1439selecting all words which do
1440.Em not
1441match
1442.Ar pattern .
1443.It Cm \&:O
1444Orders the words lexicographically.
1445.It Cm \&:On
1446Orders the words numerically.
1447A number followed by one of
1448.Ql k ,
1449.Ql M
1450or
1451.Ql G
1452is multiplied by the appropriate factor, which is 1024 for
1453.Ql k ,
14541048576 for
1455.Ql M ,
1456or 1073741824 for
1457.Ql G .
1458Both upper- and lower-case letters are accepted.
1459.It Cm \&:Or
1460Orders the words in reverse lexicographical order.
1461.It Cm \&:Orn
1462Orders the words in reverse numerical order.
1463.It Cm \&:Ox
1464Shuffles the words.
1465The results are different each time you are referring to the
1466modified variable; use the assignment with expansion
1467.Sq Cm \&:=
1468to prevent such behavior.
1469For example,
1470.Bd -literal -offset indent
1471LIST=			uno due tre quattro
1472RANDOM_LIST=		${LIST:Ox}
1473STATIC_RANDOM_LIST:=	${LIST:Ox}
1474
1475all:
1476	@echo "${RANDOM_LIST}"
1477	@echo "${RANDOM_LIST}"
1478	@echo "${STATIC_RANDOM_LIST}"
1479	@echo "${STATIC_RANDOM_LIST}"
1480.Ed
1481may produce output similar to:
1482.Bd -literal -offset indent
1483quattro due tre uno
1484tre due quattro uno
1485due uno quattro tre
1486due uno quattro tre
1487.Ed
1488.It Cm \&:Q
1489Quotes every shell meta-character in the value, so that it can be passed
1490safely to the shell.
1491.It Cm \&:q
1492Quotes every shell meta-character in the value, and also doubles
1493.Sq $
1494characters so that it can be passed
1495safely through recursive invocations of
1496.Nm .
1497This is equivalent to
1498.Sq Cm \&:S/\e\&$/&&/g:Q .
1499.It Cm \&:R
1500Replaces each word with everything but its suffix.
1501.It Cm \&:range Ns Oo Cm = Ns Ar count Oc
1502The value is an integer sequence representing the words of the original
1503value, or the supplied
1504.Ar count .
1505.It Cm \&:gmtime Ns Oo Cm = Ns Ar timestamp Oc
1506The value is interpreted as a format string for
1507.Xr strftime 3 ,
1508using
1509.Xr gmtime 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 \&:hash
1515Computes a 32-bit hash of the value and encodes it as 8 hex digits.
1516.It Cm \&:localtime Ns Oo Cm = Ns Ar timestamp Oc
1517The value is interpreted as a format string for
1518.Xr strftime 3 ,
1519using
1520.Xr localtime 3 ,
1521producing the formatted timestamp.
1522If a
1523.Ar timestamp
1524value is not provided or is 0, the current time is used.
1525.It Cm \&:mtime Ns Oo Cm = Ns Ar timestamp Oc
1526Call
1527.Xr stat 2
1528with each word as pathname;
1529use
1530.Ql st_mtime
1531as the new value.
1532If
1533.Xr stat 2
1534fails; use
1535.Ar timestamp
1536or current time.
1537If
1538.Ar timestamp
1539is set to
1540.Ql error ,
1541then
1542.Xr stat 2
1543failure will cause an error.
1544.It Cm \&:tA
1545Attempts to convert the value to an absolute path using
1546.Xr realpath 3 .
1547If that fails, the value is unchanged.
1548.It Cm \&:tl
1549Converts the value to lower-case letters.
1550.It Cm \&:ts Ns Ar c
1551When joining the words after a modifier that treats the value as words,
1552the words are normally separated by a space.
1553This modifier changes the separator to the character
1554.Ar c .
1555If
1556.Ar c
1557is omitted, no separator is used.
1558The common escapes (including octal numeric codes) work as expected.
1559.It Cm \&:tu
1560Converts the value to upper-case letters.
1561.It Cm \&:tW
1562Causes subsequent modifiers to treat the value as a single word
1563(possibly containing embedded whitespace).
1564See also
1565.Sq Cm \&:[*] .
1566.It Cm \&:tw
1567Causes the value to be treated as a list of words.
1568See also
1569.Sq Cm \&:[@] .
1570.Sm off
1571.It Cm \&:S\| No \&/ Ar old_string\| No \&/ Ar new_string\| No \&/ Op Cm 1gW
1572.Sm on
1573Modifies the first occurrence of
1574.Ar old_string
1575in each word of the value, replacing it with
1576.Ar new_string .
1577If a
1578.Ql g
1579is appended to the last delimiter of the pattern,
1580all occurrences in each word are replaced.
1581If a
1582.Ql 1
1583is appended to the last delimiter of the pattern,
1584only the first occurrence is affected.
1585If a
1586.Ql W
1587is appended to the last delimiter of the pattern,
1588the value is treated as a single word.
1589If
1590.Ar old_string
1591begins with a caret
1592.Pq Ql ^ ,
1593.Ar old_string
1594is anchored at the beginning of each word.
1595If
1596.Ar old_string
1597ends with a dollar sign
1598.Pq Ql \&$ ,
1599it is anchored at the end of each word.
1600Inside
1601.Ar new_string ,
1602an ampersand
1603.Pq Ql &
1604is replaced by
1605.Ar old_string
1606(without the anchoring
1607.Ql ^
1608or
1609.Ql \&$ ) .
1610Any character may be used as the delimiter for the parts of the modifier
1611string.
1612The anchoring, ampersand and delimiter characters can be escaped with a
1613backslash
1614.Pq Ql \e .
1615.Pp
1616Both
1617.Ar old_string
1618and
1619.Ar new_string
1620may contain nested expressions.
1621To prevent a dollar sign from starting a nested expression,
1622escape it with a backslash.
1623.Sm off
1624.It Cm \&:C\| No \&/ Ar pattern\| No \&/ Ar replacement\| No \&/ Op Cm 1gW
1625.Sm on
1626The
1627.Cm \&:C
1628modifier works like the
1629.Cm \&:S
1630modifier except that the old and new strings, instead of being
1631simple strings, are an extended regular expression
1632.Ar pattern
1633(see
1634.Xr regex 3 )
1635and an
1636.Xr ed 1 Ns \-style
1637.Ar replacement .
1638Normally, the first occurrence of the pattern
1639.Ar pattern
1640in each word of the value is substituted with
1641.Ar replacement .
1642The
1643.Ql 1
1644modifier causes the substitution to apply to at most one word; the
1645.Ql g
1646modifier causes the substitution to apply to as many instances of the
1647search pattern
1648.Ar pattern
1649as occur in the word or words it is found in; the
1650.Ql W
1651modifier causes the value to be treated as a single word
1652(possibly containing embedded whitespace).
1653.Pp
1654As for the
1655.Cm \&:S
1656modifier, the
1657.Ar pattern
1658and
1659.Ar replacement
1660are subjected to variable expansion before being parsed as
1661regular expressions.
1662.It Cm \&:T
1663Replaces each word with its last path component (basename).
1664.It Cm \&:u
1665Removes adjacent duplicate words (like
1666.Xr uniq 1 ) .
1667.Sm off
1668.It Cm \&:\&?\| Ar true_string\| Cm \&: Ar false_string
1669.Sm on
1670If the variable name (not its value), when parsed as a
1671.Cm .if
1672conditional expression, evaluates to true, return as its value the
1673.Ar true_string ,
1674otherwise return the
1675.Ar false_string .
1676Since the variable name is used as the expression,
1677\&:\&? must be the first modifier after the variable name
1678.No itself Ns \^\(em\^ Ns
1679which, of course, usually contains variable expansions.
1680A common error is trying to use expressions like
1681.Dl ${NUMBERS:M42:?match:no}
1682which actually tests defined(NUMBERS).
1683To determine if any words match
1684.Dq 42 ,
1685you need to use something like:
1686.Dl ${"${NUMBERS:M42}" != \&"\&":?match:no} .
1687.It Cm :\| Ns Ar old_string\| Ns Cm = Ns Ar new_string
1688This is the
1689.At V
1690style substitution.
1691It can only be the last modifier specified,
1692as a
1693.Ql \&:
1694in either
1695.Ar old_string
1696or
1697.Ar new_string
1698is treated as a regular character, not as the end of the modifier.
1699.Pp
1700If
1701.Ar old_string
1702does not contain the pattern matching character
1703.Ql % ,
1704and the word ends with
1705.Ar old_string
1706or equals it,
1707that suffix is replaced with
1708.Ar new_string .
1709.Pp
1710Otherwise, the first
1711.Ql %
1712in
1713.Ar old_string
1714matches a possibly empty substring of arbitrary characters,
1715and if the whole pattern is found in the word,
1716the matching part is replaced with
1717.Ar new_string ,
1718and the first occurrence of
1719.Ql %
1720in
1721.Ar new_string
1722(if any) is replaced with the substring matched by the
1723.Ql % .
1724.Pp
1725Both
1726.Ar old_string
1727and
1728.Ar new_string
1729may contain nested expressions.
1730To prevent a dollar sign from starting a nested expression,
1731escape it with a backslash.
1732.Sm off
1733.It Cm \&:@ Ar varname\| Cm @ Ar string\| Cm @
1734.Sm on
1735This is the loop expansion mechanism from the OSF Development
1736Environment (ODE) make.
1737Unlike
1738.Cm \&.for
1739loops, expansion occurs at the time of reference.
1740For each word in the value, assign the word to the variable named
1741.Ar varname
1742and evaluate
1743.Ar string .
1744The ODE convention is that
1745.Ar varname
1746should start and end with a period, for example:
1747.Dl ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}
1748.Pp
1749However, a single-letter variable is often more readable:
1750.Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}
1751.It Cm \&:_ Ns Oo Cm = Ns Ar var Oc
1752Saves the current variable value in
1753.Ql $_
1754or the named
1755.Ar var
1756for later reference.
1757Example usage:
1758.Bd -literal -offset indent
1759M_cmpv.units = 1 1000 1000000
1760M_cmpv = S,., ,g:_:range:@i@+ $${_:[-$$i]} \&\\
1761\\* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh
1762
1763.Dv .if ${VERSION:${M_cmpv}} < ${3.1.12:L:${M_cmpv}}
1764
1765.Ed
1766Here
1767.Ql $_
1768is used to save the result of the
1769.Ql :S
1770modifier which is later referenced using the index values from
1771.Ql :range .
1772.It Cm \&:U\| Ns Ar newval
1773If the variable is undefined,
1774.Ar newval
1775is the value.
1776If the variable is defined, the existing value is returned.
1777This is another ODE make feature.
1778It is handy for setting per-target CFLAGS for instance:
1779.Dl ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
1780If a value is only required if the variable is undefined, use:
1781.Dl ${VAR:D:Unewval}
1782.It Cm \&:D\| Ns Ar newval
1783If the variable is defined,
1784.Ar newval
1785is the value.
1786.It Cm \&:L
1787The name of the variable is the value.
1788.It Cm \&:P
1789The path of the node which has the same name as the variable is the value.
1790If no such node exists or its path is null, the name of the variable is used.
1791In order for this modifier to work, the name (node) must at least have
1792appeared on the right-hand side of a dependency.
1793.Sm off
1794.It Cm \&:\&! Ar cmd\| Cm \&!
1795.Sm on
1796The output of running
1797.Ar cmd
1798is the value.
1799.It Cm \&:sh
1800The value is run as a command, and the output becomes the new value.
1801.It Cm \&::= Ns Ar str
1802The variable is assigned the value
1803.Ar str
1804after substitution.
1805This modifier and its variations are useful in obscure situations
1806such as wanting to set a variable
1807at a point where a target's shell commands are being parsed.
1808These assignment modifiers always expand to nothing.
1809.Pp
1810The
1811.Sq Cm \&::
1812helps avoid false matches with the
1813.At V
1814style
1815.Ql \&:=
1816modifier and since substitution always occurs, the
1817.Ql \&::=
1818form is vaguely appropriate.
1819.It Cm \&::?= Ns Ar str
1820As for
1821.Cm \&::=
1822but only if the variable does not already have a value.
1823.It Cm \&::+= Ns Ar str
1824Append
1825.Ar str
1826to the variable.
1827.It Cm \&::!= Ns Ar cmd
1828Assign the output of
1829.Ar cmd
1830to the variable.
1831.It Cm \&:\&[ Ns Ar range Ns Cm \&]
1832Selects one or more words from the value,
1833or performs other operations related to the way in which the
1834value is split into words.
1835.Pp
1836An empty value, or a value that consists entirely of white-space,
1837is treated as a single word.
1838For the purposes of the
1839.Sq Cm \&:[]
1840modifier, the words are indexed both forwards using positive integers
1841(where index 1 represents the first word),
1842and backwards using negative integers
1843(where index \-1 represents the last word).
1844.Pp
1845The
1846.Ar range
1847is subjected to variable expansion, and the expanded result is
1848then interpreted as follows:
1849.Bl -tag -width index
1850.\" :[n]
1851.It Ar index
1852Selects a single word from the value.
1853.\" :[start..end]
1854.It Ar start Ns Cm \&.. Ns Ar end
1855Selects all words from
1856.Ar start
1857to
1858.Ar end ,
1859inclusive.
1860For example,
1861.Sq Cm \&:[2..-1]
1862selects all words from the second word to the last word.
1863If
1864.Ar start
1865is greater than
1866.Ar end ,
1867the words are output in reverse order.
1868For example,
1869.Sq Cm \&:[-1..1]
1870selects all the words from last to first.
1871If the list is already ordered,
1872this effectively reverses the list,
1873but it is more efficient to use
1874.Sq Cm \&:Or
1875instead of
1876.Sq Cm \&:O:[-1..1] .
1877.\" :[*]
1878.It Cm \&*
1879Causes subsequent modifiers to treat the value as a single word
1880(possibly containing embedded whitespace).
1881Analogous to the effect of
1882.Li \&$*
1883in Bourne shell.
1884.\" :[0]
1885.It 0
1886Means the same as
1887.Sq Cm \&:[*] .
1888.\" :[*]
1889.It Cm \&@
1890Causes subsequent modifiers to treat the value as a sequence of words
1891delimited by whitespace.
1892Analogous to the effect of
1893.Li \&$@
1894in Bourne shell.
1895.\" :[#]
1896.It Cm \&#
1897Returns the number of words in the value.
1898.El \" :[range]
1899.El
1900.Sh DIRECTIVES
1901.Nm
1902offers directives for including makefiles, conditionals and for loops.
1903All these directives are identified by a line beginning with a single dot
1904.Pq Ql \&.
1905character, followed by the keyword of the directive, such as
1906.Cm include
1907or
1908.Cm if .
1909.Ss File inclusion
1910Files are included with either
1911.Cm \&.include \&< Ns Ar file Ns Cm \&>
1912or
1913.Cm \&.include \&\*q Ns Ar file Ns Cm \&\*q .
1914Variables between the angle brackets or double quotes are expanded
1915to form the file name.
1916If angle brackets are used, the included makefile is expected to be in
1917the system makefile directory.
1918If double quotes are used, the including makefile's directory and any
1919directories specified using the
1920.Fl I
1921option are searched before the system makefile directory.
1922.Pp
1923For compatibility with other make variants,
1924.Sq Cm include Ar file No ...
1925(without leading dot)
1926is also accepted.
1927.Pp
1928If the include statement is written as
1929.Cm .-include
1930or as
1931.Cm .sinclude ,
1932errors locating and/or opening include files are ignored.
1933.Pp
1934If the include statement is written as
1935.Cm .dinclude ,
1936not only are errors locating and/or opening include files ignored,
1937but stale dependencies within the included file are ignored just like in
1938.Va .MAKE.DEPENDFILE .
1939.Ss Exporting variables
1940The directives for exporting and unexporting variables are:
1941.Bl -tag -width Ds
1942.It Ic .export Ar variable No ...
1943Export the specified global variable.
1944If no variable list is provided, all globals are exported
1945except for internal variables (those that start with
1946.Ql \&. ) .
1947This is not affected by the
1948.Fl X
1949flag, so should be used with caution.
1950For compatibility with other make programs,
1951.Cm export Ar variable\| Ns Cm \&= Ns Ar value
1952(without leading dot) is also accepted.
1953.Pp
1954Appending a variable name to
1955.Va .MAKE.EXPORTED
1956is equivalent to exporting a variable.
1957.It Ic .export-env Ar variable No ...
1958The same as
1959.Ql .export ,
1960except that the variable is not appended to
1961.Va .MAKE.EXPORTED .
1962This allows exporting a value to the environment which is different from that
1963used by
1964.Nm
1965internally.
1966.It Ic .export-literal Ar variable No ...
1967The same as
1968.Ql .export-env ,
1969except that variables in the value are not expanded.
1970.It Ic .unexport Ar variable No ...
1971The opposite of
1972.Ql .export .
1973The specified global
1974.Ar variable
1975is removed from
1976.Va .MAKE.EXPORTED .
1977If no variable list is provided, all globals are unexported,
1978and
1979.Va .MAKE.EXPORTED
1980deleted.
1981.It Ic .unexport-env
1982Unexport all globals previously exported and
1983clear the environment inherited from the parent.
1984This operation causes a memory leak of the original environment,
1985so should be used sparingly.
1986Testing for
1987.Va .MAKE.LEVEL
1988being 0 would make sense.
1989Also note that any variables which originated in the parent environment
1990should be explicitly preserved if desired.
1991For example:
1992.Bd -literal -offset indent
1993.Li .if ${.MAKE.LEVEL} == 0
1994PATH := ${PATH}
1995.Li .unexport-env
1996.Li .export PATH
1997.Li .endif
1998.Pp
1999.Ed
2000Would result in an environment containing only
2001.Sq Ev PATH ,
2002which is the minimal useful environment.
2003.\" TODO: Check the below sentence, environment variables don't start with '.'.
2004Actually
2005.Sq Va .MAKE.LEVEL
2006is also pushed into the new environment.
2007.El
2008.Ss Messages
2009The directives for printing messages to the output are:
2010.Bl -tag -width Ds
2011.It Ic .info Ar message
2012The message is printed along with the name of the makefile and line number.
2013.It Ic .warning Ar message
2014The message prefixed by
2015.Sq Li warning:
2016is printed along with the name of the makefile and line number.
2017.It Ic .error Ar message
2018The message is printed along with the name of the makefile and line number,
2019.Nm
2020exits immediately.
2021.El
2022.Ss Conditionals
2023The directives for conditionals are:
2024.ds maybenot Oo Ic \&! Oc Ns
2025.Bl -tag
2026.It Ic .if \*[maybenot] Ar expression Op Ar operator expression No ...
2027Test the value of an expression.
2028.It Ic .ifdef \*[maybenot] Ar variable Op Ar operator variable No ...
2029Test whether a variable is defined.
2030.It Ic .ifndef \*[maybenot] Ar variable Op Ar operator variable No ...
2031Test whether a variable is not defined.
2032.It Ic .ifmake \*[maybenot] Ar target Op Ar operator target No ...
2033Test the target being requested.
2034.It Ic .ifnmake \*[maybenot] Ar target Op Ar operator target No ...
2035Test the target being requested.
2036.It Ic .else
2037Reverse the sense of the last conditional.
2038.It Ic .elif \*[maybenot] Ar expression Op Ar operator expression No ...
2039A combination of
2040.Sq Ic .else
2041followed by
2042.Sq Ic .if .
2043.It Ic .elifdef \*[maybenot] Ar variable Op Ar operator variable No ...
2044A combination of
2045.Sq Ic .else
2046followed by
2047.Sq Ic .ifdef .
2048.It Ic .elifndef \*[maybenot] Ar variable Op Ar operator variable No ...
2049A combination of
2050.Sq Ic .else
2051followed by
2052.Sq Ic .ifndef .
2053.It Ic .elifmake \*[maybenot] Ar target Op Ar operator target No ...
2054A combination of
2055.Sq Ic .else
2056followed by
2057.Sq Ic .ifmake .
2058.It Ic .elifnmake \*[maybenot] Ar target Op Ar operator target No ...
2059A combination of
2060.Sq Ic .else
2061followed by
2062.Sq Ic .ifnmake .
2063.It Ic .endif
2064End the body of the conditional.
2065.El
2066.Pp
2067The
2068.Ar operator
2069may be any one of the following:
2070.Bl -tag
2071.It Ic \&|\&|
2072Logical OR.
2073.It Ic \&&&
2074Logical AND; of higher precedence than
2075.Sq Ic \&|\&| .
2076.El
2077.Pp
2078.Nm
2079only evaluates a conditional as far as is necessary to determine its value.
2080Parentheses can be used to override the operator precedence.
2081The boolean operator
2082.Sq Ic \&!
2083may be used to logically negate an entire conditional.
2084It is of higher precedence than
2085.Sq Ic \&&& .
2086.Pp
2087The value of
2088.Ar expression
2089may be any of the following function call expressions:
2090.Bl -tag
2091.Sm off
2092.It Ic defined Li \&( Ar varname Li \&)
2093.Sm on
2094Evaluates to true if the variable
2095.Ar varname
2096has been defined.
2097.Sm off
2098.It Ic make Li \&( Ar target Li \&)
2099.Sm on
2100Evaluates to true if the target was specified as part of
2101.Nm Ns 's
2102command line or was declared the default target (either implicitly or
2103explicitly, see
2104.Va .MAIN )
2105before the line containing the conditional.
2106.Sm off
2107.It Ic empty Li \&( Ar varname Oo Li : Ar modifiers Oc Li \&)
2108.Sm on
2109Evaluates to true if the expansion of the variable,
2110after applying the modifiers, results in an empty string.
2111.Sm off
2112.It Ic exists Li \&( Ar pathname Li \&)
2113.Sm on
2114Evaluates to true if the given pathname exists.
2115If relative, the pathname is searched for on the system search path (see
2116.Va .PATH ) .
2117.Sm off
2118.It Ic target Li \&( Ar target Li \&)
2119.Sm on
2120Evaluates to true if the target has been defined.
2121.Sm off
2122.It Ic commands Li \&( Ar target Li \&)
2123.Sm on
2124Evaluates to true if the target has been defined
2125and has commands associated with it.
2126.El
2127.Pp
2128.Ar Expression
2129may also be an arithmetic or string comparison.
2130Variable expansion is performed on both sides of the comparison.
2131If both sides are numeric and neither is enclosed in quotes,
2132the comparison is done numerically, otherwise lexicographically.
2133A string is interpreted as hexadecimal integer if it is preceded by
2134.Li 0x ,
2135otherwise it is a decimal floating-point number;
2136octal numbers are not supported.
2137.Pp
2138All comparisons may use the operators
2139.Sq Ic \&==
2140and
2141.Sq Ic \&!= .
2142Numeric comparisons may also use the operators
2143.Sq Ic \&< ,
2144.Sq Ic \&<= ,
2145.Sq Ic \&>
2146and
2147.Sq Ic \&>= .
2148.Pp
2149If the comparison has neither a comparison operator nor a right side,
2150the expression evaluates to true if it is nonempty
2151and its numeric value (if any) is not zero.
2152.Pp
2153When
2154.Nm
2155is evaluating one of these conditional expressions, and it encounters
2156a (whitespace separated) word it doesn't recognize, either the
2157.Dq make
2158or
2159.Dq defined
2160function is applied to it, depending on the form of the conditional.
2161If the form is
2162.Sq Ic .ifdef ,
2163.Sq Ic .ifndef
2164or
2165.Sq Ic .if ,
2166the
2167.Dq defined
2168function is applied.
2169Similarly, if the form is
2170.Sq Ic .ifmake
2171or
2172.Sq Ic .ifnmake ,
2173the
2174.Dq make
2175function is applied.
2176.Pp
2177If the conditional evaluates to true,
2178parsing of the makefile continues as before.
2179If it evaluates to false, the following lines are skipped.
2180In both cases, this continues until the corresponding
2181.Sq Ic .else
2182or
2183.Sq Ic .endif
2184is found.
2185.Ss For loops
2186For loops are typically used to apply a set of rules to a list of files.
2187The syntax of a for loop is:
2188.Pp
2189.Bl -tag -compact -width Ds
2190.It Ic \&.for Ar variable Oo Ar variable No ... Oc Ic in Ar expression
2191.It Aq Ar make-lines
2192.It Ic \&.endfor
2193.El
2194.Pp
2195The
2196.Ar expression
2197is expanded and then split into words.
2198On each iteration of the loop, one word is taken and assigned to each
2199.Ar variable ,
2200in order, and these
2201.Ar variables
2202are substituted into the
2203.Ar make-lines
2204inside the body of the for loop.
2205The number of words must come out even; that is, if there are three
2206iteration variables, the number of words provided must be a multiple
2207of three.
2208.Pp
2209If
2210.Sq Ic .break
2211is encountered within a
2212.Cm \&.for
2213loop, it causes early termination of the loop, otherwise a parse error.
2214.\" TODO: Describe limitations with defined/empty.
2215.Ss Other directives
2216.Bl -tag -width Ds
2217.It Ic .undef Ar variable No ...
2218Un-define the specified global variables.
2219Only global variables can be un-defined.
2220.El
2221.Sh COMMENTS
2222Comments begin with a hash
2223.Pq Ql \&#
2224character, anywhere but in a shell
2225command line, and continue to the end of an unescaped new line.
2226.Sh SPECIAL SOURCES (ATTRIBUTES)
2227.Bl -tag -width .IGNOREx
2228.It Ic .EXEC
2229Target is never out of date, but always execute commands anyway.
2230.It Ic .IGNORE
2231Ignore any errors from the commands associated with this target, exactly
2232as if they all were preceded by a dash
2233.Pq Ql \- .
2234.\" .It Ic .INVISIBLE
2235.\" XXX
2236.\" .It Ic .JOIN
2237.\" XXX
2238.It Ic .MADE
2239Mark all sources of this target as being up to date.
2240.It Ic .MAKE
2241Execute the commands associated with this target even if the
2242.Fl n
2243or
2244.Fl t
2245options were specified.
2246Normally used to mark recursive
2247.Nm Ns s .
2248.It Ic .META
2249Create a meta file for the target, even if it is flagged as
2250.Ic .PHONY ,
2251.Ic .MAKE ,
2252or
2253.Ic .SPECIAL .
2254Usage in conjunction with
2255.Ic .MAKE
2256is the most likely case.
2257In
2258.Dq meta
2259mode, the target is out-of-date if the meta file is missing.
2260.It Ic .NOMETA
2261Do not create a meta file for the target.
2262Meta files are also not created for
2263.Ic .PHONY ,
2264.Ic .MAKE ,
2265or
2266.Ic .SPECIAL
2267targets.
2268.It Ic .NOMETA_CMP
2269Ignore differences in commands when deciding if target is out of date.
2270This is useful if the command contains a value which always changes.
2271If the number of commands change, though,
2272the target is still considered out of date.
2273The same effect applies to any command line that uses the variable
2274.Va .OODATE ,
2275which can be used for that purpose even when not otherwise needed or desired:
2276.Bd -literal -offset indent
2277
2278skip-compare-for-some:
2279	@echo this is compared
2280	@echo this is not ${.OODATE:M.NOMETA_CMP}
2281	@echo this is also compared
2282
2283.Ed
2284The
2285.Cm \&:M
2286pattern suppresses any expansion of the unwanted variable.
2287.It Ic .NOPATH
2288Do not search for the target in the directories specified by
2289.Va .PATH .
2290.It Ic .NOTMAIN
2291Normally
2292.Nm
2293selects the first target it encounters as the default target to be built
2294if no target was specified.
2295This source prevents this target from being selected.
2296.It Ic .OPTIONAL
2297If a target is marked with this attribute and
2298.Nm
2299can't figure out how to create it, it ignores this fact and assumes
2300the file isn't needed or already exists.
2301.It Ic .PHONY
2302The target does not correspond to an actual file;
2303it is always considered to be out of date,
2304and is not created with the
2305.Fl t
2306option.
2307Suffix-transformation rules are not applied to
2308.Ic .PHONY
2309targets.
2310.It Ic .PRECIOUS
2311When
2312.Nm
2313is interrupted, it normally removes any partially made targets.
2314This source prevents the target from being removed.
2315.It Ic .RECURSIVE
2316Synonym for
2317.Ic .MAKE .
2318.It Ic .SILENT
2319Do not echo any of the commands associated with this target, exactly
2320as if they all were preceded by an at sign
2321.Pq Ql @ .
2322.It Ic .USE
2323Turn the target into
2324.Nm Ns 's
2325version of a macro.
2326When the target is used as a source for another target, the other target
2327acquires the commands, sources, and attributes (except for
2328.Ic .USE )
2329of the
2330source.
2331If the target already has commands, the
2332.Ic .USE
2333target's commands are appended
2334to them.
2335.It Ic .USEBEFORE
2336Like
2337.Ic .USE ,
2338but instead of appending, prepend the
2339.Ic .USEBEFORE
2340target commands to the target.
2341.It Ic .WAIT
2342If
2343.Ic .WAIT
2344appears in a dependency line, the sources that precede it are
2345made before the sources that succeed it in the line.
2346Since the dependents of files are not made until the file itself
2347could be made, this also stops the dependents being built unless they
2348are needed for another branch of the dependency tree.
2349So given:
2350.Bd -literal
2351x: a .WAIT b
2352	echo x
2353a:
2354	echo a
2355b: b1
2356	echo b
2357b1:
2358	echo b1
2359
2360.Ed
2361the output is always
2362.Ql a ,
2363.Ql b1 ,
2364.Ql b ,
2365.Ql x .
2366.Pp
2367The ordering imposed by
2368.Ic .WAIT
2369is only relevant for parallel makes.
2370.El
2371.Sh SPECIAL TARGETS
2372Special targets may not be included with other targets, i.e. they must be
2373the only target specified.
2374.Bl -tag -width .BEGINx
2375.It Ic .BEGIN
2376Any command lines attached to this target are executed before anything
2377else is done.
2378.It Ic .DEFAULT
2379This is sort of a
2380.Ic .USE
2381rule for any target (that was used only as a source) that
2382.Nm
2383can't figure out any other way to create.
2384Only the shell script is used.
2385The
2386.Va .IMPSRC
2387variable of a target that inherits
2388.Ic .DEFAULT Ns 's
2389commands is set to the target's own name.
2390.It Ic .DELETE_ON_ERROR
2391If this target is present in the makefile, it globally causes make to
2392delete targets whose commands fail.
2393(By default, only targets whose commands are interrupted during
2394execution are deleted.
2395This is the historical behavior.)
2396This setting can be used to help prevent half-finished or malformed
2397targets from being left around and corrupting future rebuilds.
2398.It Ic .END
2399Any command lines attached to this target are executed after everything
2400else is done successfully.
2401.It Ic .ERROR
2402Any command lines attached to this target are executed when another target fails.
2403The
2404.Va .ERROR_TARGET
2405variable is set to the target that failed.
2406See also
2407.Va MAKE_PRINT_VAR_ON_ERROR .
2408.It Ic .IGNORE
2409Mark each of the sources with the
2410.Ic .IGNORE
2411attribute.
2412If no sources are specified, this is the equivalent of specifying the
2413.Fl i
2414option.
2415.It Ic .INTERRUPT
2416If
2417.Nm
2418is interrupted, the commands for this target are executed.
2419.It Ic .MAIN
2420If no target is specified when
2421.Nm
2422is invoked, this target is built.
2423.It Ic .MAKEFLAGS
2424This target provides a way to specify flags for
2425.Nm
2426at the time when the makefiles are read.
2427The flags are as if typed to the shell, though the
2428.Fl f
2429option has
2430no effect.
2431.\" XXX: NOT YET!!!!
2432.\" .It Ic .NOTPARALLEL
2433.\" The named targets are executed in non parallel mode.
2434.\" If no targets are
2435.\" specified, all targets are executed in non parallel mode.
2436.It Ic .NOPATH
2437Apply the
2438.Ic .NOPATH
2439attribute to any specified sources.
2440.It Ic .NOTPARALLEL
2441Disable parallel mode.
2442.It Ic .NO_PARALLEL
2443Synonym for
2444.Ic .NOTPARALLEL ,
2445for compatibility with other pmake variants.
2446.It Ic .NOREADONLY
2447clear the read-only attribute from the global variables specified as sources.
2448.It Ic .OBJDIR
2449The source is a new value for
2450.Sq Va .OBJDIR .
2451If it exists,
2452.Nm
2453changes the current working directory to it and updates the value of
2454.Sq Va .OBJDIR .
2455.It Ic .ORDER
2456In parallel mode, the named targets are made in sequence.
2457This ordering does not add targets to the list of targets to be made.
2458.Pp
2459Since the dependents of a target do not get built until the target itself
2460could be built, unless
2461.Ql a
2462is built by another part of the dependency graph,
2463the following is a dependency loop:
2464.Bd -literal
2465\&.ORDER: b a
2466b: a
2467.Ed
2468.Pp
2469.\" XXX: NOT YET!!!!
2470.\" .It Ic .PARALLEL
2471.\" The named targets are executed in parallel mode.
2472.\" If no targets are
2473.\" specified, all targets are executed in parallel mode.
2474.It Ic .PATH
2475The sources are directories which are to be searched for files not
2476found in the current directory.
2477If no sources are specified,
2478any previously specified directories are removed from the search path.
2479If the source is the special
2480.Ic .DOTLAST
2481target, the current working directory is searched last.
2482.It Ic .PATH. Ns Ar suffix
2483Like
2484.Ic .PATH
2485but applies only to files with a particular suffix.
2486The suffix must have been previously declared with
2487.Ic .SUFFIXES .
2488.It Ic .PHONY
2489Apply the
2490.Ic .PHONY
2491attribute to any specified sources.
2492.It Ic .POSIX
2493If this is the first non-comment line in the main makefile,
2494the variable
2495.Va %POSIX
2496is set to the value
2497.Ql 1003.2
2498and the makefile
2499.Ql <posix.mk>
2500is included if it exists,
2501to provide POSIX-compatible default rules.
2502If
2503.Nm
2504is run with the
2505.Fl r
2506flag, only
2507.Ql posix.mk
2508contributes to the default rules.
2509.It Ic .PRECIOUS
2510Apply the
2511.Ic .PRECIOUS
2512attribute to any specified sources.
2513If no sources are specified, the
2514.Ic .PRECIOUS
2515attribute is applied to every target in the file.
2516.It Ic .READONLY
2517set the read-only attribute on the global variables specified as sources.
2518.It Ic .SHELL
2519Sets the shell that
2520.Nm
2521uses to execute commands in jobs mode.
2522The sources are a set of
2523.Ar field\| Ns Cm \&= Ns Ar value
2524pairs.
2525.Bl -tag -width ".Li hasErrCtls"
2526.It Li name
2527This is the minimal specification, used to select one of the built-in
2528shell specs;
2529.Li sh ,
2530.Li ksh ,
2531and
2532.Li csh .
2533.It Li path
2534Specifies the absolute path to the shell.
2535.It Li hasErrCtl
2536Indicates whether the shell supports exit on error.
2537.It Li check
2538The command to turn on error checking.
2539.It Li ignore
2540The command to disable error checking.
2541.It Li echo
2542The command to turn on echoing of commands executed.
2543.It Li quiet
2544The command to turn off echoing of commands executed.
2545.It Li filter
2546The output to filter after issuing the
2547.Li quiet
2548command.
2549It is typically identical to
2550.Li quiet .
2551.It Li errFlag
2552The flag to pass the shell to enable error checking.
2553.It Li echoFlag
2554The flag to pass the shell to enable command echoing.
2555.It Li newline
2556The string literal to pass the shell that results in a single newline
2557character when used outside of any quoting characters.
2558.El
2559Example:
2560.Bd -literal
2561\&.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \e
2562	check="set \-e" ignore="set +e" \e
2563	echo="set \-v" quiet="set +v" filter="set +v" \e
2564	echoFlag=v errFlag=e newline="'\en'"
2565.Ed
2566.It Ic .SILENT
2567Apply the
2568.Ic .SILENT
2569attribute to any specified sources.
2570If no sources are specified, the
2571.Ic .SILENT
2572attribute is applied to every
2573command in the file.
2574.It Ic .STALE
2575This target gets run when a dependency file contains stale entries, having
2576.Va .ALLSRC
2577set to the name of that dependency file.
2578.It Ic .SUFFIXES
2579Each source specifies a suffix to
2580.Nm .
2581If no sources are specified, any previously specified suffixes are deleted.
2582It allows the creation of suffix-transformation rules.
2583.Pp
2584Example:
2585.Bd -literal
2586\&.SUFFIXES: .c .o
2587\&.c.o:
2588	cc \-o ${.TARGET} \-c ${.IMPSRC}
2589.Ed
2590.It Ic .SYSPATH
2591The sources are directories which are to be added to the system
2592include path which
2593.Nm
2594searches for makefiles.
2595If no sources are specified,
2596any previously specified directories are removed from the system
2597include path.
2598.El
2599.Sh ENVIRONMENT
2600.Nm
2601uses the following environment variables, if they exist:
2602.Ev MACHINE ,
2603.Ev MACHINE_ARCH ,
2604.Ev MAKE ,
2605.Ev MAKEFLAGS ,
2606.Ev MAKEOBJDIR ,
2607.Ev MAKEOBJDIRPREFIX ,
2608.Ev MAKESYSPATH ,
2609.Ev PWD ,
2610and
2611.Ev TMPDIR .
2612.Pp
2613.Ev MAKEOBJDIRPREFIX
2614and
2615.Ev MAKEOBJDIR
2616may only be set in the environment or on the command line to
2617.Nm
2618and not as makefile variables;
2619see the description of
2620.Sq Va .OBJDIR
2621for more details.
2622.Sh FILES
2623.Bl -tag -width /usr/share/mk -compact
2624.It .depend
2625list of dependencies
2626.It makefile
2627first default makefile if no makefile is specified on the command line
2628.It Makefile
2629second default makefile if no makefile is specified on the command line
2630.It sys.mk
2631system makefile
2632.It /usr/share/mk
2633system makefile directory
2634.El
2635.Sh COMPATIBILITY
2636The basic make syntax is compatible between different make variants;
2637however the special variables, variable modifiers and conditionals are not.
2638.Ss Older versions
2639An incomplete list of changes in older versions of
2640.Nm :
2641.Pp
2642The way that .for loop variables are substituted changed after
2643.Nx 5.0
2644so that they still appear to be variable expansions.
2645In particular this stops them being treated as syntax, and removes some
2646obscure problems using them in .if statements.
2647.Pp
2648The way that parallel makes are scheduled changed in
2649.Nx 4.0
2650so that .ORDER and .WAIT apply recursively to the dependent nodes.
2651The algorithms used may change again in the future.
2652.Ss Other make dialects
2653Other make dialects (GNU make, SVR4 make, POSIX make, etc.) do not
2654support most of the features of
2655.Nm
2656as described in this manual.
2657Most notably:
2658.Bl -bullet -offset indent
2659.It
2660The
2661.Ic .WAIT
2662and
2663.Ic .ORDER
2664declarations and most functionality pertaining to parallelization.
2665(GNU make supports parallelization but lacks the features needed to
2666control it effectively.)
2667.It
2668Directives, including for loops and conditionals and most of the
2669forms of include files.
2670(GNU make has its own incompatible and less powerful syntax for
2671conditionals.)
2672.\" The "less powerful" above means that GNU make does not have the
2673.\" make(target), target(target) and commands(target) functions.
2674.It
2675All built-in variables that begin with a dot.
2676.It
2677Most of the special sources and targets that begin with a dot,
2678with the notable exception of
2679.Ic .PHONY ,
2680.Ic .PRECIOUS ,
2681and
2682.Ic .SUFFIXES .
2683.It
2684Variable modifiers, except for the
2685.Ql :old=new
2686string substitution, which does not portably support globbing with
2687.Ql %
2688and historically only works on declared suffixes.
2689.It
2690The
2691.Ic $>
2692variable even in its short form; most makes support this functionality
2693but its name varies.
2694.El
2695.Pp
2696Some features are somewhat more portable, such as assignment with
2697.Ic += ,
2698.Ic ?= ,
2699and
2700.Ic != .
2701The
2702.Va .PATH
2703functionality is based on an older feature
2704.Ic VPATH
2705found in GNU make and many versions of SVR4 make; however,
2706historically its behavior is too ill-defined (and too buggy) to rely
2707upon.
2708.Pp
2709The
2710.Ic $@
2711and
2712.Ic $<
2713variables are more or less universally portable, as is the
2714.Ic $(MAKE)
2715variable.
2716Basic use of suffix rules (for files only in the current directory,
2717not trying to chain transformations together, etc.) is also reasonably
2718portable.
2719.Sh SEE ALSO
2720.Xr mkdep 1 ,
2721.Xr style.Makefile 5
2722.Sh HISTORY
2723A
2724.Nm
2725command appeared in
2726.At v7 .
2727This
2728.Nm
2729implementation is based on Adam de Boor's pmake program,
2730which was written for Sprite at Berkeley.
2731It was designed to be a parallel distributed make running jobs on different
2732machines using a daemon called
2733.Dq customs .
2734.Pp
2735Historically the target/dependency
2736.Ic FRC
2737has been used to FoRCe rebuilding (since the target/dependency
2738does not exist ... unless someone creates an
2739.Pa FRC
2740file).
2741.Sh BUGS
2742The
2743.Nm
2744syntax is difficult to parse.
2745For instance, finding the end of a variable's use should involve scanning
2746each of the modifiers, using the correct terminator for each field.
2747In many places
2748.Nm
2749just counts {} and () in order to find the end of a variable expansion.
2750.Pp
2751There is no way of escaping a space character in a filename.
2752.Pp
2753In jobs mode, when a target fails;
2754.Nm
2755will put an error token into the job token pool.
2756This will cause all other instances of
2757.Nm
2758using that token pool to abort the build and exit with error code 6.
2759Sometimes the attempt to suppress a cascade of unnecessary errors,
2760can result in a seemingly unexplained
2761.Ql *** Error code 6
2762