xref: /freebsd/contrib/bmake/make.1 (revision 3955d011f8d241ebed0fa997923e7566f5485c07)
1*3955d011SMarcel Moolenaar.\"	$NetBSD: make.1,v 1.206 2012/08/30 22:35:37 wiz Exp $
2*3955d011SMarcel Moolenaar.\"
3*3955d011SMarcel Moolenaar.\" Copyright (c) 1990, 1993
4*3955d011SMarcel Moolenaar.\"	The Regents of the University of California.  All rights reserved.
5*3955d011SMarcel Moolenaar.\"
6*3955d011SMarcel Moolenaar.\" Redistribution and use in source and binary forms, with or without
7*3955d011SMarcel Moolenaar.\" modification, are permitted provided that the following conditions
8*3955d011SMarcel Moolenaar.\" are met:
9*3955d011SMarcel Moolenaar.\" 1. Redistributions of source code must retain the above copyright
10*3955d011SMarcel Moolenaar.\"    notice, this list of conditions and the following disclaimer.
11*3955d011SMarcel Moolenaar.\" 2. Redistributions in binary form must reproduce the above copyright
12*3955d011SMarcel Moolenaar.\"    notice, this list of conditions and the following disclaimer in the
13*3955d011SMarcel Moolenaar.\"    documentation and/or other materials provided with the distribution.
14*3955d011SMarcel Moolenaar.\" 3. Neither the name of the University nor the names of its contributors
15*3955d011SMarcel Moolenaar.\"    may be used to endorse or promote products derived from this software
16*3955d011SMarcel Moolenaar.\"    without specific prior written permission.
17*3955d011SMarcel Moolenaar.\"
18*3955d011SMarcel Moolenaar.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19*3955d011SMarcel Moolenaar.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*3955d011SMarcel Moolenaar.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*3955d011SMarcel Moolenaar.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22*3955d011SMarcel Moolenaar.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23*3955d011SMarcel Moolenaar.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24*3955d011SMarcel Moolenaar.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25*3955d011SMarcel Moolenaar.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26*3955d011SMarcel Moolenaar.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27*3955d011SMarcel Moolenaar.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28*3955d011SMarcel Moolenaar.\" SUCH DAMAGE.
29*3955d011SMarcel Moolenaar.\"
30*3955d011SMarcel Moolenaar.\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
31*3955d011SMarcel Moolenaar.\"
32*3955d011SMarcel Moolenaar.Dd August 30, 2012
33*3955d011SMarcel Moolenaar.Dt MAKE 1
34*3955d011SMarcel Moolenaar.Os
35*3955d011SMarcel Moolenaar.Sh NAME
36*3955d011SMarcel Moolenaar.Nm make
37*3955d011SMarcel Moolenaar.Nd maintain program dependencies
38*3955d011SMarcel Moolenaar.Sh SYNOPSIS
39*3955d011SMarcel Moolenaar.Nm
40*3955d011SMarcel Moolenaar.Op Fl BeikNnqrstWX
41*3955d011SMarcel Moolenaar.Op Fl C Ar directory
42*3955d011SMarcel Moolenaar.Op Fl D Ar variable
43*3955d011SMarcel Moolenaar.Op Fl d Ar flags
44*3955d011SMarcel Moolenaar.Op Fl f Ar makefile
45*3955d011SMarcel Moolenaar.Op Fl I Ar directory
46*3955d011SMarcel Moolenaar.Op Fl J Ar private
47*3955d011SMarcel Moolenaar.Op Fl j Ar max_jobs
48*3955d011SMarcel Moolenaar.Op Fl m Ar directory
49*3955d011SMarcel Moolenaar.Op Fl T Ar file
50*3955d011SMarcel Moolenaar.Op Fl V Ar variable
51*3955d011SMarcel Moolenaar.Op Ar variable=value
52*3955d011SMarcel Moolenaar.Op Ar target ...
53*3955d011SMarcel Moolenaar.Sh DESCRIPTION
54*3955d011SMarcel Moolenaar.Nm
55*3955d011SMarcel Moolenaaris a program designed to simplify the maintenance of other programs.
56*3955d011SMarcel MoolenaarIts input is a list of specifications as to the files upon which programs
57*3955d011SMarcel Moolenaarand other files depend.
58*3955d011SMarcel MoolenaarIf no
59*3955d011SMarcel Moolenaar.Fl f Ar makefile
60*3955d011SMarcel Moolenaarmakefile option is given,
61*3955d011SMarcel Moolenaar.Nm
62*3955d011SMarcel Moolenaarwill try to open
63*3955d011SMarcel Moolenaar.Ql Pa makefile
64*3955d011SMarcel Moolenaarthen
65*3955d011SMarcel Moolenaar.Ql Pa Makefile
66*3955d011SMarcel Moolenaarin order to find the specifications.
67*3955d011SMarcel MoolenaarIf the file
68*3955d011SMarcel Moolenaar.Ql Pa .depend
69*3955d011SMarcel Moolenaarexists, it is read (see
70*3955d011SMarcel Moolenaar.Xr mkdep 1 ) .
71*3955d011SMarcel Moolenaar.Pp
72*3955d011SMarcel MoolenaarThis manual page is intended as a reference document only.
73*3955d011SMarcel MoolenaarFor a more thorough description of
74*3955d011SMarcel Moolenaar.Nm
75*3955d011SMarcel Moolenaarand makefiles, please refer to
76*3955d011SMarcel Moolenaar.%T "PMake \- A Tutorial" .
77*3955d011SMarcel Moolenaar.Pp
78*3955d011SMarcel Moolenaar.Nm
79*3955d011SMarcel Moolenaarwill prepend the contents of the
80*3955d011SMarcel Moolenaar.Va MAKEFLAGS
81*3955d011SMarcel Moolenaarenvironment variable to the command line arguments before parsing them.
82*3955d011SMarcel Moolenaar.Pp
83*3955d011SMarcel MoolenaarThe options are as follows:
84*3955d011SMarcel Moolenaar.Bl -tag -width Ds
85*3955d011SMarcel Moolenaar.It Fl B
86*3955d011SMarcel MoolenaarTry to be backwards compatible by executing a single shell per command and
87*3955d011SMarcel Moolenaarby executing the commands to make the sources of a dependency line in sequence.
88*3955d011SMarcel Moolenaar.It Fl C Ar directory
89*3955d011SMarcel MoolenaarChange to
90*3955d011SMarcel Moolenaar.Ar directory
91*3955d011SMarcel Moolenaarbefore reading the makefiles or doing anything else.
92*3955d011SMarcel MoolenaarIf multiple
93*3955d011SMarcel Moolenaar.Fl C
94*3955d011SMarcel Moolenaaroptions are specified, each is interpreted relative to the previous one:
95*3955d011SMarcel Moolenaar.Fl C Pa / Fl C Pa etc
96*3955d011SMarcel Moolenaaris equivalent to
97*3955d011SMarcel Moolenaar.Fl C Pa /etc .
98*3955d011SMarcel Moolenaar.It Fl D Ar variable
99*3955d011SMarcel MoolenaarDefine
100*3955d011SMarcel Moolenaar.Ar variable
101*3955d011SMarcel Moolenaarto be 1, in the global context.
102*3955d011SMarcel Moolenaar.It Fl d Ar [-]flags
103*3955d011SMarcel MoolenaarTurn on debugging, and specify which portions of
104*3955d011SMarcel Moolenaar.Nm
105*3955d011SMarcel Moolenaarare to print debugging information.
106*3955d011SMarcel MoolenaarUnless the flags are preceded by
107*3955d011SMarcel Moolenaar.Ql \-
108*3955d011SMarcel Moolenaarthey are added to the
109*3955d011SMarcel Moolenaar.Va MAKEFLAGS
110*3955d011SMarcel Moolenaarenvironment variable and will be processed by any child make processes.
111*3955d011SMarcel MoolenaarBy default, debugging information is printed to standard error,
112*3955d011SMarcel Moolenaarbut this can be changed using the
113*3955d011SMarcel Moolenaar.Ar F
114*3955d011SMarcel Moolenaardebugging flag.
115*3955d011SMarcel MoolenaarThe debugging output is always unbuffered; in addition, if debugging
116*3955d011SMarcel Moolenaaris enabled but debugging output is not directed to standard output,
117*3955d011SMarcel Moolenaarthen the standard output is line buffered.
118*3955d011SMarcel Moolenaar.Ar Flags
119*3955d011SMarcel Moolenaaris one or more of the following:
120*3955d011SMarcel Moolenaar.Bl -tag -width Ds
121*3955d011SMarcel Moolenaar.It Ar A
122*3955d011SMarcel MoolenaarPrint all possible debugging information;
123*3955d011SMarcel Moolenaarequivalent to specifying all of the debugging flags.
124*3955d011SMarcel Moolenaar.It Ar a
125*3955d011SMarcel MoolenaarPrint debugging information about archive searching and caching.
126*3955d011SMarcel Moolenaar.It Ar C
127*3955d011SMarcel MoolenaarPrint debugging information about current working directory.
128*3955d011SMarcel Moolenaar.It Ar c
129*3955d011SMarcel MoolenaarPrint debugging information about conditional evaluation.
130*3955d011SMarcel Moolenaar.It Ar d
131*3955d011SMarcel MoolenaarPrint debugging information about directory searching and caching.
132*3955d011SMarcel Moolenaar.It Ar e
133*3955d011SMarcel MoolenaarPrint debugging information about failed commands and targets.
134*3955d011SMarcel Moolenaar.It Ar F Ns Oo Sy \&+ Oc Ns Ar filename
135*3955d011SMarcel MoolenaarSpecify where debugging output is written.
136*3955d011SMarcel MoolenaarThis must be the last flag, because it consumes the remainder of
137*3955d011SMarcel Moolenaarthe argument.
138*3955d011SMarcel MoolenaarIf the character immediately after the
139*3955d011SMarcel Moolenaar.Ql F
140*3955d011SMarcel Moolenaarflag is
141*3955d011SMarcel Moolenaar.Ql \&+ ,
142*3955d011SMarcel Moolenaarthen the file will be opened in append mode;
143*3955d011SMarcel Moolenaarotherwise the file will be overwritten.
144*3955d011SMarcel MoolenaarIf the file name is
145*3955d011SMarcel Moolenaar.Ql stdout
146*3955d011SMarcel Moolenaaror
147*3955d011SMarcel Moolenaar.Ql stderr
148*3955d011SMarcel Moolenaarthen debugging output will be written to the
149*3955d011SMarcel Moolenaarstandard output or standard error output file descriptors respectively
150*3955d011SMarcel Moolenaar(and the
151*3955d011SMarcel Moolenaar.Ql \&+
152*3955d011SMarcel Moolenaaroption has no effect).
153*3955d011SMarcel MoolenaarOtherwise, the output will be written to the named file.
154*3955d011SMarcel MoolenaarIf the file name ends
155*3955d011SMarcel Moolenaar.Ql .%d
156*3955d011SMarcel Moolenaarthen the
157*3955d011SMarcel Moolenaar.Ql %d
158*3955d011SMarcel Moolenaaris replaced by the pid.
159*3955d011SMarcel Moolenaar.It Ar f
160*3955d011SMarcel MoolenaarPrint debugging information about loop evaluation.
161*3955d011SMarcel Moolenaar.It Ar "g1"
162*3955d011SMarcel MoolenaarPrint the input graph before making anything.
163*3955d011SMarcel Moolenaar.It Ar "g2"
164*3955d011SMarcel MoolenaarPrint the input graph after making everything, or before exiting
165*3955d011SMarcel Moolenaaron error.
166*3955d011SMarcel Moolenaar.It Ar "g3"
167*3955d011SMarcel MoolenaarPrint the input graph before exiting on error.
168*3955d011SMarcel Moolenaar.It Ar j
169*3955d011SMarcel MoolenaarPrint debugging information about running multiple shells.
170*3955d011SMarcel Moolenaar.It Ar l
171*3955d011SMarcel MoolenaarPrint commands in Makefiles regardless of whether or not they are prefixed by
172*3955d011SMarcel Moolenaar.Ql @
173*3955d011SMarcel Moolenaaror other "quiet" flags.
174*3955d011SMarcel MoolenaarAlso known as "loud" behavior.
175*3955d011SMarcel Moolenaar.It Ar M
176*3955d011SMarcel MoolenaarPrint debugging information about "meta" mode decisions about targets.
177*3955d011SMarcel Moolenaar.It Ar m
178*3955d011SMarcel MoolenaarPrint debugging information about making targets, including modification
179*3955d011SMarcel Moolenaardates.
180*3955d011SMarcel Moolenaar.It Ar n
181*3955d011SMarcel MoolenaarDon't delete the temporary command scripts created when running commands.
182*3955d011SMarcel MoolenaarThese temporary scripts are created in the directory
183*3955d011SMarcel Moolenaarreferred to by the
184*3955d011SMarcel Moolenaar.Ev TMPDIR
185*3955d011SMarcel Moolenaarenvironment variable, or in
186*3955d011SMarcel Moolenaar.Pa /tmp
187*3955d011SMarcel Moolenaarif
188*3955d011SMarcel Moolenaar.Ev TMPDIR
189*3955d011SMarcel Moolenaaris unset or set to the empty string.
190*3955d011SMarcel MoolenaarThe temporary scripts are created by
191*3955d011SMarcel Moolenaar.Xr mkstemp 3 ,
192*3955d011SMarcel Moolenaarand have names of the form
193*3955d011SMarcel Moolenaar.Pa makeXXXXXX .
194*3955d011SMarcel Moolenaar.Em NOTE :
195*3955d011SMarcel MoolenaarThis can create many files in
196*3955d011SMarcel Moolenaar.Ev TMPDIR
197*3955d011SMarcel Moolenaaror
198*3955d011SMarcel Moolenaar.Pa /tmp ,
199*3955d011SMarcel Moolenaarso use with care.
200*3955d011SMarcel Moolenaar.It Ar p
201*3955d011SMarcel MoolenaarPrint debugging information about makefile parsing.
202*3955d011SMarcel Moolenaar.It Ar s
203*3955d011SMarcel MoolenaarPrint debugging information about suffix-transformation rules.
204*3955d011SMarcel Moolenaar.It Ar t
205*3955d011SMarcel MoolenaarPrint debugging information about target list maintenance.
206*3955d011SMarcel Moolenaar.It Ar V
207*3955d011SMarcel MoolenaarForce the
208*3955d011SMarcel Moolenaar.Fl V
209*3955d011SMarcel Moolenaaroption to print raw values of variables.
210*3955d011SMarcel Moolenaar.It Ar v
211*3955d011SMarcel MoolenaarPrint debugging information about variable assignment.
212*3955d011SMarcel Moolenaar.It Ar x
213*3955d011SMarcel MoolenaarRun shell commands with
214*3955d011SMarcel Moolenaar.Fl x
215*3955d011SMarcel Moolenaarso the actual commands are printed as they are executed.
216*3955d011SMarcel Moolenaar.El
217*3955d011SMarcel Moolenaar.It Fl e
218*3955d011SMarcel MoolenaarSpecify that environment variables override macro assignments within
219*3955d011SMarcel Moolenaarmakefiles.
220*3955d011SMarcel Moolenaar.It Fl f Ar makefile
221*3955d011SMarcel MoolenaarSpecify a makefile to read instead of the default
222*3955d011SMarcel Moolenaar.Ql Pa makefile .
223*3955d011SMarcel MoolenaarIf
224*3955d011SMarcel Moolenaar.Ar makefile
225*3955d011SMarcel Moolenaaris
226*3955d011SMarcel Moolenaar.Ql Fl ,
227*3955d011SMarcel Moolenaarstandard input is read.
228*3955d011SMarcel MoolenaarMultiple makefiles may be specified, and are read in the order specified.
229*3955d011SMarcel Moolenaar.It Fl I Ar directory
230*3955d011SMarcel MoolenaarSpecify a directory in which to search for makefiles and included makefiles.
231*3955d011SMarcel MoolenaarThe system makefile directory (or directories, see the
232*3955d011SMarcel Moolenaar.Fl m
233*3955d011SMarcel Moolenaaroption) is automatically included as part of this list.
234*3955d011SMarcel Moolenaar.It Fl i
235*3955d011SMarcel MoolenaarIgnore non-zero exit of shell commands in the makefile.
236*3955d011SMarcel MoolenaarEquivalent to specifying
237*3955d011SMarcel Moolenaar.Ql Fl
238*3955d011SMarcel Moolenaarbefore each command line in the makefile.
239*3955d011SMarcel Moolenaar.It Fl J Ar private
240*3955d011SMarcel MoolenaarThis option should
241*3955d011SMarcel Moolenaar.Em not
242*3955d011SMarcel Moolenaarbe specified by the user.
243*3955d011SMarcel Moolenaar.Pp
244*3955d011SMarcel MoolenaarWhen the
245*3955d011SMarcel Moolenaar.Ar j
246*3955d011SMarcel Moolenaaroption is in use in a recursive build, this option is passed by a make
247*3955d011SMarcel Moolenaarto child makes to allow all the make processes in the build to
248*3955d011SMarcel Moolenaarcooperate to avoid overloading the system.
249*3955d011SMarcel Moolenaar.It Fl j Ar max_jobs
250*3955d011SMarcel MoolenaarSpecify the maximum number of jobs that
251*3955d011SMarcel Moolenaar.Nm
252*3955d011SMarcel Moolenaarmay have running at any one time.
253*3955d011SMarcel MoolenaarThe value is saved in
254*3955d011SMarcel Moolenaar.Va .MAKE.JOBS .
255*3955d011SMarcel MoolenaarTurns compatibility mode off, unless the
256*3955d011SMarcel Moolenaar.Ar B
257*3955d011SMarcel Moolenaarflag is also specified.
258*3955d011SMarcel MoolenaarWhen compatibility mode is off, all commands associated with a
259*3955d011SMarcel Moolenaartarget are executed in a single shell invocation as opposed to the
260*3955d011SMarcel Moolenaartraditional one shell invocation per line.
261*3955d011SMarcel MoolenaarThis can break traditional scripts which change directories on each
262*3955d011SMarcel Moolenaarcommand invocation and then expect to start with a fresh environment
263*3955d011SMarcel Moolenaaron the next line.
264*3955d011SMarcel MoolenaarIt is more efficient to correct the scripts rather than turn backwards
265*3955d011SMarcel Moolenaarcompatibility on.
266*3955d011SMarcel Moolenaar.It Fl k
267*3955d011SMarcel MoolenaarContinue processing after errors are encountered, but only on those targets
268*3955d011SMarcel Moolenaarthat do not depend on the target whose creation caused the error.
269*3955d011SMarcel Moolenaar.It Fl m Ar directory
270*3955d011SMarcel MoolenaarSpecify a directory in which to search for sys.mk and makefiles included
271*3955d011SMarcel Moolenaarvia the
272*3955d011SMarcel Moolenaar.Ao Ar file Ac Ns -style
273*3955d011SMarcel Moolenaarinclude statement.
274*3955d011SMarcel MoolenaarThe
275*3955d011SMarcel Moolenaar.Fl m
276*3955d011SMarcel Moolenaaroption can be used multiple times to form a search path.
277*3955d011SMarcel MoolenaarThis path will override the default system include path: /usr/share/mk.
278*3955d011SMarcel MoolenaarFurthermore the system include path will be appended to the search path used
279*3955d011SMarcel Moolenaarfor
280*3955d011SMarcel Moolenaar.Qo Ar file Qc Ns -style
281*3955d011SMarcel Moolenaarinclude statements (see the
282*3955d011SMarcel Moolenaar.Fl I
283*3955d011SMarcel Moolenaaroption).
284*3955d011SMarcel Moolenaar.Pp
285*3955d011SMarcel MoolenaarIf a file or directory name in the
286*3955d011SMarcel Moolenaar.Fl m
287*3955d011SMarcel Moolenaarargument (or the
288*3955d011SMarcel Moolenaar.Ev MAKESYSPATH
289*3955d011SMarcel Moolenaarenvironment variable) starts with the string
290*3955d011SMarcel Moolenaar.Qq \&.../
291*3955d011SMarcel Moolenaarthen
292*3955d011SMarcel Moolenaar.Nm
293*3955d011SMarcel Moolenaarwill search for the specified file or directory named in the remaining part
294*3955d011SMarcel Moolenaarof the argument string.
295*3955d011SMarcel MoolenaarThe search starts with the current directory of
296*3955d011SMarcel Moolenaarthe Makefile and then works upward towards the root of the filesystem.
297*3955d011SMarcel MoolenaarIf the search is successful, then the resulting directory replaces the
298*3955d011SMarcel Moolenaar.Qq \&.../
299*3955d011SMarcel Moolenaarspecification in the
300*3955d011SMarcel Moolenaar.Fl m
301*3955d011SMarcel Moolenaarargument.
302*3955d011SMarcel MoolenaarIf used, this feature allows
303*3955d011SMarcel Moolenaar.Nm
304*3955d011SMarcel Moolenaarto easily search in the current source tree for customized sys.mk files
305*3955d011SMarcel Moolenaar(e.g., by using
306*3955d011SMarcel Moolenaar.Qq \&.../mk/sys.mk
307*3955d011SMarcel Moolenaaras an argument).
308*3955d011SMarcel Moolenaar.It Fl n
309*3955d011SMarcel MoolenaarDisplay the commands that would have been executed, but do not
310*3955d011SMarcel Moolenaaractually execute them unless the target depends on the .MAKE special
311*3955d011SMarcel Moolenaarsource (see below).
312*3955d011SMarcel Moolenaar.It Fl N
313*3955d011SMarcel MoolenaarDisplay the commands which would have been executed, but do not
314*3955d011SMarcel Moolenaaractually execute any of them; useful for debugging top-level makefiles
315*3955d011SMarcel Moolenaarwithout descending into subdirectories.
316*3955d011SMarcel Moolenaar.It Fl q
317*3955d011SMarcel MoolenaarDo not execute any commands, but exit 0 if the specified targets are
318*3955d011SMarcel Moolenaarup-to-date and 1, otherwise.
319*3955d011SMarcel Moolenaar.It Fl r
320*3955d011SMarcel MoolenaarDo not use the built-in rules specified in the system makefile.
321*3955d011SMarcel Moolenaar.It Fl s
322*3955d011SMarcel MoolenaarDo not echo any commands as they are executed.
323*3955d011SMarcel MoolenaarEquivalent to specifying
324*3955d011SMarcel Moolenaar.Ql Ic @
325*3955d011SMarcel Moolenaarbefore each command line in the makefile.
326*3955d011SMarcel Moolenaar.It Fl T Ar tracefile
327*3955d011SMarcel MoolenaarWhen used with the
328*3955d011SMarcel Moolenaar.Fl j
329*3955d011SMarcel Moolenaarflag,
330*3955d011SMarcel Moolenaarappend a trace record to
331*3955d011SMarcel Moolenaar.Ar tracefile
332*3955d011SMarcel Moolenaarfor each job started and completed.
333*3955d011SMarcel Moolenaar.It Fl t
334*3955d011SMarcel MoolenaarRather than re-building a target as specified in the makefile, create it
335*3955d011SMarcel Moolenaaror update its modification time to make it appear up-to-date.
336*3955d011SMarcel Moolenaar.It Fl V Ar variable
337*3955d011SMarcel MoolenaarPrint
338*3955d011SMarcel Moolenaar.Nm Ns 's
339*3955d011SMarcel Moolenaaridea of the value of
340*3955d011SMarcel Moolenaar.Ar variable ,
341*3955d011SMarcel Moolenaarin the global context.
342*3955d011SMarcel MoolenaarDo not build any targets.
343*3955d011SMarcel MoolenaarMultiple instances of this option may be specified;
344*3955d011SMarcel Moolenaarthe variables will be printed one per line,
345*3955d011SMarcel Moolenaarwith a blank line for each null or undefined variable.
346*3955d011SMarcel MoolenaarIf
347*3955d011SMarcel Moolenaar.Ar variable
348*3955d011SMarcel Moolenaarcontains a
349*3955d011SMarcel Moolenaar.Ql \&$
350*3955d011SMarcel Moolenaarthen the value will be expanded before printing.
351*3955d011SMarcel Moolenaar.It Fl W
352*3955d011SMarcel MoolenaarTreat any warnings during makefile parsing as errors.
353*3955d011SMarcel Moolenaar.It Fl X
354*3955d011SMarcel MoolenaarDon't export variables passed on the command line to the environment
355*3955d011SMarcel Moolenaarindividually.
356*3955d011SMarcel MoolenaarVariables passed on the command line are still exported
357*3955d011SMarcel Moolenaarvia the
358*3955d011SMarcel Moolenaar.Va MAKEFLAGS
359*3955d011SMarcel Moolenaarenvironment variable.
360*3955d011SMarcel MoolenaarThis option may be useful on systems which have a small limit on the
361*3955d011SMarcel Moolenaarsize of command arguments.
362*3955d011SMarcel Moolenaar.It Ar variable=value
363*3955d011SMarcel MoolenaarSet the value of the variable
364*3955d011SMarcel Moolenaar.Ar variable
365*3955d011SMarcel Moolenaarto
366*3955d011SMarcel Moolenaar.Ar value .
367*3955d011SMarcel MoolenaarNormally, all values passed on the command line are also exported to
368*3955d011SMarcel Moolenaarsub-makes in the environment.
369*3955d011SMarcel MoolenaarThe
370*3955d011SMarcel Moolenaar.Fl X
371*3955d011SMarcel Moolenaarflag disables this behavior.
372*3955d011SMarcel MoolenaarVariable assignments should follow options for POSIX compatibility
373*3955d011SMarcel Moolenaarbut no ordering is enforced.
374*3955d011SMarcel Moolenaar.El
375*3955d011SMarcel Moolenaar.Pp
376*3955d011SMarcel MoolenaarThere are seven different types of lines in a makefile: file dependency
377*3955d011SMarcel Moolenaarspecifications, shell commands, variable assignments, include statements,
378*3955d011SMarcel Moolenaarconditional directives, for loops, and comments.
379*3955d011SMarcel Moolenaar.Pp
380*3955d011SMarcel MoolenaarIn general, lines may be continued from one line to the next by ending
381*3955d011SMarcel Moolenaarthem with a backslash
382*3955d011SMarcel Moolenaar.Pq Ql \e .
383*3955d011SMarcel MoolenaarThe trailing newline character and initial whitespace on the following
384*3955d011SMarcel Moolenaarline are compressed into a single space.
385*3955d011SMarcel Moolenaar.Sh FILE DEPENDENCY SPECIFICATIONS
386*3955d011SMarcel MoolenaarDependency lines consist of one or more targets, an operator, and zero
387*3955d011SMarcel Moolenaaror more sources.
388*3955d011SMarcel MoolenaarThis creates a relationship where the targets
389*3955d011SMarcel Moolenaar.Dq depend
390*3955d011SMarcel Moolenaaron the sources
391*3955d011SMarcel Moolenaarand are usually created from them.
392*3955d011SMarcel MoolenaarThe exact relationship between the target and the source is determined
393*3955d011SMarcel Moolenaarby the operator that separates them.
394*3955d011SMarcel MoolenaarThe three operators are as follows:
395*3955d011SMarcel Moolenaar.Bl -tag -width flag
396*3955d011SMarcel Moolenaar.It Ic \&:
397*3955d011SMarcel MoolenaarA target is considered out-of-date if its modification time is less than
398*3955d011SMarcel Moolenaarthose of any of its sources.
399*3955d011SMarcel MoolenaarSources for a target accumulate over dependency lines when this operator
400*3955d011SMarcel Moolenaaris used.
401*3955d011SMarcel MoolenaarThe target is removed if
402*3955d011SMarcel Moolenaar.Nm
403*3955d011SMarcel Moolenaaris interrupted.
404*3955d011SMarcel Moolenaar.It Ic \&!
405*3955d011SMarcel MoolenaarTargets are always re-created, but not until all sources have been
406*3955d011SMarcel Moolenaarexamined and re-created as necessary.
407*3955d011SMarcel MoolenaarSources for a target accumulate over dependency lines when this operator
408*3955d011SMarcel Moolenaaris used.
409*3955d011SMarcel MoolenaarThe target is removed if
410*3955d011SMarcel Moolenaar.Nm
411*3955d011SMarcel Moolenaaris interrupted.
412*3955d011SMarcel Moolenaar.It Ic \&::
413*3955d011SMarcel MoolenaarIf no sources are specified, the target is always re-created.
414*3955d011SMarcel MoolenaarOtherwise, a target is considered out-of-date if any of its sources has
415*3955d011SMarcel Moolenaarbeen modified more recently than the target.
416*3955d011SMarcel MoolenaarSources for a target do not accumulate over dependency lines when this
417*3955d011SMarcel Moolenaaroperator is used.
418*3955d011SMarcel MoolenaarThe target will not be removed if
419*3955d011SMarcel Moolenaar.Nm
420*3955d011SMarcel Moolenaaris interrupted.
421*3955d011SMarcel Moolenaar.El
422*3955d011SMarcel Moolenaar.Pp
423*3955d011SMarcel MoolenaarTargets and sources may contain the shell wildcard values
424*3955d011SMarcel Moolenaar.Ql \&? ,
425*3955d011SMarcel Moolenaar.Ql * ,
426*3955d011SMarcel Moolenaar.Ql [] ,
427*3955d011SMarcel Moolenaarand
428*3955d011SMarcel Moolenaar.Ql {} .
429*3955d011SMarcel MoolenaarThe values
430*3955d011SMarcel Moolenaar.Ql \&? ,
431*3955d011SMarcel Moolenaar.Ql * ,
432*3955d011SMarcel Moolenaarand
433*3955d011SMarcel Moolenaar.Ql []
434*3955d011SMarcel Moolenaarmay only be used as part of the final
435*3955d011SMarcel Moolenaarcomponent of the target or source, and must be used to describe existing
436*3955d011SMarcel Moolenaarfiles.
437*3955d011SMarcel MoolenaarThe value
438*3955d011SMarcel Moolenaar.Ql {}
439*3955d011SMarcel Moolenaarneed not necessarily be used to describe existing files.
440*3955d011SMarcel MoolenaarExpansion is in directory order, not alphabetically as done in the shell.
441*3955d011SMarcel Moolenaar.Sh SHELL COMMANDS
442*3955d011SMarcel MoolenaarEach target may have associated with it a series of shell commands, normally
443*3955d011SMarcel Moolenaarused to create the target.
444*3955d011SMarcel MoolenaarEach of the commands in this script
445*3955d011SMarcel Moolenaar.Em must
446*3955d011SMarcel Moolenaarbe preceded by a tab.
447*3955d011SMarcel MoolenaarWhile any target may appear on a dependency line, only one of these
448*3955d011SMarcel Moolenaardependencies may be followed by a creation script, unless the
449*3955d011SMarcel Moolenaar.Ql Ic \&::
450*3955d011SMarcel Moolenaaroperator is used.
451*3955d011SMarcel Moolenaar.Pp
452*3955d011SMarcel MoolenaarIf the first characters of the command line are any combination of
453*3955d011SMarcel Moolenaar.Ql Ic @ ,
454*3955d011SMarcel Moolenaar.Ql Ic + ,
455*3955d011SMarcel Moolenaaror
456*3955d011SMarcel Moolenaar.Ql Ic \- ,
457*3955d011SMarcel Moolenaarthe command is treated specially.
458*3955d011SMarcel MoolenaarA
459*3955d011SMarcel Moolenaar.Ql Ic @
460*3955d011SMarcel Moolenaarcauses the command not to be echoed before it is executed.
461*3955d011SMarcel MoolenaarA
462*3955d011SMarcel Moolenaar.Ql Ic +
463*3955d011SMarcel Moolenaarcauses the command to be executed even when
464*3955d011SMarcel Moolenaar.Fl n
465*3955d011SMarcel Moolenaaris given.
466*3955d011SMarcel MoolenaarThis is similar to the effect of the .MAKE special source,
467*3955d011SMarcel Moolenaarexcept that the effect can be limited to a single line of a script.
468*3955d011SMarcel MoolenaarA
469*3955d011SMarcel Moolenaar.Ql Ic \-
470*3955d011SMarcel Moolenaarcauses any non-zero exit status of the command line to be ignored.
471*3955d011SMarcel Moolenaar.Sh VARIABLE ASSIGNMENTS
472*3955d011SMarcel MoolenaarVariables in make are much like variables in the shell, and, by tradition,
473*3955d011SMarcel Moolenaarconsist of all upper-case letters.
474*3955d011SMarcel Moolenaar.Ss Variable assignment modifiers
475*3955d011SMarcel MoolenaarThe five operators that can be used to assign values to variables are as
476*3955d011SMarcel Moolenaarfollows:
477*3955d011SMarcel Moolenaar.Bl -tag -width Ds
478*3955d011SMarcel Moolenaar.It Ic \&=
479*3955d011SMarcel MoolenaarAssign the value to the variable.
480*3955d011SMarcel MoolenaarAny previous value is overridden.
481*3955d011SMarcel Moolenaar.It Ic \&+=
482*3955d011SMarcel MoolenaarAppend the value to the current value of the variable.
483*3955d011SMarcel Moolenaar.It Ic \&?=
484*3955d011SMarcel MoolenaarAssign the value to the variable if it is not already defined.
485*3955d011SMarcel Moolenaar.It Ic \&:=
486*3955d011SMarcel MoolenaarAssign with expansion, i.e. expand the value before assigning it
487*3955d011SMarcel Moolenaarto the variable.
488*3955d011SMarcel MoolenaarNormally, expansion is not done until the variable is referenced.
489*3955d011SMarcel Moolenaar.Em NOTE :
490*3955d011SMarcel MoolenaarReferences to undefined variables are
491*3955d011SMarcel Moolenaar.Em not
492*3955d011SMarcel Moolenaarexpanded.
493*3955d011SMarcel MoolenaarThis can cause problems when variable modifiers are used.
494*3955d011SMarcel Moolenaar.It Ic \&!=
495*3955d011SMarcel MoolenaarExpand the value and pass it to the shell for execution and assign
496*3955d011SMarcel Moolenaarthe result to the variable.
497*3955d011SMarcel MoolenaarAny newlines in the result are replaced with spaces.
498*3955d011SMarcel Moolenaar.El
499*3955d011SMarcel Moolenaar.Pp
500*3955d011SMarcel MoolenaarAny white-space before the assigned
501*3955d011SMarcel Moolenaar.Ar value
502*3955d011SMarcel Moolenaaris removed; if the value is being appended, a single space is inserted
503*3955d011SMarcel Moolenaarbetween the previous contents of the variable and the appended value.
504*3955d011SMarcel Moolenaar.Pp
505*3955d011SMarcel MoolenaarVariables are expanded by surrounding the variable name with either
506*3955d011SMarcel Moolenaarcurly braces
507*3955d011SMarcel Moolenaar.Pq Ql {}
508*3955d011SMarcel Moolenaaror parentheses
509*3955d011SMarcel Moolenaar.Pq Ql ()
510*3955d011SMarcel Moolenaarand preceding it with
511*3955d011SMarcel Moolenaara dollar sign
512*3955d011SMarcel Moolenaar.Pq Ql \&$ .
513*3955d011SMarcel MoolenaarIf the variable name contains only a single letter, the surrounding
514*3955d011SMarcel Moolenaarbraces or parentheses are not required.
515*3955d011SMarcel MoolenaarThis shorter form is not recommended.
516*3955d011SMarcel Moolenaar.Pp
517*3955d011SMarcel MoolenaarIf the variable name contains a dollar, then the name itself is expanded first.
518*3955d011SMarcel MoolenaarThis allows almost arbitrary variable names, however names containing dollar,
519*3955d011SMarcel Moolenaarbraces, parenthesis, or whitespace are really best avoided!
520*3955d011SMarcel Moolenaar.Pp
521*3955d011SMarcel MoolenaarIf the result of expanding a variable contains a dollar sign
522*3955d011SMarcel Moolenaar.Pq Ql \&$
523*3955d011SMarcel Moolenaarthe string is expanded again.
524*3955d011SMarcel Moolenaar.Pp
525*3955d011SMarcel MoolenaarVariable substitution occurs at three distinct times, depending on where
526*3955d011SMarcel Moolenaarthe variable is being used.
527*3955d011SMarcel Moolenaar.Bl -enum
528*3955d011SMarcel Moolenaar.It
529*3955d011SMarcel MoolenaarVariables in dependency lines are expanded as the line is read.
530*3955d011SMarcel Moolenaar.It
531*3955d011SMarcel MoolenaarVariables in shell commands are expanded when the shell command is
532*3955d011SMarcel Moolenaarexecuted.
533*3955d011SMarcel Moolenaar.It
534*3955d011SMarcel Moolenaar.Dq .for
535*3955d011SMarcel Moolenaarloop index variables are expanded on each loop iteration.
536*3955d011SMarcel MoolenaarNote that other variables are not expanded inside loops so
537*3955d011SMarcel Moolenaarthe following example code:
538*3955d011SMarcel Moolenaar.Bd -literal -offset indent
539*3955d011SMarcel Moolenaar
540*3955d011SMarcel Moolenaar.Dv .for i in 1 2 3
541*3955d011SMarcel Moolenaara+=     ${i}
542*3955d011SMarcel Moolenaarj=      ${i}
543*3955d011SMarcel Moolenaarb+=     ${j}
544*3955d011SMarcel Moolenaar.Dv .endfor
545*3955d011SMarcel Moolenaar
546*3955d011SMarcel Moolenaarall:
547*3955d011SMarcel Moolenaar	@echo ${a}
548*3955d011SMarcel Moolenaar	@echo ${b}
549*3955d011SMarcel Moolenaar
550*3955d011SMarcel Moolenaar.Ed
551*3955d011SMarcel Moolenaarwill print:
552*3955d011SMarcel Moolenaar.Bd -literal -offset indent
553*3955d011SMarcel Moolenaar1 2 3
554*3955d011SMarcel Moolenaar3 3 3
555*3955d011SMarcel Moolenaar
556*3955d011SMarcel Moolenaar.Ed
557*3955d011SMarcel MoolenaarBecause while ${a} contains
558*3955d011SMarcel Moolenaar.Dq 1 2 3
559*3955d011SMarcel Moolenaarafter the loop is executed, ${b}
560*3955d011SMarcel Moolenaarcontains
561*3955d011SMarcel Moolenaar.Dq ${j} ${j} ${j}
562*3955d011SMarcel Moolenaarwhich expands to
563*3955d011SMarcel Moolenaar.Dq 3 3 3
564*3955d011SMarcel Moolenaarsince after the loop completes ${j} contains
565*3955d011SMarcel Moolenaar.Dq 3 .
566*3955d011SMarcel Moolenaar.El
567*3955d011SMarcel Moolenaar.Ss Variable classes
568*3955d011SMarcel MoolenaarThe four different classes of variables (in order of increasing precedence)
569*3955d011SMarcel Moolenaarare:
570*3955d011SMarcel Moolenaar.Bl -tag -width Ds
571*3955d011SMarcel Moolenaar.It Environment variables
572*3955d011SMarcel MoolenaarVariables defined as part of
573*3955d011SMarcel Moolenaar.Nm Ns 's
574*3955d011SMarcel Moolenaarenvironment.
575*3955d011SMarcel Moolenaar.It Global variables
576*3955d011SMarcel MoolenaarVariables defined in the makefile or in included makefiles.
577*3955d011SMarcel Moolenaar.It Command line variables
578*3955d011SMarcel MoolenaarVariables defined as part of the command line.
579*3955d011SMarcel Moolenaar.It Local variables
580*3955d011SMarcel MoolenaarVariables that are defined specific to a certain target.
581*3955d011SMarcel MoolenaarThe seven local variables are as follows:
582*3955d011SMarcel Moolenaar.Bl -tag -width ".ARCHIVE"
583*3955d011SMarcel Moolenaar.It Va .ALLSRC
584*3955d011SMarcel MoolenaarThe list of all sources for this target; also known as
585*3955d011SMarcel Moolenaar.Ql Va \&\*[Gt] .
586*3955d011SMarcel Moolenaar.It Va .ARCHIVE
587*3955d011SMarcel MoolenaarThe name of the archive file.
588*3955d011SMarcel Moolenaar.It Va .IMPSRC
589*3955d011SMarcel MoolenaarIn suffix-transformation rules, the name/path of the source from which the
590*3955d011SMarcel Moolenaartarget is to be transformed (the
591*3955d011SMarcel Moolenaar.Dq implied
592*3955d011SMarcel Moolenaarsource); also known as
593*3955d011SMarcel Moolenaar.Ql Va \&\*[Lt] .
594*3955d011SMarcel MoolenaarIt is not defined in explicit rules.
595*3955d011SMarcel Moolenaar.It Va .MEMBER
596*3955d011SMarcel MoolenaarThe name of the archive member.
597*3955d011SMarcel Moolenaar.It Va .OODATE
598*3955d011SMarcel MoolenaarThe list of sources for this target that were deemed out-of-date; also
599*3955d011SMarcel Moolenaarknown as
600*3955d011SMarcel Moolenaar.Ql Va \&? .
601*3955d011SMarcel Moolenaar.It Va .PREFIX
602*3955d011SMarcel MoolenaarThe file prefix of the target, containing only the file portion, no suffix
603*3955d011SMarcel Moolenaaror preceding directory components; also known as
604*3955d011SMarcel Moolenaar.Ql Va * .
605*3955d011SMarcel Moolenaar.It Va .TARGET
606*3955d011SMarcel MoolenaarThe name of the target; also known as
607*3955d011SMarcel Moolenaar.Ql Va @ .
608*3955d011SMarcel Moolenaar.El
609*3955d011SMarcel Moolenaar.Pp
610*3955d011SMarcel MoolenaarThe shorter forms
611*3955d011SMarcel Moolenaar.Ql Va @ ,
612*3955d011SMarcel Moolenaar.Ql Va \&? ,
613*3955d011SMarcel Moolenaar.Ql Va \&\*[Lt] ,
614*3955d011SMarcel Moolenaar.Ql Va \&\*[Gt] ,
615*3955d011SMarcel Moolenaarand
616*3955d011SMarcel Moolenaar.Ql Va *
617*3955d011SMarcel Moolenaarare permitted for backward
618*3955d011SMarcel Moolenaarcompatibility with historical makefiles and are not recommended.
619*3955d011SMarcel MoolenaarThe six variables
620*3955d011SMarcel Moolenaar.Ql Va "@F" ,
621*3955d011SMarcel Moolenaar.Ql Va "@D" ,
622*3955d011SMarcel Moolenaar.Ql Va "\*[Lt]F" ,
623*3955d011SMarcel Moolenaar.Ql Va "\*[Lt]D" ,
624*3955d011SMarcel Moolenaar.Ql Va "*F" ,
625*3955d011SMarcel Moolenaarand
626*3955d011SMarcel Moolenaar.Ql Va "*D"
627*3955d011SMarcel Moolenaarare permitted for compatibility with
628*3955d011SMarcel Moolenaar.At V
629*3955d011SMarcel Moolenaarmakefiles and are not recommended.
630*3955d011SMarcel Moolenaar.Pp
631*3955d011SMarcel MoolenaarFour of the local variables may be used in sources on dependency lines
632*3955d011SMarcel Moolenaarbecause they expand to the proper value for each target on the line.
633*3955d011SMarcel MoolenaarThese variables are
634*3955d011SMarcel Moolenaar.Ql Va .TARGET ,
635*3955d011SMarcel Moolenaar.Ql Va .PREFIX ,
636*3955d011SMarcel Moolenaar.Ql Va .ARCHIVE ,
637*3955d011SMarcel Moolenaarand
638*3955d011SMarcel Moolenaar.Ql Va .MEMBER .
639*3955d011SMarcel Moolenaar.El
640*3955d011SMarcel Moolenaar.Ss Additional built-in variables
641*3955d011SMarcel MoolenaarIn addition,
642*3955d011SMarcel Moolenaar.Nm
643*3955d011SMarcel Moolenaarsets or knows about the following variables:
644*3955d011SMarcel Moolenaar.Bl -tag -width .MAKEOVERRIDES
645*3955d011SMarcel Moolenaar.It Va \&$
646*3955d011SMarcel MoolenaarA single dollar sign
647*3955d011SMarcel Moolenaar.Ql \&$ ,
648*3955d011SMarcel Moolenaari.e.
649*3955d011SMarcel Moolenaar.Ql \&$$
650*3955d011SMarcel Moolenaarexpands to a single dollar
651*3955d011SMarcel Moolenaarsign.
652*3955d011SMarcel Moolenaar.It Va .ALLTARGETS
653*3955d011SMarcel MoolenaarThe list of all targets encountered in the Makefile.
654*3955d011SMarcel MoolenaarIf evaluated during
655*3955d011SMarcel MoolenaarMakefile parsing, lists only those targets encountered thus far.
656*3955d011SMarcel Moolenaar.It Va .CURDIR
657*3955d011SMarcel MoolenaarA path to the directory where
658*3955d011SMarcel Moolenaar.Nm
659*3955d011SMarcel Moolenaarwas executed.
660*3955d011SMarcel MoolenaarRefer to the description of
661*3955d011SMarcel Moolenaar.Ql Ev PWD
662*3955d011SMarcel Moolenaarfor more details.
663*3955d011SMarcel Moolenaar.It Ev MAKE
664*3955d011SMarcel MoolenaarThe name that
665*3955d011SMarcel Moolenaar.Nm
666*3955d011SMarcel Moolenaarwas executed with
667*3955d011SMarcel Moolenaar.Pq Va argv[0] .
668*3955d011SMarcel MoolenaarFor compatibility
669*3955d011SMarcel Moolenaar.Nm
670*3955d011SMarcel Moolenaaralso sets
671*3955d011SMarcel Moolenaar.Va .MAKE
672*3955d011SMarcel Moolenaarwith the same value.
673*3955d011SMarcel MoolenaarThe preferred variable to use is the environment variable
674*3955d011SMarcel Moolenaar.Ev MAKE
675*3955d011SMarcel Moolenaarbecause it is more compatible with other versions of
676*3955d011SMarcel Moolenaar.Nm
677*3955d011SMarcel Moolenaarand cannot be confused with the special target with the same name.
678*3955d011SMarcel Moolenaar.It Va .MAKE.DEPENDFILE
679*3955d011SMarcel MoolenaarNames the makefile (default
680*3955d011SMarcel Moolenaar.Ql Pa .depend )
681*3955d011SMarcel Moolenaarfrom which generated dependencies are read.
682*3955d011SMarcel Moolenaar.It Va .MAKE.EXPAND_VARIABLES
683*3955d011SMarcel MoolenaarA boolean that controls the default behavior of the
684*3955d011SMarcel Moolenaar.Fl V
685*3955d011SMarcel Moolenaaroption.
686*3955d011SMarcel Moolenaar.It Va .MAKE.EXPORTED
687*3955d011SMarcel MoolenaarThe list of variables exported by
688*3955d011SMarcel Moolenaar.Nm .
689*3955d011SMarcel Moolenaar.It Va .MAKE.JOBS
690*3955d011SMarcel MoolenaarThe argument to the
691*3955d011SMarcel Moolenaar.Fl j
692*3955d011SMarcel Moolenaaroption.
693*3955d011SMarcel Moolenaar.It Va .MAKE.JOB.PREFIX
694*3955d011SMarcel MoolenaarIf
695*3955d011SMarcel Moolenaar.Nm
696*3955d011SMarcel Moolenaaris run with
697*3955d011SMarcel Moolenaar.Ar j
698*3955d011SMarcel Moolenaarthen output for each target is prefixed with a token
699*3955d011SMarcel Moolenaar.Ql --- target ---
700*3955d011SMarcel Moolenaarthe first part of which can be controlled via
701*3955d011SMarcel Moolenaar.Va .MAKE.JOB.PREFIX .
702*3955d011SMarcel Moolenaar.br
703*3955d011SMarcel MoolenaarFor example:
704*3955d011SMarcel Moolenaar.Li .MAKE.JOB.PREFIX=${.newline}---${.MAKE:T}[${.MAKE.PID}]
705*3955d011SMarcel Moolenaarwould produce tokens like
706*3955d011SMarcel Moolenaar.Ql ---make[1234] target ---
707*3955d011SMarcel Moolenaarmaking it easier to track the degree of parallelism being achieved.
708*3955d011SMarcel Moolenaar.It Ev MAKEFLAGS
709*3955d011SMarcel MoolenaarThe environment variable
710*3955d011SMarcel Moolenaar.Ql Ev MAKEFLAGS
711*3955d011SMarcel Moolenaarmay contain anything that
712*3955d011SMarcel Moolenaarmay be specified on
713*3955d011SMarcel Moolenaar.Nm Ns 's
714*3955d011SMarcel Moolenaarcommand line.
715*3955d011SMarcel MoolenaarAnything specified on
716*3955d011SMarcel Moolenaar.Nm Ns 's
717*3955d011SMarcel Moolenaarcommand line is appended to the
718*3955d011SMarcel Moolenaar.Ql Ev MAKEFLAGS
719*3955d011SMarcel Moolenaarvariable which is then
720*3955d011SMarcel Moolenaarentered into the environment for all programs which
721*3955d011SMarcel Moolenaar.Nm
722*3955d011SMarcel Moolenaarexecutes.
723*3955d011SMarcel Moolenaar.It Va .MAKE.LEVEL
724*3955d011SMarcel MoolenaarThe recursion depth of
725*3955d011SMarcel Moolenaar.Nm .
726*3955d011SMarcel MoolenaarThe initial instance of
727*3955d011SMarcel Moolenaar.Nm
728*3955d011SMarcel Moolenaarwill be 0, and an incremented value is put into the environment
729*3955d011SMarcel Moolenaarto be seen by the next generation.
730*3955d011SMarcel MoolenaarThis allows tests like:
731*3955d011SMarcel Moolenaar.Li .if ${.MAKE.LEVEL} == 0
732*3955d011SMarcel Moolenaarto protect things which should only be evaluated in the initial instance of
733*3955d011SMarcel Moolenaar.Nm .
734*3955d011SMarcel Moolenaar.It Va .MAKE.MAKEFILE_PREFERENCE
735*3955d011SMarcel MoolenaarThe ordered list of makefile names
736*3955d011SMarcel Moolenaar(default
737*3955d011SMarcel Moolenaar.Ql Pa makefile ,
738*3955d011SMarcel Moolenaar.Ql Pa Makefile )
739*3955d011SMarcel Moolenaarthat
740*3955d011SMarcel Moolenaar.Nm
741*3955d011SMarcel Moolenaarwill look for.
742*3955d011SMarcel Moolenaar.It Va .MAKE.MAKEFILES
743*3955d011SMarcel MoolenaarThe list of makefiles read by
744*3955d011SMarcel Moolenaar.Nm ,
745*3955d011SMarcel Moolenaarwhich is useful for tracking dependencies.
746*3955d011SMarcel MoolenaarEach makefile is recorded only once, regardless of the number of times read.
747*3955d011SMarcel Moolenaar.It Va .MAKE.MODE
748*3955d011SMarcel MoolenaarProcessed after reading all makefiles.
749*3955d011SMarcel MoolenaarCan affect the mode that
750*3955d011SMarcel Moolenaar.Nm
751*3955d011SMarcel Moolenaarruns in.
752*3955d011SMarcel MoolenaarIt can contain a number of keywords:
753*3955d011SMarcel Moolenaar.Bl -hang -width ignore-cmd
754*3955d011SMarcel Moolenaar.It Pa compat
755*3955d011SMarcel MoolenaarLike
756*3955d011SMarcel Moolenaar.Fl B ,
757*3955d011SMarcel Moolenaarputs
758*3955d011SMarcel Moolenaar.Nm
759*3955d011SMarcel Moolenaarinto "compat" mode.
760*3955d011SMarcel Moolenaar.It Pa meta
761*3955d011SMarcel MoolenaarPuts
762*3955d011SMarcel Moolenaar.Nm
763*3955d011SMarcel Moolenaarinto "meta" mode, where meta files are created for each target
764*3955d011SMarcel Moolenaarto capture the command run, the output generated and if
765*3955d011SMarcel Moolenaar.Xr filemon 4
766*3955d011SMarcel Moolenaaris available, the system calls which are of interest to
767*3955d011SMarcel Moolenaar.Nm .
768*3955d011SMarcel MoolenaarThe captured output can be very useful when diagnosing errors.
769*3955d011SMarcel Moolenaar.It Pa curdirOk= Ar bf
770*3955d011SMarcel MoolenaarNormally
771*3955d011SMarcel Moolenaar.Nm
772*3955d011SMarcel Moolenaarwill not create .meta files in
773*3955d011SMarcel Moolenaar.Ql Va .CURDIR .
774*3955d011SMarcel MoolenaarThis can be overridden by setting
775*3955d011SMarcel Moolenaar.Va bf
776*3955d011SMarcel Moolenaarto a value which represents True.
777*3955d011SMarcel Moolenaar.It Pa env
778*3955d011SMarcel MoolenaarFor debugging, it can be useful to inlcude the environment
779*3955d011SMarcel Moolenaarin the .meta file.
780*3955d011SMarcel Moolenaar.It Pa verbose
781*3955d011SMarcel MoolenaarIf in "meta" mode, print a clue about the target being built.
782*3955d011SMarcel MoolenaarThis is useful if the build is otherwise running silently.
783*3955d011SMarcel MoolenaarThe message printed the value of:
784*3955d011SMarcel Moolenaar.Va .MAKE.META.PREFIX .
785*3955d011SMarcel Moolenaar.It Pa ignore-cmd
786*3955d011SMarcel MoolenaarSome makefiles have commands which are simply not stable.
787*3955d011SMarcel MoolenaarThis keyword causes them to be ignored for
788*3955d011SMarcel Moolenaardetermining whether a target is out of date in "meta" mode.
789*3955d011SMarcel MoolenaarSee also
790*3955d011SMarcel Moolenaar.Ic .NOMETA_CMP .
791*3955d011SMarcel Moolenaar.It Pa silent= Ar bf
792*3955d011SMarcel MoolenaarIf
793*3955d011SMarcel Moolenaar.Va bf
794*3955d011SMarcel Moolenaaris True, when a .meta file is created, mark the target
795*3955d011SMarcel Moolenaar.Ic .SILENT .
796*3955d011SMarcel Moolenaar.El
797*3955d011SMarcel Moolenaar.It Va .MAKE.META.BAILIWICK
798*3955d011SMarcel MoolenaarIn "meta" mode, provides a list of prefixes which
799*3955d011SMarcel Moolenaarmatch the directories controlled by
800*3955d011SMarcel Moolenaar.Nm .
801*3955d011SMarcel MoolenaarIf a file that was generated outside of
802*3955d011SMarcel Moolenaar.Va .OBJDIR
803*3955d011SMarcel Moolenaarbut within said bailiwick is missing,
804*3955d011SMarcel Moolenaarthe current target is considered out-of-date.
805*3955d011SMarcel Moolenaar.It Va .MAKE.META.CREATED
806*3955d011SMarcel MoolenaarIn "meta" mode, this variable contains a list of all the meta files
807*3955d011SMarcel Moolenaarupdated.
808*3955d011SMarcel MoolenaarIf not empty, it can be used to trigger processing of
809*3955d011SMarcel Moolenaar.Va .MAKE.META.FILES .
810*3955d011SMarcel Moolenaar.It Va .MAKE.META.FILES
811*3955d011SMarcel MoolenaarIn "meta" mode, this variable contains a list of all the meta files
812*3955d011SMarcel Moolenaarused (updated or not).
813*3955d011SMarcel MoolenaarThis list can be used to process the meta files to extract dependency
814*3955d011SMarcel Moolenaarinformation.
815*3955d011SMarcel Moolenaar.It Va .MAKE.META.PREFIX
816*3955d011SMarcel MoolenaarDefines the message printed for each meta file updated in "meta verbose" mode.
817*3955d011SMarcel MoolenaarThe default value is:
818*3955d011SMarcel Moolenaar.Dl Building ${.TARGET:H:tA}/${.TARGET:T}
819*3955d011SMarcel Moolenaar.It Va .MAKEOVERRIDES
820*3955d011SMarcel MoolenaarThis variable is used to record the names of variables assigned to
821*3955d011SMarcel Moolenaaron the command line, so that they may be exported as part of
822*3955d011SMarcel Moolenaar.Ql Ev MAKEFLAGS .
823*3955d011SMarcel MoolenaarThis behaviour can be disabled by assigning an empty value to
824*3955d011SMarcel Moolenaar.Ql Va .MAKEOVERRIDES
825*3955d011SMarcel Moolenaarwithin a makefile.
826*3955d011SMarcel MoolenaarExtra variables can be exported from a makefile
827*3955d011SMarcel Moolenaarby appending their names to
828*3955d011SMarcel Moolenaar.Ql Va .MAKEOVERRIDES .
829*3955d011SMarcel Moolenaar.Ql Ev MAKEFLAGS
830*3955d011SMarcel Moolenaaris re-exported whenever
831*3955d011SMarcel Moolenaar.Ql Va .MAKEOVERRIDES
832*3955d011SMarcel Moolenaaris modified.
833*3955d011SMarcel Moolenaar.It Va .MAKE.PID
834*3955d011SMarcel MoolenaarThe process-id of
835*3955d011SMarcel Moolenaar.Nm .
836*3955d011SMarcel Moolenaar.It Va .MAKE.PPID
837*3955d011SMarcel MoolenaarThe parent process-id of
838*3955d011SMarcel Moolenaar.Nm .
839*3955d011SMarcel Moolenaar.It Va MAKE_PRINT_VAR_ON_ERROR
840*3955d011SMarcel MoolenaarWhen
841*3955d011SMarcel Moolenaar.Nm
842*3955d011SMarcel Moolenaarstops due to an error, it prints its name and the value of
843*3955d011SMarcel Moolenaar.Ql Va .CURDIR
844*3955d011SMarcel Moolenaaras well as the value of any variables named in
845*3955d011SMarcel Moolenaar.Ql Va MAKE_PRINT_VAR_ON_ERROR .
846*3955d011SMarcel Moolenaar.It Va .newline
847*3955d011SMarcel MoolenaarThis variable is simply assigned a newline character as its value.
848*3955d011SMarcel MoolenaarThis allows expansions using the
849*3955d011SMarcel Moolenaar.Cm \&:@
850*3955d011SMarcel Moolenaarmodifier to put a newline between
851*3955d011SMarcel Moolenaariterations of the loop rather than a space.
852*3955d011SMarcel MoolenaarFor example, the printing of
853*3955d011SMarcel Moolenaar.Ql Va MAKE_PRINT_VAR_ON_ERROR
854*3955d011SMarcel Moolenaarcould be done as ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}.
855*3955d011SMarcel Moolenaar.It Va .OBJDIR
856*3955d011SMarcel MoolenaarA path to the directory where the targets are built.
857*3955d011SMarcel MoolenaarIts value is determined by trying to
858*3955d011SMarcel Moolenaar.Xr chdir 2
859*3955d011SMarcel Moolenaarto the following directories in order and using the first match:
860*3955d011SMarcel Moolenaar.Bl -enum
861*3955d011SMarcel Moolenaar.It
862*3955d011SMarcel Moolenaar.Ev ${MAKEOBJDIRPREFIX}${.CURDIR}
863*3955d011SMarcel Moolenaar.Pp
864*3955d011SMarcel Moolenaar(Only if
865*3955d011SMarcel Moolenaar.Ql Ev MAKEOBJDIRPREFIX
866*3955d011SMarcel Moolenaaris set in the environment or on the command line.)
867*3955d011SMarcel Moolenaar.It
868*3955d011SMarcel Moolenaar.Ev ${MAKEOBJDIR}
869*3955d011SMarcel Moolenaar.Pp
870*3955d011SMarcel Moolenaar(Only if
871*3955d011SMarcel Moolenaar.Ql Ev MAKEOBJDIR
872*3955d011SMarcel Moolenaaris set in the environment or on the command line.)
873*3955d011SMarcel Moolenaar.It
874*3955d011SMarcel Moolenaar.Ev ${.CURDIR} Ns Pa /obj. Ns Ev ${MACHINE}
875*3955d011SMarcel Moolenaar.It
876*3955d011SMarcel Moolenaar.Ev ${.CURDIR} Ns Pa /obj
877*3955d011SMarcel Moolenaar.It
878*3955d011SMarcel Moolenaar.Pa /usr/obj/ Ns Ev ${.CURDIR}
879*3955d011SMarcel Moolenaar.It
880*3955d011SMarcel Moolenaar.Ev ${.CURDIR}
881*3955d011SMarcel Moolenaar.El
882*3955d011SMarcel Moolenaar.Pp
883*3955d011SMarcel MoolenaarVariable expansion is performed on the value before it's used,
884*3955d011SMarcel Moolenaarso expressions such as
885*3955d011SMarcel Moolenaar.Dl ${.CURDIR:S,^/usr/src,/var/obj,}
886*3955d011SMarcel Moolenaarmay be used.
887*3955d011SMarcel MoolenaarThis is especially useful with
888*3955d011SMarcel Moolenaar.Ql Ev MAKEOBJDIR .
889*3955d011SMarcel Moolenaar.Pp
890*3955d011SMarcel Moolenaar.Ql Va .OBJDIR
891*3955d011SMarcel Moolenaarmay be modified in the makefile as a global variable.
892*3955d011SMarcel MoolenaarIn all cases,
893*3955d011SMarcel Moolenaar.Nm
894*3955d011SMarcel Moolenaarwill
895*3955d011SMarcel Moolenaar.Xr chdir 2
896*3955d011SMarcel Moolenaarto
897*3955d011SMarcel Moolenaar.Ql Va .OBJDIR
898*3955d011SMarcel Moolenaarand set
899*3955d011SMarcel Moolenaar.Ql Ev PWD
900*3955d011SMarcel Moolenaarto that directory before executing any targets.
901*3955d011SMarcel Moolenaar.
902*3955d011SMarcel Moolenaar.It Va .PARSEDIR
903*3955d011SMarcel MoolenaarA path to the directory of the current
904*3955d011SMarcel Moolenaar.Ql Pa Makefile
905*3955d011SMarcel Moolenaarbeing parsed.
906*3955d011SMarcel Moolenaar.It Va .PARSEFILE
907*3955d011SMarcel MoolenaarThe basename of the current
908*3955d011SMarcel Moolenaar.Ql Pa Makefile
909*3955d011SMarcel Moolenaarbeing parsed.
910*3955d011SMarcel MoolenaarThis variable and
911*3955d011SMarcel Moolenaar.Ql Va .PARSEDIR
912*3955d011SMarcel Moolenaarare both set only while the
913*3955d011SMarcel Moolenaar.Ql Pa Makefiles
914*3955d011SMarcel Moolenaarare being parsed.
915*3955d011SMarcel MoolenaarIf you want to retain their current values, assign them to a variable
916*3955d011SMarcel Moolenaarusing assignment with expansion:
917*3955d011SMarcel Moolenaar.Pq Ql Cm \&:= .
918*3955d011SMarcel Moolenaar.It Va .PATH
919*3955d011SMarcel MoolenaarA variable that represents the list of directories that
920*3955d011SMarcel Moolenaar.Nm
921*3955d011SMarcel Moolenaarwill search for files.
922*3955d011SMarcel MoolenaarThe search list should be updated using the target
923*3955d011SMarcel Moolenaar.Ql Va .PATH
924*3955d011SMarcel Moolenaarrather than the variable.
925*3955d011SMarcel Moolenaar.It Ev PWD
926*3955d011SMarcel MoolenaarAlternate path to the current directory.
927*3955d011SMarcel Moolenaar.Nm
928*3955d011SMarcel Moolenaarnormally sets
929*3955d011SMarcel Moolenaar.Ql Va .CURDIR
930*3955d011SMarcel Moolenaarto the canonical path given by
931*3955d011SMarcel Moolenaar.Xr getcwd 3 .
932*3955d011SMarcel MoolenaarHowever, if the environment variable
933*3955d011SMarcel Moolenaar.Ql Ev PWD
934*3955d011SMarcel Moolenaaris set and gives a path to the current directory, then
935*3955d011SMarcel Moolenaar.Nm
936*3955d011SMarcel Moolenaarsets
937*3955d011SMarcel Moolenaar.Ql Va .CURDIR
938*3955d011SMarcel Moolenaarto the value of
939*3955d011SMarcel Moolenaar.Ql Ev PWD
940*3955d011SMarcel Moolenaarinstead.
941*3955d011SMarcel MoolenaarThis behaviour is disabled if
942*3955d011SMarcel Moolenaar.Ql Ev MAKEOBJDIRPREFIX
943*3955d011SMarcel Moolenaaris set or
944*3955d011SMarcel Moolenaar.Ql Ev MAKEOBJDIR
945*3955d011SMarcel Moolenaarcontains a variable transform.
946*3955d011SMarcel Moolenaar.Ql Ev PWD
947*3955d011SMarcel Moolenaaris set to the value of
948*3955d011SMarcel Moolenaar.Ql Va .OBJDIR
949*3955d011SMarcel Moolenaarfor all programs which
950*3955d011SMarcel Moolenaar.Nm
951*3955d011SMarcel Moolenaarexecutes.
952*3955d011SMarcel Moolenaar.It Ev .TARGETS
953*3955d011SMarcel MoolenaarThe list of targets explicitly specified on the command line, if any.
954*3955d011SMarcel Moolenaar.It Ev VPATH
955*3955d011SMarcel MoolenaarColon-separated
956*3955d011SMarcel Moolenaar.Pq Dq \&:
957*3955d011SMarcel Moolenaarlists of directories that
958*3955d011SMarcel Moolenaar.Nm
959*3955d011SMarcel Moolenaarwill search for files.
960*3955d011SMarcel MoolenaarThe variable is supported for compatibility with old make programs only,
961*3955d011SMarcel Moolenaaruse
962*3955d011SMarcel Moolenaar.Ql Va .PATH
963*3955d011SMarcel Moolenaarinstead.
964*3955d011SMarcel Moolenaar.El
965*3955d011SMarcel Moolenaar.Ss Variable modifiers
966*3955d011SMarcel MoolenaarVariable expansion may be modified to select or modify each word of the
967*3955d011SMarcel Moolenaarvariable (where a
968*3955d011SMarcel Moolenaar.Dq word
969*3955d011SMarcel Moolenaaris white-space delimited sequence of characters).
970*3955d011SMarcel MoolenaarThe general format of a variable expansion is as follows:
971*3955d011SMarcel Moolenaar.Pp
972*3955d011SMarcel Moolenaar.Dl ${variable[:modifier[:...]]}
973*3955d011SMarcel Moolenaar.Pp
974*3955d011SMarcel MoolenaarEach modifier begins with a colon,
975*3955d011SMarcel Moolenaarwhich may be escaped with a backslash
976*3955d011SMarcel Moolenaar.Pq Ql \e .
977*3955d011SMarcel Moolenaar.Pp
978*3955d011SMarcel MoolenaarA set of modifiers can be specified via a variable, as follows:
979*3955d011SMarcel Moolenaar.Pp
980*3955d011SMarcel Moolenaar.Dl modifier_variable=modifier[:...]
981*3955d011SMarcel Moolenaar.Dl ${variable:${modifier_variable}[:...]}
982*3955d011SMarcel Moolenaar.Pp
983*3955d011SMarcel MoolenaarIn this case the first modifier in the modifier_variable does not
984*3955d011SMarcel Moolenaarstart with a colon, since that must appear in the referencing
985*3955d011SMarcel Moolenaarvariable.
986*3955d011SMarcel MoolenaarIf any of the modifiers in the modifier_variable contain a dollar sign
987*3955d011SMarcel Moolenaar.Pq Ql $ ,
988*3955d011SMarcel Moolenaarthese must be doubled to avoid early expansion.
989*3955d011SMarcel Moolenaar.Pp
990*3955d011SMarcel MoolenaarThe supported modifiers are:
991*3955d011SMarcel Moolenaar.Bl -tag -width EEE
992*3955d011SMarcel Moolenaar.It Cm \&:E
993*3955d011SMarcel MoolenaarReplaces each word in the variable with its suffix.
994*3955d011SMarcel Moolenaar.It Cm \&:H
995*3955d011SMarcel MoolenaarReplaces each word in the variable with everything but the last component.
996*3955d011SMarcel Moolenaar.It Cm \&:M Ns Ar pattern
997*3955d011SMarcel MoolenaarSelect only those words that match
998*3955d011SMarcel Moolenaar.Ar pattern .
999*3955d011SMarcel MoolenaarThe standard shell wildcard characters
1000*3955d011SMarcel Moolenaar.Pf ( Ql * ,
1001*3955d011SMarcel Moolenaar.Ql \&? ,
1002*3955d011SMarcel Moolenaarand
1003*3955d011SMarcel Moolenaar.Ql Oo Oc )
1004*3955d011SMarcel Moolenaarmay
1005*3955d011SMarcel Moolenaarbe used.
1006*3955d011SMarcel MoolenaarThe wildcard characters may be escaped with a backslash
1007*3955d011SMarcel Moolenaar.Pq Ql \e .
1008*3955d011SMarcel Moolenaar.It Cm \&:N Ns Ar pattern
1009*3955d011SMarcel MoolenaarThis is identical to
1010*3955d011SMarcel Moolenaar.Ql Cm \&:M ,
1011*3955d011SMarcel Moolenaarbut selects all words which do not match
1012*3955d011SMarcel Moolenaar.Ar pattern .
1013*3955d011SMarcel Moolenaar.It Cm \&:O
1014*3955d011SMarcel MoolenaarOrder every word in variable alphabetically.
1015*3955d011SMarcel MoolenaarTo sort words in
1016*3955d011SMarcel Moolenaarreverse order use the
1017*3955d011SMarcel Moolenaar.Ql Cm \&:O:[-1..1]
1018*3955d011SMarcel Moolenaarcombination of modifiers.
1019*3955d011SMarcel Moolenaar.It Cm \&:Ox
1020*3955d011SMarcel MoolenaarRandomize words in variable.
1021*3955d011SMarcel MoolenaarThe results will be different each time you are referring to the
1022*3955d011SMarcel Moolenaarmodified variable; use the assignment with expansion
1023*3955d011SMarcel Moolenaar.Pq Ql Cm \&:=
1024*3955d011SMarcel Moolenaarto prevent such behaviour.
1025*3955d011SMarcel MoolenaarFor example,
1026*3955d011SMarcel Moolenaar.Bd -literal -offset indent
1027*3955d011SMarcel MoolenaarLIST=			uno due tre quattro
1028*3955d011SMarcel MoolenaarRANDOM_LIST=		${LIST:Ox}
1029*3955d011SMarcel MoolenaarSTATIC_RANDOM_LIST:=	${LIST:Ox}
1030*3955d011SMarcel Moolenaar
1031*3955d011SMarcel Moolenaarall:
1032*3955d011SMarcel Moolenaar	@echo "${RANDOM_LIST}"
1033*3955d011SMarcel Moolenaar	@echo "${RANDOM_LIST}"
1034*3955d011SMarcel Moolenaar	@echo "${STATIC_RANDOM_LIST}"
1035*3955d011SMarcel Moolenaar	@echo "${STATIC_RANDOM_LIST}"
1036*3955d011SMarcel Moolenaar.Ed
1037*3955d011SMarcel Moolenaarmay produce output similar to:
1038*3955d011SMarcel Moolenaar.Bd -literal -offset indent
1039*3955d011SMarcel Moolenaarquattro due tre uno
1040*3955d011SMarcel Moolenaartre due quattro uno
1041*3955d011SMarcel Moolenaardue uno quattro tre
1042*3955d011SMarcel Moolenaardue uno quattro tre
1043*3955d011SMarcel Moolenaar.Ed
1044*3955d011SMarcel Moolenaar.It Cm \&:Q
1045*3955d011SMarcel MoolenaarQuotes every shell meta-character in the variable, so that it can be passed
1046*3955d011SMarcel Moolenaarsafely through recursive invocations of
1047*3955d011SMarcel Moolenaar.Nm .
1048*3955d011SMarcel Moolenaar.It Cm \&:R
1049*3955d011SMarcel MoolenaarReplaces each word in the variable with everything but its suffix.
1050*3955d011SMarcel Moolenaar.It Cm \&:gmtime
1051*3955d011SMarcel MoolenaarThe value is a format string for
1052*3955d011SMarcel Moolenaar.Xr strftime 3 ,
1053*3955d011SMarcel Moolenaarusing the current
1054*3955d011SMarcel Moolenaar.Xr gmtime 3 .
1055*3955d011SMarcel Moolenaar.It Cm \&:hash
1056*3955d011SMarcel MoolenaarCompute a 32bit hash of the value and encode it as hex digits.
1057*3955d011SMarcel Moolenaar.It Cm \&:localtime
1058*3955d011SMarcel MoolenaarThe value is a format string for
1059*3955d011SMarcel Moolenaar.Xr strftime 3 ,
1060*3955d011SMarcel Moolenaarusing the current
1061*3955d011SMarcel Moolenaar.Xr localtime 3 .
1062*3955d011SMarcel Moolenaar.It Cm \&:tA
1063*3955d011SMarcel MoolenaarAttempt to convert variable to an absolute path using
1064*3955d011SMarcel Moolenaar.Xr realpath 3 ,
1065*3955d011SMarcel Moolenaarif that fails, the value is unchanged.
1066*3955d011SMarcel Moolenaar.It Cm \&:tl
1067*3955d011SMarcel MoolenaarConverts variable to lower-case letters.
1068*3955d011SMarcel Moolenaar.It Cm \&:ts Ns Ar c
1069*3955d011SMarcel MoolenaarWords in the variable are normally separated by a space on expansion.
1070*3955d011SMarcel MoolenaarThis modifier sets the separator to the character
1071*3955d011SMarcel Moolenaar.Ar c .
1072*3955d011SMarcel MoolenaarIf
1073*3955d011SMarcel Moolenaar.Ar c
1074*3955d011SMarcel Moolenaaris omitted, then no separator is used.
1075*3955d011SMarcel MoolenaarThe common escapes (including octal numeric codes), work as expected.
1076*3955d011SMarcel Moolenaar.It Cm \&:tu
1077*3955d011SMarcel MoolenaarConverts variable to upper-case letters.
1078*3955d011SMarcel Moolenaar.It Cm \&:tW
1079*3955d011SMarcel MoolenaarCauses the value to be treated as a single word
1080*3955d011SMarcel Moolenaar(possibly containing embedded white space).
1081*3955d011SMarcel MoolenaarSee also
1082*3955d011SMarcel Moolenaar.Ql Cm \&:[*] .
1083*3955d011SMarcel Moolenaar.It Cm \&:tw
1084*3955d011SMarcel MoolenaarCauses the value to be treated as a sequence of
1085*3955d011SMarcel Moolenaarwords delimited by white space.
1086*3955d011SMarcel MoolenaarSee also
1087*3955d011SMarcel Moolenaar.Ql Cm \&:[@] .
1088*3955d011SMarcel Moolenaar.Sm off
1089*3955d011SMarcel Moolenaar.It Cm \&:S No \&/ Ar old_string No \&/ Ar new_string No \&/ Op Cm 1gW
1090*3955d011SMarcel Moolenaar.Sm on
1091*3955d011SMarcel MoolenaarModify the first occurrence of
1092*3955d011SMarcel Moolenaar.Ar old_string
1093*3955d011SMarcel Moolenaarin the variable's value, replacing it with
1094*3955d011SMarcel Moolenaar.Ar new_string .
1095*3955d011SMarcel MoolenaarIf a
1096*3955d011SMarcel Moolenaar.Ql g
1097*3955d011SMarcel Moolenaaris appended to the last slash of the pattern, all occurrences
1098*3955d011SMarcel Moolenaarin each word are replaced.
1099*3955d011SMarcel MoolenaarIf a
1100*3955d011SMarcel Moolenaar.Ql 1
1101*3955d011SMarcel Moolenaaris appended to the last slash of the pattern, only the first word
1102*3955d011SMarcel Moolenaaris affected.
1103*3955d011SMarcel MoolenaarIf a
1104*3955d011SMarcel Moolenaar.Ql W
1105*3955d011SMarcel Moolenaaris appended to the last slash of the pattern,
1106*3955d011SMarcel Moolenaarthen the value is treated as a single word
1107*3955d011SMarcel Moolenaar(possibly containing embedded white space).
1108*3955d011SMarcel MoolenaarIf
1109*3955d011SMarcel Moolenaar.Ar old_string
1110*3955d011SMarcel Moolenaarbegins with a caret
1111*3955d011SMarcel Moolenaar.Pq Ql ^ ,
1112*3955d011SMarcel Moolenaar.Ar old_string
1113*3955d011SMarcel Moolenaaris anchored at the beginning of each word.
1114*3955d011SMarcel MoolenaarIf
1115*3955d011SMarcel Moolenaar.Ar old_string
1116*3955d011SMarcel Moolenaarends with a dollar sign
1117*3955d011SMarcel Moolenaar.Pq Ql \&$ ,
1118*3955d011SMarcel Moolenaarit is anchored at the end of each word.
1119*3955d011SMarcel MoolenaarInside
1120*3955d011SMarcel Moolenaar.Ar new_string ,
1121*3955d011SMarcel Moolenaaran ampersand
1122*3955d011SMarcel Moolenaar.Pq Ql \*[Am]
1123*3955d011SMarcel Moolenaaris replaced by
1124*3955d011SMarcel Moolenaar.Ar old_string
1125*3955d011SMarcel Moolenaar(without any
1126*3955d011SMarcel Moolenaar.Ql ^
1127*3955d011SMarcel Moolenaaror
1128*3955d011SMarcel Moolenaar.Ql \&$ ) .
1129*3955d011SMarcel MoolenaarAny character may be used as a delimiter for the parts of the modifier
1130*3955d011SMarcel Moolenaarstring.
1131*3955d011SMarcel MoolenaarThe anchoring, ampersand and delimiter characters may be escaped with a
1132*3955d011SMarcel Moolenaarbackslash
1133*3955d011SMarcel Moolenaar.Pq Ql \e .
1134*3955d011SMarcel Moolenaar.Pp
1135*3955d011SMarcel MoolenaarVariable expansion occurs in the normal fashion inside both
1136*3955d011SMarcel Moolenaar.Ar old_string
1137*3955d011SMarcel Moolenaarand
1138*3955d011SMarcel Moolenaar.Ar new_string
1139*3955d011SMarcel Moolenaarwith the single exception that a backslash is used to prevent the expansion
1140*3955d011SMarcel Moolenaarof a dollar sign
1141*3955d011SMarcel Moolenaar.Pq Ql \&$ ,
1142*3955d011SMarcel Moolenaarnot a preceding dollar sign as is usual.
1143*3955d011SMarcel Moolenaar.Sm off
1144*3955d011SMarcel Moolenaar.It Cm \&:C No \&/ Ar pattern No \&/ Ar replacement No \&/ Op Cm 1gW
1145*3955d011SMarcel Moolenaar.Sm on
1146*3955d011SMarcel MoolenaarThe
1147*3955d011SMarcel Moolenaar.Cm \&:C
1148*3955d011SMarcel Moolenaarmodifier is just like the
1149*3955d011SMarcel Moolenaar.Cm \&:S
1150*3955d011SMarcel Moolenaarmodifier except that the old and new strings, instead of being
1151*3955d011SMarcel Moolenaarsimple strings, are a regular expression (see
1152*3955d011SMarcel Moolenaar.Xr regex 3 )
1153*3955d011SMarcel Moolenaarstring
1154*3955d011SMarcel Moolenaar.Ar pattern
1155*3955d011SMarcel Moolenaarand an
1156*3955d011SMarcel Moolenaar.Xr ed 1 Ns \-style
1157*3955d011SMarcel Moolenaarstring
1158*3955d011SMarcel Moolenaar.Ar replacement .
1159*3955d011SMarcel MoolenaarNormally, the first occurrence of the pattern
1160*3955d011SMarcel Moolenaar.Ar pattern
1161*3955d011SMarcel Moolenaarin each word of the value is substituted with
1162*3955d011SMarcel Moolenaar.Ar replacement .
1163*3955d011SMarcel MoolenaarThe
1164*3955d011SMarcel Moolenaar.Ql 1
1165*3955d011SMarcel Moolenaarmodifier causes the substitution to apply to at most one word; the
1166*3955d011SMarcel Moolenaar.Ql g
1167*3955d011SMarcel Moolenaarmodifier causes the substitution to apply to as many instances of the
1168*3955d011SMarcel Moolenaarsearch pattern
1169*3955d011SMarcel Moolenaar.Ar pattern
1170*3955d011SMarcel Moolenaaras occur in the word or words it is found in; the
1171*3955d011SMarcel Moolenaar.Ql W
1172*3955d011SMarcel Moolenaarmodifier causes the value to be treated as a single word
1173*3955d011SMarcel Moolenaar(possibly containing embedded white space).
1174*3955d011SMarcel MoolenaarNote that
1175*3955d011SMarcel Moolenaar.Ql 1
1176*3955d011SMarcel Moolenaarand
1177*3955d011SMarcel Moolenaar.Ql g
1178*3955d011SMarcel Moolenaarare orthogonal; the former specifies whether multiple words are
1179*3955d011SMarcel Moolenaarpotentially affected, the latter whether multiple substitutions can
1180*3955d011SMarcel Moolenaarpotentially occur within each affected word.
1181*3955d011SMarcel Moolenaar.It Cm \&:T
1182*3955d011SMarcel MoolenaarReplaces each word in the variable with its last component.
1183*3955d011SMarcel Moolenaar.It Cm \&:u
1184*3955d011SMarcel MoolenaarRemove adjacent duplicate words (like
1185*3955d011SMarcel Moolenaar.Xr uniq 1 ) .
1186*3955d011SMarcel Moolenaar.Sm off
1187*3955d011SMarcel Moolenaar.It Cm \&:\&? Ar true_string Cm \&: Ar false_string
1188*3955d011SMarcel Moolenaar.Sm on
1189*3955d011SMarcel MoolenaarIf the variable name (not its value), when parsed as a .if conditional
1190*3955d011SMarcel Moolenaarexpression, evaluates to true, return as its value the
1191*3955d011SMarcel Moolenaar.Ar true_string ,
1192*3955d011SMarcel Moolenaarotherwise return the
1193*3955d011SMarcel Moolenaar.Ar false_string .
1194*3955d011SMarcel MoolenaarSince the variable name is used as the expression, \&:\&? must be the
1195*3955d011SMarcel Moolenaarfirst modifier after the variable name itself - which will, of course,
1196*3955d011SMarcel Moolenaarusually contain variable expansions.
1197*3955d011SMarcel MoolenaarA common error is trying to use expressions like
1198*3955d011SMarcel Moolenaar.Dl ${NUMBERS:M42:?match:no}
1199*3955d011SMarcel Moolenaarwhich actually tests defined(NUMBERS),
1200*3955d011SMarcel Moolenaarto determine is any words match "42" you need to use something like:
1201*3955d011SMarcel Moolenaar.Dl ${"${NUMBERS:M42}" != \&"\&":?match:no} .
1202*3955d011SMarcel Moolenaar.It Ar :old_string=new_string
1203*3955d011SMarcel MoolenaarThis is the
1204*3955d011SMarcel Moolenaar.At V
1205*3955d011SMarcel Moolenaarstyle variable substitution.
1206*3955d011SMarcel MoolenaarIt must be the last modifier specified.
1207*3955d011SMarcel MoolenaarIf
1208*3955d011SMarcel Moolenaar.Ar old_string
1209*3955d011SMarcel Moolenaaror
1210*3955d011SMarcel Moolenaar.Ar new_string
1211*3955d011SMarcel Moolenaardo not contain the pattern matching character
1212*3955d011SMarcel Moolenaar.Ar %
1213*3955d011SMarcel Moolenaarthen it is assumed that they are
1214*3955d011SMarcel Moolenaaranchored at the end of each word, so only suffixes or entire
1215*3955d011SMarcel Moolenaarwords may be replaced.
1216*3955d011SMarcel MoolenaarOtherwise
1217*3955d011SMarcel Moolenaar.Ar %
1218*3955d011SMarcel Moolenaaris the substring of
1219*3955d011SMarcel Moolenaar.Ar old_string
1220*3955d011SMarcel Moolenaarto be replaced in
1221*3955d011SMarcel Moolenaar.Ar new_string .
1222*3955d011SMarcel Moolenaar.Pp
1223*3955d011SMarcel MoolenaarVariable expansion occurs in the normal fashion inside both
1224*3955d011SMarcel Moolenaar.Ar old_string
1225*3955d011SMarcel Moolenaarand
1226*3955d011SMarcel Moolenaar.Ar new_string
1227*3955d011SMarcel Moolenaarwith the single exception that a backslash is used to prevent the
1228*3955d011SMarcel Moolenaarexpansion of a dollar sign
1229*3955d011SMarcel Moolenaar.Pq Ql \&$ ,
1230*3955d011SMarcel Moolenaarnot a preceding dollar sign as is usual.
1231*3955d011SMarcel Moolenaar.Sm off
1232*3955d011SMarcel Moolenaar.It Cm \&:@ Ar temp Cm @ Ar string Cm @
1233*3955d011SMarcel Moolenaar.Sm on
1234*3955d011SMarcel MoolenaarThis is the loop expansion mechanism from the OSF Development
1235*3955d011SMarcel MoolenaarEnvironment (ODE) make.
1236*3955d011SMarcel MoolenaarUnlike
1237*3955d011SMarcel Moolenaar.Cm \&.for
1238*3955d011SMarcel Moolenaarloops expansion occurs at the time of
1239*3955d011SMarcel Moolenaarreference.
1240*3955d011SMarcel MoolenaarAssign
1241*3955d011SMarcel Moolenaar.Ar temp
1242*3955d011SMarcel Moolenaarto each word in the variable and evaluate
1243*3955d011SMarcel Moolenaar.Ar string .
1244*3955d011SMarcel MoolenaarThe ODE convention is that
1245*3955d011SMarcel Moolenaar.Ar temp
1246*3955d011SMarcel Moolenaarshould start and end with a period.
1247*3955d011SMarcel MoolenaarFor example.
1248*3955d011SMarcel Moolenaar.Dl ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@}
1249*3955d011SMarcel Moolenaar.Pp
1250*3955d011SMarcel MoolenaarHowever a single character varaiable is often more readable:
1251*3955d011SMarcel Moolenaar.Dl ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}
1252*3955d011SMarcel Moolenaar.It Cm \&:U Ns Ar newval
1253*3955d011SMarcel MoolenaarIf the variable is undefined
1254*3955d011SMarcel Moolenaar.Ar newval
1255*3955d011SMarcel Moolenaaris the value.
1256*3955d011SMarcel MoolenaarIf the variable is defined, the existing value is returned.
1257*3955d011SMarcel MoolenaarThis is another ODE make feature.
1258*3955d011SMarcel MoolenaarIt is handy for setting per-target CFLAGS for instance:
1259*3955d011SMarcel Moolenaar.Dl ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}}
1260*3955d011SMarcel MoolenaarIf a value is only required if the variable is undefined, use:
1261*3955d011SMarcel Moolenaar.Dl ${VAR:D:Unewval}
1262*3955d011SMarcel Moolenaar.It Cm \&:D Ns Ar newval
1263*3955d011SMarcel MoolenaarIf the variable is defined
1264*3955d011SMarcel Moolenaar.Ar newval
1265*3955d011SMarcel Moolenaaris the value.
1266*3955d011SMarcel Moolenaar.It Cm \&:L
1267*3955d011SMarcel MoolenaarThe name of the variable is the value.
1268*3955d011SMarcel Moolenaar.It Cm \&:P
1269*3955d011SMarcel MoolenaarThe path of the node which has the same name as the variable
1270*3955d011SMarcel Moolenaaris the value.
1271*3955d011SMarcel MoolenaarIf no such node exists or its path is null, then the
1272*3955d011SMarcel Moolenaarname of the variable is used.
1273*3955d011SMarcel MoolenaarIn order for this modifier to work, the name (node) must at least have
1274*3955d011SMarcel Moolenaarappeared on the rhs of a dependency.
1275*3955d011SMarcel Moolenaar.Sm off
1276*3955d011SMarcel Moolenaar.It Cm \&:\&! Ar cmd Cm \&!
1277*3955d011SMarcel Moolenaar.Sm on
1278*3955d011SMarcel MoolenaarThe output of running
1279*3955d011SMarcel Moolenaar.Ar cmd
1280*3955d011SMarcel Moolenaaris the value.
1281*3955d011SMarcel Moolenaar.It Cm \&:sh
1282*3955d011SMarcel MoolenaarIf the variable is non-empty it is run as a command and the output
1283*3955d011SMarcel Moolenaarbecomes the new value.
1284*3955d011SMarcel Moolenaar.It Cm \&::= Ns Ar str
1285*3955d011SMarcel MoolenaarThe variable is assigned the value
1286*3955d011SMarcel Moolenaar.Ar str
1287*3955d011SMarcel Moolenaarafter substitution.
1288*3955d011SMarcel MoolenaarThis modifier and its variations are useful in
1289*3955d011SMarcel Moolenaarobscure situations such as wanting to set a variable when shell commands
1290*3955d011SMarcel Moolenaarare being parsed.
1291*3955d011SMarcel MoolenaarThese assignment modifiers always expand to
1292*3955d011SMarcel Moolenaarnothing, so if appearing in a rule line by themselves should be
1293*3955d011SMarcel Moolenaarpreceded with something to keep
1294*3955d011SMarcel Moolenaar.Nm
1295*3955d011SMarcel Moolenaarhappy.
1296*3955d011SMarcel Moolenaar.Pp
1297*3955d011SMarcel MoolenaarThe
1298*3955d011SMarcel Moolenaar.Ql Cm \&::
1299*3955d011SMarcel Moolenaarhelps avoid false matches with the
1300*3955d011SMarcel Moolenaar.At V
1301*3955d011SMarcel Moolenaarstyle
1302*3955d011SMarcel Moolenaar.Cm \&:=
1303*3955d011SMarcel Moolenaarmodifier and since substitution always occurs the
1304*3955d011SMarcel Moolenaar.Cm \&::=
1305*3955d011SMarcel Moolenaarform is vaguely appropriate.
1306*3955d011SMarcel Moolenaar.It Cm \&::?= Ns Ar str
1307*3955d011SMarcel MoolenaarAs for
1308*3955d011SMarcel Moolenaar.Cm \&::=
1309*3955d011SMarcel Moolenaarbut only if the variable does not already have a value.
1310*3955d011SMarcel Moolenaar.It Cm \&::+= Ns Ar str
1311*3955d011SMarcel MoolenaarAppend
1312*3955d011SMarcel Moolenaar.Ar str
1313*3955d011SMarcel Moolenaarto the variable.
1314*3955d011SMarcel Moolenaar.It Cm \&::!= Ns Ar cmd
1315*3955d011SMarcel MoolenaarAssign the output of
1316*3955d011SMarcel Moolenaar.Ar cmd
1317*3955d011SMarcel Moolenaarto the variable.
1318*3955d011SMarcel Moolenaar.It Cm \&:\&[ Ns Ar range Ns Cm \&]
1319*3955d011SMarcel MoolenaarSelects one or more words from the value,
1320*3955d011SMarcel Moolenaaror performs other operations related to the way in which the
1321*3955d011SMarcel Moolenaarvalue is divided into words.
1322*3955d011SMarcel Moolenaar.Pp
1323*3955d011SMarcel MoolenaarOrdinarily, a value is treated as a sequence of words
1324*3955d011SMarcel Moolenaardelimited by white space.
1325*3955d011SMarcel MoolenaarSome modifiers suppress this behaviour,
1326*3955d011SMarcel Moolenaarcausing a value to be treated as a single word
1327*3955d011SMarcel Moolenaar(possibly containing embedded white space).
1328*3955d011SMarcel MoolenaarAn empty value, or a value that consists entirely of white-space,
1329*3955d011SMarcel Moolenaaris treated as a single word.
1330*3955d011SMarcel MoolenaarFor the purposes of the
1331*3955d011SMarcel Moolenaar.Ql Cm \&:[]
1332*3955d011SMarcel Moolenaarmodifier, the words are indexed both forwards using positive integers
1333*3955d011SMarcel Moolenaar(where index 1 represents the first word),
1334*3955d011SMarcel Moolenaarand backwards using negative integers
1335*3955d011SMarcel Moolenaar(where index \-1 represents the last word).
1336*3955d011SMarcel Moolenaar.Pp
1337*3955d011SMarcel MoolenaarThe
1338*3955d011SMarcel Moolenaar.Ar range
1339*3955d011SMarcel Moolenaaris subjected to variable expansion, and the expanded result is
1340*3955d011SMarcel Moolenaarthen interpreted as follows:
1341*3955d011SMarcel Moolenaar.Bl -tag -width index
1342*3955d011SMarcel Moolenaar.\" :[n]
1343*3955d011SMarcel Moolenaar.It Ar index
1344*3955d011SMarcel MoolenaarSelects a single word from the value.
1345*3955d011SMarcel Moolenaar.\" :[start..end]
1346*3955d011SMarcel Moolenaar.It Ar start Ns Cm \&.. Ns Ar end
1347*3955d011SMarcel MoolenaarSelects all words from
1348*3955d011SMarcel Moolenaar.Ar start
1349*3955d011SMarcel Moolenaarto
1350*3955d011SMarcel Moolenaar.Ar end ,
1351*3955d011SMarcel Moolenaarinclusive.
1352*3955d011SMarcel MoolenaarFor example,
1353*3955d011SMarcel Moolenaar.Ql Cm \&:[2..-1]
1354*3955d011SMarcel Moolenaarselects all words from the second word to the last word.
1355*3955d011SMarcel MoolenaarIf
1356*3955d011SMarcel Moolenaar.Ar start
1357*3955d011SMarcel Moolenaaris greater than
1358*3955d011SMarcel Moolenaar.Ar end ,
1359*3955d011SMarcel Moolenaarthen the words are output in reverse order.
1360*3955d011SMarcel MoolenaarFor example,
1361*3955d011SMarcel Moolenaar.Ql Cm \&:[-1..1]
1362*3955d011SMarcel Moolenaarselects all the words from last to first.
1363*3955d011SMarcel Moolenaar.\" :[*]
1364*3955d011SMarcel Moolenaar.It Cm \&*
1365*3955d011SMarcel MoolenaarCauses subsequent modifiers to treat the value as a single word
1366*3955d011SMarcel Moolenaar(possibly containing embedded white space).
1367*3955d011SMarcel MoolenaarAnalogous to the effect of
1368*3955d011SMarcel Moolenaar\&"$*\&"
1369*3955d011SMarcel Moolenaarin Bourne shell.
1370*3955d011SMarcel Moolenaar.\" :[0]
1371*3955d011SMarcel Moolenaar.It 0
1372*3955d011SMarcel MoolenaarMeans the same as
1373*3955d011SMarcel Moolenaar.Ql Cm \&:[*] .
1374*3955d011SMarcel Moolenaar.\" :[*]
1375*3955d011SMarcel Moolenaar.It Cm \&@
1376*3955d011SMarcel MoolenaarCauses subsequent modifiers to treat the value as a sequence of words
1377*3955d011SMarcel Moolenaardelimited by white space.
1378*3955d011SMarcel MoolenaarAnalogous to the effect of
1379*3955d011SMarcel Moolenaar\&"$@\&"
1380*3955d011SMarcel Moolenaarin Bourne shell.
1381*3955d011SMarcel Moolenaar.\" :[#]
1382*3955d011SMarcel Moolenaar.It Cm \&#
1383*3955d011SMarcel MoolenaarReturns the number of words in the value.
1384*3955d011SMarcel Moolenaar.El \" :[range]
1385*3955d011SMarcel Moolenaar.El
1386*3955d011SMarcel Moolenaar.Sh INCLUDE STATEMENTS, CONDITIONALS AND FOR LOOPS
1387*3955d011SMarcel MoolenaarMakefile inclusion, conditional structures and for loops  reminiscent
1388*3955d011SMarcel Moolenaarof the C programming language are provided in
1389*3955d011SMarcel Moolenaar.Nm .
1390*3955d011SMarcel MoolenaarAll such structures are identified by a line beginning with a single
1391*3955d011SMarcel Moolenaardot
1392*3955d011SMarcel Moolenaar.Pq Ql \&.
1393*3955d011SMarcel Moolenaarcharacter.
1394*3955d011SMarcel MoolenaarFiles are included with either
1395*3955d011SMarcel Moolenaar.Cm \&.include Aq Ar file
1396*3955d011SMarcel Moolenaaror
1397*3955d011SMarcel Moolenaar.Cm \&.include Pf \*q Ar file Ns \*q .
1398*3955d011SMarcel MoolenaarVariables between the angle brackets or double quotes are expanded
1399*3955d011SMarcel Moolenaarto form the file name.
1400*3955d011SMarcel MoolenaarIf angle brackets are used, the included makefile is expected to be in
1401*3955d011SMarcel Moolenaarthe system makefile directory.
1402*3955d011SMarcel MoolenaarIf double quotes are used, the including makefile's directory and any
1403*3955d011SMarcel Moolenaardirectories specified using the
1404*3955d011SMarcel Moolenaar.Fl I
1405*3955d011SMarcel Moolenaaroption are searched before the system
1406*3955d011SMarcel Moolenaarmakefile directory.
1407*3955d011SMarcel MoolenaarFor compatibility with other versions of
1408*3955d011SMarcel Moolenaar.Nm
1409*3955d011SMarcel Moolenaar.Ql include file ...
1410*3955d011SMarcel Moolenaaris also accepted.
1411*3955d011SMarcel MoolenaarIf the include statement is written as
1412*3955d011SMarcel Moolenaar.Cm .-include
1413*3955d011SMarcel Moolenaaror as
1414*3955d011SMarcel Moolenaar.Cm .sinclude
1415*3955d011SMarcel Moolenaarthen errors locating and/or opening include files are ignored.
1416*3955d011SMarcel Moolenaar.Pp
1417*3955d011SMarcel MoolenaarConditional expressions are also preceded by a single dot as the first
1418*3955d011SMarcel Moolenaarcharacter of a line.
1419*3955d011SMarcel MoolenaarThe possible conditionals are as follows:
1420*3955d011SMarcel Moolenaar.Bl -tag -width Ds
1421*3955d011SMarcel Moolenaar.It Ic .error Ar message
1422*3955d011SMarcel MoolenaarThe message is printed along with the name of the makefile and line number,
1423*3955d011SMarcel Moolenaarthen
1424*3955d011SMarcel Moolenaar.Nm
1425*3955d011SMarcel Moolenaarwill exit.
1426*3955d011SMarcel Moolenaar.It Ic .export Ar variable ...
1427*3955d011SMarcel MoolenaarExport the specified global variable.
1428*3955d011SMarcel MoolenaarIf no variable list is provided, all globals are exported
1429*3955d011SMarcel Moolenaarexcept for internal variables (those that start with
1430*3955d011SMarcel Moolenaar.Ql \&. ) .
1431*3955d011SMarcel MoolenaarThis is not affected by the
1432*3955d011SMarcel Moolenaar.Fl X
1433*3955d011SMarcel Moolenaarflag, so should be used with caution.
1434*3955d011SMarcel MoolenaarFor compatibility with other
1435*3955d011SMarcel Moolenaar.Nm
1436*3955d011SMarcel Moolenaarprograms
1437*3955d011SMarcel Moolenaar.Ql export variable=value
1438*3955d011SMarcel Moolenaaris also accepted.
1439*3955d011SMarcel Moolenaar.Pp
1440*3955d011SMarcel MoolenaarAppending a variable name to
1441*3955d011SMarcel Moolenaar.Va .MAKE.EXPORTED
1442*3955d011SMarcel Moolenaaris equivalent to exporting a variable.
1443*3955d011SMarcel Moolenaar.It Ic .export-env Ar variable ...
1444*3955d011SMarcel MoolenaarThe same as
1445*3955d011SMarcel Moolenaar.Ql .export ,
1446*3955d011SMarcel Moolenaarexcept that the variable is not appended to
1447*3955d011SMarcel Moolenaar.Va .MAKE.EXPORTED .
1448*3955d011SMarcel MoolenaarThis allows exporting a value to the environment which is different from that
1449*3955d011SMarcel Moolenaarused by
1450*3955d011SMarcel Moolenaar.Nm
1451*3955d011SMarcel Moolenaarinternally.
1452*3955d011SMarcel Moolenaar.It Ic .info Ar message
1453*3955d011SMarcel MoolenaarThe message is printed along with the name of the makefile and line number.
1454*3955d011SMarcel Moolenaar.It Ic .undef Ar variable
1455*3955d011SMarcel MoolenaarUn-define the specified global variable.
1456*3955d011SMarcel MoolenaarOnly global variables may be un-defined.
1457*3955d011SMarcel Moolenaar.It Ic .unexport Ar variable ...
1458*3955d011SMarcel MoolenaarThe opposite of
1459*3955d011SMarcel Moolenaar.Ql .export .
1460*3955d011SMarcel MoolenaarThe specified global
1461*3955d011SMarcel Moolenaar.Va variable
1462*3955d011SMarcel Moolenaarwill be removed from
1463*3955d011SMarcel Moolenaar.Va .MAKE.EXPORTED .
1464*3955d011SMarcel MoolenaarIf no variable list is provided, all globals are unexported,
1465*3955d011SMarcel Moolenaarand
1466*3955d011SMarcel Moolenaar.Va .MAKE.EXPORTED
1467*3955d011SMarcel Moolenaardeleted.
1468*3955d011SMarcel Moolenaar.It Ic .unexport-env
1469*3955d011SMarcel MoolenaarUnexport all globals previously exported and
1470*3955d011SMarcel Moolenaarclear the environment inherited from the parent.
1471*3955d011SMarcel MoolenaarThis operation will cause a memory leak of the original environment,
1472*3955d011SMarcel Moolenaarso should be used sparingly.
1473*3955d011SMarcel MoolenaarTesting for
1474*3955d011SMarcel Moolenaar.Va .MAKE.LEVEL
1475*3955d011SMarcel Moolenaarbeing 0, would make sense.
1476*3955d011SMarcel MoolenaarAlso note that any variables which originated in the parent environment
1477*3955d011SMarcel Moolenaarshould be explicitly preserved if desired.
1478*3955d011SMarcel MoolenaarFor example:
1479*3955d011SMarcel Moolenaar.Bd -literal -offset indent
1480*3955d011SMarcel Moolenaar.Li .if ${.MAKE.LEVEL} == 0
1481*3955d011SMarcel MoolenaarPATH := ${PATH}
1482*3955d011SMarcel Moolenaar.Li .unexport-env
1483*3955d011SMarcel Moolenaar.Li .export PATH
1484*3955d011SMarcel Moolenaar.Li .endif
1485*3955d011SMarcel Moolenaar.Pp
1486*3955d011SMarcel Moolenaar.Ed
1487*3955d011SMarcel MoolenaarWould result in an environment containing only
1488*3955d011SMarcel Moolenaar.Ql Ev PATH ,
1489*3955d011SMarcel Moolenaarwhich is the minimal useful environment.
1490*3955d011SMarcel MoolenaarActually
1491*3955d011SMarcel Moolenaar.Ql Ev .MAKE.LEVEL
1492*3955d011SMarcel Moolenaarwill also be pushed into the new environment.
1493*3955d011SMarcel Moolenaar.It Ic .warning Ar message
1494*3955d011SMarcel MoolenaarThe message prefixed by
1495*3955d011SMarcel Moolenaar.Ql Pa warning:
1496*3955d011SMarcel Moolenaaris printed along with the name of the makefile and line number.
1497*3955d011SMarcel Moolenaar.It Ic \&.if Oo \&! Oc Ns Ar expression Op Ar operator expression ...
1498*3955d011SMarcel MoolenaarTest the value of an expression.
1499*3955d011SMarcel Moolenaar.It Ic .ifdef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
1500*3955d011SMarcel MoolenaarTest the value of a variable.
1501*3955d011SMarcel Moolenaar.It Ic .ifndef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
1502*3955d011SMarcel MoolenaarTest the value of a variable.
1503*3955d011SMarcel Moolenaar.It Ic .ifmake Oo \&! Oc Ns Ar target Op Ar operator target ...
1504*3955d011SMarcel MoolenaarTest the target being built.
1505*3955d011SMarcel Moolenaar.It Ic .ifnmake Oo \&! Ns Oc Ar target Op Ar operator target ...
1506*3955d011SMarcel MoolenaarTest the target being built.
1507*3955d011SMarcel Moolenaar.It Ic .else
1508*3955d011SMarcel MoolenaarReverse the sense of the last conditional.
1509*3955d011SMarcel Moolenaar.It Ic .elif Oo \&! Ns Oc Ar expression Op Ar operator expression ...
1510*3955d011SMarcel MoolenaarA combination of
1511*3955d011SMarcel Moolenaar.Ql Ic .else
1512*3955d011SMarcel Moolenaarfollowed by
1513*3955d011SMarcel Moolenaar.Ql Ic .if .
1514*3955d011SMarcel Moolenaar.It Ic .elifdef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
1515*3955d011SMarcel MoolenaarA combination of
1516*3955d011SMarcel Moolenaar.Ql Ic .else
1517*3955d011SMarcel Moolenaarfollowed by
1518*3955d011SMarcel Moolenaar.Ql Ic .ifdef .
1519*3955d011SMarcel Moolenaar.It Ic .elifndef Oo \&! Oc Ns Ar variable Op Ar operator variable ...
1520*3955d011SMarcel MoolenaarA combination of
1521*3955d011SMarcel Moolenaar.Ql Ic .else
1522*3955d011SMarcel Moolenaarfollowed by
1523*3955d011SMarcel Moolenaar.Ql Ic .ifndef .
1524*3955d011SMarcel Moolenaar.It Ic .elifmake Oo \&! Oc Ns Ar target Op Ar operator target ...
1525*3955d011SMarcel MoolenaarA combination of
1526*3955d011SMarcel Moolenaar.Ql Ic .else
1527*3955d011SMarcel Moolenaarfollowed by
1528*3955d011SMarcel Moolenaar.Ql Ic .ifmake .
1529*3955d011SMarcel Moolenaar.It Ic .elifnmake Oo \&! Oc Ns Ar target Op Ar operator target ...
1530*3955d011SMarcel MoolenaarA combination of
1531*3955d011SMarcel Moolenaar.Ql Ic .else
1532*3955d011SMarcel Moolenaarfollowed by
1533*3955d011SMarcel Moolenaar.Ql Ic .ifnmake .
1534*3955d011SMarcel Moolenaar.It Ic .endif
1535*3955d011SMarcel MoolenaarEnd the body of the conditional.
1536*3955d011SMarcel Moolenaar.El
1537*3955d011SMarcel Moolenaar.Pp
1538*3955d011SMarcel MoolenaarThe
1539*3955d011SMarcel Moolenaar.Ar operator
1540*3955d011SMarcel Moolenaarmay be any one of the following:
1541*3955d011SMarcel Moolenaar.Bl -tag -width "Cm XX"
1542*3955d011SMarcel Moolenaar.It Cm \&|\&|
1543*3955d011SMarcel MoolenaarLogical OR.
1544*3955d011SMarcel Moolenaar.It Cm \&\*[Am]\*[Am]
1545*3955d011SMarcel MoolenaarLogical
1546*3955d011SMarcel Moolenaar.Tn AND ;
1547*3955d011SMarcel Moolenaarof higher precedence than
1548*3955d011SMarcel Moolenaar.Dq \&|\&| .
1549*3955d011SMarcel Moolenaar.El
1550*3955d011SMarcel Moolenaar.Pp
1551*3955d011SMarcel MoolenaarAs in C,
1552*3955d011SMarcel Moolenaar.Nm
1553*3955d011SMarcel Moolenaarwill only evaluate a conditional as far as is necessary to determine
1554*3955d011SMarcel Moolenaarits value.
1555*3955d011SMarcel MoolenaarParentheses may be used to change the order of evaluation.
1556*3955d011SMarcel MoolenaarThe boolean operator
1557*3955d011SMarcel Moolenaar.Ql Ic \&!
1558*3955d011SMarcel Moolenaarmay be used to logically negate an entire
1559*3955d011SMarcel Moolenaarconditional.
1560*3955d011SMarcel MoolenaarIt is of higher precedence than
1561*3955d011SMarcel Moolenaar.Ql Ic \&\*[Am]\*[Am] .
1562*3955d011SMarcel Moolenaar.Pp
1563*3955d011SMarcel MoolenaarThe value of
1564*3955d011SMarcel Moolenaar.Ar expression
1565*3955d011SMarcel Moolenaarmay be any of the following:
1566*3955d011SMarcel Moolenaar.Bl -tag -width defined
1567*3955d011SMarcel Moolenaar.It Ic defined
1568*3955d011SMarcel MoolenaarTakes a variable name as an argument and evaluates to true if the variable
1569*3955d011SMarcel Moolenaarhas been defined.
1570*3955d011SMarcel Moolenaar.It Ic make
1571*3955d011SMarcel MoolenaarTakes a target name as an argument and evaluates to true if the target
1572*3955d011SMarcel Moolenaarwas specified as part of
1573*3955d011SMarcel Moolenaar.Nm Ns 's
1574*3955d011SMarcel Moolenaarcommand line or was declared the default target (either implicitly or
1575*3955d011SMarcel Moolenaarexplicitly, see
1576*3955d011SMarcel Moolenaar.Va .MAIN )
1577*3955d011SMarcel Moolenaarbefore the line containing the conditional.
1578*3955d011SMarcel Moolenaar.It Ic empty
1579*3955d011SMarcel MoolenaarTakes a variable, with possible modifiers, and evaluates to true if
1580*3955d011SMarcel Moolenaarthe expansion of the variable would result in an empty string.
1581*3955d011SMarcel Moolenaar.It Ic exists
1582*3955d011SMarcel MoolenaarTakes a file name as an argument and evaluates to true if the file exists.
1583*3955d011SMarcel MoolenaarThe file is searched for on the system search path (see
1584*3955d011SMarcel Moolenaar.Va .PATH ) .
1585*3955d011SMarcel Moolenaar.It Ic target
1586*3955d011SMarcel MoolenaarTakes a target name as an argument and evaluates to true if the target
1587*3955d011SMarcel Moolenaarhas been defined.
1588*3955d011SMarcel Moolenaar.It Ic commands
1589*3955d011SMarcel MoolenaarTakes a target name as an argument and evaluates to true if the target
1590*3955d011SMarcel Moolenaarhas been defined and has commands associated with it.
1591*3955d011SMarcel Moolenaar.El
1592*3955d011SMarcel Moolenaar.Pp
1593*3955d011SMarcel Moolenaar.Ar Expression
1594*3955d011SMarcel Moolenaarmay also be an arithmetic or string comparison.
1595*3955d011SMarcel MoolenaarVariable expansion is
1596*3955d011SMarcel Moolenaarperformed on both sides of the comparison, after which the integral
1597*3955d011SMarcel Moolenaarvalues are compared.
1598*3955d011SMarcel MoolenaarA value is interpreted as hexadecimal if it is
1599*3955d011SMarcel Moolenaarpreceded by 0x, otherwise it is decimal; octal numbers are not supported.
1600*3955d011SMarcel MoolenaarThe standard C relational operators are all supported.
1601*3955d011SMarcel MoolenaarIf after
1602*3955d011SMarcel Moolenaarvariable expansion, either the left or right hand side of a
1603*3955d011SMarcel Moolenaar.Ql Ic ==
1604*3955d011SMarcel Moolenaaror
1605*3955d011SMarcel Moolenaar.Ql Ic "!="
1606*3955d011SMarcel Moolenaaroperator is not an integral value, then
1607*3955d011SMarcel Moolenaarstring comparison is performed between the expanded
1608*3955d011SMarcel Moolenaarvariables.
1609*3955d011SMarcel MoolenaarIf no relational operator is given, it is assumed that the expanded
1610*3955d011SMarcel Moolenaarvariable is being compared against 0 or an empty string in the case
1611*3955d011SMarcel Moolenaarof a string comparison.
1612*3955d011SMarcel Moolenaar.Pp
1613*3955d011SMarcel MoolenaarWhen
1614*3955d011SMarcel Moolenaar.Nm
1615*3955d011SMarcel Moolenaaris evaluating one of these conditional expressions, and it encounters
1616*3955d011SMarcel Moolenaara (white-space separated) word it doesn't recognize, either the
1617*3955d011SMarcel Moolenaar.Dq make
1618*3955d011SMarcel Moolenaaror
1619*3955d011SMarcel Moolenaar.Dq defined
1620*3955d011SMarcel Moolenaarexpression is applied to it, depending on the form of the conditional.
1621*3955d011SMarcel MoolenaarIf the form is
1622*3955d011SMarcel Moolenaar.Ql Ic .ifdef ,
1623*3955d011SMarcel Moolenaar.Ql Ic .ifndef ,
1624*3955d011SMarcel Moolenaaror
1625*3955d011SMarcel Moolenaar.Ql Ic .if
1626*3955d011SMarcel Moolenaarthe
1627*3955d011SMarcel Moolenaar.Dq defined
1628*3955d011SMarcel Moolenaarexpression is applied.
1629*3955d011SMarcel MoolenaarSimilarly, if the form is
1630*3955d011SMarcel Moolenaar.Ql Ic .ifmake
1631*3955d011SMarcel Moolenaaror
1632*3955d011SMarcel Moolenaar.Ql Ic .ifnmake , the
1633*3955d011SMarcel Moolenaar.Dq make
1634*3955d011SMarcel Moolenaarexpression is applied.
1635*3955d011SMarcel Moolenaar.Pp
1636*3955d011SMarcel MoolenaarIf the conditional evaluates to true the parsing of the makefile continues
1637*3955d011SMarcel Moolenaaras before.
1638*3955d011SMarcel MoolenaarIf it evaluates to false, the following lines are skipped.
1639*3955d011SMarcel MoolenaarIn both cases this continues until a
1640*3955d011SMarcel Moolenaar.Ql Ic .else
1641*3955d011SMarcel Moolenaaror
1642*3955d011SMarcel Moolenaar.Ql Ic .endif
1643*3955d011SMarcel Moolenaaris found.
1644*3955d011SMarcel Moolenaar.Pp
1645*3955d011SMarcel MoolenaarFor loops are typically used to apply a set of rules to a list of files.
1646*3955d011SMarcel MoolenaarThe syntax of a for loop is:
1647*3955d011SMarcel Moolenaar.Pp
1648*3955d011SMarcel Moolenaar.Bl -tag -compact -width Ds
1649*3955d011SMarcel Moolenaar.It Ic \&.for Ar variable Oo Ar variable ... Oc Ic in Ar expression
1650*3955d011SMarcel Moolenaar.It Aq make-rules
1651*3955d011SMarcel Moolenaar.It Ic \&.endfor
1652*3955d011SMarcel Moolenaar.El
1653*3955d011SMarcel Moolenaar.Pp
1654*3955d011SMarcel MoolenaarAfter the for
1655*3955d011SMarcel Moolenaar.Ic expression
1656*3955d011SMarcel Moolenaaris evaluated, it is split into words.
1657*3955d011SMarcel MoolenaarOn each iteration of the loop, one word is taken and assigned to each
1658*3955d011SMarcel Moolenaar.Ic variable ,
1659*3955d011SMarcel Moolenaarin order, and these
1660*3955d011SMarcel Moolenaar.Ic variables
1661*3955d011SMarcel Moolenaarare substituted into the
1662*3955d011SMarcel Moolenaar.Ic make-rules
1663*3955d011SMarcel Moolenaarinside the body of the for loop.
1664*3955d011SMarcel MoolenaarThe number of words must come out even; that is, if there are three
1665*3955d011SMarcel Moolenaariteration variables, the number of words provided must be a multiple
1666*3955d011SMarcel Moolenaarof three.
1667*3955d011SMarcel Moolenaar.Sh COMMENTS
1668*3955d011SMarcel MoolenaarComments begin with a hash
1669*3955d011SMarcel Moolenaar.Pq Ql \&#
1670*3955d011SMarcel Moolenaarcharacter, anywhere but in a shell
1671*3955d011SMarcel Moolenaarcommand line, and continue to the end of an unescaped new line.
1672*3955d011SMarcel Moolenaar.Sh SPECIAL SOURCES (ATTRIBUTES)
1673*3955d011SMarcel Moolenaar.Bl -tag -width .IGNOREx
1674*3955d011SMarcel Moolenaar.It Ic .EXEC
1675*3955d011SMarcel MoolenaarTarget is never out of date, but always execute commands anyway.
1676*3955d011SMarcel Moolenaar.It Ic .IGNORE
1677*3955d011SMarcel MoolenaarIgnore any errors from the commands associated with this target, exactly
1678*3955d011SMarcel Moolenaaras if they all were preceded by a dash
1679*3955d011SMarcel Moolenaar.Pq Ql \- .
1680*3955d011SMarcel Moolenaar.\" .It Ic .INVISIBLE
1681*3955d011SMarcel Moolenaar.\" XXX
1682*3955d011SMarcel Moolenaar.\" .It Ic .JOIN
1683*3955d011SMarcel Moolenaar.\" XXX
1684*3955d011SMarcel Moolenaar.It Ic .MADE
1685*3955d011SMarcel MoolenaarMark all sources of this target as being up-to-date.
1686*3955d011SMarcel Moolenaar.It Ic .MAKE
1687*3955d011SMarcel MoolenaarExecute the commands associated with this target even if the
1688*3955d011SMarcel Moolenaar.Fl n
1689*3955d011SMarcel Moolenaaror
1690*3955d011SMarcel Moolenaar.Fl t
1691*3955d011SMarcel Moolenaaroptions were specified.
1692*3955d011SMarcel MoolenaarNormally used to mark recursive
1693*3955d011SMarcel Moolenaar.Nm Ns 's .
1694*3955d011SMarcel Moolenaar.It Ic .META
1695*3955d011SMarcel MoolenaarCreate a meta file for the target, even if it is flagged as
1696*3955d011SMarcel Moolenaar.Ic .PHONY ,
1697*3955d011SMarcel Moolenaar.Ic .MAKE ,
1698*3955d011SMarcel Moolenaaror
1699*3955d011SMarcel Moolenaar.Ic .SPECIAL .
1700*3955d011SMarcel MoolenaarUsage in conjunction with
1701*3955d011SMarcel Moolenaar.Ic .MAKE
1702*3955d011SMarcel Moolenaaris the most likely case.
1703*3955d011SMarcel MoolenaarIn "meta" mode, the target is out-of-date if the meta file is missing.
1704*3955d011SMarcel Moolenaar.It Ic .NOMETA
1705*3955d011SMarcel MoolenaarDo not create a meta file for the target.
1706*3955d011SMarcel MoolenaarMeta files are also not created for
1707*3955d011SMarcel Moolenaar.Ic .PHONY ,
1708*3955d011SMarcel Moolenaar.Ic .MAKE ,
1709*3955d011SMarcel Moolenaaror
1710*3955d011SMarcel Moolenaar.Ic .SPECIAL
1711*3955d011SMarcel Moolenaartargets.
1712*3955d011SMarcel Moolenaar.It Ic .NOMETA_CMP
1713*3955d011SMarcel MoolenaarIgnore differences in commands when deciding if target is out of date.
1714*3955d011SMarcel MoolenaarThis is useful if the command contains a value which always changes.
1715*3955d011SMarcel MoolenaarIf the number of commands change, though, the target will still be out of date.
1716*3955d011SMarcel Moolenaar.It Ic .NOPATH
1717*3955d011SMarcel MoolenaarDo not search for the target in the directories specified by
1718*3955d011SMarcel Moolenaar.Ic .PATH .
1719*3955d011SMarcel Moolenaar.It Ic .NOTMAIN
1720*3955d011SMarcel MoolenaarNormally
1721*3955d011SMarcel Moolenaar.Nm
1722*3955d011SMarcel Moolenaarselects the first target it encounters as the default target to be built
1723*3955d011SMarcel Moolenaarif no target was specified.
1724*3955d011SMarcel MoolenaarThis source prevents this target from being selected.
1725*3955d011SMarcel Moolenaar.It Ic .OPTIONAL
1726*3955d011SMarcel MoolenaarIf a target is marked with this attribute and
1727*3955d011SMarcel Moolenaar.Nm
1728*3955d011SMarcel Moolenaarcan't figure out how to create it, it will ignore this fact and assume
1729*3955d011SMarcel Moolenaarthe file isn't needed or already exists.
1730*3955d011SMarcel Moolenaar.It Ic .PHONY
1731*3955d011SMarcel MoolenaarThe target does not
1732*3955d011SMarcel Moolenaarcorrespond to an actual file; it is always considered to be out of date,
1733*3955d011SMarcel Moolenaarand will not be created with the
1734*3955d011SMarcel Moolenaar.Fl t
1735*3955d011SMarcel Moolenaaroption.
1736*3955d011SMarcel MoolenaarSuffix-transformation rules are not applied to
1737*3955d011SMarcel Moolenaar.Ic .PHONY
1738*3955d011SMarcel Moolenaartargets.
1739*3955d011SMarcel Moolenaar.It Ic .PRECIOUS
1740*3955d011SMarcel MoolenaarWhen
1741*3955d011SMarcel Moolenaar.Nm
1742*3955d011SMarcel Moolenaaris interrupted, it normally removes any partially made targets.
1743*3955d011SMarcel MoolenaarThis source prevents the target from being removed.
1744*3955d011SMarcel Moolenaar.It Ic .RECURSIVE
1745*3955d011SMarcel MoolenaarSynonym for
1746*3955d011SMarcel Moolenaar.Ic .MAKE .
1747*3955d011SMarcel Moolenaar.It Ic .SILENT
1748*3955d011SMarcel MoolenaarDo not echo any of the commands associated with this target, exactly
1749*3955d011SMarcel Moolenaaras if they all were preceded by an at sign
1750*3955d011SMarcel Moolenaar.Pq Ql @ .
1751*3955d011SMarcel Moolenaar.It Ic .USE
1752*3955d011SMarcel MoolenaarTurn the target into
1753*3955d011SMarcel Moolenaar.Nm Ns 's
1754*3955d011SMarcel Moolenaarversion of a macro.
1755*3955d011SMarcel MoolenaarWhen the target is used as a source for another target, the other target
1756*3955d011SMarcel Moolenaaracquires the commands, sources, and attributes (except for
1757*3955d011SMarcel Moolenaar.Ic .USE )
1758*3955d011SMarcel Moolenaarof the
1759*3955d011SMarcel Moolenaarsource.
1760*3955d011SMarcel MoolenaarIf the target already has commands, the
1761*3955d011SMarcel Moolenaar.Ic .USE
1762*3955d011SMarcel Moolenaartarget's commands are appended
1763*3955d011SMarcel Moolenaarto them.
1764*3955d011SMarcel Moolenaar.It Ic .USEBEFORE
1765*3955d011SMarcel MoolenaarExactly like
1766*3955d011SMarcel Moolenaar.Ic .USE ,
1767*3955d011SMarcel Moolenaarbut prepend the
1768*3955d011SMarcel Moolenaar.Ic .USEBEFORE
1769*3955d011SMarcel Moolenaartarget commands to the target.
1770*3955d011SMarcel Moolenaar.It Ic .WAIT
1771*3955d011SMarcel MoolenaarIf
1772*3955d011SMarcel Moolenaar.Ic .WAIT
1773*3955d011SMarcel Moolenaarappears in a dependency line, the sources that precede it are
1774*3955d011SMarcel Moolenaarmade before the sources that succeed it in the line.
1775*3955d011SMarcel MoolenaarSince the dependents of files are not made until the file itself
1776*3955d011SMarcel Moolenaarcould be made, this also stops the dependents being built unless they
1777*3955d011SMarcel Moolenaarare needed for another branch of the dependency tree.
1778*3955d011SMarcel MoolenaarSo given:
1779*3955d011SMarcel Moolenaar.Bd -literal
1780*3955d011SMarcel Moolenaarx: a .WAIT b
1781*3955d011SMarcel Moolenaar	echo x
1782*3955d011SMarcel Moolenaara:
1783*3955d011SMarcel Moolenaar	echo a
1784*3955d011SMarcel Moolenaarb: b1
1785*3955d011SMarcel Moolenaar	echo b
1786*3955d011SMarcel Moolenaarb1:
1787*3955d011SMarcel Moolenaar	echo b1
1788*3955d011SMarcel Moolenaar
1789*3955d011SMarcel Moolenaar.Ed
1790*3955d011SMarcel Moolenaarthe output is always
1791*3955d011SMarcel Moolenaar.Ql a ,
1792*3955d011SMarcel Moolenaar.Ql b1 ,
1793*3955d011SMarcel Moolenaar.Ql b ,
1794*3955d011SMarcel Moolenaar.Ql x .
1795*3955d011SMarcel Moolenaar.br
1796*3955d011SMarcel MoolenaarThe ordering imposed by
1797*3955d011SMarcel Moolenaar.Ic .WAIT
1798*3955d011SMarcel Moolenaaris only relevant for parallel makes.
1799*3955d011SMarcel Moolenaar.El
1800*3955d011SMarcel Moolenaar.Sh SPECIAL TARGETS
1801*3955d011SMarcel MoolenaarSpecial targets may not be included with other targets, i.e. they must be
1802*3955d011SMarcel Moolenaarthe only target specified.
1803*3955d011SMarcel Moolenaar.Bl -tag -width .BEGINx
1804*3955d011SMarcel Moolenaar.It Ic .BEGIN
1805*3955d011SMarcel MoolenaarAny command lines attached to this target are executed before anything
1806*3955d011SMarcel Moolenaarelse is done.
1807*3955d011SMarcel Moolenaar.It Ic .DEFAULT
1808*3955d011SMarcel MoolenaarThis is sort of a
1809*3955d011SMarcel Moolenaar.Ic .USE
1810*3955d011SMarcel Moolenaarrule for any target (that was used only as a
1811*3955d011SMarcel Moolenaarsource) that
1812*3955d011SMarcel Moolenaar.Nm
1813*3955d011SMarcel Moolenaarcan't figure out any other way to create.
1814*3955d011SMarcel MoolenaarOnly the shell script is used.
1815*3955d011SMarcel MoolenaarThe
1816*3955d011SMarcel Moolenaar.Ic .IMPSRC
1817*3955d011SMarcel Moolenaarvariable of a target that inherits
1818*3955d011SMarcel Moolenaar.Ic .DEFAULT Ns 's
1819*3955d011SMarcel Moolenaarcommands is set
1820*3955d011SMarcel Moolenaarto the target's own name.
1821*3955d011SMarcel Moolenaar.It Ic .END
1822*3955d011SMarcel MoolenaarAny command lines attached to this target are executed after everything
1823*3955d011SMarcel Moolenaarelse is done.
1824*3955d011SMarcel Moolenaar.It Ic .ERROR
1825*3955d011SMarcel MoolenaarAny command lines attached to this target are executed when another target fails.
1826*3955d011SMarcel MoolenaarThe
1827*3955d011SMarcel Moolenaar.Ic .ERROR_TARGET
1828*3955d011SMarcel Moolenaarvariable is set to the target that failed.
1829*3955d011SMarcel MoolenaarSee also
1830*3955d011SMarcel Moolenaar.Ic MAKE_PRINT_VAR_ON_ERROR .
1831*3955d011SMarcel Moolenaar.It Ic .IGNORE
1832*3955d011SMarcel MoolenaarMark each of the sources with the
1833*3955d011SMarcel Moolenaar.Ic .IGNORE
1834*3955d011SMarcel Moolenaarattribute.
1835*3955d011SMarcel MoolenaarIf no sources are specified, this is the equivalent of specifying the
1836*3955d011SMarcel Moolenaar.Fl i
1837*3955d011SMarcel Moolenaaroption.
1838*3955d011SMarcel Moolenaar.It Ic .INTERRUPT
1839*3955d011SMarcel MoolenaarIf
1840*3955d011SMarcel Moolenaar.Nm
1841*3955d011SMarcel Moolenaaris interrupted, the commands for this target will be executed.
1842*3955d011SMarcel Moolenaar.It Ic .MAIN
1843*3955d011SMarcel MoolenaarIf no target is specified when
1844*3955d011SMarcel Moolenaar.Nm
1845*3955d011SMarcel Moolenaaris invoked, this target will be built.
1846*3955d011SMarcel Moolenaar.It Ic .MAKEFLAGS
1847*3955d011SMarcel MoolenaarThis target provides a way to specify flags for
1848*3955d011SMarcel Moolenaar.Nm
1849*3955d011SMarcel Moolenaarwhen the makefile is used.
1850*3955d011SMarcel MoolenaarThe flags are as if typed to the shell, though the
1851*3955d011SMarcel Moolenaar.Fl f
1852*3955d011SMarcel Moolenaaroption will have
1853*3955d011SMarcel Moolenaarno effect.
1854*3955d011SMarcel Moolenaar.\" XXX: NOT YET!!!!
1855*3955d011SMarcel Moolenaar.\" .It Ic .NOTPARALLEL
1856*3955d011SMarcel Moolenaar.\" The named targets are executed in non parallel mode.
1857*3955d011SMarcel Moolenaar.\" If no targets are
1858*3955d011SMarcel Moolenaar.\" specified, then all targets are executed in non parallel mode.
1859*3955d011SMarcel Moolenaar.It Ic .NOPATH
1860*3955d011SMarcel MoolenaarApply the
1861*3955d011SMarcel Moolenaar.Ic .NOPATH
1862*3955d011SMarcel Moolenaarattribute to any specified sources.
1863*3955d011SMarcel Moolenaar.It Ic .NOTPARALLEL
1864*3955d011SMarcel MoolenaarDisable parallel mode.
1865*3955d011SMarcel Moolenaar.It Ic .NO_PARALLEL
1866*3955d011SMarcel MoolenaarSynonym for
1867*3955d011SMarcel Moolenaar.Ic .NOTPARALLEL ,
1868*3955d011SMarcel Moolenaarfor compatibility with other pmake variants.
1869*3955d011SMarcel Moolenaar.It Ic .ORDER
1870*3955d011SMarcel MoolenaarThe named targets are made in sequence.
1871*3955d011SMarcel MoolenaarThis ordering does not add targets to the list of targets to be made.
1872*3955d011SMarcel MoolenaarSince the dependents of a target do not get built until the target itself
1873*3955d011SMarcel Moolenaarcould be built, unless
1874*3955d011SMarcel Moolenaar.Ql a
1875*3955d011SMarcel Moolenaaris built by another part of the dependency graph,
1876*3955d011SMarcel Moolenaarthe following is a dependency loop:
1877*3955d011SMarcel Moolenaar.Bd -literal
1878*3955d011SMarcel Moolenaar\&.ORDER: b a
1879*3955d011SMarcel Moolenaarb: a
1880*3955d011SMarcel Moolenaar.Ed
1881*3955d011SMarcel Moolenaar.Pp
1882*3955d011SMarcel MoolenaarThe ordering imposed by
1883*3955d011SMarcel Moolenaar.Ic .ORDER
1884*3955d011SMarcel Moolenaaris only relevant for parallel makes.
1885*3955d011SMarcel Moolenaar.\" XXX: NOT YET!!!!
1886*3955d011SMarcel Moolenaar.\" .It Ic .PARALLEL
1887*3955d011SMarcel Moolenaar.\" The named targets are executed in parallel mode.
1888*3955d011SMarcel Moolenaar.\" If no targets are
1889*3955d011SMarcel Moolenaar.\" specified, then all targets are executed in parallel mode.
1890*3955d011SMarcel Moolenaar.It Ic .PATH
1891*3955d011SMarcel MoolenaarThe sources are directories which are to be searched for files not
1892*3955d011SMarcel Moolenaarfound in the current directory.
1893*3955d011SMarcel MoolenaarIf no sources are specified, any previously specified directories are
1894*3955d011SMarcel Moolenaardeleted.
1895*3955d011SMarcel MoolenaarIf the source is the special
1896*3955d011SMarcel Moolenaar.Ic .DOTLAST
1897*3955d011SMarcel Moolenaartarget, then the current working
1898*3955d011SMarcel Moolenaardirectory is searched last.
1899*3955d011SMarcel Moolenaar.It Ic .PHONY
1900*3955d011SMarcel MoolenaarApply the
1901*3955d011SMarcel Moolenaar.Ic .PHONY
1902*3955d011SMarcel Moolenaarattribute to any specified sources.
1903*3955d011SMarcel Moolenaar.It Ic .PRECIOUS
1904*3955d011SMarcel MoolenaarApply the
1905*3955d011SMarcel Moolenaar.Ic .PRECIOUS
1906*3955d011SMarcel Moolenaarattribute to any specified sources.
1907*3955d011SMarcel MoolenaarIf no sources are specified, the
1908*3955d011SMarcel Moolenaar.Ic .PRECIOUS
1909*3955d011SMarcel Moolenaarattribute is applied to every
1910*3955d011SMarcel Moolenaartarget in the file.
1911*3955d011SMarcel Moolenaar.It Ic .SHELL
1912*3955d011SMarcel MoolenaarSets the shell that
1913*3955d011SMarcel Moolenaar.Nm
1914*3955d011SMarcel Moolenaarwill use to execute commands.
1915*3955d011SMarcel MoolenaarThe sources are a set of
1916*3955d011SMarcel Moolenaar.Ar field=value
1917*3955d011SMarcel Moolenaarpairs.
1918*3955d011SMarcel Moolenaar.Bl -tag -width hasErrCtls
1919*3955d011SMarcel Moolenaar.It Ar name
1920*3955d011SMarcel MoolenaarThis is the minimal specification, used to select one of the builtin
1921*3955d011SMarcel Moolenaarshell specs;
1922*3955d011SMarcel Moolenaar.Ar sh ,
1923*3955d011SMarcel Moolenaar.Ar ksh ,
1924*3955d011SMarcel Moolenaarand
1925*3955d011SMarcel Moolenaar.Ar csh .
1926*3955d011SMarcel Moolenaar.It Ar path
1927*3955d011SMarcel MoolenaarSpecifies the path to the shell.
1928*3955d011SMarcel Moolenaar.It Ar hasErrCtl
1929*3955d011SMarcel MoolenaarIndicates whether the shell supports exit on error.
1930*3955d011SMarcel Moolenaar.It Ar check
1931*3955d011SMarcel MoolenaarThe command to turn on error checking.
1932*3955d011SMarcel Moolenaar.It Ar ignore
1933*3955d011SMarcel MoolenaarThe command to disable error checking.
1934*3955d011SMarcel Moolenaar.It Ar echo
1935*3955d011SMarcel MoolenaarThe command to turn on echoing of commands executed.
1936*3955d011SMarcel Moolenaar.It Ar quiet
1937*3955d011SMarcel MoolenaarThe command to turn off echoing of commands executed.
1938*3955d011SMarcel Moolenaar.It Ar filter
1939*3955d011SMarcel MoolenaarThe output to filter after issuing the
1940*3955d011SMarcel Moolenaar.Ar quiet
1941*3955d011SMarcel Moolenaarcommand.
1942*3955d011SMarcel MoolenaarIt is typically identical to
1943*3955d011SMarcel Moolenaar.Ar quiet .
1944*3955d011SMarcel Moolenaar.It Ar errFlag
1945*3955d011SMarcel MoolenaarThe flag to pass the shell to enable error checking.
1946*3955d011SMarcel Moolenaar.It Ar echoFlag
1947*3955d011SMarcel MoolenaarThe flag to pass the shell to enable command echoing.
1948*3955d011SMarcel Moolenaar.It Ar newline
1949*3955d011SMarcel MoolenaarThe string literal to pass the shell that results in a single newline
1950*3955d011SMarcel Moolenaarcharacter when used outside of any quoting characters.
1951*3955d011SMarcel Moolenaar.El
1952*3955d011SMarcel MoolenaarExample:
1953*3955d011SMarcel Moolenaar.Bd -literal
1954*3955d011SMarcel Moolenaar\&.SHELL: name=ksh path=/bin/ksh hasErrCtl=true \e
1955*3955d011SMarcel Moolenaar	check="set \-e" ignore="set +e" \e
1956*3955d011SMarcel Moolenaar	echo="set \-v" quiet="set +v" filter="set +v" \e
1957*3955d011SMarcel Moolenaar	echoFlag=v errFlag=e newline="'\en'"
1958*3955d011SMarcel Moolenaar.Ed
1959*3955d011SMarcel Moolenaar.It Ic .SILENT
1960*3955d011SMarcel MoolenaarApply the
1961*3955d011SMarcel Moolenaar.Ic .SILENT
1962*3955d011SMarcel Moolenaarattribute to any specified sources.
1963*3955d011SMarcel MoolenaarIf no sources are specified, the
1964*3955d011SMarcel Moolenaar.Ic .SILENT
1965*3955d011SMarcel Moolenaarattribute is applied to every
1966*3955d011SMarcel Moolenaarcommand in the file.
1967*3955d011SMarcel Moolenaar.It Ic .SUFFIXES
1968*3955d011SMarcel MoolenaarEach source specifies a suffix to
1969*3955d011SMarcel Moolenaar.Nm .
1970*3955d011SMarcel MoolenaarIf no sources are specified, any previously specified suffixes are deleted.
1971*3955d011SMarcel MoolenaarIt allows the creation of suffix-transformation rules.
1972*3955d011SMarcel Moolenaar.Pp
1973*3955d011SMarcel MoolenaarExample:
1974*3955d011SMarcel Moolenaar.Bd -literal
1975*3955d011SMarcel Moolenaar\&.SUFFIXES: .o
1976*3955d011SMarcel Moolenaar\&.c.o:
1977*3955d011SMarcel Moolenaar	cc \-o ${.TARGET} \-c ${.IMPSRC}
1978*3955d011SMarcel Moolenaar.Ed
1979*3955d011SMarcel Moolenaar.El
1980*3955d011SMarcel Moolenaar.Sh ENVIRONMENT
1981*3955d011SMarcel Moolenaar.Nm
1982*3955d011SMarcel Moolenaaruses the following environment variables, if they exist:
1983*3955d011SMarcel Moolenaar.Ev MACHINE ,
1984*3955d011SMarcel Moolenaar.Ev MACHINE_ARCH ,
1985*3955d011SMarcel Moolenaar.Ev MAKE ,
1986*3955d011SMarcel Moolenaar.Ev MAKEFLAGS ,
1987*3955d011SMarcel Moolenaar.Ev MAKEOBJDIR ,
1988*3955d011SMarcel Moolenaar.Ev MAKEOBJDIRPREFIX ,
1989*3955d011SMarcel Moolenaar.Ev MAKESYSPATH ,
1990*3955d011SMarcel Moolenaar.Ev PWD ,
1991*3955d011SMarcel Moolenaarand
1992*3955d011SMarcel Moolenaar.Ev TMPDIR .
1993*3955d011SMarcel Moolenaar.Pp
1994*3955d011SMarcel Moolenaar.Ev MAKEOBJDIRPREFIX
1995*3955d011SMarcel Moolenaarand
1996*3955d011SMarcel Moolenaar.Ev MAKEOBJDIR
1997*3955d011SMarcel Moolenaarmay only be set in the environment or on the command line to
1998*3955d011SMarcel Moolenaar.Nm
1999*3955d011SMarcel Moolenaarand not as makefile variables;
2000*3955d011SMarcel Moolenaarsee the description of
2001*3955d011SMarcel Moolenaar.Ql Va .OBJDIR
2002*3955d011SMarcel Moolenaarfor more details.
2003*3955d011SMarcel Moolenaar.Sh FILES
2004*3955d011SMarcel Moolenaar.Bl -tag -width /usr/share/mk -compact
2005*3955d011SMarcel Moolenaar.It .depend
2006*3955d011SMarcel Moolenaarlist of dependencies
2007*3955d011SMarcel Moolenaar.It Makefile
2008*3955d011SMarcel Moolenaarlist of dependencies
2009*3955d011SMarcel Moolenaar.It makefile
2010*3955d011SMarcel Moolenaarlist of dependencies
2011*3955d011SMarcel Moolenaar.It sys.mk
2012*3955d011SMarcel Moolenaarsystem makefile
2013*3955d011SMarcel Moolenaar.It /usr/share/mk
2014*3955d011SMarcel Moolenaarsystem makefile directory
2015*3955d011SMarcel Moolenaar.El
2016*3955d011SMarcel Moolenaar.Sh COMPATIBILITY
2017*3955d011SMarcel MoolenaarThe basic make syntax is compatible between different versions of make,
2018*3955d011SMarcel Moolenaarhowever the special variables, variable modifiers and conditionals are not.
2019*3955d011SMarcel Moolenaar.Pp
2020*3955d011SMarcel MoolenaarThe way that parallel makes are scheduled changed in
2021*3955d011SMarcel Moolenaar.Nx 4.0
2022*3955d011SMarcel Moolenaarso that .ORDER and .WAIT apply recursively to the dependent nodes.
2023*3955d011SMarcel MoolenaarThe algorithms used may change again in the future.
2024*3955d011SMarcel Moolenaar.Pp
2025*3955d011SMarcel MoolenaarThe way that .for loop variables are substituted changed after
2026*3955d011SMarcel Moolenaar.Nx 5.0
2027*3955d011SMarcel Moolenaarso that they still appear to be variable expansions.
2028*3955d011SMarcel MoolenaarIn particular this stops them being treated as syntax, and removes some
2029*3955d011SMarcel Moolenaarobscure problems using them in .if statements.
2030*3955d011SMarcel Moolenaar.Pp
2031*3955d011SMarcel MoolenaarUnlike other
2032*3955d011SMarcel Moolenaar.Nm
2033*3955d011SMarcel Moolenaarprograms, this implementation by default executes all commands for a given
2034*3955d011SMarcel Moolenaartarget using a single shell invocation.
2035*3955d011SMarcel MoolenaarThis is done for both efficiency and to simplify error handling in remote
2036*3955d011SMarcel Moolenaarcommand invocations.
2037*3955d011SMarcel MoolenaarTypically this is transparent to the user, unless the target commands change
2038*3955d011SMarcel Moolenaarthe current working directory using
2039*3955d011SMarcel Moolenaar.Dq cd
2040*3955d011SMarcel Moolenaaror
2041*3955d011SMarcel Moolenaar.Dq chdir .
2042*3955d011SMarcel MoolenaarTo be compatible with Makefiles that do this, one can use
2043*3955d011SMarcel Moolenaar.Fl B
2044*3955d011SMarcel Moolenaarto disable this behavior.
2045*3955d011SMarcel Moolenaar.Sh SEE ALSO
2046*3955d011SMarcel Moolenaar.Xr mkdep 1
2047*3955d011SMarcel Moolenaar.Sh HISTORY
2048*3955d011SMarcel MoolenaarA
2049*3955d011SMarcel Moolenaar.Nm
2050*3955d011SMarcel Moolenaarcommand appeared in
2051*3955d011SMarcel Moolenaar.At v7 .
2052*3955d011SMarcel MoolenaarThis
2053*3955d011SMarcel Moolenaar.Nm
2054*3955d011SMarcel Moolenaarimplementation is based on Adam De Boor's pmake program which was written
2055*3955d011SMarcel Moolenaarfor Sprint at Berkeley.
2056*3955d011SMarcel MoolenaarIt was designed to be a parallel distributed make running jobs on different
2057*3955d011SMarcel Moolenaarmachines using a daemon called
2058*3955d011SMarcel Moolenaar.Dq customs .
2059*3955d011SMarcel Moolenaar.Sh BUGS
2060*3955d011SMarcel MoolenaarThe
2061*3955d011SMarcel Moolenaar.Nm
2062*3955d011SMarcel Moolenaarsyntax is difficult to parse without actually acting of the data.
2063*3955d011SMarcel MoolenaarFor instance finding the end of a variable use should involve scanning each
2064*3955d011SMarcel Moolenaarthe modifiers using the correct terminator for each field.
2065*3955d011SMarcel MoolenaarIn many places
2066*3955d011SMarcel Moolenaar.Nm
2067*3955d011SMarcel Moolenaarjust counts {} and () in order to find the end of a variable expansion.
2068*3955d011SMarcel Moolenaar.Pp
2069*3955d011SMarcel MoolenaarThere is no way of escaping a space character in a filename.
2070