git: 06b9b3e0ad0d - main - Merge bmake-20210110

Simon J. Gerraty sjg at FreeBSD.org
Thu Jan 14 06:22:17 UTC 2021


The branch main has been updated by sjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=06b9b3e0ad0dc3f0166b3e8f26ced68c271cf527

commit 06b9b3e0ad0dc3f0166b3e8f26ced68c271cf527
Merge: 0495ed398c4f 8e11a9b4250b
Author:     Simon J. Gerraty <sjg at FreeBSD.org>
AuthorDate: 2021-01-14 06:21:37 +0000
Commit:     Simon J. Gerraty <sjg at FreeBSD.org>
CommitDate: 2021-01-14 06:21:37 +0000

    Merge bmake-20210110
    
    Quite a lot of churn on style, but lots of
    good work refactoring complicated functions
    and lots more unit-tests.
    Thanks mostly to rillig at NetBSD
    
    Some interesting entries from ChangeLog
    
    o .MAKE.{UID,GID} represent uid and gid running make.
    
    o allow env var MAKE_OBJDIR_CHECK_WRITABLE=no to skip writable
      checks in InitObjdir.  Explicit .OBJDIR target always allows
      read-only directory.
    
    o add more unit tests for META MODE
    
    Merge commit '8e11a9b4250be3c3379c45fa820bff78d99d5946' into main
    
    Change-Id: I464fd4c013067f0915671c1ccc96d2d8090b2b9c

 contrib/bmake/ChangeLog                            |  241 +-
 contrib/bmake/FILES                                |   64 +-
 contrib/bmake/LICENSE                              |    4 +-
 contrib/bmake/PSD.doc/tutorial.ms                  |   10 +-
 contrib/bmake/VERSION                              |    2 +-
 contrib/bmake/arch.c                               | 1323 ++---
 contrib/bmake/bmake.1                              |   18 +-
 contrib/bmake/bmake.cat1                           |  248 +-
 contrib/bmake/buf.c                                |  139 +-
 contrib/bmake/buf.h                                |   28 +-
 contrib/bmake/compat.c                             |  932 +--
 contrib/bmake/cond.c                               | 1611 +++---
 contrib/bmake/dir.c                                | 2047 ++++---
 contrib/bmake/dir.h                                |   36 +-
 contrib/bmake/enum.c                               |   11 +-
 contrib/bmake/enum.h                               |   69 +-
 contrib/bmake/filemon/filemon.h                    |    6 +-
 contrib/bmake/filemon/filemon_dev.c                |    6 +-
 contrib/bmake/filemon/filemon_ktrace.c             |   79 +-
 contrib/bmake/for.c                                |  633 +-
 contrib/bmake/hash.c                               |   41 +-
 contrib/bmake/hash.h                               |   72 +-
 contrib/bmake/import.sh                            |   87 +
 contrib/bmake/job.c                                | 3893 +++++++------
 contrib/bmake/job.h                                |   84 +-
 contrib/bmake/lst.c                                |  304 +-
 contrib/bmake/lst.h                                |   88 +-
 contrib/bmake/main.c                               |  364 +-
 contrib/bmake/make-conf.h                          |   20 +-
 contrib/bmake/make.1                               |   18 +-
 contrib/bmake/make.c                               | 1825 +++---
 contrib/bmake/make.h                               |  812 +--
 contrib/bmake/make_malloc.c                        |    7 +-
 contrib/bmake/make_malloc.h                        |   12 +-
 contrib/bmake/meta.c                               |  359 +-
 contrib/bmake/meta.h                               |    4 +-
 contrib/bmake/metachar.h                           |    4 +-
 contrib/bmake/mk/ChangeLog                         |   39 +
 contrib/bmake/mk/dirdeps-options.mk                |    5 +-
 contrib/bmake/mk/dirdeps-targets.mk                |    7 +-
 contrib/bmake/mk/dirdeps.mk                        |   25 +-
 contrib/bmake/mk/init.mk                           |   17 +-
 contrib/bmake/mk/install-mk                        |    4 +-
 contrib/bmake/mk/meta.subdir.mk                    |    4 +-
 contrib/bmake/mk/mkopt.sh                          |    0
 contrib/bmake/mk/own.mk                            |    6 +-
 contrib/bmake/mk/sys.mk                            |    6 +-
 contrib/bmake/nonints.h                            |  278 +-
 contrib/bmake/os.sh                                |    0
 contrib/bmake/parse.c                              | 4058 ++++++-------
 contrib/bmake/pathnames.h                          |   15 +-
 contrib/bmake/str.c                                |   15 +-
 contrib/bmake/suff.c                               | 2897 +++++-----
 contrib/bmake/targ.c                               |  568 +-
 contrib/bmake/trace.c                              |   16 +-
 contrib/bmake/trace.h                              |    6 +-
 contrib/bmake/unit-tests/Makefile                  |  159 +-
 contrib/bmake/unit-tests/cmd-errors-jobs.exp       |    9 +
 contrib/bmake/unit-tests/cmd-errors-jobs.mk        |   32 +
 contrib/bmake/unit-tests/cmd-errors.mk             |    4 +-
 contrib/bmake/unit-tests/cmdline.mk                |    2 +-
 contrib/bmake/unit-tests/compat-error.exp          |   15 +
 contrib/bmake/unit-tests/compat-error.mk           |   37 +
 contrib/bmake/unit-tests/cond-eof.exp              |    9 +
 contrib/bmake/unit-tests/cond-eof.mk               |   20 +
 contrib/bmake/unit-tests/cond-func-empty.mk        |   27 +-
 contrib/bmake/unit-tests/cond-func-exists.mk       |   11 +-
 contrib/bmake/unit-tests/cond-func-make-main.exp   |    3 +
 contrib/bmake/unit-tests/cond-func-make-main.mk    |   62 +
 contrib/bmake/unit-tests/cond-short.exp            |   12 +-
 contrib/bmake/unit-tests/cond-short.mk             |   64 +-
 contrib/bmake/unit-tests/cond-token-string.exp     |    2 +-
 contrib/bmake/unit-tests/dep-percent.exp           |    5 +-
 contrib/bmake/unit-tests/depsrc-meta.exp           |    4 +
 contrib/bmake/unit-tests/depsrc-meta.mk            |   27 +-
 contrib/bmake/unit-tests/depsrc-optional.exp       |   18 +-
 contrib/bmake/unit-tests/depsrc.exp                |    3 +
 contrib/bmake/unit-tests/depsrc.mk                 |   17 +-
 .../unit-tests/deptgt-begin-fail-indirect.exp      |    6 +
 .../bmake/unit-tests/deptgt-begin-fail-indirect.mk |   16 +
 contrib/bmake/unit-tests/deptgt-begin-fail.exp     |    6 +
 contrib/bmake/unit-tests/deptgt-begin-fail.mk      |   10 +
 contrib/bmake/unit-tests/deptgt-end-fail-all.exp   |    7 +
 contrib/bmake/unit-tests/deptgt-end-fail-all.mk    |   19 +
 .../bmake/unit-tests/deptgt-end-fail-indirect.exp  |    7 +
 .../bmake/unit-tests/deptgt-end-fail-indirect.mk   |   16 +
 contrib/bmake/unit-tests/deptgt-end-fail.exp       |  163 +
 contrib/bmake/unit-tests/deptgt-end-fail.mk        |   69 +
 contrib/bmake/unit-tests/deptgt-suffixes.exp       |   26 +
 contrib/bmake/unit-tests/deptgt-suffixes.mk        |   23 +-
 contrib/bmake/unit-tests/deptgt.exp                |    1 +
 contrib/bmake/unit-tests/deptgt.mk                 |   10 +-
 contrib/bmake/unit-tests/directive-elif.exp        |   32 +-
 contrib/bmake/unit-tests/directive-elif.mk         |  126 +-
 contrib/bmake/unit-tests/directive-else.exp        |   16 +-
 contrib/bmake/unit-tests/directive-else.mk         |   15 +-
 contrib/bmake/unit-tests/directive-endfor.exp      |    4 +
 contrib/bmake/unit-tests/directive-endfor.mk       |    9 +
 contrib/bmake/unit-tests/directive-endif.exp       |    9 +-
 contrib/bmake/unit-tests/directive-endif.mk        |   28 +-
 contrib/bmake/unit-tests/directive-error.mk        |    6 +-
 contrib/bmake/unit-tests/directive-export-env.mk   |    4 +-
 contrib/bmake/unit-tests/directive-export-impl.exp |   56 +
 contrib/bmake/unit-tests/directive-export-impl.mk  |   62 +
 .../bmake/unit-tests/directive-export-literal.mk   |    4 +-
 contrib/bmake/unit-tests/directive-export.exp      |    5 +-
 contrib/bmake/unit-tests/directive-export.mk       |   16 +-
 contrib/bmake/unit-tests/directive-for-errors.exp  |   22 +
 contrib/bmake/unit-tests/directive-for-errors.mk   |   75 +
 contrib/bmake/unit-tests/directive-for-escape.exp  |   74 +
 contrib/bmake/unit-tests/directive-for-escape.mk   |   96 +
 contrib/bmake/unit-tests/directive-for-lines.exp   |   10 +
 contrib/bmake/unit-tests/directive-for-lines.mk    |   32 +
 contrib/bmake/unit-tests/directive-for-null.exp    |   10 +
 contrib/bmake/unit-tests/directive-for-null.mk     |   19 +
 contrib/bmake/unit-tests/directive-for.exp         |    7 +-
 contrib/bmake/unit-tests/directive-for.mk          |    9 +-
 contrib/bmake/unit-tests/directive-if.exp          |    6 +-
 contrib/bmake/unit-tests/directive-if.mk           |   14 +-
 contrib/bmake/unit-tests/directive-include.mk      |    5 +-
 contrib/bmake/unit-tests/directive-info.exp        |   23 +-
 contrib/bmake/unit-tests/directive-info.mk         |   18 +-
 .../bmake/unit-tests/directive-misspellings.exp    |   45 +
 contrib/bmake/unit-tests/directive-misspellings.mk |   79 +
 contrib/bmake/unit-tests/directive-undef.exp       |    3 +-
 contrib/bmake/unit-tests/directive-undef.mk        |   85 +-
 .../bmake/unit-tests/directive-unexport-env.exp    |   19 +-
 contrib/bmake/unit-tests/directive-unexport-env.mk |   19 +-
 contrib/bmake/unit-tests/directive-unexport.exp    |   13 +-
 contrib/bmake/unit-tests/directive-unexport.mk     |   12 +-
 contrib/bmake/unit-tests/directive-warning.exp     |   16 +-
 contrib/bmake/unit-tests/directive-warning.mk      |   10 +-
 contrib/bmake/unit-tests/jobs-error-indirect.exp   |    8 +
 contrib/bmake/unit-tests/jobs-error-indirect.mk    |   21 +
 .../bmake/unit-tests/jobs-error-nested-make.exp    |   11 +
 contrib/bmake/unit-tests/jobs-error-nested-make.mk |   20 +
 contrib/bmake/unit-tests/jobs-error-nested.exp     |   15 +
 contrib/bmake/unit-tests/jobs-error-nested.mk      |   20 +
 contrib/bmake/unit-tests/make-exported.mk          |    2 +-
 contrib/bmake/unit-tests/meta-cmd-cmp.exp          |   37 +
 contrib/bmake/unit-tests/meta-cmd-cmp.mk           |   52 +
 contrib/bmake/unit-tests/modmisc.exp               |    1 -
 contrib/bmake/unit-tests/modmisc.mk                |   29 +-
 contrib/bmake/unit-tests/opt-chdir.exp             |    4 +-
 contrib/bmake/unit-tests/opt-debug-errors.exp      |    5 +-
 contrib/bmake/unit-tests/opt-debug-graph1.exp      |   36 +
 contrib/bmake/unit-tests/opt-debug-jobs.exp        |    4 +-
 contrib/bmake/unit-tests/opt-debug-lint.exp        |    3 +-
 contrib/bmake/unit-tests/opt-debug-lint.mk         |   15 +-
 contrib/bmake/unit-tests/opt-file.exp              |   13 +-
 contrib/bmake/unit-tests/opt-file.mk               |  101 +-
 contrib/bmake/unit-tests/opt-jobs-no-action.exp    |   61 +
 contrib/bmake/unit-tests/opt-jobs-no-action.mk     |  102 +
 .../bmake/unit-tests/opt-keep-going-multiple.exp   |    9 +
 .../bmake/unit-tests/opt-keep-going-multiple.mk    |   21 +
 contrib/bmake/unit-tests/opt-keep-going.exp        |    5 +-
 contrib/bmake/unit-tests/opt-keep-going.mk         |    6 +-
 .../bmake/unit-tests/opt-no-action-runflags.exp    |   34 +
 contrib/bmake/unit-tests/opt-no-action-runflags.mk |   32 +
 contrib/bmake/unit-tests/opt.exp                   |    4 +
 contrib/bmake/unit-tests/posix.exp                 |    5 +-
 contrib/bmake/unit-tests/qequals.exp               |    2 -
 contrib/bmake/unit-tests/qequals.mk                |    8 -
 contrib/bmake/unit-tests/sh-dots.exp               |   12 +-
 contrib/bmake/unit-tests/sh-errctl.exp             |   27 +
 contrib/bmake/unit-tests/sh-errctl.mk              |   26 +
 contrib/bmake/unit-tests/sh-flags.exp              | 4325 ++++++++++++++
 contrib/bmake/unit-tests/sh-flags.mk               |  138 +
 contrib/bmake/unit-tests/sh-jobs.exp               |    7 +-
 contrib/bmake/unit-tests/sh-jobs.mk                |   34 +-
 contrib/bmake/unit-tests/sh-meta-chars.mk          |   17 +-
 contrib/bmake/unit-tests/shell-csh.mk              |    6 +-
 contrib/bmake/unit-tests/suff-add-later.exp        |    8 +-
 contrib/bmake/unit-tests/suff-clear-regular.exp    |    5 +-
 contrib/bmake/unit-tests/suff-clear-regular.mk     |    3 +-
 contrib/bmake/unit-tests/suff-clear-single.exp     |    5 +-
 contrib/bmake/unit-tests/suff-incomplete.exp       |   42 +
 contrib/bmake/unit-tests/suff-incomplete.mk        |   31 +
 contrib/bmake/unit-tests/suff-lookup.exp           |   21 +-
 contrib/bmake/unit-tests/suff-main-several.exp     |  141 +
 contrib/bmake/unit-tests/suff-main-several.mk      |   42 +
 contrib/bmake/unit-tests/suff-phony.exp            |   13 +
 contrib/bmake/unit-tests/suff-phony.mk             |   21 +
 contrib/bmake/unit-tests/suff-rebuild.exp          |   76 +-
 contrib/bmake/unit-tests/suff-rebuild.mk           |   23 +-
 contrib/bmake/unit-tests/suff-self.exp             |    5 +-
 contrib/bmake/unit-tests/suff-transform-debug.exp  |   62 +
 contrib/bmake/unit-tests/suff-transform-debug.mk   |   12 +
 .../bmake/unit-tests/suff-transform-endless.exp    |   44 +-
 contrib/bmake/unit-tests/suff-transform-endless.mk |    9 +-
 contrib/bmake/unit-tests/suff-transform-expand.exp |    5 +-
 contrib/bmake/unit-tests/suff-transform-select.exp |   45 +-
 contrib/bmake/unit-tests/suff-transform-select.mk  |    7 +-
 contrib/bmake/unit-tests/use-inference.exp         |    5 +-
 contrib/bmake/unit-tests/use-inference.mk          |    6 +-
 contrib/bmake/unit-tests/var-op-default.mk         |   72 +-
 contrib/bmake/unit-tests/var-op-expand.exp         |    9 -
 contrib/bmake/unit-tests/var-op-expand.mk          |  191 +-
 contrib/bmake/unit-tests/vardebug.exp              |    2 +-
 contrib/bmake/unit-tests/varmisc.mk                |   14 +-
 contrib/bmake/unit-tests/varmod-defined.exp        |   18 +-
 contrib/bmake/unit-tests/varmod-edge.exp           |   41 +-
 contrib/bmake/unit-tests/varmod-extension.exp      |    1 +
 contrib/bmake/unit-tests/varmod-extension.mk       |    4 +-
 contrib/bmake/unit-tests/varmod-gmtime.exp         |   40 +-
 contrib/bmake/unit-tests/varmod-gmtime.mk          |  197 +-
 contrib/bmake/unit-tests/varmod-head.exp           |    1 +
 contrib/bmake/unit-tests/varmod-head.mk            |    4 +-
 contrib/bmake/unit-tests/varmod-ifelse.exp         |    4 +
 contrib/bmake/unit-tests/varmod-ifelse.mk          |   20 +-
 contrib/bmake/unit-tests/varmod-indirect.exp       |   59 +
 contrib/bmake/unit-tests/varmod-indirect.mk        |  157 +
 contrib/bmake/unit-tests/varmod-localtime.exp      |   40 +-
 contrib/bmake/unit-tests/varmod-localtime.mk       |  196 +-
 contrib/bmake/unit-tests/varmod-range.exp          |    9 +-
 contrib/bmake/unit-tests/varmod-root.exp           |    1 +
 contrib/bmake/unit-tests/varmod-root.mk            |    4 +-
 contrib/bmake/unit-tests/varmod-subst-regex.exp    |    2 +
 contrib/bmake/unit-tests/varmod-subst-regex.mk     |    7 +-
 contrib/bmake/unit-tests/varmod-sysv.exp           |    4 +-
 contrib/bmake/unit-tests/varmod-sysv.mk            |   16 +-
 contrib/bmake/unit-tests/varmod-tail.exp           |    1 +
 contrib/bmake/unit-tests/varmod-tail.mk            |    4 +-
 contrib/bmake/unit-tests/varmod-to-many-words.mk   |   16 +-
 contrib/bmake/unit-tests/varmod-to-one-word.mk     |   16 +-
 contrib/bmake/unit-tests/varmod-to-separator.exp   |    2 -
 contrib/bmake/unit-tests/varmod.exp                |    2 +-
 contrib/bmake/unit-tests/varmod.mk                 |    4 +-
 contrib/bmake/unit-tests/varname-dot-makeflags.exp |    3 +
 contrib/bmake/unit-tests/varname-dot-makeflags.mk  |   15 +
 contrib/bmake/unit-tests/varname-dot-shell.exp     |    2 +-
 .../varname-make_print_var_on_error-jobs.exp       |    5 +-
 .../varname-make_print_var_on_error-jobs.mk        |   15 +-
 .../unit-tests/varname-make_print_var_on_error.exp |    3 +-
 .../unit-tests/varname-make_print_var_on_error.mk  |   15 +-
 contrib/bmake/unit-tests/varname-makeflags.mk      |   24 +-
 contrib/bmake/unit-tests/varparse-dynamic.mk       |   12 +-
 contrib/bmake/unit-tests/varparse-errors.exp       |    6 +-
 contrib/bmake/unit-tests/varparse-errors.mk        |   18 +-
 contrib/bmake/util.c                               |   91 +-
 contrib/bmake/var.c                                | 6056 ++++++++++----------
 usr.bin/bmake/Makefile.config                      |    2 +-
 usr.bin/bmake/unit-tests/Makefile                  |  159 +-
 243 files changed, 24413 insertions(+), 14581 deletions(-)

