Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MAKE(1)			    General Commands Manual		       MAKE(1)

NAME
       make -- maintain	program	dependencies

SYNOPSIS
       make   [-ABPSXeiknpqrstv]  [-C  directory]  [-D	variable]  [-d	flags]
	    [-E	 variable]  [-f	 makefile]  [-I	  directory]   [-j   max_jobs]
	    [-m	directory] [-V variable] [-x warning_options] [variable=value]
	    [target ...]

DESCRIPTION
       The  make  utility is a program designed	to simplify the	maintenance of
       other programs.	Its input is a list of specifications  describing  de-
       pendency	relationships between the generation of	files and programs.

       First  of all, the initial list of specifications will be read from the
       system makefile,	sys.mk,	unless inhibited  with	the  -r	 option.   The
       standard	 sys.mk	as shipped with	FreeBSD	also handles make.conf(5), the
       default path to which can be altered via	the make variable __MAKE_CONF.

       Then the	first of BSDmakefile, makefile,	and Makefile that can be found
       in the current directory, object	directory  (see	 .OBJDIR),  or	search
       path  (see  the -I option) will be read for the main list of dependency
       specifications.	A different makefile or	list of	them can  be  supplied
       via the -f option(s).  Finally, if the file .depend can be found	in any
       of the aforesaid	locations, it will also	be read	(see mkdep(1)).

       When  make  searches for	a makefile, its	name takes precedence over its
       location.  For instance,	BSDmakefile in the object  directory  will  be
       favored over Makefile in	the current directory.

       The options are as follows:

       -A      Make  archive  errors  non-fatal, causing make to just skip the
	       remainder or all	of the archive and continue after  printing  a
	       message.

       -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 un-
	       less -j is used.

       -C directory
	       Change to directory before reading the makefiles	or doing  any-
	       thing  else.  If	multiple -C options are	specified, each	is in-
	       terpreted relative to the previous one: -C / -C etc is  equiva-
	       lent to -C /etc.

       -D variable
	       Define variable to be 1,	in the global context.

       -d flags
	       Turn  on	 debugging,  and specify which portions	of make	are to
	       print debugging information.  Argument flags is one or more  of
	       the following:

	       A       Print all possible debugging information; equivalent to
		       specifying all of the debugging flags.

	       a       Print debugging information about archive searching and
		       caching.

	       c       Print  debugging	 information about conditional evalua-
		       tion.

	       d       Print debugging information about  directory  searching
		       and caching.

	       f       Print  debugging	information about the execution	of for
		       loops.

	       g1      Print the input graph before making anything.

	       g2      Print the input graph after making everything,  or  be-
		       fore exiting on error.

	       j       Print  debugging	 information  about  running  multiple
		       shells.

	       l       Print commands in Makefiles regardless  of  whether  or
		       not  they  are  prefixed	 by  @ or other	"quiet"	flags.
		       Also known as "loud" behavior.

	       m       Print debugging information about making	 targets,  in-
		       cluding modification dates.

	       s       Print debugging information about suffix-transformation
		       rules.

	       t       Print  debugging	 information about target list mainte-
		       nance.

	       v       Print debugging information about variable assignment.

       -E variable
	       Specify a variable whose	environment value (if any) will	 over-
	       ride macro assignments within makefiles.

       -e      Specify	that  environment  values  override  macro assignments
	       within makefiles	for all	variables.

       -f makefile
	       Specify a makefile to read instead  of  the  default  one.   If
	       makefile	 is  not an absolute pathname, make will search	for it
	       as described above.  In case makefile is	`-', standard input is
	       read.  Multiple -f options can be supplied, and	the  makefiles
	       will  be	read in	that order.  Unlike the	other command-line op-
	       tions, -f is neither stored in .MAKEFLAGS nor  pushed  down  to
	       sub-makes  via  MAKEFLAGS.  See below for more details on these
	       variables.

       -I directory
	       Specify a directory in which to search for  makefiles  and  in-
	       cluded makefiles.  Multiple -I options can be specified to form
	       a  search path.	The system makefile directory (or directories,
	       see the -m option) is automatically appended  at	 the  tail  of
	       this path.

       -i      Ignore non-zero exit of shell commands in the makefile.	Equiv-
	       alent  to  specifying `-' before	each command line in the make-
	       file.

       -j max_jobs
	       Specify the maximum number of jobs that make may	 have  running
	       at  any	one time.  Turns compatibility mode off, unless	the -B
	       flag is also specified.

       -k      Continue	processing after errors	are encountered, but  only  on
	       those  targets  that do not depend on the target	whose creation
	       caused the error.

       -m directory
	       Specify a directory in which to search for the system  makefile
	       and  makefiles  included	 via the <...> style.  Multiple	-m op-
	       tions can be specified to form a	search path.  This  path  will
	       override	 the  default system include path, /usr/share/mk.  The
	       system include path will	always be appended to the search  path
	       used  for "..."-style inclusions	and makefile searches (see the
	       -I option).

	       If a file  or  directory	 name  in  the	-m  argument  (or  the
	       MAKESYSPATH environment variable) starts	with the string	".../"
	       then make 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	".../"
	       specification in	the -m argument.  If used, this	feature	allows
	       make to easily search in	the current source tree	for customized
	       sys.mk  files  (e.g.  by	using ".../mk/sys.mk" as an argument).
	       Note that a -C that are earlier	on  the	 command  line	affect
	       where -m	".../" searches.

       -n      Display	the commands that would	have been executed, but	do not
	       actually	execute	them.

       -P      Collate the output of a given job and display it	only when  the
	       job finishes, instead of	mixing the output of parallel jobs to-
	       gether.	This option has	no effect unless -j is used too.

       -p      Only  print  the	 input graph, not executing any	commands.  The
	       output is the same as -d	g1.  When combined with	-f  /dev/null,
	       only the	builtin	rules of make are displayed.

       -Q      Be extra	quiet.	For multi-job makes, this will cause file ban-
	       ners not	to be generated.

       -q      Do  not	execute	any commands, but exit 0 if the	specified tar-
	       gets are	up-to-date and 1, otherwise.

       -r      Do not process the system makefile.

       -S      Stop processing when an error is	encountered.   Default	behav-
	       iour.   This is needed to negate	the -k option during recursive
	       builds.

       -s      Do not echo any commands	as they	are executed.	Equivalent  to
	       specifying `@' before each command line in the makefile.

       -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.

       -V variable
	       Print make's idea of the	value of variable, in the global  con-
	       text.   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 variable contains a `$' then the value will be expanded  be-
	       fore printing.

       -v      Be extra	verbose.  Print	any extra information.

       -X      When  using  the	-V option to print the values of variables, do
	       not recursively expand the values.

       variable=value
	       Set the value of	the variable variable to value.

       -x warning_options
	       Specify extended	warning	options.  This option may be specified
	       several times.  A warning_option	can be prefixed	with  "no"  in
	       which  case  the	warning	is switched off.  The currently	avail-
	       able options are:

	       dirsyntax
		       Warn if anything	except blanks and comments follows  an
		       .endif or .else directive.

	       See also	the .WARN special target.

       There are seven different types of lines	in a makefile: file dependency
       specifications,	shell  commands,  variable assignments,	include	state-
       ments, conditional directives, for loops, and comments.

       In general, lines may be	continued from one line	to the next by	ending
       them  with  a backslash (`\').  The trailing newline character and ini-
       tial whitespace on the following	line  are  compressed  into  a	single
       space.

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
       "depend"	 on  the sources and are usually created from them.  The exact
       relationship between the	target and the source is determined by the op-
       erator that separates them.  The	three operators	are as follows:

       :     A target is considered out-of-date	if its	modification  time  is
	     less  than	those of any of	its sources.  Sources for a target ac-
	     cumulate over dependency lines when this operator is  used.   The
	     target is removed if make is interrupted.

       !     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 make is interrupted.

       ::    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 make is  in-
	     terrupted.

       Targets	and  sources  may  contain the shell wildcard expressions `?',
       `*', `[]' and `{}'.  The	expressions `?', `*' and `[]' 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 `{}' need not	neces-
       sarily be used to describe existing files.  Expansion is	 in  directory
       order, not alphabetically as done in the	shell.

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 must be preceded by a tab.  While	any target may appear on a de-
       pendency	line, only one of these	dependencies may be followed by	a cre-
       ation script, unless the	`::' operator is used.

       If  the	first characters of the	command	line are `@', `-', and/or `+',
       the command is treated specially.  A `@'	causes the command not	to  be
       echoed before it	is executed.  A	`-' causes any non-zero	exit status of
       the  command  line  to be ignored.  A `+' causes	the command to be exe-
       cuted even if -n	is specified on	the command line.

VARIABLE ASSIGNMENTS
       Variables in make are much like variables in the	shell, and, by	tradi-
       tion,  consist  of all upper-case letters.  The five operators that can
       be used to assign values	to variables are as follows:

       =       Assign the value	to the variable.  Any previous value is	 over-
	       ridden.

       +=      Append the value	to the current value of	the variable.

       ?=      Assign the value	to the variable	if it is not already defined.

       :=      Assign  with expansion, i.e., expand the	value before assigning
	       it to the variable.  Normally, expansion	is not done until  the
	       variable	is referenced.

       !=      Expand the value	and pass it to the shell for execution and as-
	       sign  the  result  to the variable.  Any	newlines in the	result
	       are replaced with spaces.

       Any whitespace before the assigned value	is removed; if	the  value  is
       being  appended,	 a  single space is inserted between the previous con-
       tents of	the variable and the appended value.

       Variables are expanded by surrounding the  variable  name  with	either
       curly  braces (`{}') or parentheses (`()') and preceding	it with	a dol-
       lar sign	(`$').	If the variable	name contains only  a  single  letter,
       the  surrounding	 braces	or parentheses are not required.  This shorter
       form is not recommended.

       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.

       The  four different classes of variables	(in order of increasing	prece-
       dence) are:

       Environment variables
	       Variables defined as part of make's environment.

       Global variables
	       Variables defined in the	makefile or in included	makefiles.

       Command line variables
	       Variables defined as part of the	command	line and variables ob-
	       tained  from  the  MAKEFLAGS  environment   variable   or   the
	       .MAKEFLAGS target.

       Local variables
	       Variables that are defined specific to a	certain	target.

       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	make.  However,	a com-
       mand-line variable actually replaces the	environment  variable  of  the
       same name if the	latter exists, which is	visible	to child programs.

       There are seven local variables in make:

       .ALLSRC	 The list of all sources for this target; also known as	`>'.

       .ARCHIVE	 The name of the archive file; also known as `!'.

       .IMPSRC	 The  name/path	 of  the source	from which the target is to be
		 transformed (the "implied" source); also known	as `<'.

       .MEMBER	 The name of the archive member; also known as `%'.

       .OODATE	 The list of sources for this target that were deemed  out-of-
		 date; also known as `?'.

       .PREFIX	 The  file  prefix  of the file, containing only the file por-
		 tion, no suffix or preceding directory	components; also known
		 as `*'.

       .TARGET	 The name of the target; also known as `@'.

       The shorter forms `@', `!', `<',	`%', `?', `>', and `*'	are  permitted
       for  backward compatibility and are not recommended.  The six variables
       `@F', `@D', `<F', `<D', `*F', and `*D' are permitted for	 compatibility
       with AT&T System	V UNIX makefiles and are not recommended.

       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 .TARGET, .PREFIX, .ARCHIVE, and .MEMBER.

       In  addition, make sets or knows	about the following internal variables
       or environment variables:

       $	       A single	dollar sign `$', i.e. `$$' expands to a	single
		       dollar sign.

       MAKE	       The name	that make was executed with (argv[0]).

       .CURDIR	       A path to the directory where make was  executed.   The
		       make  utility  sets .CURDIR to the canonical path given
		       by getcwd(3).

       .OBJDIR	       A path to the directory where the  targets  are	built.
		       At startup, make	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:

		       1.   ${MAKEOBJDIRPREFIX}/`pwd -P`
		       2.   ${MAKEOBJDIR}
		       3.   obj.${MACHINE}
		       4.   obj
		       5.   /usr/obj/`pwd -P`

		       The first directory that	make successfully changes into
		       is used.	 If either MAKEOBJDIRPREFIX or	MAKEOBJDIR  is
		       set  in	the  environment  but make is unable to	change
		       into the	corresponding directory, then the current  di-
		       rectory	is  used without checking the remainder	of the
		       list.  If they are undefined  and  make	is  unable  to
		       change  into  any  of  the remaining three directories,
		       then  the  current  directory  is  used.	  Note,	  that
		       MAKEOBJDIRPREFIX	 and  MAKEOBJDIR  must	be environment
		       variables and should not	be set on make's command line.

		       The make	utility	sets .OBJDIR  to  the  canonical  path
		       given by	getcwd(3).

       .MAKEFILE_LIST  As  make	reads various makefiles, including the default
		       files and  any  obtained	 from  the  command  line  and
		       .include	 and .sinclude directives, their names will be
		       automatically appended to the .MAKEFILE_LIST  variable.
		       They  are added right before make begins	to parse them,
		       so that the name	of the current makefile	 is  the  last
		       word in this variable.

       MAKEFLAGS       The  environment	 variable MAKEFLAGS may	initially con-
		       tain anything that may be specified on  make's  command
		       line,  including	 -f  option(s).	 After processing, its
		       contents	are stored in the .MAKEFLAGS global  variable,
		       although	 any -f	options	are omitted.  Then all options
		       and variable assignments	specified  on  make's  command
		       line,  except  for  -f,	are appended to	the .MAKEFLAGS
		       variable.

		       Whenever	make executes a	program, it sets MAKEFLAGS  in
		       the  program's  environment to the current value	of the
		       .MAKEFLAGS global  variable.   Thus,  if	 MAKEFLAGS  in
		       make's  environment  contains any -f options, they will
		       not be pushed down  to  child  programs	automatically.
		       The  make  utility  effectively	filters	out -f options
		       from the	 environment  and  command  line  although  it
		       passes  the  rest  of its options down to sub-makes via
		       MAKEFLAGS by default.

		       When passing macro definitions and  flag	 arguments  in
		       the MAKEFLAGS environment variable, space and tab char-
		       acters  are  quoted by preceding	them with a backslash.
		       When reading the	MAKEFLAGS variable from	 the  environ-
		       ment,  all sequences of a backslash and one of space or
		       tab are replaced	just with their	second character with-
		       out causing a word break.  Any other occurrences	 of  a
		       backslash  are retained.	 Groups	of unquoted space, tab
		       and newline characters cause word breaking.

       .MAKEFLAGS      Initially, this global variable contains	make's current
		       run-time	options	from the environment and command  line
		       as  described above, under MAKEFLAGS.  By modifying the
		       contents	of the .MAKEFLAGS global variable,  the	 make-
		       file  can  alter	the contents of	the MAKEFLAGS environ-
		       ment variable made available  for  all  programs	 which
		       make executes.  This includes adding -f option(s).  The
		       current	value of .MAKEFLAGS is just copied verbatim to
		       MAKEFLAGS in the	environment of child programs.

		       Note that any options entered to	.MAKEFLAGS neither af-
		       fect the	current	instance of make nor show  up  in  its
		       own copy	of MAKEFLAGS instantly.	 However, they do show
		       up  in  the  MAKEFLAGS environment variable of programs
		       executed	by make.  On the other hand, a direct  assign-
		       ment  to	MAKEFLAGS neither affects the current instance
		       of make nor is passed down to make's children.  Compare
		       with the	.MAKEFLAGS special target below.

       MFLAGS	       This variable is	provided  for  backward	 compatibility
		       and  contains  all the options from the MAKEFLAGS envi-
		       ronment variable	plus any options specified  on	make's
		       command line.

       .MAKE.PID       The process-id of make.

       .MAKE.PPID      The parent process-id of	make.

       .MAKE.JOB.PREFIX
		       If  make	 is run	with -j	-v then	output for each	target
		       is prefixed with	a token	`---  target  ---'  the	 first
		       part of which can be controlled via .MAKE.JOB.PREFIX.
		       For					      example:
		       .MAKE.JOB.PREFIX=${.newline}---${MAKE:T}[${.MAKE.PID}]
		       would produce tokens like `---make[1234]	target ---' or
		       .MAKE.JOB.PREFIX=---pid[${.MAKE.PID}],ppid[${.MAKE.PPID}]
		       would  produce  tokens  like  `---pid[56789],ppid[1234]
		       target  ---'  making  it	 easier	to track the degree of
		       parallelism being achieved.

       .TARGETS	       List of targets make is currently building.

       .INCLUDES       See .INCLUDES special target.

       .LIBS	       See .LIBS special target.

       MACHINE	       Name of the machine architecture	make  is  running  on,
		       obtained	 from  the  MACHINE  environment  variable, or
		       through uname(3)	if not defined.

       MACHINE_ARCH    Name of the machine architecture	make was compiled for,
		       defined at compilation time.

       VPATH	       Makefiles may assign a colon-delimited list of directo-
		       ries to VPATH.  These directories will be searched  for
		       source  files by	make after it has finished parsing all
		       input makefiles.

   Variable Modifiers
       Variable	expansion may be modified to select or modify each word	of the
       variable	(where a "word"	is whitespace-delimited	 sequence  of  charac-
       ters).  The general format of a variable	expansion is as	follows:

	     {variable[:modifier[:...]]}

       Each  modifier  begins  with  a	colon and one of the following special
       characters.  The	colon may be escaped with a backslash (`\').

       :C/pattern/replacement/[1g]
		   Modify each word of the value, substituting every match  of
		   the	extended regular expression pattern (see re_format(7))
		   with	the ed(1)-style	 replacement  string.	Normally,  the
		   first  occurrence  of the pattern in	each word of the value
		   is changed.	The `1'	modifier causes	 the  substitution  to
		   apply to at most one	word; the `g' modifier causes the sub-
		   stitution  to apply to as many instances of the search pat-
		   tern	as occur in the	word or	words it is  found  in.	  Note
		   that	 `1'  and  `g'	are  orthogonal;  the former specifies
		   whether multiple words are potentially affected, the	latter
		   whether multiple substitutions can potentially occur	within
		   each	affected word.

       :E	   Replaces each word in the variable with its suffix.

       :H	   Replaces each word in the variable with everything but  the
		   last	component.

       :L	   Converts variable to	lower-case letters.  (deprecated)

       :Mpattern   Select  only	 those	words that match the rest of the modi-
		   fier.  The standard shell wildcard  characters  (`*',  `?',
		   and	`[]') may be used.  The	wildcard characters may	be es-
		   caped with a	backslash (`\').

       :Npattern   This	is identical to	:M, but	selects	all words which	do not
		   match the rest of the modifier.

       :O	   Order every word in the variable alphabetically.

       :Q	   Quotes every	shell meta-character in	the variable, so  that
		   it  can  be	passed safely through recursive	invocations of
		   make.

       :R	   Replaces each word in the variable with everything but  its
		   suffix.

       :S/old_string/new_string/[g]
		   Modify  the	first occurrence of old_string in each word of
		   the variable's value, replacing it with new_string.	 If  a
		   `g'	is  appended to	the last slash of the pattern, all oc-
		   currences in	each word are replaced.	 If old_string	begins
		   with	a caret	(`^'), old_string is anchored at the beginning
		   of each word.  If old_string	ends with a dollar sign	(`$'),
		   it is anchored at the end of	each word.  Inside new_string,
		   an  ampersand (`&') is replaced by old_string.  Any charac-
		   ter may be used as a	delimiter for the parts	of  the	 modi-
		   fier	string.	 The anchoring,	ampersand, and delimiter char-
		   acters may be escaped with a	backslash (`\').

		   Variable expansion occurs in	the normal fashion inside both
		   old_string  and new_string with the single exception	that a
		   backslash is	used to	prevent	the expansion of a dollar sign
		   (`$'), not a	preceding dollar sign as is usual.

       :old_string=new_string
		   This	is the AT&T System V UNIX style	variable substitution.
		   It must be the last modifier	specified.  If	old_string  or
		   new_string  do not contain the pattern matching character %
		   then	it is assumed that they	are anchored  at  the  end  of
		   each	 word,	so  only  suffixes  or entire words may	be re-
		   placed.  Otherwise %	is the substring of old_string	to  be
		   replaced in new_string.

       :T	   Replaces each word in the variable with its last component.

       :tl	   Converts variable to	lower-case letters.

       :tu	   Converts variable to	upper-case letters.

       :U	   Converts variable to	upper-case letters.  (deprecated)

       :u	   Remove adjacent duplicate words (like uniq(1)).

DIRECTIVES, CONDITIONALS, AND FOR LOOPS
       Directives,  conditionals,  and for loops reminiscent of	the C program-
       ming language are provided in make.  All	such structures	are identified
       by a line beginning with	a single dot (`.') character.	The  following
       directives are supported:

       .include	<file>

       .include	"file"
	       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 -I option are searched  before  the	system
	       makefile	directory.

       .sinclude <file>

       .sinclude "file"
	       Like .include, but silently ignored if the file cannot be found
	       and opened.

       .undef variable
	       Un-define the specified global variable.	 Only global variables
	       may be un-defined.

       .error 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 make	terminates with	exit code 1.  Variables	in the
	       message are expanded.

       .warning	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.

       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:

       .if [!]expression [operator expression ...]
	       Test the	value of an expression.

       .ifdef [!]variable [operator variable ...]
	       Test the	value of a variable.

       .ifndef [!]variable [operator variable ...]
	       Test the	value of a variable.

       .ifmake [!]target [operator target ...]
	       Test the	target being built.

       .ifnmake	[!]target [operator target ...]
	       Test the	target being built.

       .else   Reverse the sense of the	last conditional.

       .elif [!]expression [operator expression	...]
	       A combination of	.else followed by .if.

       .elifdef	[!]variable [operator variable ...]
	       A combination of	.else followed by .ifdef.

       .elifndef [!]variable [operator variable	...]
	       A combination of	.else followed by .ifndef.

       .elifmake [!]target [operator target ...]
	       A combination of	.else followed by .ifmake.

       .elifnmake [!]target [operator target ...]
	       A combination of	.else followed by .ifnmake.

       .endif  End the body of the conditional.

       The operator may	be any one of the following:

       ||     Logical OR

       &&     Logical AND; of higher precedence	than `||'.

       As  in  C, make 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 `!' may be used to  logically	negate
       an entire conditional.  It is of	higher precedence than `&&'.

       The value of expression may be any of the following:

       defined	   Takes  a variable name as an	argument and evaluates to true
		   if the variable has been defined.

       make	   Takes a target name as an argument and evaluates to true if
		   the target was specified as part of make's command line  or
		   was	declared  the default target (either implicitly	or ex-
		   plicitly, see .MAIN)	before the line	containing the	condi-
		   tional.

       empty	   Takes a variable, with possible modifiers, and evaluates to
		   true	 if  the  expansion of the variable would result in an
		   empty string.

       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 .PATH).

       target	   Takes a target name as an argument and evaluates to true if
		   the target has been defined.

       An expression may also be a numeric or string comparison: in this case,
       the left-hand side 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,	other-
       wise it is decimal; octal numbers are not supported.

       String comparison can only use the `==' or `!=' operators, whereas  nu-
       meric values (both integer and floating point) can also be compared us-
       ing the `>', `>=', `<' and `<=' operators.

       If no relational	operator (and right-hand value)	are given, an implicit
       `!=  0'	is  used.  However be very careful in using this feature espe-
       cially when the left-hand side variable expansion returns a string.

       When make is evaluating one of these conditional	 expressions,  and  it
       encounters a word it does not recognize,	either the "make" or "defined"
       expression  is applied to it, depending on the form of the conditional.
       If the form is .if, .ifdef or .ifndef, the "defined" expression is  ap-
       plied.	Similarly,  if the form	is .ifmake or .ifnmake,	the "make" ex-
       pression	is applied.

       If the conditional evaluates to true the	parsing	of the	makefile  con-
       tinues  as  before.   If	it evaluates to	false, the following lines are
       skipped.	 In both cases this continues  until  a	 .else	or  .endif  is
       found.

       For  loops  are	typically  used	 to  apply a set of rules to a list of
       files.  The syntax of a for loop	is:

       .for variable in	expression
       <make-rules>
       .endfor

       After the for expression	is evaluated, it is split into words.  The it-
       eration variable	is successively	set to each word, and  substituted  in
       the make-rules inside the body of the for loop.

COMMENTS
       Comments	 begin	with  a	 hash (`#') character, anywhere	but in a shell
       command line, and continue to the end of	the line.

SPECIAL	SOURCES
       .IGNORE	   Ignore any errors from the commands	associated  with  this
		   target,  exactly  as	 if  they  all were preceded by	a dash
		   (`-').

       .MAKE	   Execute the commands	associated with	this  target  even  if
		   the -n or -t	options	were specified.	 Normally used to mark
		   recursive make's.

       .NOTMAIN	   Normally make 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.

       .OPTIONAL   If a	target is marked with this attribute and  make	cannot
		   figure  out	how to create it, it will ignore this fact and
		   assume the file is not needed or already exists.

       .PRECIOUS   When	make is	interrupted, it	 removes  any  partially  made
		   targets.   This  source  prevents the target	from being re-
		   moved.

       .SILENT	   Do not echo any of the commands associated with  this  tar-
		   get,	 exactly  as  if  they all were	preceded by an at sign
		   (`@').

       .USE	   Turn	the target into	make'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  (ex-
		   cept	 for  .USE)  of	the source.  If	the target already has
		   commands, the .USE target's commands	are appended to	them.

       .WAIT	   If special .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.

SPECIAL	TARGETS
       Special targets may not be included with	other targets, i.e., they must
       be the only target specified.

       .BEGIN	   Any	command	lines attached to this target are executed be-
		   fore	anything else is done.

       .DEFAULT	   This	is sort	of a .USE rule for any target (that  was  used
		   only	as a source) that make cannot figure out any other way
		   to  create.	 Only  the  shell script is used.  The .IMPSRC
		   variable of a target	that inherits .DEFAULT's  commands  is
		   set to the target's own name.

       .END	   Any	command	lines attached to this target are executed af-
		   ter everything else is done.

       .IGNORE	   Mark	each of	the sources with the .IGNORE attribute.	 If no
		   sources are specified, this is the equivalent of specifying
		   the -i option.

       .INCLUDES   A list of suffixes that indicate files that can be included
		   in a	source file.  The suffix must have  already  been  de-
		   clared with .SUFFIXES; any suffix so	declared will have the
		   directories	on  its	 search	path (see .PATH) placed	in the
		   .INCLUDES special variable, each preceded by	a -I flag.

       .INTERRUPT  If make is interrupted, the commands	for this  target  will
		   be executed.

       .LIBS	   This	 does  for  libraries  what .INCLUDES does for include
		   files, except that the flag used is -L.

       .MAIN	   If no target	is specified when make is invoked, this	target
		   will	be built.  This	is always set, either  explicitly,  or
		   implicitly  when  make  selects the default target, to give
		   the user a way to refer to the default target on  the  com-
		   mand	line.

       .MAKEFILEDEPS
		   Enable the "Remaking	Makefiles" functionality, as explained
		   in the "REMAKING MAKEFILES" section below.

       .MAKEFLAGS  This	 target	 provides a way	to specify flags for make when
		   the makefile	is used.  The flags are	as  if	typed  to  the
		   shell,  though  the	-f  option will	have no	effect.	 Flags
		   (except for -f) and variable	assignments specified  as  the
		   source  for this target are also appended to	the .MAKEFLAGS
		   internal variable.  Please note the difference between this
		   target and the .MAKEFLAGS internal variable:	specifying  an
		   option or variable assignment as the	source for this	target
		   will	 affect	 both  the  current makefile and all processes
		   that	make executes.

       .MFLAGS	   Same	as above, for backward compatibility.

       .NOTPARALLEL
		   Disable parallel mode.

       .NO_PARALLEL
		   Same	as above, for compatibility with other pmake variants.

       .ORDER	   The named targets are made in sequence.

       .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 .PATH is	preferred over
		   use of the VPATH variable.

       .PATHsuffix
		   The sources are directories which are to  be	 searched  for
		   suffixed  files  not	 found	in the current directory.  The
		   make	utility	first searches the suffixed search  path,  be-
		   fore	reverting to the default path if the file is not found
		   there.   This  form	is required for	.LIBS and .INCLUDES to
		   work.

       .PHONY	   Apply the .PHONY attribute to any specified sources.	  Tar-
		   gets	with this attribute are	always considered to be	out of
		   date.

       .POSIX	   Adjust make's behavior to match the applicable POSIX	speci-
		   fications.	(Note  this  disables the "Remaking Makefiles"
		   feature.)

       .PRECIOUS   Apply the .PRECIOUS attribute to any	specified sources.  If
		   no sources are specified, the .PRECIOUS  attribute  is  ap-
		   plied to every target in the	file.

       .SHELL	   Select  another shell.  The sources of this target have the
		   format key=value.  The key is one of:

		   path	      Specify the path to the new shell.

		   name	      Specify the name of the new shell.  This may  be
			      either  one of the three builtin shells (see be-
			      low) or any other	name.

		   quiet      Specify the shell	command	to turn	echoing	off.

		   echo	      Specify the shell	command	to turn	echoing	on.

		   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.

		   echoFlag   The shell	option that turns echoing on.

		   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.

		   hasErrCtl  True if the shell	has error control.

		   check      If hasErrCtl is true then	this is	the shell com-
			      mand to turn error checking on.  If hasErrCtl is
			      false  then  this	 is a command template to echo
			      commands for which error checking	 is  disabled.
			      The template must	contain	a `%s'.

		   ignore     If  hasErrCtl is true, this is the shell command
			      to turn error checking  off.   If	 hasErrCtl  is
			      false,  this  is a command template to execute a
			      command so that errors are  ignored.   The  tem-
			      plate must contain a `%s'.

		   meta	      This  is	a  string  of  meta  characters	of the
			      shell.

		   builtins   This is a	string holding all the shell's builtin
			      commands separated  by  blanks.	The  meta  and
			      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.

		   unsetenv   If true, remove the ENV environment variable be-
			      fore  executing any command.  This is useful for
			      the Korn-shell (ksh).

		   Values that	are  strings  must  be	surrounded  by	double
		   quotes.  Boolean values are specified as `T'	or `Y' (in ei-
		   ther	 case) to mean true.  Any other	value is taken to mean
		   false.

		   There are several uses of the .SHELL	target:

		      Selecting one of	the builtin shells.  This is  done  by
		       just  specifying	 the  name  of the shell with the name
		       keyword.	 It is also possible to	modify the  parameters
		       of  the builtin shell by	just specifying	other keywords
		       (except for path).

		      Using another executable	for one	of the builtin shells.
		       This is done by specifying the path to  the  executable
		       with  the  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:

			     .SHELL: path="/usr/local/bin/sh"

		       selects the builtin shell "sh" but will execute it from
		       /usr/local/bin/sh.   Like  in  the previous case, it is
		       possible	to modify parameters of	the builtin  shell  by
		       just specifying them.

		      Using  an  entirely  different  shell.  This is done by
		       specifying all keywords.

		   The builtin shells are  "sh",  "csh"	 and  "ksh".   Because
		   FreeBSD  has	 no  ksh  in  /bin,  it	 is  unwise to specify
		   name="ksh" without also specifying a	path.

       .SILENT	   Apply the .SILENT attribute to any specified	 sources.   If
		   no  sources are specified, the .SILENT attribute is applied
		   to every command in the file.

       .SUFFIXES   Each	source specifies a suffix to make.  If no sources  are
		   specified, any previous specified suffixes are deleted.

       .WARN	   Each	 source	 specifies  a  warning	flag as	previously de-
		   scribed for the -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 MAKEFLAGS envi-
		   ronment variables so	that a warning flag specified  on  the
		   command  line  will influence all sub-makes.	 Several flags
		   can be specified on a single	 .WARN	target	by  separating
		   them	with blanks.

REMAKING MAKEFILES
       If  the	special	 target	.MAKEFILEDEPS exists in	the Makefile, make en-
       ables the "Remaking Makefiles" feature.	After reading Makefile and all
       the files that are included  using  .include  or	 .sinclude  directives
       (source	Makefiles) make	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, make restarts from clean	state.

       To prevent infinite loops the following source Makefile targets are ig-
       nored:

          :: targets that have	no prerequisites

          ! targets

          targets that	have .PHONY or .EXEC attributes

          targets without prerequisites and without commands

       When remaking a source Makefile options -t (touch  target),  -q	(query
       mode),  and  -n (no exec) do not	take effect, unless source Makefile is
       specified explicitly as a target	in make	command	line.

       Additionally, system makefiles and .depend are not considered as	 Make-
       files that can be rebuilt.

ENVIRONMENT
       The  make utility uses the following environment	variables, if they ex-
       ist:  MACHINE,  MAKE,  MAKEFLAGS,  MAKEOBJDIR,  MAKEOBJDIRPREFIX,   and
       MAKESYSPATH.

FILES
       .depend			   list	of dependencies
       Makefile			   list	of dependencies
       makefile			   list	of dependencies
       obj			   object directory
       sys.mk			   system makefile
       /usr/share/mk		   default system makefile directory
       /usr/share/doc/psd/12.make  PMake tutorial
       /usr/obj			   default MAKEOBJDIRPREFIX directory.
       /etc/make.conf		   default path	to make.conf(5)

EXAMPLES
       List all	included makefiles in order visited:

	     make -V .MAKEFILE_LIST | tr \  \\n

COMPATIBILITY
       Older  versions	of  make used MAKE instead of MAKEFLAGS.  This was re-
       moved for POSIX compatibility.  The internal variable MAKE  is  set  to
       the same	value as .MAKE;	support	for this may be	removed	in the future.

       The  use	 of the	:L and :U modifiers are	deprecated in FreeBSD 10.0 and
       the more	portable (among	Pmake decedents) :tl and :tu  should  be  used
       instead.

       Most  of	 the more esoteric features of make should probably be avoided
       for greater compatibility.

SEE ALSO
       mkdep(1), make.conf(5)

       PMake - A Tutorial.  in /usr/share/doc/psd/12.make

HISTORY
       A make command appeared in PWB UNIX.

BUGS
       The determination of .OBJDIR is contorted to the	point of absurdity.

       In the presence of several .MAIN	special	targets, make silently ignores
       all but the first.

       .TARGETS	is not set to the default target when make is invoked  without
       a target	name and no .MAIN special target exists.

       The  evaluation	of  expression	in a test is very simple-minded.  Cur-
       rently, the only	form that works	is `.if	${VAR} op something'.  For in-
       stance, you should write	tests as `.if ${VAR} ==	string'	not the	 other
       way around, which would give you	an error.

       For loops are expanded before tests, so a fragment such as:

	     .for ARCH in ${SHARED_ARCHS}
	     .if ${ARCH} == ${MACHINE}
		  ...
	     .endif
	     .endfor

       will not	work, and should be rewritten as:

	     .for ARCH in ${SHARED_ARCHS}
	     .if ${MACHINE} == ${ARCH}
		  ...
	     .endif
	     .endfor

       The parsing code	is broken with respect to handling a semicolon after a
       colon, so a fragment like this will fail:

	     HDRS=   foo.h bar.h

	     all:
	     .for h in ${HDRS:S;^;${.CURDIR}/;}
		  ...
	     .endfor

       A  trailing  backslash  in a variable value defined on the command line
       causes the delimiting space in the 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	.MAKEFLAGS.

FreeBSD	ports 15.0		 May 30, 2012			       MAKE(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=fmake&sektion=1&manpath=FreeBSD+Ports+15.0>

home | help