diff options
author | sjg <sjg@FreeBSD.org> | 2012-10-25 23:18:05 +0000 |
---|---|---|
committer | sjg <sjg@FreeBSD.org> | 2012-10-25 23:18:05 +0000 |
commit | f8768a6120b46ed906f39884eecc8b8ec328fd98 (patch) | |
tree | 874aa155fac4900513e34c588047739fa2bc7141 | |
parent | 83b5dc03eb3b4233e7a15da88f6ed00abcb3575f (diff) | |
download | FreeBSD-src-f8768a6120b46ed906f39884eecc8b8ec328fd98.zip FreeBSD-src-f8768a6120b46ed906f39884eecc8b8ec328fd98.tar.gz |
Merge bmake-20121010
Approved by: marcel (mentor)
-rw-r--r-- | contrib/bmake/ChangeLog | 24 | ||||
-rw-r--r-- | contrib/bmake/Makefile.in | 27 | ||||
-rw-r--r-- | contrib/bmake/bmake.1 | 34 | ||||
-rw-r--r-- | contrib/bmake/bmake.cat1 | 1325 | ||||
-rw-r--r-- | contrib/bmake/bsd.after-import.mk | 12 | ||||
-rw-r--r-- | contrib/bmake/compat.c | 7 | ||||
-rw-r--r-- | contrib/bmake/make.1 | 13 | ||||
-rw-r--r-- | usr.bin/bmake/Makefile | 20 |
8 files changed, 119 insertions, 1343 deletions
diff --git a/contrib/bmake/ChangeLog b/contrib/bmake/ChangeLog index cb2532a..933e435 100644 --- a/contrib/bmake/ChangeLog +++ b/contrib/bmake/ChangeLog @@ -1,3 +1,27 @@ +2012-10-10 Simon J. Gerraty <sjg@bad.crufty.net> + + * Makefile.in (MAKE_VERSION): 20121010 + o protect syntax that only bmake parses correctly. + o remove auto setting of FORCE_MACHINE, use configure's + --with-force-machine=whatever if that is desired. + +2012-10-08 Simon J. Gerraty <sjg@bad.crufty.net> + + * Makefile.in: do not lose history from make.1 when generating bmake.1 + +2012-10-07 Simon J. Gerraty <sjg@bad.crufty.net> + + * Makefile.in (MAKE_VERSION): 20121007 + Merge with NetBSD make, pick up + o compat.c: ignore empty commands - same as jobs mode. + o make.1: document meta chars that cause use of shell + +2012-09-11 Simon J. Gerraty <sjg@bad.crufty.net> + + * Makefile.in (MAKE_VERSION): bump version to 20120911 + * bsd.after-import.mk: include Makefile.inc early and allow it to + override PROG + 2012-08-31 Simon J. Gerraty <sjg@bad.crufty.net> * Makefile.in (MAKE_VERSION): bump version to 20120831 diff --git a/contrib/bmake/Makefile.in b/contrib/bmake/Makefile.in index 42da646..4cb55dd 100644 --- a/contrib/bmake/Makefile.in +++ b/contrib/bmake/Makefile.in @@ -1,7 +1,7 @@ # $NetBSD: Makefile,v 1.56 2012/05/30 21:54:23 sjg Exp $ # @(#)Makefile 5.2 (Berkeley) 12/28/90 -# $Id: Makefile.in,v 1.170 2012/08/31 06:46:22 sjg Exp $ +# $Id: Makefile.in,v 1.174 2012/10/10 18:46:24 sjg Exp $ PROG= bmake SRCS= arch.c buf.c compat.c cond.c dir.c for.c hash.c job.c main.c \ @@ -21,7 +21,7 @@ srcdir= @srcdir@ CC?= @CC@ # Base version on src date -MAKE_VERSION= 20120831 +MAKE_VERSION= 20121010 MACHINE=@machine@ MACHINE_ARCH=@machine_arch@ DEFAULT_SYS_PATH = @default_sys_path@ @@ -71,10 +71,9 @@ SUBDIR= PSD.doc .endif .endif +.if defined(.PARSEDIR) +# we cannot rely on anything but bmake to parse this correctly. .if empty(isBSD44:M${OS}) -# XXX not sure if we still want this given that configure -# lets us force or not the definition of MACHINE. -CFLAGS_main.o+= "-DFORCE_MACHINE=\"${MACHINE}\"" MANTARGET=cat INSTALL?=${srcdir}/install-sh .if (${MACHINE} == "sun386") @@ -85,7 +84,7 @@ SRCS+= sigcompat.c CFLAGS+= -DSIGNAL_FLAGS=SA_RESTART .endif .endif -.if defined(.PARSEDIR) + .if make(obj) || make(clean) SUBDIR+= unit-tests .endif @@ -104,14 +103,18 @@ EXTRACT_MAN=no MAN=${PROG}.1 .if (${PROG} != "make") -${MAN}: make.1 - @echo making ${PROG}.1 - @sed -e 's/^.Nx/NetBSD/' -e '/^.Nm/s/make/${PROG}/' -e '/^.Sh HISTORY/,$$d' ${srcdir}/make.1 > $@ - @(echo ".Sh HISTORY"; \ - echo ".Nm"; \ +my.history: ${MAKEFILE} + @(echo ".Nm"; \ echo "is derived from NetBSD"; \ echo ".Xr make 1 ."; \ - echo It uses autoconf to facilitate portability to other platforms.) >> $@ + echo "It uses autoconf to facilitate portability to other platforms."; \ + echo ".Pp") > $@ + +${MAN}: make.1 my.history + @echo making ${PROG}.1 + @sed -e 's/^.Nx/NetBSD/' -e '/^.Nm/s/make/${PROG}/' \ + -e '/^.Sh HISTORY/rmy.history' \ + -e '/^.Sh HISTORY/,$$s,^.Nm,make,' ${.CURDIR}/make.1 > $@ .endif diff --git a/contrib/bmake/bmake.1 b/contrib/bmake/bmake.1 index bd67089..d7ed08a 100644 --- a/contrib/bmake/bmake.1 +++ b/contrib/bmake/bmake.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.206 2012/08/30 22:35:37 wiz Exp $ +.\" $NetBSD: make.1,v 1.209 2012/10/08 15:09:48 christos Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 .\" -.Dd August 30, 2012 +.Dd October 8, 2012 .Dt MAKE 1 .Os .Sh NAME @@ -2042,6 +2042,13 @@ or To be compatible with Makefiles that do this, one can use .Fl B to disable this behavior. +.Pp +In compatibility mode, each command is run in a separate process. +If the command contains any shell meta characters +.Pq Ql #=|^(){};&<>*?[]:$`\e\en +it will be passed to the shell, otherwise +.Nm +will attempt direct execution. .Sh SEE ALSO .Xr mkdep 1 .Sh HISTORY @@ -2049,3 +2056,26 @@ to disable this behavior. is derived from NetBSD .Xr make 1 . It uses autoconf to facilitate portability to other platforms. +.Pp +A +make +command appeared in +.At v7 . +This +make +implementation is based on Adam De Boor's pmake program which was written +for Sprite at Berkeley. +It was designed to be a parallel distributed make running jobs on different +machines using a daemon called +.Dq customs . +.Sh BUGS +The +make +syntax is difficult to parse without actually acting of the data. +For instance finding the end of a variable use should involve scanning each +the modifiers using the correct terminator for each field. +In many places +make +just counts {} and () in order to find the end of a variable expansion. +.Pp +There is no way of escaping a space character in a filename. diff --git a/contrib/bmake/bmake.cat1 b/contrib/bmake/bmake.cat1 index 0c2e7f6..2d54ee2 100644 --- a/contrib/bmake/bmake.cat1 +++ b/contrib/bmake/bmake.cat1 @@ -1301,1321 +1301,30 @@ CCOOMMPPAATTIIBBIILLIITTYY ``chdir''. To be compatible with Makefiles that do this, one can use --BB to disable this behavior. + In compatibility mode, each command is run in a separate process. If the + command contains any shell meta characters (`#=|^(){};&<>*?[]:$`\\n') it + will be passed to the shell, otherwise bbmmaakkee will attempt direct execu- + tion. + SSEEEE AALLSSOO mkdep(1) HHIISSTTOORRYY bbmmaakkee is derived from NetBSD make(1). It uses autoconf to facilitate -MAKE(1) NetBSD General Commands Manual MAKE(1) - portability to other platforms. -NNAAMMEE - bbmmaakkee -- maintain program dependencies - -SSYYNNOOPPSSIISS - bbmmaakkee [--BBeeiikkNNnnqqrrssttWWXX] [--CC _d_i_r_e_c_t_o_r_y] [--DD _v_a_r_i_a_b_l_e] [--dd _f_l_a_g_s] - [--ff _m_a_k_e_f_i_l_e] [--II _d_i_r_e_c_t_o_r_y] [--JJ _p_r_i_v_a_t_e] [--jj _m_a_x___j_o_b_s] - [--mm _d_i_r_e_c_t_o_r_y] [--TT _f_i_l_e] [--VV _v_a_r_i_a_b_l_e] [_v_a_r_i_a_b_l_e_=_v_a_l_u_e] - [_t_a_r_g_e_t _._._.] - -DDEESSCCRRIIPPTTIIOONN - bbmmaakkee is a program designed to simplify the maintenance of other pro- - grams. Its input is a list of specifications as to the files upon which - programs and other files depend. If no --ff _m_a_k_e_f_i_l_e makefile option is - given, bbmmaakkee will try to open `_m_a_k_e_f_i_l_e' then `_M_a_k_e_f_i_l_e' in order to find - the specifications. If the file `_._d_e_p_e_n_d' exists, it is read (see - mkdep(1)). - - This manual page is intended as a reference document only. For a more - thorough description of bbmmaakkee and makefiles, please refer to _P_M_a_k_e _- _A - _T_u_t_o_r_i_a_l. - - bbmmaakkee will prepend the contents of the _M_A_K_E_F_L_A_G_S environment variable to - the command line arguments before parsing them. - - The options are as follows: - - --BB 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. - - --CC _d_i_r_e_c_t_o_r_y - Change to _d_i_r_e_c_t_o_r_y before reading the makefiles or doing any- - thing else. If multiple --CC options are specified, each is inter- - preted relative to the previous one: --CC _/ --CC _e_t_c is equivalent to - --CC _/_e_t_c. - - --DD _v_a_r_i_a_b_l_e - Define _v_a_r_i_a_b_l_e to be 1, in the global context. - - --dd _[_-_]_f_l_a_g_s - Turn on debugging, and specify which portions of bbmmaakkee are to - print debugging information. Unless the flags are preceded by - `-' they are added to the _M_A_K_E_F_L_A_G_S environment variable and will - be processed by any child make processes. By default, debugging - information is printed to standard error, but this can be changed - using the _F debugging flag. The debugging output is always - unbuffered; in addition, if debugging is enabled but debugging - output is not directed to standard output, then the standard out- - put is line buffered. _F_l_a_g_s 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 current working direc- - tory. - - _c Print debugging information about conditional evaluation. - - _d Print debugging information about directory searching and - caching. - - _e Print debugging information about failed commands and - targets. - - _F[++]_f_i_l_e_n_a_m_e - Specify where debugging output is written. This must be - the last flag, because it consumes the remainder of the - argument. If the character immediately after the `F' - flag is `+', then the file will be opened in append mode; - otherwise the file will be overwritten. If the file name - is `stdout' or `stderr' then debugging output will be - written to the standard output or standard error output - file descriptors respectively (and the `+' option has no - effect). Otherwise, the output will be written to the - named file. If the file name ends `.%d' then the `%d' is - replaced by the pid. - - _f Print debugging information about loop evaluation. - - _g_1 Print the input graph before making anything. - - _g_2 Print the input graph after making everything, or before - exiting on error. - - _g_3 Print the input graph before 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 "meta" mode decisions - about targets. - - _m Print debugging information about making targets, includ- - ing modification dates. - - _n Don't delete the temporary command scripts created when - running commands. These temporary scripts are created in - the directory referred to by the TMPDIR environment vari- - able, or in _/_t_m_p if TMPDIR is unset or set to the empty - string. The temporary scripts are created by mkstemp(3), - and have names of the form _m_a_k_e_X_X_X_X_X_X. _N_O_T_E: This can - create many files in TMPDIR or _/_t_m_p, so use with care. - - _p Print debugging information about makefile parsing. - - _s Print debugging information about suffix-transformation - rules. - - _t Print debugging information about target list mainte- - nance. - - _V Force the --VV option to print raw value of variables. - - _v Print debugging information about variable assignment. - - _x Run shell commands with --xx so the actual commands are - printed as they are executed. - - --ee Specify that environment variables override macro assignments - within makefiles. - - --ff _m_a_k_e_f_i_l_e - Specify a makefile to read instead of the default `_m_a_k_e_f_i_l_e'. If - _m_a_k_e_f_i_l_e is `--', standard input is read. Multiple makefiles may - be specified, and are read in the order specified. - - --II _d_i_r_e_c_t_o_r_y - Specify a directory in which to search for makefiles and included - makefiles. The system makefile directory (or directories, see - the --mm option) is automatically included as part of this list. - - --ii Ignore non-zero exit of shell commands in the makefile. Equiva- - lent to specifying `--' before each command line in the makefile. - - --JJ _p_r_i_v_a_t_e - This option should _n_o_t be specified by the user. - - When the _j option is in use in a recursive build, this option is - passed by a make to child makes to allow all the make processes - in the build to cooperate to avoid overloading the system. - - --jj _m_a_x___j_o_b_s - Specify the maximum number of jobs that bbmmaakkee may have running at - any one time. The value is saved in _._M_A_K_E_._J_O_B_S. Turns compati- - bility mode off, unless the _B flag is also specified. When com- - patibility mode is off, all commands associated with a target are - executed in a single shell invocation as opposed to the tradi- - tional one shell invocation per line. This can break traditional - scripts which change directories on each command invocation and - then expect to start with a fresh environment on the next line. - It is more efficient to correct the scripts rather than turn - backwards compatibility on. - - --kk Continue processing after errors are encountered, but only on - those targets that do not depend on the target whose creation - caused the error. - - --mm _d_i_r_e_c_t_o_r_y - Specify a directory in which to search for sys.mk and makefiles - included via the <_f_i_l_e>-style include statement. The --mm option - can be used multiple times to form a search path. This path will - override the default system include path: /usr/share/mk. Fur- - thermore the system include path will be appended to the search - path used for "_f_i_l_e"-style include statements (see the --II - option). - - If a file or directory name in the --mm argument (or the - MAKESYSPATH environment variable) starts with the string ".../" - then bbmmaakkee 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 --mm argument. If used, this feature allows bbmmaakkee to easily - search in the current source tree for customized sys.mk files - (e.g., by using ".../mk/sys.mk" as an argument). - - --nn Display the commands that would have been executed, but do not - actually execute them unless the target depends on the .MAKE spe- - cial source (see below). - - --NN Display the commands which would have been executed, but do not - actually execute any of them; useful for debugging top-level - makefiles without descending into subdirectories. - - --qq Do not execute any commands, but exit 0 if the specified targets - are up-to-date and 1, otherwise. - - --rr Do not use the built-in rules specified in the system makefile. - - --ss Do not echo any commands as they are executed. Equivalent to - specifying `@@' before each command line in the makefile. - - --TT _t_r_a_c_e_f_i_l_e - When used with the --jj flag, append a trace record to _t_r_a_c_e_f_i_l_e - for each job started and completed. - - --tt 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. - - --VV _v_a_r_i_a_b_l_e - Print bbmmaakkee's idea of the value of _v_a_r_i_a_b_l_e, 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 - _v_a_r_i_a_b_l_e contains a `$' then the value will be expanded before - printing. - - --WW Treat any warnings during makefile parsing as errors. - - --XX Don't export variables passed on the command line to the environ- - ment individually. Variables passed on the command line are - still exported via the _M_A_K_E_F_L_A_G_S environment variable. This - option may be useful on systems which have a small limit on the - size of command arguments. - - _v_a_r_i_a_b_l_e_=_v_a_l_u_e - Set the value of the variable _v_a_r_i_a_b_l_e to _v_a_l_u_e. Normally, all - values passed on the command line are also exported to sub-makes - in the environment. The --XX flag disables this behavior. Vari- - able assignments should follow options for POSIX compatibility - but no ordering is enforced. - - 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. - - In general, lines may be continued from one line to the next by ending - them with a backslash (`\'). The trailing newline character and initial - whitespace on the following line are compressed into a single space. - -FFIILLEE DDEEPPEENNDDEENNCCYY SSPPEECCIIFFIICCAATTIIOONNSS - 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 operator that sep- - arates 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 accumulate - over dependency lines when this operator is used. The target is - removed if bbmmaakkee is interrupted. - - !! Targets are always re-created, but not until all sources have been - examined and re-created as necessary. Sources for a target accumu- - late over dependency lines when this operator is used. The target - is removed if bbmmaakkee is interrupted. - - :::: If no sources are specified, the target is always re-created. Oth- - erwise, 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 bbmmaakkee is interrupted. - - Targets and sources may contain the shell wildcard values `?', `*', `[]', - and `{}'. The values `?', `*', 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 value `{}' need not necessarily be used to describe - existing files. Expansion is in directory order, not alphabetically as - done in the shell. - -SSHHEELLLL CCOOMMMMAANNDDSS - Each target may have associated with it a series of shell commands, nor- - mally used to create the target. Each of the commands in this script - _m_u_s_t 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 `::::' operator is used. - - If the first characters of the command line are any combination of `@@', - `++', or `--', the command is treated specially. A `@@' causes the command - not to be echoed before it is executed. A `++' causes the command to be - executed even when --nn is given. This is similar to the effect of the - .MAKE special source, except that the effect can be limited to a single - line of a script. A `--' causes any non-zero exit status of the command - line to be ignored. - -VVAARRIIAABBLLEE AASSSSIIGGNNMMEENNTTSS - Variables in make are much like variables in the shell, and, by tradi- - tion, consist of all upper-case letters. - - VVaarriiaabbllee aassssiiggnnmmeenntt mmooddiiffiieerrss - 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 overrid- - den. - - ++== 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 vari- - able is referenced. _N_O_T_E: References to undefined variables are - _n_o_t expanded. This can cause problems when variable modifiers - are used. - - !!== 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. - - Any white-space before the assigned _v_a_l_u_e is removed; if the value is - being appended, a single space is inserted between the previous contents - 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 dollar sign - (`$'). If the variable name contains only a single letter, the surround- - ing braces or parentheses are not required. This shorter form is not - recommended. - - If the variable name contains a dollar, then the name itself is expanded - first. This allows almost arbitrary variable names, however names con- - taining dollar, braces, parenthesis, or whitespace are really best - avoided! - - If the result of expanding a variable contains a dollar sign (`$') the - string is expanded again. - - Variable substitution occurs at three distinct times, depending on where - the variable is being used. - - 1. Variables in dependency lines are expanded as the line is read. - - 2. Variables in shell commands are expanded when the shell command is - executed. - - 3. ``.for'' loop index variables are expanded on each loop iteration. - Note that other variables are not expanded inside loops so the fol- - lowing example code: - - - .for i in 1 2 3 - a+= ${i} - j= ${i} - b+= ${j} - .endfor - - all: - @echo ${a} - @echo ${b} - - will print: - - 1 2 3 - 3 3 3 - - Because while ${a} contains ``1 2 3'' after the loop is executed, - ${b} contains ``${j} ${j} ${j}'' which expands to ``3 3 3'' since - after the loop completes ${j} contains ``3''. - - VVaarriiaabbllee ccllaasssseess - The four different classes of variables (in order of increasing prece- - dence) are: - - Environment variables - Variables defined as part of bbmmaakkee's environment. - - Global variables - Variables defined in the makefile or in included makefiles. - - Command line variables - Variables defined as part of the command line. - - Local variables - Variables that are defined specific to a certain target. The - seven local variables are as follows: - - _._A_L_L_S_R_C The list of all sources for this target; also known as - `_>'. - - _._A_R_C_H_I_V_E The name of the archive file. - - _._I_M_P_S_R_C In suffix-transformation rules, the name/path of the - source from which the target is to be transformed (the - ``implied'' source); also known as `_<'. It is not - defined in explicit rules. - - _._M_E_M_B_E_R The name of the archive member. - - _._O_O_D_A_T_E The list of sources for this target that were deemed - out-of-date; also known as `_?'. - - _._P_R_E_F_I_X The file prefix of the target, containing only the file - portion, no suffix or preceding directory components; - also known as `_*'. - - _._T_A_R_G_E_T The name of the target; also known as `_@'. - - The shorter forms `_@', `_?', `_<', `_>', and `_*' are permitted for - backward compatibility with historical makefiles and are not rec- - ommended. 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 `_._T_A_R_G_E_T', `_._P_R_E_F_I_X', `_._A_R_C_H_I_V_E', - and `_._M_E_M_B_E_R'. - - AAddddiittiioonnaall bbuuiilltt--iinn vvaarriiaabblleess - In addition, bbmmaakkee sets or knows about the following variables: - - _$ A single dollar sign `$', i.e. `$$' expands to a single - dollar sign. - - _._A_L_L_T_A_R_G_E_T_S The list of all targets encountered in the Makefile. If - evaluated during Makefile parsing, lists only those tar- - gets encountered thus far. - - _._C_U_R_D_I_R A path to the directory where bbmmaakkee was executed. Refer - to the description of `PWD' for more details. - - MAKE The name that bbmmaakkee was executed with (_a_r_g_v_[_0_]). For - compatibility bbmmaakkee also sets _._M_A_K_E with the same value. - The preferred variable to use is the environment variable - MAKE because it is more compatible with other versions of - bbmmaakkee and cannot be confused with the special target with - the same name. - - _._M_A_K_E_._D_E_P_E_N_D_F_I_L_E - Names the makefile (default `_._d_e_p_e_n_d') from which gener- - ated dependencies are read. - - _._M_A_K_E_._E_X_P_A_N_D___V_A_R_I_A_B_L_E_S - A boolean that controls the default behavior of the --VV - option. - - _._M_A_K_E_._E_X_P_O_R_T_E_D The list of variables exported by bbmmaakkee. - - _._M_A_K_E_._J_O_B_S The argument to the --jj option. - - _._M_A_K_E_._J_O_B_._P_R_E_F_I_X - If bbmmaakkee is run with _j then output for each target is - prefixed with a token `--- target ---' the first part of - which can be controlled via _._M_A_K_E_._J_O_B_._P_R_E_F_I_X. - For example: - .MAKE.JOB.PREFIX=${.newline}---${.MAKE:T}[${.MAKE.PID}] - would produce tokens like `---make[1234] target ---' mak- - ing it easier to track the degree of parallelism being - achieved. - - MAKEFLAGS The environment variable `MAKEFLAGS' may contain anything - that may be specified on bbmmaakkee's command line. Anything - specified on bbmmaakkee's command line is appended to the - `MAKEFLAGS' variable which is then entered into the envi- - ronment for all programs which bbmmaakkee executes. + A make command appeared in Version 7 AT&T UNIX. This make implementation + is based on Adam De Boor's pmake program which was written for Sprite at + Berkeley. It was designed to be a parallel distributed make running jobs + on different machines using a daemon called ``customs''. - _._M_A_K_E_._L_E_V_E_L The recursion depth of bbmmaakkee. The initial instance of - bbmmaakkee will be 0, and an incremented value is put into the - environment to be seen by the next generation. This - allows tests like: .if ${.MAKE.LEVEL} == 0 to protect - things which should only be evaluated in the initial - instance of bbmmaakkee. - - _._M_A_K_E_._M_A_K_E_F_I_L_E___P_R_E_F_E_R_E_N_C_E - The ordered list of makefile names (default `_m_a_k_e_f_i_l_e', - `_M_a_k_e_f_i_l_e') that bbmmaakkee will look for. +BBUUGGSS + The make syntax is difficult to parse without actually acting of the + data. For instance finding the end of a variable use should involve + scanning each the modifiers using the correct terminator for each field. + In many places make just counts {} and () in order to find the end of a + variable expansion. - _._M_A_K_E_._M_A_K_E_F_I_L_E_S - The list of makefiles read by bbmmaakkee, which is useful for - tracking dependencies. Each makefile is recorded only - once, regardless of the number of times read. - - _._M_A_K_E_._M_O_D_E Processed after reading all makefiles. Can affect the - mode that bbmmaakkee runs in. It can contain a number of key- - words: - - _c_o_m_p_a_t Like --BB, puts bbmmaakkee into "compat" mode. - - _m_e_t_a Puts bbmmaakkee into "meta" mode, where meta files - are created for each target to capture the - command run, the output generated and if - filemon(4) is available, the system calls - which are of interest to bbmmaakkee. The captured - output can be very useful when diagnosing - errors. - - _c_u_r_d_i_r_O_k_= _b_f Normally bbmmaakkee will not create .meta files - in `_._C_U_R_D_I_R'. This can be overridden by set- - ting _b_f to a value which represents True. - - _e_n_v For debugging, it can be useful to inlcude - the environment in the .meta file. - - _v_e_r_b_o_s_e If in "meta" mode, print a clue about the - target being built. This is useful if the - build is otherwise running silently. The - message printed the value of: - _._M_A_K_E_._M_E_T_A_._P_R_E_F_I_X. - - _i_g_n_o_r_e_-_c_m_d Some makefiles have commands which are simply - not stable. This keyword causes them to be - ignored for determining whether a target is - out of date in "meta" mode. See also - ..NNOOMMEETTAA__CCMMPP. - - _s_i_l_e_n_t_= _b_f If _b_f is True, when a .meta file is created, - mark the target ..SSIILLEENNTT. - - _._M_A_K_E_._M_E_T_A_._B_A_I_L_I_W_I_C_K - In "meta" mode, provides a list of prefixes which match - the directories controlled by bbmmaakkee. If a file that was - generated outside of _._O_B_J_D_I_R but within said bailiwick is - missing, the current target is considered out-of-date. - - _._M_A_K_E_._M_E_T_A_._C_R_E_A_T_E_D - In "meta" mode, this variable contains a list of all the - meta files updated. If not empty, it can be used to - trigger processing of _._M_A_K_E_._M_E_T_A_._F_I_L_E_S. - - _._M_A_K_E_._M_E_T_A_._F_I_L_E_S - In "meta" mode, this variable contains a list of all the - meta files used (updated or not). This list can be used - to process the meta files to extract dependency informa- - tion. - - _._M_A_K_E_._M_E_T_A_._P_R_E_F_I_X - Defines the message printed for each meta file updated in - "meta verbose" mode. The default value is: - Building ${.TARGET:H:tA}/${.TARGET:T} - - _._M_A_K_E_O_V_E_R_R_I_D_E_S This variable is used to record the names of variables - assigned to on the command line, so that they may be - exported as part of `MAKEFLAGS'. This behaviour can be - disabled by assigning an empty value to `_._M_A_K_E_O_V_E_R_R_I_D_E_S' - within a makefile. Extra variables can be exported from - a makefile by appending their names to `_._M_A_K_E_O_V_E_R_R_I_D_E_S'. - `MAKEFLAGS' is re-exported whenever `_._M_A_K_E_O_V_E_R_R_I_D_E_S' is - modified. - - _._M_A_K_E_._P_I_D The process-id of bbmmaakkee. - - _._M_A_K_E_._P_P_I_D The parent process-id of bbmmaakkee. - - _M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R - When bbmmaakkee stops due to an error, it prints its name and - the value of `_._C_U_R_D_I_R' as well as the value of any vari- - ables named in `_M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R'. - - _._n_e_w_l_i_n_e This variable is simply assigned a newline character as - its value. This allows expansions using the ::@@ modifier - to put a newline between iterations of the loop rather - than a space. For example, the printing of - `_M_A_K_E___P_R_I_N_T___V_A_R___O_N___E_R_R_O_R' could be done as - ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@}. - - _._O_B_J_D_I_R A path to the directory where the targets are built. Its - value is determined by trying to chdir(2) to the follow- - ing directories in order and using the first match: - - 1. ${MAKEOBJDIRPREFIX}${.CURDIR} - - (Only if `MAKEOBJDIRPREFIX' is set in the environ- - ment or on the command line.) - - 2. ${MAKEOBJDIR} - - (Only if `MAKEOBJDIR' is set in the environment or - on the command line.) - - 3. ${.CURDIR}_/_o_b_j_.${MACHINE} - - 4. ${.CURDIR}_/_o_b_j - - 5. _/_u_s_r_/_o_b_j_/${.CURDIR} - - 6. ${.CURDIR} - - Variable expansion is performed on the value before it's - used, so expressions such as - ${.CURDIR:S,^/usr/src,/var/obj,} - may be used. This is especially useful with - `MAKEOBJDIR'. - - `_._O_B_J_D_I_R' may be modified in the makefile as a global - variable. In all cases, bbmmaakkee will chdir(2) to `_._O_B_J_D_I_R' - and set `PWD' to that directory before executing any tar- - gets. - - _._P_A_R_S_E_D_I_R A path to the directory of the current `_M_a_k_e_f_i_l_e' being - parsed. - - _._P_A_R_S_E_F_I_L_E The basename of the current `_M_a_k_e_f_i_l_e' being parsed. - This variable and `_._P_A_R_S_E_D_I_R' are both set only while the - `_M_a_k_e_f_i_l_e_s' are being parsed. If you want to retain - their current values, assign them to a variable using - assignment with expansion: (`::=='). - - _._P_A_T_H A variable that represents the list of directories that - bbmmaakkee will search for files. The search list should be - updated using the target `_._P_A_T_H' rather than the vari- - able. - - PWD Alternate path to the current directory. bbmmaakkee normally - sets `_._C_U_R_D_I_R' to the canonical path given by getcwd(3). - However, if the environment variable `PWD' is set and - gives a path to the current directory, then bbmmaakkee sets - `_._C_U_R_D_I_R' to the value of `PWD' instead. This behaviour - is disabled if `MAKEOBJDIRPREFIX' is set or `MAKEOBJDIR' - contains a variable transform. `PWD' is set to the value - of `_._O_B_J_D_I_R' for all programs which bbmmaakkee executes. - - .TARGETS The list of targets explicitly specified on the command - line, if any. - - VPATH Colon-separated (``:'') lists of directories that bbmmaakkee - will search for files. The variable is supported for - compatibility with old make programs only, use `_._P_A_T_H' - instead. - - VVaarriiaabbllee mmooddiiffiieerrss - Variable expansion may be modified to select or modify each word of the - variable (where a ``word'' is white-space delimited sequence of charac- - ters). The general format of a variable expansion is as follows: - - ${variable[:modifier[:...]]} - - Each modifier begins with a colon, which may be escaped with a backslash - (`\'). - - A set of modifiers can be specified via a variable, as follows: - - modifier_variable=modifier[:...] - ${variable:${modifier_variable}[:...]} - - In this case the first modifier in the modifier_variable does not start - with a colon, since that must appear in the referencing variable. If any - of the modifiers in the modifier_variable contain a dollar sign (`$'), - these must be doubled to avoid early expansion. - - The supported modifiers are: - - ::EE Replaces each word in the variable with its suffix. - - ::HH Replaces each word in the variable with everything but the last com- - ponent. - - ::MM_p_a_t_t_e_r_n - Select only those words that match _p_a_t_t_e_r_n. The standard shell - wildcard characters (`*', `?', and `[]') may be used. The wildcard - characters may be escaped with a backslash (`\'). - - ::NN_p_a_t_t_e_r_n - This is identical to `::MM', but selects all words which do not match - _p_a_t_t_e_r_n. - - ::OO Order every word in variable alphabetically. To sort words in - reverse order use the `::OO::[[--11....11]]' combination of modifiers. - - ::OOxx Randomize words in variable. The results will be different each - time you are referring to the modified variable; use the assignment - with expansion (`::==') to prevent such behaviour. For example, - - LIST= uno due tre quattro - RANDOM_LIST= ${LIST:Ox} - STATIC_RANDOM_LIST:= ${LIST:Ox} - - all: - @echo "${RANDOM_LIST}" - @echo "${RANDOM_LIST}" - @echo "${STATIC_RANDOM_LIST}" - @echo "${STATIC_RANDOM_LIST}" - may produce output similar to: - - quattro due tre uno - tre due quattro uno - due uno quattro tre - due uno quattro tre - - ::QQ Quotes every shell meta-character in the variable, so that it can be - passed safely through recursive invocations of bbmmaakkee. - - ::RR Replaces each word in the variable with everything but its suffix. - - ::ggmmttiimmee - The value is a format string for strftime(3), using the current - gmtime(3). - - ::hhaasshh - Compute a 32bit hash of the value and encode it as hex digits. - - ::llooccaallttiimmee - The value is a format string for strftime(3), using the current - localtime(3). - - ::ttAA Attempt to convert variable to an absolute path using realpath(3), - if that fails, the value is unchanged. - - ::ttll Converts variable to lower-case letters. - - ::ttss_c - Words in the variable are normally separated by a space on expan- - sion. This modifier sets the separator to the character _c. If _c is - omitted, then no separator is used. The common escapes (including - octal numeric codes), work as expected. - - ::ttuu Converts variable to upper-case letters. - - ::ttWW Causes the value to be treated as a single word (possibly containing - embedded white space). See also `::[[**]]'. - - ::ttww Causes the value to be treated as a sequence of words delimited by - white space. See also `::[[@@]]'. - - ::SS/_o_l_d___s_t_r_i_n_g/_n_e_w___s_t_r_i_n_g/[11ggWW] - Modify the first occurrence of _o_l_d___s_t_r_i_n_g in the variable's value, - replacing it with _n_e_w___s_t_r_i_n_g. If a `g' is appended to the last - slash of the pattern, all occurrences in each word are replaced. If - a `1' is appended to the last slash of the pattern, only the first - word is affected. If a `W' is appended to the last slash of the - pattern, then the value is treated as a single word (possibly con- - taining embedded white space). If _o_l_d___s_t_r_i_n_g begins with a caret - (`^'), _o_l_d___s_t_r_i_n_g is anchored at the beginning of each word. If - _o_l_d___s_t_r_i_n_g ends with a dollar sign (`$'), it is anchored at the end - of each word. Inside _n_e_w___s_t_r_i_n_g, an ampersand (`&') is replaced by - _o_l_d___s_t_r_i_n_g (without any `^' or `$'). 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 - (`\'). - - Variable expansion occurs in the normal fashion inside both - _o_l_d___s_t_r_i_n_g and _n_e_w___s_t_r_i_n_g with the single exception that a backslash - is used to prevent the expansion of a dollar sign (`$'), not a pre- - ceding dollar sign as is usual. - - ::CC/_p_a_t_t_e_r_n/_r_e_p_l_a_c_e_m_e_n_t/[11ggWW] - The ::CC modifier is just like the ::SS modifier except that the old and - new strings, instead of being simple strings, are a regular expres- - sion (see regex(3)) string _p_a_t_t_e_r_n and an ed(1)-style string - _r_e_p_l_a_c_e_m_e_n_t. Normally, the first occurrence of the pattern _p_a_t_t_e_r_n - in each word of the value is substituted with _r_e_p_l_a_c_e_m_e_n_t. The `1' - modifier causes the substitution to apply to at most one word; the - `g' modifier causes the substitution to apply to as many instances - of the search pattern _p_a_t_t_e_r_n as occur in the word or words it is - found in; the `W' modifier causes the value to be treated as a sin- - gle word (possibly containing embedded white space). 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. - - ::TT Replaces each word in the variable with its last component. - - ::uu Remove adjacent duplicate words (like uniq(1)). - - ::??_t_r_u_e___s_t_r_i_n_g::_f_a_l_s_e___s_t_r_i_n_g - If the variable name (not its value), when parsed as a .if condi- - tional expression, evaluates to true, return as its value the - _t_r_u_e___s_t_r_i_n_g, otherwise return the _f_a_l_s_e___s_t_r_i_n_g. Since the variable - name is used as the expression, :? must be the first modifier after - the variable name itself - which will, of course, usually contain - variable expansions. A common error is trying to use expressions - like - ${NUMBERS:M42:?match:no} - which actually tests defined(NUMBERS), to determine is any words - match "42" you need to use something like: - ${"${NUMBERS:M42}" != "":?match:no}. - - _:_o_l_d___s_t_r_i_n_g_=_n_e_w___s_t_r_i_n_g - This is the AT&T System V UNIX style variable substitution. It must - be the last modifier specified. If _o_l_d___s_t_r_i_n_g or _n_e_w___s_t_r_i_n_g 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 replaced. Otherwise _% is the substring of - _o_l_d___s_t_r_i_n_g to be replaced in _n_e_w___s_t_r_i_n_g. - - Variable expansion occurs in the normal fashion inside both - _o_l_d___s_t_r_i_n_g and _n_e_w___s_t_r_i_n_g with the single exception that a backslash - is used to prevent the expansion of a dollar sign (`$'), not a pre- - ceding dollar sign as is usual. - - ::@@_t_e_m_p@@_s_t_r_i_n_g@@ - This is the loop expansion mechanism from the OSF Development Envi- - ronment (ODE) make. Unlike ..ffoorr loops expansion occurs at the time - of reference. Assign _t_e_m_p to each word in the variable and evaluate - _s_t_r_i_n_g. The ODE convention is that _t_e_m_p should start and end with a - period. For example. - ${LINKS:@.LINK.@${LN} ${TARGET} ${.LINK.}@} - - However a single character varaiable is often more readable: - ${MAKE_PRINT_VAR_ON_ERROR:@v@$v='${$v}'${.newline}@} - - ::UU_n_e_w_v_a_l - If the variable is undefined _n_e_w_v_a_l is the value. If the variable - is defined, the existing value is returned. This is another ODE - make feature. It is handy for setting per-target CFLAGS for - instance: - ${_${.TARGET:T}_CFLAGS:U${DEF_CFLAGS}} - If a value is only required if the variable is undefined, use: - ${VAR:D:Unewval} - - ::DD_n_e_w_v_a_l - If the variable is defined _n_e_w_v_a_l is the value. - - ::LL The name of the variable is the value. - - ::PP The path of the node which has the same name as the variable is the - value. If no such node exists or its path is null, then the name of - the variable is used. In order for this modifier to work, the name - (node) must at least have appeared on the rhs of a dependency. - - ::!!_c_m_d!! - The output of running _c_m_d is the value. - - ::sshh If the variable is non-empty it is run as a command and the output - becomes the new value. - - ::::==_s_t_r - The variable is assigned the value _s_t_r after substitution. This - modifier and its variations are useful in obscure situations such as - wanting to set a variable when shell commands are being parsed. - These assignment modifiers always expand to nothing, so if appearing - in a rule line by themselves should be preceded with something to - keep bbmmaakkee happy. - - The `::::' helps avoid false matches with the AT&T System V UNIX style - ::== modifier and since substitution always occurs the ::::== form is - vaguely appropriate. - - ::::??==_s_t_r - As for ::::== but only if the variable does not already have a value. - - ::::++==_s_t_r - Append _s_t_r to the variable. - - ::::!!==_c_m_d - Assign the output of _c_m_d to the variable. - - ::[[_r_a_n_g_e]] - Selects one or more words from the value, or performs other opera- - tions related to the way in which the value is divided into words. - - Ordinarily, a value is treated as a sequence of words delimited by - white space. Some modifiers suppress this behaviour, causing a - value to be treated as a single word (possibly containing embedded - white space). An empty value, or a value that consists entirely of - white-space, is treated as a single word. For the purposes of the - `::[[]]' modifier, the words are indexed both forwards using positive - integers (where index 1 represents the first word), and backwards - using negative integers (where index -1 represents the last word). - - The _r_a_n_g_e is subjected to variable expansion, and the expanded - result is then interpreted as follows: - - _i_n_d_e_x Selects a single word from the value. - - _s_t_a_r_t...._e_n_d - Selects all words from _s_t_a_r_t to _e_n_d, inclusive. For example, - `::[[22....--11]]' selects all words from the second word to the last - word. If _s_t_a_r_t is greater than _e_n_d, then the words are out- - put in reverse order. For example, `::[[--11....11]]' selects all - the words from last to first. - - ** Causes subsequent modifiers to treat the value as a single - word (possibly containing embedded white space). Analogous - to the effect of "$*" in Bourne shell. - - 0 Means the same as `::[[**]]'. - - @@ Causes subsequent modifiers to treat the value as a sequence - of words delimited by white space. Analogous to the effect - of "$@" in Bourne shell. - - ## Returns the number of words in the value. - -IINNCCLLUUDDEE SSTTAATTEEMMEENNTTSS,, CCOONNDDIITTIIOONNAALLSS AANNDD FFOORR LLOOOOPPSS - Makefile inclusion, conditional structures and for loops reminiscent of - the C programming language are provided in bbmmaakkee. All such structures - are identified by a line beginning with a single dot (`.') character. - Files are included with either ..iinncclluuddee <_f_i_l_e> or ..iinncclluuddee "_f_i_l_e". Vari- - ables 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 --II option are searched before the system makefile directory. - For compatibility with other versions of bbmmaakkee `include file ...' is also - accepted. If the include statement is written as ..--iinncclluuddee or as - ..ssiinncclluuddee then errors locating and/or opening include files are ignored. - - Conditional expressions are also preceded by a single dot as the first - character of a line. The possible conditionals are as follows: - - ..eerrrroorr _m_e_s_s_a_g_e - The message is printed along with the name of the makefile and - line number, then bbmmaakkee will exit. - - ..eexxppoorrtt _v_a_r_i_a_b_l_e _._._. - Export the specified global variable. If no variable list is - provided, all globals are exported except for internal variables - (those that start with `.'). This is not affected by the --XX - flag, so should be used with caution. For compatibility with - other bbmmaakkee programs `export variable=value' is also accepted. - - Appending a variable name to _._M_A_K_E_._E_X_P_O_R_T_E_D is equivalent to - exporting a variable. - - ..eexxppoorrtt--eennvv _v_a_r_i_a_b_l_e _._._. - The same as `.export', except that the variable is not appended - to _._M_A_K_E_._E_X_P_O_R_T_E_D. This allows exporting a value to the environ- - ment which is different from that used by bbmmaakkee internally. - - ..iinnffoo _m_e_s_s_a_g_e - The message is printed along with the name of the makefile and - line number. - - ..uunnddeeff _v_a_r_i_a_b_l_e - Un-define the specified global variable. Only global variables - may be un-defined. - - ..uunneexxppoorrtt _v_a_r_i_a_b_l_e _._._. - The opposite of `.export'. The specified global _v_a_r_i_a_b_l_e will be - removed from _._M_A_K_E_._E_X_P_O_R_T_E_D. If no variable list is provided, - all globals are unexported, and _._M_A_K_E_._E_X_P_O_R_T_E_D deleted. - - ..uunneexxppoorrtt--eennvv - Unexport all globals previously exported and clear the environ- - ment inherited from the parent. This operation will cause a mem- - ory leak of the original environment, so should be used spar- - ingly. Testing for _._M_A_K_E_._L_E_V_E_L being 0, would make sense. Also - note that any variables which originated in the parent environ- - ment should be explicitly preserved if desired. For example: - - .if ${.MAKE.LEVEL} == 0 - PATH := ${PATH} - .unexport-env - .export PATH - .endif - - Would result in an environment containing only `PATH', which is - the minimal useful environment. Actually `.MAKE.LEVEL' will also - be pushed into the new environment. - - ..wwaarrnniinngg _m_e_s_s_a_g_e - The message prefixed by `_w_a_r_n_i_n_g_:' is printed along with the name - of the makefile and line number. - - ..iiff [!]_e_x_p_r_e_s_s_i_o_n [_o_p_e_r_a_t_o_r _e_x_p_r_e_s_s_i_o_n _._._.] - Test the value of an expression. - - ..iiffddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.] - Test the value of a variable. - - ..iiffnnddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.] - Test the value of a variable. - - ..iiffmmaakkee [!]_t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.] - Test the target being built. - - ..iiffnnmmaakkee [!] _t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.] - Test the target being built. - - ..eellssee Reverse the sense of the last conditional. - - ..eelliiff [!] _e_x_p_r_e_s_s_i_o_n [_o_p_e_r_a_t_o_r _e_x_p_r_e_s_s_i_o_n _._._.] - A combination of `..eellssee' followed by `..iiff'. - - ..eelliiffddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.] - A combination of `..eellssee' followed by `..iiffddeeff'. - - ..eelliiffnnddeeff [!]_v_a_r_i_a_b_l_e [_o_p_e_r_a_t_o_r _v_a_r_i_a_b_l_e _._._.] - A combination of `..eellssee' followed by `..iiffnnddeeff'. - - ..eelliiffmmaakkee [!]_t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.] - A combination of `..eellssee' followed by `..iiffmmaakkee'. - - ..eelliiffnnmmaakkee [!]_t_a_r_g_e_t [_o_p_e_r_a_t_o_r _t_a_r_g_e_t _._._.] - A combination of `..eellssee' followed by `..iiffnnmmaakkee'. - - ..eennddiiff End the body of the conditional. - - The _o_p_e_r_a_t_o_r may be any one of the following: - - |||| Logical OR. - - &&&& Logical AND; of higher precedence than ``||''. - - As in C, bbmmaakkee 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 _e_x_p_r_e_s_s_i_o_n may be any of the following: - - ddeeffiinneedd Takes a variable name as an argument and evaluates to true if - the variable has been defined. - - mmaakkee Takes a target name as an argument and evaluates to true if the - target was specified as part of bbmmaakkee's command line or was - declared the default target (either implicitly or explicitly, - see _._M_A_I_N) before the line containing the conditional. - - eemmppttyy Takes a variable, with possible modifiers, and evaluates to true - if the expansion of the variable would result in an empty - string. - - eexxiissttss 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 _._P_A_T_H). - - ttaarrggeett Takes a target name as an argument and evaluates to true if the - target has been defined. - - ccoommmmaannddss - Takes a target name as an argument and evaluates to true if the - target has been defined and has commands associated with it. - - _E_x_p_r_e_s_s_i_o_n may also be an arithmetic or string comparison. Variable - expansion is performed on both sides of the comparison, after which the - integral values are compared. A value is interpreted as hexadecimal if - it is preceded by 0x, otherwise it is decimal; octal numbers are not sup- - ported. The standard C relational operators are all supported. If after - variable expansion, either the left or right hand side of a `====' or `!!==' - operator is not an integral value, then string comparison is performed - between the expanded variables. If no relational operator is given, it - is assumed that the expanded variable is being compared against 0 or an - empty string in the case of a string comparison. - - When bbmmaakkee is evaluating one of these conditional expressions, and it - encounters a (white-space separated) word it doesn't recognize, either - the ``make'' or ``defined'' expression is applied to it, depending on the - form of the conditional. If the form is `..iiffddeeff', `..iiffnnddeeff', or `..iiff' - the ``defined'' expression is applied. Similarly, if the form is - `..iiffmmaakkee' or `..iiffnnmmaakkee, tthhee' ``make'' expression is applied. - - If the conditional evaluates to true the parsing of the makefile contin- - ues as before. If it evaluates to false, the following lines are - skipped. In both cases this continues until a `..eellssee' or `..eennddiiff' 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: - - ..ffoorr _v_a_r_i_a_b_l_e [_v_a_r_i_a_b_l_e _._._.] iinn _e_x_p_r_e_s_s_i_o_n - <make-rules> - ..eennddffoorr - - After the for eexxpprreessssiioonn is evaluated, it is split into words. On each - iteration of the loop, one word is taken and assigned to each vvaarriiaabbllee, - in order, and these vvaarriiaabblleess are substituted into the mmaakkee--rruulleess inside - the body of the for loop. The number of words must come out even; that - is, if there are three iteration variables, the number of words provided - must be a multiple of three. - -CCOOMMMMEENNTTSS - Comments begin with a hash (`#') character, anywhere but in a shell com- - mand line, and continue to the end of an unescaped new line. - -SSPPEECCIIAALL SSOOUURRCCEESS ((AATTTTRRIIBBUUTTEESS)) - ..EEXXEECC Target is never out of date, but always execute commands any- - way. - - ..IIGGNNOORREE Ignore any errors from the commands associated with this tar- - get, exactly as if they all were preceded by a dash (`-'). - - ..MMAADDEE Mark all sources of this target as being up-to-date. - - ..MMAAKKEE Execute the commands associated with this target even if the --nn - or --tt options were specified. Normally used to mark recursive - bbmmaakkee's. - - ..MMEETTAA Create a meta file for the target, even if it is flagged as - ..PPHHOONNYY, ..MMAAKKEE, or ..SSPPEECCIIAALL. Usage in conjunction with ..MMAAKKEE is - the most likely case. In "meta" mode, the target is out-of- - date if the meta file is missing. - - ..NNOOMMEETTAA Do not create a meta file for the target. Meta files are also - not created for ..PPHHOONNYY, ..MMAAKKEE, or ..SSPPEECCIIAALL targets. - - ..NNOOMMEETTAA__CCMMPP - Ignore differences in commands when deciding if target is out - of date. This is useful if the command contains a value which - always changes. If the number of commands change, though, the - target will still be out of date. - - ..NNOOPPAATTHH Do not search for the target in the directories specified by - ..PPAATTHH. - - ..NNOOTTMMAAIINN Normally bbmmaakkee 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. - - ..OOPPTTIIOONNAALL - If a target is marked with this attribute and bbmmaakkee can't fig- - ure out how to create it, it will ignore this fact and assume - the file isn't needed or already exists. - - ..PPHHOONNYY The target does not correspond to an actual file; it is always - considered to be out of date, and will not be created with the - --tt option. Suffix-transformation rules are not applied to - ..PPHHOONNYY targets. - - ..PPRREECCIIOOUUSS - When bbmmaakkee is interrupted, it normally removes any partially - made targets. This source prevents the target from being - removed. - - ..RREECCUURRSSIIVVEE - Synonym for ..MMAAKKEE. - - ..SSIILLEENNTT Do not echo any of the commands associated with this target, - exactly as if they all were preceded by an at sign (`@'). - - ..UUSSEE Turn the target into bbmmaakkee's version of a macro. When the tar- - get is used as a source for another target, the other target - acquires the commands, sources, and attributes (except for - ..UUSSEE) of the source. If the target already has commands, the - ..UUSSEE target's commands are appended to them. - - ..UUSSEEBBEEFFOORREE - Exactly like ..UUSSEE, but prepend the ..UUSSEEBBEEFFOORREE target commands - to the target. - - ..WWAAIITT If ..WWAAIITT appears in a dependency line, the sources that precede - it are made before the sources that succeed it in the line. - Since the dependents of files are not made until the file - itself could be made, this also stops the dependents being - built unless they are needed for another branch of the depen- - dency tree. So given: - - x: a .WAIT b - echo x - a: - echo a - b: b1 - echo b - b1: - echo b1 - - the output is always `a', `b1', `b', `x'. - The ordering imposed by ..WWAAIITT is only relevant for parallel - makes. - -SSPPEECCIIAALL TTAARRGGEETTSS - Special targets may not be included with other targets, i.e. they must be - the only target specified. - - ..BBEEGGIINN Any command lines attached to this target are executed before - anything else is done. - - ..DDEEFFAAUULLTT - This is sort of a ..UUSSEE rule for any target (that was used only - as a source) that bbmmaakkee can't figure out any other way to cre- - ate. Only the shell script is used. The ..IIMMPPSSRRCC variable of a - target that inherits ..DDEEFFAAUULLTT's commands is set to the target's - own name. - - ..EENNDD Any command lines attached to this target are executed after - everything else is done. - - ..EERRRROORR Any command lines attached to this target are executed when - another target fails. The ..EERRRROORR__TTAARRGGEETT variable is set to the - target that failed. See also MMAAKKEE__PPRRIINNTT__VVAARR__OONN__EERRRROORR. - - ..IIGGNNOORREE Mark each of the sources with the ..IIGGNNOORREE attribute. If no - sources are specified, this is the equivalent of specifying the - --ii option. - - ..IINNTTEERRRRUUPPTT - If bbmmaakkee is interrupted, the commands for this target will be - executed. - - ..MMAAIINN If no target is specified when bbmmaakkee is invoked, this target - will be built. - - ..MMAAKKEEFFLLAAGGSS - This target provides a way to specify flags for bbmmaakkee when the - makefile is used. The flags are as if typed to the shell, - though the --ff option will have no effect. - - ..NNOOPPAATTHH Apply the ..NNOOPPAATTHH attribute to any specified sources. - - ..NNOOTTPPAARRAALLLLEELL - Disable parallel mode. - - ..NNOO__PPAARRAALLLLEELL - Synonym for ..NNOOTTPPAARRAALLLLEELL, for compatibility with other pmake - variants. - - ..OORRDDEERR The named targets are made in sequence. This ordering does not - add targets to the list of targets to be made. Since the depen- - dents of a target do not get built until the target itself could - be built, unless `a' is built by another part of the dependency - graph, the following is a dependency loop: - - .ORDER: b a - b: a - - The ordering imposed by ..OORRDDEERR is only relevant for parallel - makes. - - ..PPAATTHH The sources are directories which are to be searched for files - not found in the current directory. If no sources are speci- - fied, any previously specified directories are deleted. If the - source is the special ..DDOOTTLLAASSTT target, then the current working - directory is searched last. - - ..PPHHOONNYY Apply the ..PPHHOONNYY attribute to any specified sources. - - ..PPRREECCIIOOUUSS - Apply the ..PPRREECCIIOOUUSS attribute to any specified sources. If no - sources are specified, the ..PPRREECCIIOOUUSS attribute is applied to - every target in the file. - - ..SSHHEELLLL Sets the shell that bbmmaakkee will use to execute commands. The - sources are a set of _f_i_e_l_d_=_v_a_l_u_e pairs. - - _n_a_m_e This is the minimal specification, used to select - one of the builtin shell specs; _s_h, _k_s_h, and _c_s_h. - - _p_a_t_h Specifies the path to the shell. - - _h_a_s_E_r_r_C_t_l Indicates whether the shell supports exit on error. - - _c_h_e_c_k The command to turn on error checking. - - _i_g_n_o_r_e The command to disable error checking. - - _e_c_h_o The command to turn on echoing of commands executed. - - _q_u_i_e_t The command to turn off echoing of commands exe- - cuted. - - _f_i_l_t_e_r The output to filter after issuing the _q_u_i_e_t com- - mand. It is typically identical to _q_u_i_e_t. - - _e_r_r_F_l_a_g The flag to pass the shell to enable error checking. - - _e_c_h_o_F_l_a_g The flag to pass the shell to enable command echo- - ing. - - _n_e_w_l_i_n_e The string literal to pass the shell that results in - a single newline character when used outside of any - quoting characters. - Example: - - .SHELL: name=ksh path=/bin/ksh hasErrCtl=true \ - check="set -e" ignore="set +e" \ - echo="set -v" quiet="set +v" filter="set +v" \ - echoFlag=v errFlag=e newline="'\n'" - - ..SSIILLEENNTT Apply the ..SSIILLEENNTT attribute to any specified sources. If no - sources are specified, the ..SSIILLEENNTT attribute is applied to every - command in the file. - - ..SSUUFFFFIIXXEESS - Each source specifies a suffix to bbmmaakkee. If no sources are - specified, any previously specified suffixes are deleted. It - allows the creation of suffix-transformation rules. - - Example: - - .SUFFIXES: .o - .c.o: - cc -o ${.TARGET} -c ${.IMPSRC} - -EENNVVIIRROONNMMEENNTT - bbmmaakkee uses the following environment variables, if they exist: MACHINE, - MACHINE_ARCH, MAKE, MAKEFLAGS, MAKEOBJDIR, MAKEOBJDIRPREFIX, MAKESYSPATH, - PWD, and TMPDIR. - - MAKEOBJDIRPREFIX and MAKEOBJDIR may only be set in the environment or on - the command line to bbmmaakkee and not as makefile variables; see the descrip- - tion of `_._O_B_J_D_I_R' for more details. - -FFIILLEESS - .depend list of dependencies - Makefile list of dependencies - makefile list of dependencies - sys.mk system makefile - /usr/share/mk system makefile directory - -CCOOMMPPAATTIIBBIILLIITTYY - The basic make syntax is compatible between different versions of make, - however the special variables, variable modifiers and conditionals are - not. - - The way that parallel makes are scheduled changed in NetBSD 4.0 so that - .ORDER and .WAIT apply recursively to the dependent nodes. The algo- - rithms used may change again in the future. - - The way that .for loop variables are substituted changed after NetBSD 5.0 - so that they still appear to be variable expansions. In particular this - stops them being treated as syntax, and removes some obscure problems - using them in .if statements. - - Unlike other bbmmaakkee programs, this implementation by default executes all - commands for a given target using a single shell invocation. This is - done for both efficiency and to simplify error handling in remote command - invocations. Typically this is transparent to the user, unless the tar- - get commands change the current working directory using ``cd'' or - ``chdir''. To be compatible with Makefiles that do this, one can use --BB - to disable this behavior. - -SSEEEE AALLSSOO - mkdep(1) - -HHIISSTTOORRYY - bbmmaakkee is derived from NetBSD make(1). It uses autoconf to facilitate - portability to other platforms. + There is no way of escaping a space character in a filename. -NetBSD 5.1 August 30, 2012 NetBSD 5.1 +NetBSD 5.1 October 8, 2012 NetBSD 5.1 diff --git a/contrib/bmake/bsd.after-import.mk b/contrib/bmake/bsd.after-import.mk index b2b2187..6cd442a 100644 --- a/contrib/bmake/bsd.after-import.mk +++ b/contrib/bmake/bsd.after-import.mk @@ -1,4 +1,4 @@ -# $Id: bsd.after-import.mk,v 1.7 2012/07/06 03:03:44 sjg Exp $ +# $Id: bsd.after-import.mk,v 1.9 2012/09/20 00:30:15 sjg Exp $ # This makefile is for use when integrating bmake into a BSD build # system. Use this makefile after importing bmake. @@ -58,7 +58,7 @@ bootstrap: ${BMAKE_SRC}/boot-strap ${MAKEFILE} # Makefiles need a little more tweaking than say config.h MAKEFILE_SED = sed -e '/^MACHINE/d' \ - -e '/^PROG/s,bmake,${.CURDIR:T},' \ + -e '/^PROG/ { s,=,?=,;s,bmake,$${.CURDIR:T},; }' \ -e 's,^.-include,.sinclude,' \ -e 's,${SRCTOP},$${SRCTOP},g' @@ -87,20 +87,20 @@ _makefile: bootstrap ${MAKEFILE} @echo Generating ${.CURDIR}/Makefile @(echo '# This is a generated file, do NOT edit!'; \ echo '# See ${_this:S,${SRCTOP}/,,}'; \ - echo '#'; echo '# $$${OS}$$'; echo; \ - echo 'SRCTOP?= $${.CURDIR:${.CURDIR:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; echo; \ + echo '#'; echo '# $$${OS}$$'; \ + echo; echo '.sinclude "Makefile.inc"'; \ + echo; echo 'SRCTOP?= $${.CURDIR:${.CURDIR:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; \ echo; echo '# look here first for config.h'; \ echo 'CFLAGS+= -I$${.CURDIR}'; echo; \ ${MAKEFILE_SED} ${HOST_OS}/Makefile; \ echo; echo '# override some simple things'; \ echo 'BINDIR= /usr/bin'; \ - echo 'MANDIR= /usr/share/man'; \ + echo 'MANDIR= ${MANDIR:U/usr/share/man}'; \ echo; echo '# make sure we get this'; \ echo 'CFLAGS+= $${COPTS.$${.IMPSRC:T}}'; \ echo 'CLEANFILES+= bootstrap'; \ echo; echo 'after-import: ${_this:S,${SRCTOP},\${SRCTOP},}'; \ echo ' cd $${.CURDIR} && $${.MAKE} -f ${_this:S,${SRCTOP},\${SRCTOP},}'; \ - echo; echo '.sinclude "Makefile.inc"'; \ echo ) > ${.TARGET} @cmp -s ${.TARGET} ${.CURDIR}/Makefile || \ mv ${.TARGET} ${.CURDIR}/Makefile diff --git a/contrib/bmake/compat.c b/contrib/bmake/compat.c index 7f715cc..4cc699e 100644 --- a/contrib/bmake/compat.c +++ b/contrib/bmake/compat.c @@ -1,4 +1,4 @@ -/* $NetBSD: compat.c,v 1.89 2012/06/10 21:44:01 wiz Exp $ */ +/* $NetBSD: compat.c,v 1.90 2012/10/07 19:17:31 sjg Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -70,14 +70,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: compat.c,v 1.89 2012/06/10 21:44:01 wiz Exp $"; +static char rcsid[] = "$NetBSD: compat.c,v 1.90 2012/10/07 19:17:31 sjg Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)compat.c 8.2 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: compat.c,v 1.89 2012/06/10 21:44:01 wiz Exp $"); +__RCSID("$NetBSD: compat.c,v 1.90 2012/10/07 19:17:31 sjg Exp $"); #endif #endif /* not lint */ #endif @@ -247,7 +247,6 @@ CompatRunCommand(void *cmdp, void *gnp) if (*cmdStart == '\0') { free(cmdStart); - Error("%s expands to empty string", cmd); return(0); } cmd = cmdStart; diff --git a/contrib/bmake/make.1 b/contrib/bmake/make.1 index 8a4faf3..702e478 100644 --- a/contrib/bmake/make.1 +++ b/contrib/bmake/make.1 @@ -1,4 +1,4 @@ -.\" $NetBSD: make.1,v 1.206 2012/08/30 22:35:37 wiz Exp $ +.\" $NetBSD: make.1,v 1.209 2012/10/08 15:09:48 christos Exp $ .\" .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -29,7 +29,7 @@ .\" .\" from: @(#)make.1 8.4 (Berkeley) 3/19/94 .\" -.Dd August 30, 2012 +.Dd October 8, 2012 .Dt MAKE 1 .Os .Sh NAME @@ -2042,6 +2042,13 @@ or To be compatible with Makefiles that do this, one can use .Fl B to disable this behavior. +.Pp +In compatibility mode, each command is run in a separate process. +If the command contains any shell meta characters +.Pq Ql #=|^(){};&<>*?[]:$`\e\en +it will be passed to the shell, otherwise +.Nm +will attempt direct execution. .Sh SEE ALSO .Xr mkdep 1 .Sh HISTORY @@ -2052,7 +2059,7 @@ command appeared in This .Nm implementation is based on Adam De Boor's pmake program which was written -for Sprint at Berkeley. +for Sprite at Berkeley. It was designed to be a parallel distributed make running jobs on different machines using a daemon called .Dq customs . diff --git a/usr.bin/bmake/Makefile b/usr.bin/bmake/Makefile index ea21728..44ce56f 100644 --- a/usr.bin/bmake/Makefile +++ b/usr.bin/bmake/Makefile @@ -13,7 +13,7 @@ CFLAGS+= -I${.CURDIR} # $NetBSD: Makefile,v 1.56 2012/05/30 21:54:23 sjg Exp $ # @(#)Makefile 5.2 (Berkeley) 12/28/90 -# $Id: Makefile.in,v 1.170 2012/08/31 06:46:22 sjg Exp $ +# $Id: Makefile.in,v 1.174 2012/10/10 18:46:24 sjg Exp $ PROG?= ${.CURDIR:T} SRCS= arch.c buf.c compat.c cond.c dir.c for.c hash.c job.c main.c \ @@ -33,7 +33,7 @@ srcdir= ${SRCTOP}/contrib/bmake CC?= gcc # Base version on src date -MAKE_VERSION= 20120831 +MAKE_VERSION= 20121010 DEFAULT_SYS_PATH = .../share/mk:/usr/share/mk CPPFLAGS+= @@ -113,14 +113,18 @@ EXTRACT_MAN=no MAN=${PROG}.1 .if (${PROG} != "make") -${MAN}: make.1 - @echo making ${PROG}.1 - @sed -e 's/^.Nx/NetBSD/' -e '/^.Nm/s/make/${PROG}/' -e '/^.Sh HISTORY/,$$d' ${srcdir}/make.1 > $@ - @(echo ".Sh HISTORY"; \ - echo ".Nm"; \ +my.history: ${MAKEFILE} + @(echo ".Nm"; \ echo "is derived from NetBSD"; \ echo ".Xr make 1 ."; \ - echo It uses autoconf to facilitate portability to other platforms.) >> $@ + echo "It uses autoconf to facilitate portability to other platforms."; \ + echo ".Pp") > $@ + +${MAN}: make.1 my.history + @echo making ${PROG}.1 + @sed -e 's/^.Nx/NetBSD/' -e '/^.Nm/s/make/${PROG}/' \ + -e '/^.Sh HISTORY/rmy.history' \ + -e '/^.Sh HISTORY/,$$s,^.Nm,make,' ${srcdir}/make.1 > $@ .endif |