diff --cc contrib/bmake/import.sh
index 000000000000,d4554a078951..d4554a078951
mode 000000,100755..100755
--- a/contrib/bmake/import.sh
+++ b/contrib/bmake/import.sh
diff --cc contrib/bmake/job.c
index 052b9290f9f3,000000000000..d43761ca80ff
mode 100644,000000..100644
--- a/contrib/bmake/job.c
+++ b/contrib/bmake/job.c
@@@ -1,2853 -1,0 +1,3016 @@@
- /*	$NetBSD: job.c,v 1.326 2020/11/16 18:28:27 rillig Exp $	*/
++/*	$NetBSD: job.c,v 1.397 2021/01/10 23:59:53 rillig Exp $	*/
 +
 +/*
 + * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
 + * All rights reserved.
 + *
 + * This code is derived from software contributed to Berkeley by
 + * Adam de Boor.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + * 3. Neither the name of the University nor the names of its contributors
 + *    may be used to endorse or promote products derived from this software
 + *    without specific prior written permission.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 + * SUCH DAMAGE.
 + */
 +
 +/*
 + * Copyright (c) 1988, 1989 by Adam de Boor
 + * Copyright (c) 1989 by Berkeley Softworks
 + * All rights reserved.
 + *
 + * This code is derived from software contributed to Berkeley by
 + * Adam de Boor.
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *    notice, this list of conditions and the following disclaimer.
 + * 2. Redistributions in binary form must reproduce the above copyright
 + *    notice, this list of conditions and the following disclaimer in the
 + *    documentation and/or other materials provided with the distribution.
 + * 3. All advertising materials mentioning features or use of this software
 + *    must display the following acknowledgement:
 + *	This product includes software developed by the University of
 + *	California, Berkeley and its contributors.
 + * 4. Neither the name of the University nor the names of its contributors
 + *    may be used to endorse or promote products derived from this software
 + *    without specific prior written permission.
 + *
 + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 + * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 + * SUCH DAMAGE.
 + */
 +
 +/*-
 + * job.c --
 + *	handle the creation etc. of our child processes.
 + *
 + * Interface:
 + *	Job_Init	Called to initialize this module. In addition,
 + *			any commands attached to the .BEGIN target
 + *			are executed before this function returns.
 + *			Hence, the makefiles must have been parsed
 + *			before this function is called.
 + *
 + *	Job_End		Clean up any memory used.
 + *
 + *	Job_Make	Start the creation of the given target.
 + *
 + *	Job_CatchChildren
 + *			Check for and handle the termination of any
 + *			children. This must be called reasonably
 + *			frequently to keep the whole make going at
 + *			a decent clip, since job table entries aren't
 + *			removed until their process is caught this way.
 + *
 + *	Job_CatchOutput
 + *			Print any output our children have produced.
 + *			Should also be called fairly frequently to
 + *			keep the user informed of what's going on.
 + *			If no output is waiting, it will block for
 + *			a time given by the SEL_* constants, below,
 + *			or until output is ready.
 + *
 + *	Job_ParseShell	Given the line following a .SHELL target, parse
 + *			the line as a shell specification. Returns
 + *			FALSE if the spec was incorrect.
 + *
 + *	Job_Finish	Perform any final processing which needs doing.
 + *			This includes the execution of any commands
 + *			which have been/were attached to the .END
 + *			target. It should only be called when the
 + *			job table is empty.
 + *
 + *	Job_AbortAll	Abort all currently running jobs. It doesn't
 + *			handle output or do anything for the jobs,
 + *			just kills them. It should only be called in
 + *			an emergency.
 + *
 + *	Job_CheckCommands
 + *			Verify that the commands for a target are
 + *			ok. Provide them if necessary and possible.
 + *
 + *	Job_Touch	Update a target without really updating it.
 + *
 + *	Job_Wait	Wait for all currently-running jobs to finish.
 + */
 +
 +#ifdef HAVE_CONFIG_H
 +# include "config.h"
 +#endif
 +#include <sys/types.h>
 +#include <sys/stat.h>
 +#include <sys/file.h>
 +#include <sys/time.h>
 +#include "wait.h"
 +
 +#include <errno.h>
 +#if !defined(USE_SELECT) && defined(HAVE_POLL_H)
 +#include <poll.h>
 +#else
 +#ifndef USE_SELECT			/* no poll.h */
 +# define USE_SELECT
 +#endif
 +#if defined(HAVE_SYS_SELECT_H)
 +# include <sys/select.h>
 +#endif
 +#endif
 +#include <signal.h>
 +#include <utime.h>
 +#if defined(HAVE_SYS_SOCKET_H)
 +# include <sys/socket.h>
 +#endif
 +
 +#include "make.h"
 +#include "dir.h"
 +#include "job.h"
 +#include "pathnames.h"
 +#include "trace.h"
 +
 +/*	"@(#)job.c	8.2 (Berkeley) 3/19/94"	*/
