diff options
Diffstat (limited to 'usr.bin/make/make.1')
-rw-r--r-- | usr.bin/make/make.1 | 1843 |
1 files changed, 0 insertions, 1843 deletions
diff --git a/usr.bin/make/make.1 b/usr.bin/make/make.1 deleted file mode 100644 index 63da1aa..0000000 --- a/usr.bin/make/make.1 +++ /dev/null @@ -1,1843 +0,0 @@ -.\" Copyright (c) 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)make.1 8.8 (Berkeley) 6/13/95 -.\" $FreeBSD$ -.\" -.Dd May 30, 2012 -.Dt MAKE 1 -.Os -.Sh NAME -.Nm make -.Nd maintain program dependencies -.Sh SYNOPSIS -.Nm -.Op Fl ABPSXeiknpqrstv -.Op Fl C Ar directory -.Op Fl D Ar variable -.Op Fl d Ar flags -.Op Fl E Ar variable -.Op Fl f Ar makefile -.Op Fl I Ar directory -.Bk -words -.Op Fl j Ar max_jobs -.Op Fl m Ar directory -.Ek -.Op Fl V Ar variable -.Op Fl x Ar warning_options -.Op Ar variable Ns No = Ns Ar value -.Op Ar target ... -.Sh DESCRIPTION -The -.Nm -utility is a program designed to simplify the maintenance of other programs. -Its input is a list of specifications -describing dependency relationships between the generation of -files and programs. -.Pp -First of all, the initial list of specifications will be read -from the system makefile, -.Pa sys.mk , -unless inhibited with the -.Fl r -option. -The standard -.Pa sys.mk -as shipped with -.Fx -also handles -.Xr make.conf 5 , -the default path to which -can be altered via the -.Nm -variable -.Va __MAKE_CONF . -.Pp -Then the first of -.Pa BSDmakefile , -.Pa makefile , -and -.Pa Makefile -that can be found in the current directory, object directory (see -.Va .OBJDIR ) , -or search path (see the -.Fl I -option) -will be read for the main list of dependency specifications. -A different makefile or list of them can be supplied via the -.Fl f -option(s). -Finally, if the file -.Pa .depend -can be found in any of the aforesaid locations, it will also be read (see -.Xr mkdep 1 ) . -.Pp -When -.Nm -searches for a makefile, its name takes precedence over its location. -For instance, -.Pa BSDmakefile -in the object directory will be favored over -.Pa Makefile -in the current directory. -.Pp -The options are as follows: -.Bl -tag -width Ds -.It Fl A -Make archive errors non-fatal, causing -.Nm -to just skip the remainder -or all of the archive and continue after printing a message. -.It Fl B -Try to be backwards compatible by executing a single shell per command and -by executing the commands to make the sources of a dependency line in sequence. -This is turned on by default unless -.Fl j -is used. -.It Fl C Ar directory -Change to -.Ar directory -before reading the makefiles or doing anything else. -If multiple -.Fl C -options are specified, each is interpreted relative to the previous one: -.Fl C Pa / Fl C Pa etc -is equivalent to -.Fl C Pa /etc . -.It Fl D Ar variable -Define -.Ar variable -to be 1, in the global context. -.It Fl d Ar flags -Turn on debugging, and specify which portions of -.Nm -are to print debugging information. -Argument -.Ar flags -is one or more of the following: -.Bl -tag -width Ds -.It Ar A -Print all possible debugging information; -equivalent to specifying all of the debugging flags. -.It Ar a -Print debugging information about archive searching and caching. -.It Ar c -Print debugging information about conditional evaluation. -.It Ar d -Print debugging information about directory searching and caching. -.It Ar f -Print debugging information about the execution of for loops. -.It Ar "g1" -Print the input graph before making anything. -.It Ar "g2" -Print the input graph after making everything, or before exiting -on error. -.It Ar j -Print debugging information about running multiple shells. -.It Ar l -Print commands in Makefiles regardless of whether or not they are prefixed -by @ or other "quiet" flags. -Also known as "loud" behavior. -.It Ar m -Print debugging information about making targets, including modification -dates. -.It Ar s -Print debugging information about suffix-transformation rules. -.It Ar t -Print debugging information about target list maintenance. -.It Ar v -Print debugging information about variable assignment. -.El -.It Fl E Ar variable -Specify a variable whose environment value (if any) will override -macro assignments within makefiles. -.It Fl e -Specify that environment values override macro assignments within -makefiles for all variables. -.It Fl f Ar makefile -Specify a makefile to read instead of the default one. -If -.Ar makefile -is not an absolute pathname, -.Nm -will search for it as described above. -In case -.Ar makefile -is -.Sq Fl , -standard input is read. -Multiple -.Fl f -options can be supplied, -and the makefiles will be read in that order. -Unlike the other command-line options, -.Fl f -is neither stored in -.Va .MAKEFLAGS -nor pushed down to sub-makes via -.Ev MAKEFLAGS . -See below for more details on these variables. -.It Fl I Ar directory -Specify a directory in which to search for makefiles and included makefiles. -Multiple -.Fl I -options can be specified to form a search path. -The system makefile directory (or directories, see the -.Fl m -option) is automatically appended at the tail of this path. -.It Fl i -Ignore non-zero exit of shell commands in the makefile. -Equivalent to specifying -.Sq Ic \- -before each command line in the makefile. -.It Fl j Ar max_jobs -Specify the maximum number of jobs that -.Nm -may have running at any one time. -Turns compatibility mode off, unless the -.Fl B -flag is also specified. -.It Fl k -Continue processing after errors are encountered, but only on those targets -that do not depend on the target whose creation caused the error. -.It Fl m Ar directory -Specify a directory in which to search for -the system makefile and makefiles included via the <...> style. -Multiple -.Fl m -options can be specified to form a search path. -This path will override the default system include path, -.Pa /usr/share/mk . -The system include path will always be appended to the search path used -for "..."-style inclusions and makefile searches (see the -.Fl I -option). -.Pp -If a file or directory name in the -.Fl m -argument (or the -.Ev MAKESYSPATH -environment variable) starts with the string -.Qq \&.../ -then -.Nm -will search for the specified file or directory named in the remaining part -of the argument string. -The search starts with the current directory of the Makefile and then works -upward towards the root of the filesystem. -If the search is successful, -then the resulting directory replaces the -.Qq \&.../ -specification in the -.Fl m -argument. -If used, this feature allows -.Nm -to easily search in the current source tree for customized sys.mk files -(e.g. by using -.Qq \&.../mk/sys.mk -as an argument). -Note that a -.Fl C -that are earlier on the command line affect where -.Fl m Qq \&.../ -searches. -.It Fl n -Display the commands that would have been executed, but do not actually -execute them. -.It Fl P -Collate the output of a given job and display it only when the job finishes, -instead of mixing the output of parallel jobs together. -This option has no effect unless -.Fl j -is used too. -.It Fl p -Only print the input graph, not executing any commands. -The output is the same as -.Fl d Ar g1 . -When combined with -.Fl f Pa /dev/null , -only the builtin rules of -.Nm -are displayed. -.It Fl Q -Be extra quiet. -For multi-job makes, this will cause file banners not to be generated. -.It Fl q -Do not execute any commands, but exit 0 if the specified targets are -up-to-date and 1, otherwise. -.It Fl r -Do not process the system makefile. -.It Fl S -Stop processing when an error is encountered. -Default behaviour. -This is needed to negate the -.Fl k -option during recursive builds. -.It Fl s -Do not echo any commands as they are executed. -Equivalent to specifying -.Sq Ic @ -before each command line in the makefile. -.It Fl t -Rather than re-building a target as specified in the makefile, create it -or update its modification time to make it appear up-to-date. -.It Fl V Ar variable -Print -.Nm Ns 's -idea of the value of -.Ar variable , -in the global context. -Do not build any targets. -Multiple instances of this option may be specified; -the variables will be printed one per line, -with a blank line for each null or undefined variable. -If -.Ar variable -contains a -.Sq Ic $ -then the value will be expanded before printing. -.It Fl v -Be extra verbose. -Print any extra information. -.It Fl X -When using the -.Fl V -option to print the values of variables, -do not recursively expand the values. -.It Ar variable Ns No = Ns Ar value -Set the value of the variable -.Ar variable -to -.Ar value . -.It Fl x Ar warning_options -Specify extended warning options. -This option may be specified several times. -A -.Ar warning_option -can be prefixed with -.Dq Li no -in which case the warning is switched off. -The currently available options are: -.Bl -tag -width indent -.It Li dirsyntax -Warn if anything except blanks and comments follows an -.Ic .endif -or -.Ic .else -directive. -.El -.Pp -See also the -.Ic .WARN -special target. -.El -.Pp -There are seven different types of lines in a makefile: file dependency -specifications, shell commands, variable assignments, include statements, -conditional directives, for loops, and comments. -.Pp -In general, lines may be continued from one line to the next by ending -them with a backslash -.Pq Ql \e . -The trailing newline character and initial whitespace on the following -line are compressed into a single space. -.Sh FILE DEPENDENCY SPECIFICATIONS -Dependency lines consist of one or more targets, an operator, and zero -or more sources. -This creates a relationship where the targets -.Dq depend -on the sources -and are usually created from them. -The exact relationship between the target and the source is determined -by the operator that separates them. -The three operators are as follows: -.Bl -tag -width flag -.It Ic \&: -A target is considered out-of-date if its modification time is less than -those of any of its sources. -Sources for a target accumulate over dependency lines when this operator -is used. -The target is removed if -.Nm -is interrupted. -.It Ic \&! -Targets are always re-created, but not until all sources have been -examined and re-created as necessary. -Sources for a target accumulate over dependency lines when this operator -is used. -The target is removed if -.Nm -is interrupted. -.It Ic :: -If no sources are specified, the target is always re-created. -Otherwise, a target is considered out-of-date if any of its sources has -been modified more recently than the target. -Sources for a target do not accumulate over dependency lines when this -operator is used. -The target will not be removed if -.Nm -is interrupted. -.El -.Pp -Targets and sources may contain the shell wildcard expressions -.Ql \&? , -.Ql * , -.Ql [] -and -.Ql {} . -The expressions -.Ql \&? , -.Ql * -and -.Ql [] -may only be used as part of the final -component of the target or source, and must be used to describe existing -files. -The expression -.Ql {} -need not necessarily be used to describe existing files. -Expansion is in directory order, not alphabetically as done in the shell. -.Sh SHELL COMMANDS -Each target may have associated with it a series of shell commands, normally -used to create the target. -Each of the commands in this script -.Em must -be preceded by a tab. -While any target may appear on a dependency line, only one of these -dependencies may be followed by a creation script, unless the -.Sq Ic :: -operator is used. -.Pp -If the first characters of the command line are -.Sq Ic @ , -.Sq Ic \- , -and/or -.Sq Ic + , -the command is treated specially. -A -.Sq Ic @ -causes the command not to be echoed before it is executed. -A -.Sq Ic \- -causes any non-zero exit status of the command line to be ignored. -A -.Sq Ic + -causes the command to be executed even if -.Fl n -is specified on the command line. -.Sh VARIABLE ASSIGNMENTS -Variables in -.Nm -are much like variables in the shell, and, by tradition, -consist of all upper-case letters. -The five operators that can be used to assign values to variables are as -follows: -.Bl -tag -width Ds -.It Ic = -Assign the value to the variable. -Any previous value is overridden. -.It Ic += -Append the value to the current value of the variable. -.It Ic ?= -Assign the value to the variable if it is not already defined. -.It Ic := -Assign with expansion, i.e., expand the value before assigning it -to the variable. -Normally, expansion is not done until the variable is referenced. -.It Ic != -Expand the value and pass it to the shell for execution and assign -the result to the variable. -Any newlines in the result are replaced with spaces. -.El -.Pp -Any whitespace before the assigned -.Ar value -is removed; if the value is being appended, a single space is inserted -between the previous contents of the variable and the appended value. -.Pp -Variables are expanded by surrounding the variable name with either -curly braces -.Pq Ql {} -or parentheses -.Pq Ql () -and preceding it with -a dollar sign -.Pq Ql $ . -If the variable name contains only a single letter, the surrounding -braces or parentheses are not required. -This shorter form is not recommended. -.Pp -Variable substitution occurs at two distinct times, depending on where -the variable is being used. -Variables in dependency lines are expanded as the line is read. -Variables in shell commands are expanded when the shell command is -executed. -.Pp -The four different classes of variables (in order of increasing precedence) -are: -.Bl -tag -width Ds -.It Environment variables -Variables defined as part of -.Nm Ns 's -environment. -.It Global variables -Variables defined in the makefile or in included makefiles. -.It Command line variables -Variables defined as part of the command line and variables -obtained from the -.Ev MAKEFLAGS -environment variable or the -.Ic .MAKEFLAGS -target. -.It Local variables -Variables that are defined specific to a certain target. -.El -.Pp -If the name of an environment variable appears in a makefile -on the left-hand side of an assignment, -a global variable with the same name is created, and the latter -shadows the former as per their relative precedences. -The environment is not changed in this case, and the change -is not exported to programs executed by -.Nm . -However, a command-line variable actually replaces -the environment variable of the same name if the latter exists, -which is visible to child programs. -.Pp -There are seven local variables in -.Nm : -.Bl -tag -width ".ARCHIVE" -.It Va .ALLSRC -The list of all sources for this target; also known as -.Sq Va > . -.It Va .ARCHIVE -The name of the archive file; also known as -.Sq Va \&! . -.It Va .IMPSRC -The name/path of the source from which the target is to be transformed -(the -.Dq implied -source); also known as -.Sq Va < . -.It Va .MEMBER -The name of the archive member; also known as -.Sq Va % . -.It Va .OODATE -The list of sources for this target that were deemed out-of-date; also -known as -.Sq Va \&? . -.It Va .PREFIX -The file prefix of the file, containing only the file portion, no suffix -or preceding directory components; also known as -.Sq Va * . -.It Va .TARGET -The name of the target; also known as -.Sq Va @ . -.El -.Pp -The shorter forms -.Sq Va @ , -.Sq Va \&! , -.Sq Va < , -.Sq Va % , -.Sq Va \&? , -.Sq Va > , -and -.Sq Va * -are permitted for backward -compatibility and are not recommended. -The six variables -.Sq Va @F , -.Sq Va @D , -.Sq Va <F , -.Sq Va <D , -.Sq Va *F , -and -.Sq Va *D -are -permitted for compatibility with -.At V -makefiles and are not recommended. -.Pp -Four of the local variables may be used in sources on dependency lines -because they expand to the proper value for each target on the line. -These variables are -.Va .TARGET , -.Va .PREFIX , -.Va .ARCHIVE , -and -.Va .MEMBER . -.Pp -In addition, -.Nm -sets or knows about the following internal variables or environment -variables: -.Bl -tag -width ".Va .MAKEFILE_LIST" -.It Va $ -A single dollar sign -.Ql $ , -i.e.\& -.Ql $$ -expands to a single dollar -sign. -.It Va MAKE -The name that -.Nm -was executed with -.Pq Va argv Ns Op 0 . -.It Va .CURDIR -A path to the directory where -.Nm -was executed. -The -.Nm -utility sets -.Va .CURDIR -to the canonical path given by -.Xr getcwd 3 . -.It Va .OBJDIR -A path to the directory where the targets are built. -At startup, -.Nm -searches for an alternate directory to place target files. -It will attempt to change into this special directory -and will search this directory for makefiles -not found in the current directory. -The following directories are tried in order: -.Pp -.Bl -enum -compact -.It -${MAKEOBJDIRPREFIX}/`pwd -P` -.It -${MAKEOBJDIR} -.It -obj.${MACHINE} -.It -obj -.It -/usr/obj/`pwd -P` -.El -.Pp -The first directory that -.Nm -successfully changes into is used. -If either -.Ev MAKEOBJDIRPREFIX -or -.Ev MAKEOBJDIR -is set in the environment but -.Nm -is unable to change into the corresponding directory, -then the current directory is used -without checking the remainder of the list. -If they are undefined and -.Nm -is unable to change into any of the remaining three directories, -then the current directory is used. -Note, that -.Ev MAKEOBJDIRPREFIX -and -.Ev MAKEOBJDIR -must be environment variables and should not be set on -.Nm Ns 's -command line. -.Pp -The -.Nm -utility sets -.Va .OBJDIR -to the canonical path given by -.Xr getcwd 3 . -.It Va .MAKEFILE_LIST -As -.Nm -reads various makefiles, including the default files and any -obtained from the command line and -.Ic .include -and -.Ic .sinclude -directives, their names will be automatically appended to the -.Va .MAKEFILE_LIST -variable. -They are added right before -.Nm -begins to parse them, so that the name of the current makefile is the -last word in this variable. -.It Ev MAKEFLAGS -The environment variable -.Ev MAKEFLAGS -may initially contain anything that -may be specified on -.Nm Ns 's -command line, -including -.Fl f -option(s). -After processing, its contents are stored in the -.Va .MAKEFLAGS -global variable, although any -.Fl f -options are omitted. -Then all options and variable assignments specified on -.Nm Ns 's -command line, except for -.Fl f , -are appended to the -.Va .MAKEFLAGS -variable. -.Pp -Whenever -.Nm -executes a program, it sets -.Ev MAKEFLAGS -in the program's environment to the current value of the -.Va .MAKEFLAGS -global variable. -Thus, if -.Ev MAKEFLAGS -in -.Nm Ns 's -environment contains any -.Fl f -options, they will not be pushed down to child programs automatically. -The -.Nm -utility effectively filters out -.Fl f -options from the environment and command line although it -passes the rest of its options down to sub-makes via -.Ev MAKEFLAGS -by default. -.Pp -When passing macro definitions and flag arguments in the -.Ev MAKEFLAGS -environment variable, -space and tab characters are quoted by preceding them with a backslash. -When reading the -.Ev MAKEFLAGS -variable from the environment, -all sequences of a backslash and one of space or tab -are replaced just with their second character -without causing a word break. -Any other occurrences of a backslash are retained. -Groups of unquoted space, tab and newline characters cause word -breaking. -.It Va .MAKEFLAGS -Initially, this global variable contains -.Nm Ns 's -current run-time options from the environment -and command line as described above, under -.Ev MAKEFLAGS . -By modifying the contents of the -.Va .MAKEFLAGS -global variable, the makefile can alter the contents of the -.Ev MAKEFLAGS -environment variable made available for all programs which -.Nm -executes. -This includes adding -.Fl f -option(s). -The current value of -.Va .MAKEFLAGS -is just copied verbatim to -.Ev MAKEFLAGS -in the environment of child programs. -.Pp -Note that any options entered to -.Va .MAKEFLAGS -neither affect the current instance of -.Nm -nor show up in its own copy of -.Ev MAKEFLAGS -instantly. -However, they do show up in the -.Ev MAKEFLAGS -environment variable of programs executed by -.Nm . -On the other hand, a direct assignment to -.Ev MAKEFLAGS -neither affects the current instance of -.Nm -nor is passed down to -.Nm Ns 's -children. -Compare with the -.Ic .MAKEFLAGS -special target below. -.It Va MFLAGS -This variable is provided for backward compatibility and -contains all the options from the -.Ev MAKEFLAGS -environment variable plus any options specified on -.Nm Ns 's -command line. -.It Va .MAKE.PID -The process-id of -.Nm . -.It Va .MAKE.PPID -The parent process-id of -.Nm . -.It Va .MAKE.JOB.PREFIX -If -.Nm -is run with -.Fl j Fl v -then output for each target is prefixed with a token -.Ql --- target --- -the first part of which can be controlled via -.Va .MAKE.JOB.PREFIX . -.br -For example: -.Li .MAKE.JOB.PREFIX=${.newline}---${MAKE:T}[${.MAKE.PID}] -would produce tokens like -.Ql ---make[1234] target --- -or -.Li .MAKE.JOB.PREFIX=---pid[${.MAKE.PID}],ppid[${.MAKE.PPID}] -would produce tokens like -.Ql ---pid[56789],ppid[1234] target --- -making it easier to track the degree of parallelism being achieved. -.It Va .TARGETS -List of targets -.Nm -is currently building. -.It Va .INCLUDES -See -.Ic .INCLUDES -special target. -.It Va .LIBS -See -.Ic .LIBS -special target. -.It Va MACHINE -Name of the machine architecture -.Nm -is running on, obtained from the -.Ev MACHINE -environment variable, or through -.Xr uname 3 -if not defined. -.It Va MACHINE_ARCH -Name of the machine architecture -.Nm -was compiled for, defined at compilation time. -.It Va VPATH -Makefiles may assign a colon-delimited list of directories to -.Va VPATH . -These directories will be searched for source files by -.Nm -after it has finished parsing all input makefiles. -.El -.Ss Variable Modifiers -Variable expansion may be modified to select or modify each word of the -variable (where a -.Dq word -is whitespace-delimited sequence of characters). -The general format of a variable expansion is as follows: -.Pp -.Dl {variable[:modifier[:...]]} -.Pp -Each modifier begins with a colon and one of the following -special characters. -The colon may be escaped with a backslash -.Pq Ql \e . -.Bl -tag -width Cm -.Sm off -.It Cm :C No / Ar pattern Xo -.No / Ar replacement -.No / Op Cm 1g -.Xc -.Sm on -Modify each word of the value, -substituting every match of the extended regular expression -.Ar pattern -(see -.Xr re_format 7 ) -with the -.Xr ed 1 Ns \-style -.Ar replacement -string. -Normally, the first occurrence of the pattern in -each word of the value is changed. -The -.Ql 1 -modifier causes the substitution to apply to at most one word; the -.Ql g -modifier causes the substitution to apply to as many instances of the -search pattern as occur in the word or words it is found in. -Note that -.Ql 1 -and -.Ql g -are orthogonal; the former specifies whether multiple words are -potentially affected, the latter whether multiple substitutions can -potentially occur within each affected word. -.It Cm :E -Replaces each word in the variable with its suffix. -.It Cm :H -Replaces each word in the variable with everything but the last component. -.It Cm :L -Converts variable to lower-case letters. -(deprecated) -.It Cm :M Ns Ar pattern -Select only those words that match the rest of the modifier. -The standard shell wildcard characters -.Pf ( Ql * , -.Ql \&? , -and -.Ql [] ) -may -be used. -The wildcard characters may be escaped with a backslash -.Pq Ql \e . -.It Cm :N Ns Ar pattern -This is identical to -.Cm :M , -but selects all words which do not match -the rest of the modifier. -.It Cm :O -Order every word in the variable alphabetically. -.It Cm :Q -Quotes every shell meta-character in the variable, so that it can be passed -safely through recursive invocations of -.Nm . -.It Cm :R -Replaces each word in the variable with everything but its suffix. -.Sm off -.It Cm :S No / Ar old_string Xo -.No / Ar new_string -.No / Op Cm g -.Xc -.Sm on -Modify the first occurrence of -.Ar old_string -in each word of the variable's value, replacing it with -.Ar new_string . -If a -.Ql g -is appended to the last slash of the pattern, all occurrences -in each word are replaced. -If -.Ar old_string -begins with a caret -.Pq Ql ^ , -.Ar old_string -is anchored at the beginning of each word. -If -.Ar old_string -ends with a dollar sign -.Pq Ql $ , -it is anchored at the end of each word. -Inside -.Ar new_string , -an ampersand -.Pq Ql & -is replaced by -.Ar old_string . -Any character may be used as a delimiter for the parts of the modifier -string. -The anchoring, ampersand, and delimiter characters may be escaped with a -backslash -.Pq Ql \e . -.Pp -Variable expansion occurs in the normal fashion inside both -.Ar old_string -and -.Ar new_string -with the single exception that a backslash is used to prevent the expansion -of a dollar sign -.Pq Ql $ , -not a preceding dollar sign as is usual. -.It Ar :old_string=new_string -This is the -.At V -style variable substitution. -It must be the last modifier specified. -If -.Ar old_string -or -.Ar new_string -do not contain the pattern matching character -.Ar % -then it is assumed that they are -anchored at the end of each word, so only suffixes or entire -words may be replaced. -Otherwise -.Ar % -is the substring of -.Ar old_string -to be replaced in -.Ar new_string . -.It Cm :T -Replaces each word in the variable with its last component. -.It Cm :tl -Converts variable to lower-case letters. -.It Cm :tu -Converts variable to upper-case letters. -.It Cm :U -Converts variable to upper-case letters. -(deprecated) -.It Cm :u -Remove adjacent duplicate words (like -.Xr uniq 1 ) . -.El -.Sh DIRECTIVES, CONDITIONALS, AND FOR LOOPS -Directives, conditionals, and for loops reminiscent -of the C programming language are provided in -.Nm . -All such structures are identified by a line beginning with a single -dot -.Pq Ql \&. -character. -The following directives are supported: -.Bl -tag -width Ds -.It Ic .include Ar <file> -.It Ic .include Ar \*qfile\*q -Include the specified makefile. -Variables between the angle brackets -or double quotes are expanded to form the file name. -If angle brackets -are used, the included makefile is expected to be in the system -makefile directory. -If double quotes are used, the including -makefile's directory and any directories specified using the -.Fl I -option are searched before the system -makefile directory. -.It Ic .sinclude Ar <file> -.It Ic .sinclude Ar \*qfile\*q -Like -.Ic .include , -but silently ignored if the file cannot be found and opened. -.It Ic .undef Ar variable -Un-define the specified global variable. -Only global variables may be un-defined. -.It Ic .error Ar message -Terminate processing of the makefile immediately. -The filename of the -makefile, the line on which the error was encountered and the specified -message are printed to the standard error output and -.Nm -terminates with exit code 1. -Variables in the message are expanded. -.It Ic .warning Ar message -Emit a warning message. -The filename of the makefile, -the line on which the warning was encountered, -and the specified message are printed to the standard error output. -Variables in the message are expanded. -.El -.Pp -Conditionals are used to determine which parts of the Makefile -to process. -They are used similarly to the conditionals supported -by the C pre-processor. -The following conditionals are supported: -.Bl -tag -width Ds -.It Xo -.Ic .if -.Oo \&! Oc Ns Ar expression -.Op Ar operator expression ... -.Xc -Test the value of an expression. -.It Xo -.Ic .ifdef -.Oo \&! Oc Ns Ar variable -.Op Ar operator variable ... -.Xc -Test the value of a variable. -.It Xo -.Ic .ifndef -.Oo \&! Oc Ns Ar variable -.Op Ar operator variable ... -.Xc -Test the value of a variable. -.It Xo -.Ic .ifmake -.Oo \&! Oc Ns Ar target -.Op Ar operator target ... -.Xc -Test the target being built. -.It Xo -.Ic .ifnmake -.Oo \&! Oc Ns Ar target -.Op Ar operator target ... -.Xc -Test the target being built. -.It Ic .else -Reverse the sense of the last conditional. -.It Xo -.Ic .elif -.Oo \&! Oc Ns Ar expression -.Op Ar operator expression ... -.Xc -A combination of -.Ic .else -followed by -.Ic .if . -.It Xo -.Ic .elifdef -.Oo \&! Oc Ns Ar variable -.Op Ar operator variable ... -.Xc -A combination of -.Ic .else -followed by -.Ic .ifdef . -.It Xo -.Ic .elifndef -.Oo \&! Oc Ns Ar variable -.Op Ar operator variable ... -.Xc -A combination of -.Ic .else -followed by -.Ic .ifndef . -.It Xo -.Ic .elifmake -.Oo \&! Oc Ns Ar target -.Op Ar operator target ... -.Xc -A combination of -.Ic .else -followed by -.Ic .ifmake . -.It Xo -.Ic .elifnmake -.Oo \&! Oc Ns Ar target -.Op Ar operator target ... -.Xc -A combination of -.Ic .else -followed by -.Ic .ifnmake . -.It Ic .endif -End the body of the conditional. -.El -.Pp -The -.Ar operator -may be any one of the following: -.Bl -tag -width "Cm XX" -.It Cm || -Logical -.Tn OR -.It Cm && -Logical -.Tn AND ; -of higher precedence than -.Sq Ic || . -.El -.Pp -As in C, -.Nm -will only evaluate a conditional as far as is necessary to determine -its value. -Parentheses may be used to change the order of evaluation. -The boolean operator -.Sq Ic !\& -may be used to logically negate an entire -conditional. -It is of higher precedence than -.Sq Ic && . -.Pp -The value of -.Ar expression -may be any of the following: -.Bl -tag -width Ic -.It Ic defined -Takes a variable name as an argument and evaluates to true if the variable -has been defined. -.It Ic make -Takes a target name as an argument and evaluates to true if the target -was specified as part of -.Nm Ns 's -command line or was declared the default target (either implicitly or -explicitly, see -.Va .MAIN ) -before the line containing the conditional. -.It Ic empty -Takes a variable, with possible modifiers, and evaluates to true if -the expansion of the variable would result in an empty string. -.It Ic exists -Takes a file name as an argument and evaluates to true if the file exists. -The file is searched for on the system search path (see -.Va .PATH ) . -.It Ic target -Takes a target name as an argument and evaluates to true if the target -has been defined. -.El -.Pp -An -.Ar expression -may also be a numeric or string comparison: -in this case, the left-hand side -.Ar must be -a variable expansion, whereas the right-hand side can be a -constant or a variable expansion. -Variable expansion is performed on both sides, after which the resulting -values are compared. -A value is interpreted as hexadecimal if it is -preceded by 0x, otherwise it is decimal; octal numbers are not supported. -.Pp -String comparison can only use the -.Sq Ic == -or -.Sq Ic != -operators, whereas numeric values (both integer and floating point) -can also be compared using the -.Sq Ic > , -.Sq Ic >= , -.Sq Ic < -and -.Sq Ic <= -operators. -.Pp -If no relational operator (and right-hand value) are given, an implicit -.Sq Ic != 0 -is used. -However be very careful in using this feature especially -when the left-hand side variable expansion returns a string. -.Pp -When -.Nm -is evaluating one of these conditional expressions, and it encounters -a word it does not recognize, either the -.Dq make -or -.Dq defined -expression is applied to it, depending on the form of the conditional. -If the form is -.Ic .if , -.Ic .ifdef -or -.Ic .ifndef , -the -.Dq defined -expression is applied. -Similarly, if the form is -.Ic .ifmake -or -.Ic .ifnmake , -the -.Dq make -expression is applied. -.Pp -If the conditional evaluates to true the parsing of the makefile continues -as before. -If it evaluates to false, the following lines are skipped. -In both cases this continues until a -.Ic .else -or -.Ic .endif -is found. -.Pp -For loops are typically used to apply a set of rules to a list of files. -The syntax of a for loop is: -.Pp -.Bl -tag -width indent -compact -.It Ic .for Ar variable Ic in Ar expression -.It <make-rules> -.It Ic .endfor -.El -.Pp -After the for -.Ar expression -is evaluated, it is split into words. -The -iteration -.Ar variable -is successively set to each word, and substituted in the -.Ic make-rules -inside the body of the for loop. -.Sh COMMENTS -Comments begin with a hash -.Pq Ql # -character, anywhere but in a shell -command line, and continue to the end of the line. -.Sh SPECIAL SOURCES -.Bl -tag -width Ic -.It Ic .IGNORE -Ignore any errors from the commands associated with this target, exactly -as if they all were preceded by a dash -.Pq Ql \- . -.It Ic .MAKE -Execute the commands associated with this target even if the -.Fl n -or -.Fl t -options were specified. -Normally used to mark recursive -.Nm Ns 's . -.It Ic .NOTMAIN -Normally -.Nm -selects the first target it encounters as the default target to be built -if no target was specified. -This source prevents this target from being selected. -.It Ic .OPTIONAL -If a target is marked with this attribute and -.Nm -cannot figure out how to create it, it will ignore this fact and assume -the file is not needed or already exists. -.It Ic .PRECIOUS -When -.Nm -is interrupted, it removes any partially made targets. -This source prevents the target from being removed. -.It Ic .SILENT -Do not echo any of the commands associated with this target, exactly -as if they all were preceded by an at sign -.Pq Ql @ . -.It Ic .USE -Turn the target into -.Nm Ns 's -version of a macro. -When the target is used as a source for another target, the other target -acquires the commands, sources, and attributes (except for -.Ic .USE ) -of the -source. -If the target already has commands, the -.Ic .USE -target's commands are appended -to them. -.It Ic .WAIT -If special -.Ic .WAIT -source appears in a dependency line, the sources that precede it are -made before the sources that succeed it in the line. -Loops are not being -detected and targets that form loops will be silently ignored. -.El -.Sh SPECIAL TARGETS -Special targets may not be included with other targets, i.e., they must be -the only target specified. -.Bl -tag -width Ic -.It Ic .BEGIN -Any command lines attached to this target are executed before anything -else is done. -.It Ic .DEFAULT -This is sort of a -.Ic .USE -rule for any target (that was used only as a -source) that -.Nm -cannot figure out any other way to create. -Only the shell script is used. -The -.Ic .IMPSRC -variable of a target that inherits -.Ic .DEFAULT Ns 's -commands is set -to the target's own name. -.It Ic .END -Any command lines attached to this target are executed after everything -else is done. -.It Ic .IGNORE -Mark each of the sources with the -.Ic .IGNORE -attribute. -If no sources are specified, this is the equivalent of specifying the -.Fl i -option. -.It Ic .INCLUDES -A list of suffixes that indicate files that can be included in a source -file. -The suffix must have already been declared with -.Ic .SUFFIXES ; -any suffix so declared will have the directories on its search path (see -.Ic .PATH ) -placed in the -.Va .INCLUDES -special variable, each preceded by a -.Fl I -flag. -.It Ic .INTERRUPT -If -.Nm -is interrupted, the commands for this target will be executed. -.It Ic .LIBS -This does for libraries what -.Ic .INCLUDES -does for include files, except that the flag used is -.Fl L . -.It Ic .MAIN -If no target is specified when -.Nm -is invoked, this target will be built. -This is always set, either -explicitly, or implicitly when -.Nm -selects the default target, to give the user a way to refer to the default -target on the command line. -.It Ic .MAKEFILEDEPS -Enable the -.Dq Remaking Makefiles -functionality, as explained in the -.Sx REMAKING MAKEFILES -section below. -.It Ic .MAKEFLAGS -This target provides a way to specify flags for -.Nm -when the makefile is used. -The flags are as if typed to the shell, though the -.Fl f -option will have -no effect. -Flags (except for -.Fl f ) -and variable assignments specified as the source -for this target are also appended to the -.Va .MAKEFLAGS -internal variable. -Please note the difference between this target and the -.Va .MAKEFLAGS -internal variable: specifying an option or variable -assignment as the source for this target will affect -.Em both -the current makefile and all processes that -.Nm -executes. -.It Ic .MFLAGS -Same as above, for backward compatibility. -.\" XXX: NOT YET!!!! -.\" .It Ic .NOTPARALLEL -.\" The named targets are executed in non parallel mode. If no targets are -.\" specified, then all targets are executed in non parallel mode. -.It Ic .NOTPARALLEL -Disable parallel mode. -.It Ic .NO_PARALLEL -Same as above, for compatibility with other -.Nm pmake -variants. -.It Ic .ORDER -The named targets are made in sequence. -.\" XXX: NOT YET!!!! -.\" .It Ic .PARALLEL -.\" The named targets are executed in parallel mode. If no targets are -.\" specified, then all targets are executed in parallel mode. -.It Ic .PATH -The sources are directories which are to be searched for files not -found in the current directory. -If no sources are specified, any previously specified directories are -deleted. -Where possible, use of -.Ic .PATH -is preferred over use of the -.Va VPATH -variable. -.It Ic .PATH\fIsuffix\fR -The sources are directories which are to be searched for suffixed files -not found in the current directory. -The -.Nm -utility -first searches the suffixed search path, before reverting to the default -path if the file is not found there. -This form is required for -.Ic .LIBS -and -.Ic .INCLUDES -to work. -.It Ic .PHONY -Apply the -.Ic .PHONY -attribute to any specified sources. -Targets with this attribute are always -considered to be out of date. -.It Ic .POSIX -Adjust -.Nm Ap s -behavior to match the applicable -.Tn POSIX -specifications. -(Note this disables the -.Dq Remaking Makefiles -feature.) -.It Ic .PRECIOUS -Apply the -.Ic .PRECIOUS -attribute to any specified sources. -If no sources are specified, the -.Ic .PRECIOUS -attribute is applied to every -target in the file. -.It Ic .SHELL -Select another shell. -The sources of this target have the format -.Ar key Ns = Ns Ar value . -The -.Ar key -is one of: -.Bl -tag -width ".Va hasErrCtl" -.It Va path -Specify the path to the new shell. -.It Va name -Specify the name of the new shell. -This may be either one of the three builtin shells (see below) or any -other name. -.It Va quiet -Specify the shell command to turn echoing off. -.It Va echo -Specify the shell command to turn echoing on. -.It Va filter -Usually shells print the echo off command before turning echoing off. -This is the exact string that will be printed by the shell and is used -to filter the shell output to remove the echo off command. -.It Va echoFlag -The shell option that turns echoing on. -.It Va errFlag -The shell option to turn on error checking. -If error checking is on, the shell should exit if a command returns -a non-zero status. -.It Va hasErrCtl -True if the shell has error control. -.It Va check -If -.Va hasErrCtl -is true then this is the shell command to turn error checking on. -If -.Va hasErrCtl -is false then this is a command template to echo commands for which error -checking is disabled. -The template must contain a -.Ql %s . -.It Va ignore -If -.Va hasErrCtl -is true, this is the shell command to turn error checking off. -If -.Va hasErrCtl -is false, this is a command template to execute a command so that errors -are ignored. -The template must contain a -.Ql %s . -.It Va meta -This is a string of meta characters of the shell. -.It Va builtins -This is a string holding all the shell's builtin commands separated by blanks. -The -.Va meta -and -.Va builtins -strings are used in compat mode. -When a command line contains neither a meta -character nor starts with a shell builtin, it is executed directly without -invoking a shell. -When one of these strings (or both) is empty all commands are executed -through a shell. -.It Va unsetenv -If true, remove the -.Ev ENV -environment variable before executing any command. -This is useful for the Korn-shell -.Pq Nm ksh . -.El -.Pp -Values that are strings must be surrounded by double quotes. -Boolean values are specified as -.Ql T -or -.Ql Y -(in either case) to mean true. -Any other value is taken to mean false. -.Pp -There are several uses of the -.Ic .SHELL -target: -.Bl -bullet -.It -Selecting one of the builtin shells. -This is done by just specifying the name of the shell with the -.Va name -keyword. -It is also possible to modify the parameters of the builtin shell by just -specifying other keywords (except for -.Va path ) . -.It -Using another executable for one of the builtin shells. -This is done by specifying the path to the executable with the -.Va path -keyword. -If the last component is the same as the name of the builtin shell, no -name needs to be specified; if it is different, the name must be given: -.Bd -literal -offset indent -\&.SHELL: path="/usr/local/bin/sh" -.Ed -.Pp -selects the builtin shell -.Dq Li sh -but will execute it from -.Pa /usr/local/bin/sh . -Like in the previous case, it is possible to modify parameters of the builtin -shell by just specifying them. -.It -Using an entirely different shell. -This is done by specifying all keywords. -.El -.Pp -The builtin shells are -.Dq Li sh , -.Dq Li csh -and -.Dq Li ksh . -Because -.Fx -has no -.Nm ksh -in -.Pa /bin , -it is unwise to specify -.Va name Ns = Ns Qq Li ksh -without also specifying a path. -.It Ic .SILENT -Apply the -.Ic .SILENT -attribute to any specified sources. -If no sources are specified, the -.Ic .SILENT -attribute is applied to every -command in the file. -.It Ic .SUFFIXES -Each source specifies a suffix to -.Nm . -If no sources are specified, any previous specified suffixes are deleted. -.It Ic .WARN -Each source specifies a warning flag as previously described for the -.Fl x -command line option. -Warning flags specified on the command line take precedence over flags -specified in the makefile. -Also, command line warning flags are pushed to sub-makes through the -.Ev MAKEFLAGS -environment variables so that a warning flag specified on the command -line will influence all sub-makes. -Several flags can be specified on a single -.Ic .WARN -target by separating them with blanks. -.El -.Sh REMAKING MAKEFILES -If the special target -.Ic .MAKEFILEDEPS -exists in the Makefile, -.Nm -enables the -.Dq Remaking Makefiles -feature. -After reading Makefile and all the files that are included using -.Ic .include -or -.Ic .sinclude -directives (source Makefiles) -.Nm -considers each source Makefile as a target and tries to rebuild it. -Both explicit and implicit rules are checked and all source Makefiles -are updated if necessary. If any of the source Makefiles were rebuilt, -.Nm -restarts from clean state. -.Pp -To prevent infinite loops the following source Makefile targets are ignored: -.Bl -bullet -.It -.Ic :: -targets that have no prerequisites -.It -.Ic \&! -targets -.It -targets that have -.Ic .PHONY -or -.Ic .EXEC -attributes -.It -targets without prerequisites and without commands -.El -.Pp -When remaking a source Makefile options -.Ic -t -(touch target), -.Ic -q -(query mode), and -.Ic -n -(no exec) do not take effect, unless source Makefile is specified -explicitly as a target in -.Nm -command line. -.Pp -Additionally, system makefiles and -.Ic .depend -are not considered as Makefiles that can be rebuilt. -.Sh ENVIRONMENT -The -.Nm -utility uses the following environment variables, if they exist: -.Ev MACHINE , -.Ev MAKE , -.Ev MAKEFLAGS , -.Ev MAKEOBJDIR , -.Ev MAKEOBJDIRPREFIX , -and -.Ev MAKESYSPATH . -.Sh FILES -.Bl -tag -width /usr/share/doc/psd/12.make -compact -.It Pa .depend -list of dependencies -.It Pa Makefile -list of dependencies -.It Pa makefile -list of dependencies -.It Pa obj -object directory -.It Pa sys.mk -system makefile -.It Pa /usr/share/mk -default system makefile directory -.It Pa /usr/share/doc/psd/12.make -PMake tutorial -.It Pa /usr/obj -default -.Ev MAKEOBJDIRPREFIX -directory. -.It Pa /etc/make.conf -default path to -.Xr make.conf 5 -.El -.Sh EXAMPLES -List all included makefiles in order visited: -.Pp -.Dl "make -V .MAKEFILE_LIST | tr \e\ \e\en" -.Sh COMPATIBILITY -Older versions of -.Nm -used -.Ev MAKE -instead of -.Ev MAKEFLAGS . -This was removed for -.Tn POSIX -compatibility. -The internal variable -.Va MAKE -is set to the same value as -.Va .MAKE ; -support for this may be removed in the future. -.Pp -The use of the -.Cm :L -and -.Cm :U -modifiers are deprecated -in -.Fx 10.0 -and the more portable (among Pmake decedents) -.Cm :tl -and -.Cm :tu -should be used instead. -.Pp -Most of the more esoteric features of -.Nm -should probably be avoided for greater compatibility. -.Sh SEE ALSO -.Xr mkdep 1 , -.Xr make.conf 5 -.Rs -.%T "PMake - A Tutorial" -.Re -in -.Pa /usr/share/doc/psd/12.make -.Sh HISTORY -A -.Nm -command appeared in PWB UNIX. -.Sh BUGS -The determination of -.Va .OBJDIR -is contorted to the point of absurdity. -.Pp -In the presence of several -.Ic .MAIN -special targets, -.Nm -silently ignores all but the first. -.Pp -.Va .TARGETS -is not set to the default target when -.Nm -is invoked without a target name and no -.Ic .MAIN -special target exists. -.Pp -The evaluation of -.Ar expression -in a test is very simple-minded. -Currently, the only form that works is -.Ql .if ${VAR} op something . -For instance, you should write tests as -.Ql .if ${VAR} == "string" -not the other way around, which would give you an error. -.Pp -For loops are expanded before tests, so a fragment such as: -.Bd -literal -offset indent -\&.for ARCH in ${SHARED_ARCHS} -\&.if ${ARCH} == ${MACHINE} - ... -\&.endif -\&.endfor -.Ed -.Pp -will not work, and should be rewritten as: -.Bd -literal -offset indent -\&.for ARCH in ${SHARED_ARCHS} -\&.if ${MACHINE} == ${ARCH} - ... -\&.endif -\&.endfor -.Ed -.Pp -The parsing code is broken with respect to handling a semicolon -after a colon, so a fragment like this will fail: -.Bd -literal -offset indent -HDRS= foo.h bar.h - -all: -\&.for h in ${HDRS:S;^;${.CURDIR}/;} - ... -\&.endfor -.Ed -.Pp -A trailing backslash in a variable value defined on the command line causes -the delimiting space in the -.Ev MAKEFLAGS -environment variable to be preceded by that backslash. -That causes a submake to not treat that space as a word delimiter. -Fixing this requires a larger rewrite of the code handling command line -macros and assignments to -.Va .MAKEFLAGS . |