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 bmake 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 MoolenaarNetBSD 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 MoolenaarNetBSD 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 Moolenaar.Nm 2049*3955d011SMarcel Moolenaaris derived from NetBSD 2050*3955d011SMarcel Moolenaar.Xr make 1 . 2051*3955d011SMarcel MoolenaarIt uses autoconf to facilitate portability to other platforms. 2052