- MAKE_RCSID("$NetBSD: job.c,v 1.326 2020/11/16 18:28:27 rillig Exp $");
++MAKE_RCSID("$NetBSD: job.c,v 1.397 2021/01/10 23:59:53 rillig Exp $");
 +
- /* A shell defines how the commands are run.  All commands for a target are
++/*
++ * A shell defines how the commands are run.  All commands for a target are
 + * written into a single file, which is then given to the shell to execute
 + * the commands from it.  The commands are written to the file using a few
 + * templates for echo control and error control.
 + *
 + * The name of the shell is the basename for the predefined shells, such as
 + * "sh", "csh", "bash".  For custom shells, it is the full pathname, and its
 + * basename is used to select the type of shell; the longest match wins.
 + * So /usr/pkg/bin/bash has type sh, /usr/local/bin/tcsh has type csh.
 + *
 + * The echoing of command lines is controlled using hasEchoCtl, echoOff,
 + * echoOn, noPrint and noPrintLen.  When echoOff is executed by the shell, it
 + * still outputs something, but this something is not interesting, therefore
 + * it is filtered out using noPrint and noPrintLen.
 + *
 + * The error checking for individual commands is controlled using hasErrCtl,
-  * errOnOrEcho, errOffOrExecIgnore and errExit.
++ * errOn, errOff and runChkTmpl.
 + *
-  * If a shell doesn't have error control, errOnOrEcho becomes a printf template
-  * for echoing the command, should echoing be on; errOffOrExecIgnore becomes
++ * If a shell doesn't have error control, echoTmpl becomes a printf template
++ * for echoing the command, should echoing be on; runIgnTmpl becomes
 + * another printf template for executing the command while ignoring the return
-  * status. Finally errExit is a printf template for running the command and
++ * status. Finally runChkTmpl is a printf template for running the command and
 + * causing the shell to exit on error. If any of these strings are empty when
 + * hasErrCtl is FALSE, the command will be executed anyway as is, and if it
 + * causes an error, so be it. Any templates set up to echo the command will
 + * escape any '$ ` \ "' characters in the command string to avoid common
 + * problems with echo "%s\n" as a template.
 + *
 + * The command-line flags "echo" and "exit" also control the behavior.  The
 + * "echo" flag causes the shell to start echoing commands right away.  The
 + * "exit" flag causes the shell to exit when an error is detected in one of
 + * the commands.
 + */
 +typedef struct Shell {
 +
-     /* The name of the shell. For Bourne and C shells, this is used only to
-      * find the shell description when used as the single source of a .SHELL
-      * target. For user-defined shells, this is the full path of the shell. */
-     const char *name;
++	/*
++	 * The name of the shell. For Bourne and C shells, this is used only
++	 * to find the shell description when used as the single source of a
++	 * .SHELL target. For user-defined shells, this is the full path of
++	 * the shell.
++	 */
++	const char *name;
 +
-     Boolean hasEchoCtl;		/* True if both echoOff and echoOn defined */
-     const char *echoOff;	/* command to turn off echo */
-     const char *echoOn;		/* command to turn it back on again */
-     const char *noPrint;	/* text to skip when printing output from
++	Boolean hasEchoCtl;	/* whether both echoOff and echoOn are there */
++	const char *echoOff;	/* command to turn echoing off */
++	const char *echoOn;	/* command to turn echoing back on */
++	const char *noPrint;	/* text to skip when printing output from the
 +				 * shell. This is usually the same as echoOff */
-     size_t noPrintLen;		/* length of noPrint command */
++	size_t noPrintLen;	/* length of noPrint command */
++
++	Boolean hasErrCtl;	/* whether error checking can be controlled
++				 * for individual commands */
++	const char *errOn;	/* command to turn on error checking */
++	const char *errOff;	/* command to turn off error checking */
++
++	const char *echoTmpl;	/* template to echo a command */
++	const char *runIgnTmpl;	/* template to run a command
++				 * without error checking */
++	const char *runChkTmpl;	/* template to run a command
++				 * with error checking */
++
++	/* string literal that results in a newline character when it appears
++	 * outside of any 'quote' or "quote" characters */
++	const char *newline;
++	char commentChar;	/* character used by shell for comment lines */
++
++	const char *echoFlag;	/* shell flag to echo commands */
++	const char *errFlag;	/* shell flag to exit on error */
++} Shell;
 +
