aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon J. Gerraty <sjg@FreeBSD.org>2012-10-25 20:31:22 +0000
committerSimon J. Gerraty <sjg@FreeBSD.org>2012-10-25 20:31:22 +0000
commitbdf7c19d9bfc9bc02c4cc48cd2725610971ec6c7 (patch)
treed8708c428266695647c87532217d05d3411b7d4f
parentf74e4d18d1c2154445d8e162d083a20d6ed0c74e (diff)
downloadsrc-bdf7c19d9bfc9bc02c4cc48cd2725610971ec6c7.tar.gz
src-bdf7c19d9bfc9bc02c4cc48cd2725610971ec6c7.zip
Import bmake-20121010vendor/NetBSD/bmake/20121010
Relevant items from ChangeLog: o [Makefile.in:] protect syntax that only bmake parses correctly. o compat.c: ignore empty commands - same as jobs mode. o make.1: document meta chars that cause use of shell Approved by: marcelm (mentor)
Notes
Notes: svn path=/vendor/NetBSD/bmake/dist/; revision=242093 svn path=/vendor/NetBSD/bmake/20121010/; revision=242094; tag=vendor/NetBSD/bmake/20121010
-rw-r--r--ChangeLog24
-rw-r--r--Makefile.in27
-rw-r--r--bmake.134
-rw-r--r--bmake.cat11325
-rw-r--r--bsd.after-import.mk12
-rw-r--r--compat.c7
-rw-r--r--make.113
7 files changed, 107 insertions, 1335 deletions
diff --git a/ChangeLog b/ChangeLog
index cb2532a2d832..933e43565dfc 100644
--- a/ChangeLog
+++ b/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/Makefile.in b/Makefile.in
index 42da6460515e..4cb55dd85fb5 100644
--- a/Makefile.in
+++ b/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/bmake.1 b/bmake.1
index bd670891f85d..d7ed08af0c07 100644
--- a/bmake.1
+++ b/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/bmake.cat1 b/bmake.cat1
index 0c2e7f628d8c..2d54ee2f89cf 100644
--- a/bmake.cat1
+++ b/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/bsd.after-import.mk b/bsd.after-import.mk
index b2b21872b9ac..6cd442acc07e 100644
--- a/bsd.after-import.mk
+++ b/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/compat.c b/compat.c
index 7f715ccbe386..4cc699ec20ea 100644
--- a/compat.c
+++ b/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/make.1 b/make.1
index 8a4faf3f223c..702e4780b4cd 100644
--- a/make.1
+++ b/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 .