-     Boolean hasErrCtl;		/* set if can control error checking for
- 				 * individual commands */
-     /* XXX: split into errOn and echoCmd */
-     const char *errOnOrEcho;	/* template to turn on error checking */
-     /* XXX: split into errOff and execIgnore */
-     const char *errOffOrExecIgnore; /* template to turn off error checking */
-     const char *errExit;	/* template to use for testing exit code */
++typedef struct CommandFlags {
++	/* Whether to echo the command before running it. */
++	Boolean echo;
 +
-     /* string literal that results in a newline character when it appears
-      * outside of any 'quote' or "quote" characters */
-     const char *newline;
-     char commentChar;		/* character used by shell for comment lines */
++	/* Run the command even in -n or -N mode. */
++	Boolean always;
 +
-     /*
-      * command-line flags
-      */
-     const char *echo;		/* echo commands */
-     const char *exit;		/* exit on error */
- } Shell;
++	/*
++	 * true if we turned error checking off before printing the command
++	 * and need to turn it back on
++	 */
++	Boolean ignerr;
++} CommandFlags;
++
++/*
++ * Write shell commands to a file.
++ *
++ * TODO: keep track of whether commands are echoed.
++ * TODO: keep track of whether error checking is active.
++ */
++typedef struct ShellWriter {
++	FILE *f;
++
++	/* we've sent 'set -x' */
++	Boolean xtraced;
++
++} ShellWriter;
 +
 +/*
 + * FreeBSD: traditionally .MAKE is not required to
 + * pass jobs queue to sub-makes.
 + * Use .MAKE.ALWAYS_PASS_JOB_QUEUE=no to disable.
 + */
 +#define MAKE_ALWAYS_PASS_JOB_QUEUE ".MAKE.ALWAYS_PASS_JOB_QUEUE"
 +static int Always_pass_job_queue = TRUE;
 +/*
 + * FreeBSD: aborting entire parallel make isn't always
 + * desired. When doing tinderbox for example, failure of
 + * one architecture should not stop all.
 + * We still want to bail on interrupt though.
 + */
 +#define MAKE_JOB_ERROR_TOKEN "MAKE_JOB_ERROR_TOKEN"
 +static int Job_error_token = TRUE;
 +
 +/*
 + * error handling variables
 + */
- static int errors = 0;		/* number of errors reported */
++static int job_errors = 0;	/* number of errors reported */
 +typedef enum AbortReason {	/* why is the make aborting? */
-     ABORT_NONE,
-     ABORT_ERROR,		/* Because of an error */
-     ABORT_INTERRUPT,		/* Because it was interrupted */
-     ABORT_WAIT			/* Waiting for jobs to finish */
++	ABORT_NONE,
++	ABORT_ERROR,		/* Because of an error */
++	ABORT_INTERRUPT,	/* Because it was interrupted */
++	ABORT_WAIT		/* Waiting for jobs to finish */
 +} AbortReason;
 +static AbortReason aborting = ABORT_NONE;
- #define JOB_TOKENS	"+EI+"	/* Token to requeue for each abort state */
++#define JOB_TOKENS "+EI+"	/* Token to requeue for each abort state */
 +
 +/*
 + * this tracks the number of tokens currently "out" to build jobs.
 + */
 +int jobTokensRunning = 0;
 +
- /* The number of commands actually printed to the shell commands file for
-  * the current job.  Should this number be 0, no shell will be executed. */
- static int numCommands;
- 
 +typedef enum JobStartResult {
-     JOB_RUNNING,		/* Job is running */
-     JOB_ERROR,			/* Error in starting the job */
-     JOB_FINISHED		/* The job is already finished */
++	JOB_RUNNING,		/* Job is running */
++	JOB_ERROR,		/* Error in starting the job */
++	JOB_FINISHED		/* The job is already finished */
 +} JobStartResult;
 +
 +/*
 + * Descriptions for various shells.
 + *
 + * The build environment may set DEFSHELL_INDEX to one of
 + * DEFSHELL_INDEX_SH, DEFSHELL_INDEX_KSH, or DEFSHELL_INDEX_CSH, to
 + * select one of the predefined shells as the default shell.
 + *
 + * Alternatively, the build environment may set DEFSHELL_CUSTOM to the
 + * name or the full path of a sh-compatible shell, which will be used as
 + * the default shell.
 + *
 + * ".SHELL" lines in Makefiles can choose the default shell from the
 + * set defined here, or add additional shells.
 + */
 +
 +#ifdef DEFSHELL_CUSTOM
 +#define DEFSHELL_INDEX_CUSTOM 0
 +#define DEFSHELL_INDEX_SH     1
 +#define DEFSHELL_INDEX_KSH    2
 +#define DEFSHELL_INDEX_CSH    3
 +#else /* !DEFSHELL_CUSTOM */
 +#define DEFSHELL_INDEX_SH     0
 +#define DEFSHELL_INDEX_KSH    1
 +#define DEFSHELL_INDEX_CSH    2
 +#endif /* !DEFSHELL_CUSTOM */
 +
 +#ifndef DEFSHELL_INDEX
 +#define DEFSHELL_INDEX 0	/* DEFSHELL_INDEX_CUSTOM or DEFSHELL_INDEX_SH */
 +#endif /* !DEFSHELL_INDEX */
 +
- static Shell    shells[] = {
++static Shell shells[] = {
 +#ifdef DEFSHELL_CUSTOM
 +    /*
 +     * An sh-compatible shell with a non-standard name.
 +     *
 +     * Keep this in sync with the "sh" description below, but avoid
 +     * non-portable features that might not be supplied by all
 +     * sh-compatible shells.
 +     */
- {
-     DEFSHELL_CUSTOM,		/* .name */
-     FALSE,			/* .hasEchoCtl */
-     "",				/* .echoOff */
-     "",				/* .echoOn */
-     "",				/* .noPrint */
-     0,				/* .noPrintLen */
-     FALSE,			/* .hasErrCtl */
-     "echo \"%s\"\n",		/* .errOnOrEcho */
-     "%s\n",			/* .errOffOrExecIgnore */
-     "{ %s \n} || exit $?\n",	/* .errExit */
-     "'\n'",			/* .newline */
-     '#',			/* .commentChar */
-     "",				/* .echo */
-     "",				/* .exit */
- },
++    {
++	DEFSHELL_CUSTOM,	/* .name */
++	FALSE,			/* .hasEchoCtl */
++	"",			/* .echoOff */
++	"",			/* .echoOn */
++	"",			/* .noPrint */
++	0,			/* .noPrintLen */
++	FALSE,			/* .hasErrCtl */
++	"",			/* .errOn */
++	"",			/* .errOff */
++	"echo \"%s\"\n",	/* .echoTmpl */
++	"%s\n",			/* .runIgnTmpl */
++	"{ %s \n} || exit $?\n", /* .runChkTmpl */
++	"'\n'",			/* .newline */
++	'#',			/* .commentChar */
++	"",			/* .echoFlag */
++	"",			/* .errFlag */
++    },
 +#endif /* DEFSHELL_CUSTOM */
 +    /*
 +     * SH description. Echo control is also possible and, under
 +     * sun UNIX anyway, one can even control error checking.
 +     */
- {
-     "sh",			/* .name */
-     FALSE,			/* .hasEchoCtl */
-     "",				/* .echoOff */
-     "",				/* .echoOn */
-     "",				/* .noPrint */
-     0,				/* .noPrintLen */
-     FALSE,			/* .hasErrCtl */
-     "echo \"%s\"\n", 		/* .errOnOrEcho */
-     "%s\n",			/* .errOffOrExecIgnore */
-     "{ %s \n} || exit $?\n",	/* .errExit */
-     "'\n'",			/* .newline */
-     '#',			/* .commentChar*/
++    {
++	"sh",			/* .name */
++	FALSE,			/* .hasEchoCtl */
++	"",			/* .echoOff */
++	"",			/* .echoOn */
++	"",			/* .noPrint */
++	0,			/* .noPrintLen */
++	FALSE,			/* .hasErrCtl */
++	"",			/* .errOn */
++	"",			/* .errOff */
++	"echo \"%s\"\n",	/* .echoTmpl */
++	"%s\n",			/* .runIgnTmpl */
++	"{ %s \n} || exit $?\n", /* .runChkTmpl */
++	"'\n'",			/* .newline */
++	'#',			/* .commentChar*/
 +#if defined(MAKE_NATIVE) && defined(__NetBSD__)
-     "q",			/* .echo */
++	/* XXX: -q is not really echoFlag, it's more like noEchoInSysFlag. */
++	"q",			/* .echoFlag */
 +#else
-     "",				/* .echo */
++	"",			/* .echoFlag */
 +#endif
-     "",				/* .exit */
- },
++	"",			/* .errFlag */
++    },
 +    /*
 +     * KSH description.
 +     */
- {
-     "ksh",			/* .name */
-     TRUE,			/* .hasEchoCtl */
-     "set +v",			/* .echoOff */
-     "set -v",			/* .echoOn */
-     "set +v",			/* .noPrint */
-     6,				/* .noPrintLen */
-     FALSE,			/* .hasErrCtl */
-     "echo \"%s\"\n",		/* .errOnOrEcho */
-     "%s\n",			/* .errOffOrExecIgnore */
-     "{ %s \n} || exit $?\n",	/* .errExit */
-     "'\n'",			/* .newline */
-     '#',			/* .commentChar */
-     "v",			/* .echo */
-     "",				/* .exit */
- },
++    {
++	"ksh",			/* .name */
++	TRUE,			/* .hasEchoCtl */
++	"set +v",		/* .echoOff */
++	"set -v",		/* .echoOn */
++	"set +v",		/* .noPrint */
++	6,			/* .noPrintLen */
++	FALSE,			/* .hasErrCtl */
++	"",			/* .errOn */
++	"",			/* .errOff */
++	"echo \"%s\"\n",	/* .echoTmpl */
++	"%s\n",			/* .runIgnTmpl */
++	"{ %s \n} || exit $?\n", /* .runChkTmpl */
++	"'\n'",			/* .newline */
++	'#',			/* .commentChar */
++	"v",			/* .echoFlag */
++	"",			/* .errFlag */
++    },
 +    /*
 +     * CSH description. The csh can do echo control by playing
 +     * with the setting of the 'echo' shell variable. Sadly,
 +     * however, it is unable to do error control nicely.
 +     */
- {
-     "csh",			/* .name */
-     TRUE,			/* .hasEchoCtl */
-     "unset verbose",		/* .echoOff */
-     "set verbose",		/* .echoOn */
-     "unset verbose", 		/* .noPrint */
-     13,				/* .noPrintLen */
-     FALSE, 			/* .hasErrCtl */
-     "echo \"%s\"\n", 		/* .errOnOrEcho */
-     /* XXX: Mismatch between errOn and execIgnore */
-     "csh -c \"%s || exit 0\"\n", /* .errOffOrExecIgnore */
-     "", 			/* .errExit */
-     "'\\\n'",			/* .newline */
-     '#',			/* .commentChar */
-     "v", 			/* .echo */
-     "e",			/* .exit */
- }
++    {
++	"csh",			/* .name */
++	TRUE,			/* .hasEchoCtl */
++	"unset verbose",	/* .echoOff */
++	"set verbose",		/* .echoOn */
++	"unset verbose",	/* .noPrint */
++	13,			/* .noPrintLen */
++	FALSE,			/* .hasErrCtl */
++	"",			/* .errOn */
++	"",			/* .errOff */
++	"echo \"%s\"\n",	/* .echoTmpl */
++	"csh -c \"%s || exit 0\"\n", /* .runIgnTmpl */
++	"",			/* .runChkTmpl */
++	"'\\\n'",		/* .newline */
++	'#',			/* .commentChar */
++	"v",			/* .echoFlag */
++	"e",			/* .errFlag */
++    }
 +};
 +
- /* This is the shell to which we pass all commands in the Makefile.
-  * It is set by the Job_ParseShell function. */
- static Shell *commandShell = &shells[DEFSHELL_INDEX];
++/*
++ * This is the shell to which we pass all commands in the Makefile.
++ * It is set by the Job_ParseShell function.
++ */
++static Shell *shell = &shells[DEFSHELL_INDEX];
 +const char *shellPath = NULL;	/* full pathname of executable image */
 +const char *shellName = NULL;	/* last component of shellPath */
 +char *shellErrFlag = NULL;
 +static char *shellArgv = NULL;	/* Custom shell args */
 +
 +
 +static Job *job_table;		/* The structures that describe them */
 +static Job *job_table_end;	/* job_table + maxJobs */
 +static unsigned int wantToken;	/* we want a token */
 +static Boolean lurking_children = FALSE;
- static Boolean make_suspended = FALSE;	/* Whether we've seen a SIGTSTP (etc) */
++static Boolean make_suspended = FALSE; /* Whether we've seen a SIGTSTP (etc) */
 +
 +/*
 + * Set of descriptors of pipes connected to
 + * the output channels of children
 + */
 +static struct pollfd *fds = NULL;
- static Job **jobfds = NULL;
- static nfds_t nfds = 0;
++static Job **allJobs = NULL;
++static nfds_t nJobs = 0;
 +static void watchfd(Job *);
 +static void clearfd(Job *);
- static int readyfd(Job *);
++static Boolean readyfd(Job *);
 +
- static GNode *lastNode;		/* The node for which output was most recently
- 				 * produced. */
- static char *targPrefix = NULL; /* What we print at the start of TARG_FMT */
++static char *targPrefix = NULL; /* To identify a job change in the output. */
 +static Job tokenWaitJob;	/* token wait pseudo-job */
 +
 +static Job childExitJob;	/* child exit pseudo-job */
- #define	CHILD_EXIT	"."
- #define	DO_JOB_RESUME	"R"
++#define CHILD_EXIT "."
++#define DO_JOB_RESUME "R"
 +
- enum { npseudojobs = 2 };	/* number of pseudo-jobs */
- 
- #define TARG_FMT  "%s %s ---\n" /* Default format */
- #define MESSAGE(fp, gn) \
- 	if (opts.maxJobs != 1 && targPrefix && *targPrefix) \
- 	    (void)fprintf(fp, TARG_FMT, targPrefix, gn->name)
++enum {
++	npseudojobs = 2		/* number of pseudo-jobs */
++};
 +
 +static sigset_t caught_signals;	/* Set of signals we handle */
 +
 +static void JobDoOutput(Job *, Boolean);
- static void JobInterrupt(int, int) MAKE_ATTR_DEAD;
++static void JobInterrupt(Boolean, int) MAKE_ATTR_DEAD;
 +static void JobRestartJobs(void);
 +static void JobSigReset(void);
 +
++static void
++SwitchOutputTo(GNode *gn)
++{
++	/* The node for which output was most recently produced. */
++	static GNode *lastNode = NULL;
++
++	if (gn == lastNode)
++		return;
++	lastNode = gn;
++
++	if (opts.maxJobs != 1 && targPrefix != NULL && targPrefix[0] != '\0')
++		(void)fprintf(stdout, "%s %s ---\n", targPrefix, gn->name);
++}
++
 +static unsigned
 +nfds_per_job(void)
 +{
 +#if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
-     if (useMeta)
- 	return 2;
++	if (useMeta)
++		return 2;
 +#endif
-     return 1;
++	return 1;
++}
++
++void
++Job_FlagsToString(const Job *job, char *buf, size_t bufsize)
++{
++	snprintf(buf, bufsize, "%c%c%c",
++	    job->ignerr ? 'i' : '-',
++	    !job->echo ? 's' : '-',
++	    job->special ? 'S' : '-');
 +}
 +
 +static void
 +job_table_dump(const char *where)
 +{
-     Job *job;
++	Job *job;
++	char flags[4];
 +
-     debug_printf("job table @ %s\n", where);
-     for (job = job_table; job < job_table_end; job++) {
- 	debug_printf("job %d, status %d, flags %d, pid %d\n",
- 		     (int)(job - job_table), job->status, job->flags, job->pid);
-     }
++	debug_printf("job table @ %s\n", where);
++	for (job = job_table; job < job_table_end; job++) {
++		Job_FlagsToString(job, flags, sizeof flags);
++		debug_printf("job %d, status %d, flags %s, pid %d\n",
++		    (int)(job - job_table), job->status, flags, job->pid);
++	}
 +}
 +
 +/*
 + * Delete the target of a failed, interrupted, or otherwise
 + * unsuccessful job unless inhibited by .PRECIOUS.
 + */
 +static void
 +JobDeleteTarget(GNode *gn)
 +{
-     const char *file;
- 
-     if (gn->type & OP_JOIN)
- 	return;
-     if (gn->type & OP_PHONY)
- 	return;
-     if (Targ_Precious(gn))
- 	return;
-     if (opts.noExecute)
- 	return;
- 
-     file = GNode_Path(gn);
-     if (eunlink(file) != -1)
- 	Error("*** %s removed", file);
++	const char *file;
++
++	if (gn->type & OP_JOIN)
++		return;
++	if (gn->type & OP_PHONY)
++		return;
++	if (Targ_Precious(gn))
++		return;
++	if (opts.noExecute)
++		return;
++
++	file = GNode_Path(gn);
++	if (eunlink(file) != -1)
++		Error("*** %s removed", file);
*** 7771 LINES SKIPPED ***


More information about the dev-commits-src-all mailing list